---
构建以SaaS为主系统、AI Agent为辅节点的B2B再生塑料CRM平台,实现:
| 编号 | 铁律 | 违反后果 |
|---|
| F1 | SaaS是主系统,Agent是辅节点 | Agent不得绕过SaaS直接操作数据库 |
| F2 | 人在环中,人类拥有最终决策权 | 任何Agent建议需人类确认后才生效 |
| F3 | 一事一记,每次对话更新状态 | 防止遗忘和幻觉 |
| F4 | 源头可溯,所有结论引用来源 | 禁止凭空创造数据 |
| F5 | 架构锁定,变更需审批 | 禁止Agent自行调整CRM架构 |
---
**决策**:
**决策**:
- **DeepSeek-R1 32B/70B** (推荐首选):推理能力强,适合商机分析
- **Qwen2.5-72B** (通义千问):中文理解优秀,适合日报周报汇总
- **ChatGLM3-6B/12B** (智谱):轻量级,适合实时响应场景
- **Baichuan2-13B** (百川):中文场景优化
- 主流程API:毫秒级响应
- Agent分析:异步队列,60秒内完成,结果通过企业微信推送
**决策**:
- 非流程性/不影响其他节点:等待直至批复
- 影响其他流程节点:维持旧规则执行,新规则审批通过后切换
**决策**:
- 客户关系: 30%
- 技术匹配: 25%
- 价格竞争力: 20%
- 切换意愿: 15%
- 时间窗口: 10%
- 项目阶段: 30%
- 客户订单状态: 25%
- 技术匹配: 20%
- 时间规划: 15%
- 竞争态势: 10%
- 高商机: ≥70分
- 中商机: 50-69分
- 低商机: 30-49分
- 放弃: <30分
**决策**:
---
┌─────────────────────────────────────────────────────────────┐
│ TopcentralMall CRM SaaS (多租户) │
├─────────────────────────────────────────────────────────────┤
│ 租户隔离层 (tenant_id 物理隔离) │
├─────────────────────────────────────────────────────────────┤
│ 客户管理 → 销售过程 → 办公自动化 → 营销分析 → 产品库存 │
│ ↓ ↓ ↓ ↓ ↓ │
│ [Agent] [Agent] [Agent] [Agent] [Agent] │
│ 客户画像 商机评分 日报汇总 流失预警 库存建议 │
│ ↓ ↓ ↓ ↓ ↓ │
│ 企业微信 企业微信 企业微信 企业微信 自动执行 │
│ 人类确认 人类确认 人类确认 人类确认 │
│ ↓ ↓ ↓ ↓ │
│ SaaS执行 SaaS执行 SaaS执行 SaaS执行 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ API Gateway (Nginx) │
│ JWT Token + tenant_id │
└─────────────────────────────────────────┘
│
┌─────────────────────────────────────────┐
│ SaaS Core (FastAPI) │
│ 毫秒级响应,不阻塞主流程 │
└─────────────────────────────────────────┘
│
┌──────────┼──────────┐
│ │ │
┌────┴────┐┌───┴────┐┌────┴────┐
│ Tenant ││ Tenant ││ Tenant │
│ A ││ B ││ C │
│(独立DB) ││(独立DB)││(独立DB) │
└────┬────┘└───┬────┘└────┬────┘
│ │ │
┌────┴────────────────────┴────┐
│ Agent Analysis Queue │
│ (异步执行,Redis/RabbitMQ) │
│ DeepSeek/Qwen/私有模型 │
└────────────────────────────────┘
│
┌──────────┴──────────┐
│ │
┌────┴────┐ ┌────┴────┐
│ 企业微信 │ │ 邮件 │
│ 推送确认 │ │ 通知 │
└─────────┘ └─────────┘
---
| 编号 | 节点名称 | 所属模块 | 触发条件 | 人类确认 | 响应时间 |
|---|
| A01 | 客户画像分析Agent | 客户管理 | 新客户/更新/每周 | 建议级别 | 30s |
| A02 | 商机评分Agent | 销售过程 | 商机创建/变更 | 必须确认 | 30s |
| **A03** | **项目商机分析Agent** | **销售过程** | **手动/项目录入** | **必须确认** | **60s** |
| A04 | 日报汇总周报Agent | 办公自动化 | 每周五18:00 | 建议级别 | 45s |
| A05 | 流失预警Agent | 营销分析 | 每日凌晨 | 建议级别 | 30s |
| A06 | 报价智能建议Agent | 销售过程 | 报价创建 | 必须确认 | 30s |
| A07 | 回款催收建议Agent | 销售过程 | 回款逾期 | 必须确认 | 30s |
| A08 | 库存预警建议Agent | 产品库存 | 库存阈值 | 自动执行 | 15s |
| A09 | 营销活动优化Agent | 营销分析 | 活动创建 | 建议级别 | 30s |
| A10 | 客户来源分析Agent | 营销分析 | 每月/手动 | 自动执行 | 30s |
| A11 | 报表解读Agent | 营销分析 | 报表生成 | 建议级别 | 30s |
| A12 | 合同风险审查Agent | 销售过程 | 合同创建 | 必须确认 | 60s |
| A13 | 售后服务建议Agent | 客户服务 | 投诉/工单 | 建议级别 | 30s |
| A14 | 仪表盘解读Agent | 数据可视化 | 实时/手动 | 自动执行 | 15s |
| A15 | 审批流程优化Agent | 办公自动化 | 流程积压 | 建议级别 | 30s |
{
"tenant_id": "string (required)",
"workflow_instance_id": "string (required)",
"node_id": "A03",
"customer_relation": {
"relationship_depth": "number: 1-10",
"decision_maker_relation": "enum: [excellent, good, poor]",
"tech_relation": "enum: [excellent, good, poor]",
"cooperation_years": "number",
"last_visit_date": "date",
"visit_count_30d": "number"
},
"mass_production_project": {
"current_supplier": "string",
"switch_willingness": "enum: [strong, moderate, weak, none]",
"plastic_requirements": "string",
"mold_structure": "enum: [simple, medium, complex]",
"molding_process": "string",
"cert_requirements": "string",
"monthly_volume": "number",
"price_range": "string",
"payment_terms": "enum: [30, 60, 90, 120]",
"competitors": "string"
},
"new_project": {
"project_stage": "enum: [rfq, sample, mold, ppap, mass]",
"customer_has_order": "enum: [yes, bidding, no]",
"sample_date": "date",
"mold_date": "date",
"mass_production_date": "date",
"project_lifecycle": "enum: [short, medium, long]"
},
"switch_motivation": {
"motivation_factors": "array: [price, quality, supply, service, tech, relation]",
"risk_assessment": "string"
},
"historical_data": {
"quotes": "array",
"samples": "array",
"contracts": "array",
"orders": "array",
"travel_reports": "array"
}
}
{
"tenant_id": "string",
"workflow_instance_id": "string",
"node_id": "A03",
"timestamp": "ISO8601",
"overall_score": "number: 0-100",
"score_level": "enum: [high, medium, low, abandon]",
"score_breakdown": {
"relation_score": "number: 0-30",
"tech_match_score": "number: 0-25",
"price_score": "number: 0-20",
"switch_willingness_score": "number: 0-15",
"time_window_score": "number: 0-10"
},
"relation_assessment": {
"score": "number: 0-10",
"level": "enum: [excellent, good, poor]",
"risks": ["string"],
"opportunities": ["string"]
},
"mass_project_analysis": {
"feasibility_score": "number: 0-100",
"switch_probability": "number: 0-1",
"competitor_analysis": {
"primary_competitor": "string",
"competitor_strengths": ["string"],
"competitor_weaknesses": ["string"],
"our_advantages": ["string"]
},
"risk_matrix": [
{
"risk_type": "string",
"level": "enum: [high, medium, low]",
"description": "string"
}
]
},
"new_project_analysis": {
"potential_score": "number: 0-100",
"timeline_assessment": "string",
"risks": ["string"],
"opportunities": ["string"]
},
"switch_willingness_analysis": {
"willingness_level": "enum: [strong, moderate, weak, none]",
"motivation_analysis": "string",
"risk_factors": ["string"]
},
"strategy_recommendations": [
{
"priority": "number: 1-5",
"title": "string",
"description": "string",
"expected_outcome": "string",
"timeline": "string"
}
],
"risk_warnings": [
{
"severity": "enum: [high, medium, low]",
"category": "string",
"description": "string",
"mitigation": "string"
}
],
"next_actions": [
{
"action": "string",
"owner": "string",
"deadline": "date",
"priority": "enum: [high, medium, low]"
}
],
"confidence": "number: 0-1",
"model_version": "string",
"suggested_human_review": "boolean: true"
}
CREATE TABLE customer_decision_tree (
id SERIAL PRIMARY KEY,
tenant_id VARCHAR(64) NOT NULL,
customer_id VARCHAR(64) NOT NULL,
decision_maker_name VARCHAR(128),
decision_maker_title VARCHAR(64),
decision_maker_contact VARCHAR(64),
influence_level INTEGER CHECK (influence_level BETWEEN 1 AND 10),
relationship_quality VARCHAR(16) CHECK (relationship_quality IN ('excellent', 'good', 'poor')),
tech_contact_name VARCHAR(128),
tech_contact_title VARCHAR(64),
tech_influence_level INTEGER CHECK (tech_influence_level BETWEEN 1 AND 10),
procurement_contact_name VARCHAR(128),
procurement_contact_title VARCHAR(64),
procurement_influence_level INTEGER CHECK (procurement_influence_level BETWEEN 1 AND 10),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(tenant_id, customer_id),
FOREIGN KEY (tenant_id, customer_id) REFERENCES customers(tenant_id, id)
);
CREATE TABLE project_analysis_results (
id SERIAL PRIMARY KEY,
tenant_id VARCHAR(64) NOT NULL,
workflow_instance_id VARCHAR(128) NOT NULL,
node_id VARCHAR(16) NOT NULL,
project_id VARCHAR(64) NOT NULL,
overall_score INTEGER CHECK (overall_score BETWEEN 0 AND 100),
score_level VARCHAR(16) CHECK (score_level IN ('high', 'medium', 'low', 'abandon')),
score_breakdown JSONB NOT NULL,
relation_assessment JSONB,
mass_project_analysis JSONB,
new_project_analysis JSONB,
switch_willingness_analysis JSONB,
strategy_recommendations JSONB,
risk_warnings JSONB,
next_actions JSONB,
confidence DECIMAL(3,2),
model_version VARCHAR(32),
human_review_status VARCHAR(16) DEFAULT 'pending' CHECK (human_review_status IN ('pending', 'approved', 'rejected', 'modified')),
human_review_comment TEXT,
human_reviewer_id VARCHAR(64),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (tenant_id, project_id) REFERENCES projects(tenant_id, id)
);
CREATE TABLE agent_execution_logs (
id SERIAL PRIMARY KEY,
tenant_id VARCHAR(64) NOT NULL,
workflow_instance_id VARCHAR(128) NOT NULL,
node_id VARCHAR(16) NOT NULL,
model_name VARCHAR(64) NOT NULL,
model_version VARCHAR(32) NOT NULL,
input_tokens INTEGER,
output_tokens INTEGER,
execution_time_ms INTEGER,
status VARCHAR(16) CHECK (status IN ('success', 'failure', 'timeout')),
error_message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
---
┌─────────────────────────────────────────────────────────────┐
│ 阿里云服务器 47.96.253.194 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐│
│ │ SaaS Core │ │ Agent Queue │ │ Model API ││
│ │ (FastAPI) │ │ (Redis/Celery)│ │ (vLLM) ││
│ │ 毫秒级响应 │ │ 异步处理 │ │ 模型推理 ││
│ └─────────────────┘ └─────────────────┘ └─────────────┘│
│ │ │ │ │
│ └────────────────────┴────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Nginx (API Gateway) ││
│ │ /api/* → SaaS Core ││
│ │ /agent/* → Agent Queue ││
│ │ /model/* → Model API (内部) ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
│
┌─────────┴─────────┐
│ │
┌─────┴─────┐ ┌─────┴─────┐
│ DeepSeek │ │ Qwen │
│ R1-32B │ │ 2.5-72B │
│ (本地GPU) │ │ (API调用) │
└───────────┘ └───────────┘
| 场景 | 推荐模型 | 部署方式 | 响应时间 | 备注 |
|---|
| 项目商机分析 | DeepSeek-R1-32B | 本地GPU | 30-60s | 推理能力强 |
| 日报周报汇总 | Qwen2.5-72B | API调用 | 20-45s | 中文理解优秀 |
| 实时库存预警 | ChatGLM3-6B | 本地CPU | 5-15s | 轻量级快速 |
| 客户画像 | DeepSeek-R1-14B | 本地GPU | 15-30s | 平衡性能 |
| 合同风险 | DeepSeek-R1-70B | 本地GPU | 45-60s | 高精度 |
**私有模型**指部署在企业自有服务器或私有云环境中的AI模型,特点:
**推荐私有模型**:
---
Agent生成建议
│
▼
┌─────────────────┐
│ 企业微信推送 │
│ • 建议摘要 │
│ • 关键数据 │
│ • 确认按钮 │
│ • 驳回按钮 │
│ • 查看详情链接 │
└─────────────────┘
│
├──────────────┬──────────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│ 确认 │ │ 驳回 │ │ 30分钟 │
│ │ │ │ │ 未响应 │
└───┬────┘ └───┬────┘ └───┬────┘
│ │ │
▼ ▼ ▼
SaaS执行 记录驳回原因 维持旧规则
│ │ │
▼ ▼ ▼
记录日志 等待新指令 等待人类批复
{
"batch_confirmation": {
"max_items": 50,
"confirmation_methods": [
"individual", // 逐条确认
"category_batch", // 按类别批量
"all_at_once" // 全部确认
],
"timeout_handling": {
"non_blocking": "wait_until_approved",
"blocking": "maintain_old_rules"
},
"required_fields": [
"workflow_instance_id",
"node_id",
"suggestion_id",
"tenant_id"
]
}
}
---
| 节点 | 数据敏感性 | 最大Token | 超时时间 | 重试次数 | 人类确认 | 模型选择 |
|---|
| A01 客户画像 | 高 | 4000 | 30s | 2 | 建议级别 | DeepSeek-R1-14B |
| A02 商机评分 | 高 | 4000 | 30s | 2 | **必须确认** | DeepSeek-R1-32B |
| **A03 项目商机** | **极高** | **8000** | **60s** | **2** | **必须确认** | **DeepSeek-R1-32B** |
| A04 日报汇总 | 中 | 8000 | 45s | 3 | 建议级别 | Qwen2.5-72B |
| A05 流失预警 | 高 | 4000 | 30s | 2 | 建议级别 | DeepSeek-R1-14B |
| A06 报价建议 | 高 | 4000 | 30s | 2 | **必须确认** | DeepSeek-R1-32B |
| A07 回款催收 | 高 | 4000 | 30s | 2 | **必须确认** | DeepSeek-R1-14B |
| A08 库存预警 | 中 | 2000 | 15s | 3 | 自动执行 | ChatGLM3-6B |
| A09 营销优化 | 中 | 4000 | 30s | 2 | 建议级别 | Qwen2.5-72B |
| A10 客户来源 | 低 | 4000 | 30s | 3 | 自动执行 | ChatGLM3-6B |
| A11 报表解读 | 低 | 4000 | 30s | 3 | 建议级别 | Qwen2.5-72B |
| A12 合同风险 | 极高 | 8000 | 60s | 1 | **必须确认** | DeepSeek-R1-70B |
| A13 售后建议 | 中 | 4000 | 30s | 2 | 建议级别 | Qwen2.5-72B |
| A14 仪表盘 | 低 | 2000 | 15s | 3 | 自动执行 | ChatGLM3-6B |
| A15 审批优化 | 中 | 4000 | 30s | 2 | 建议级别 | DeepSeek-R1-14B |
---
{
"timestamp": "2026-06-14T20:00:00Z",
"phase": "phase_1_design",
"version": "1.0",
"summary": "完成15个Agent节点识别和Schema定义,等待人类审批",
"decisions": [
"D1: 采用超兔Xtools 7模块架构作为SaaS基础",
"D2: 项目商机分析Agent作为核心节点,需人类必须确认",
"D3: 所有Agent输出使用JSON Schema硬校验",
"D4: 高风险节点(合同/商机/报价)必须人类确认",
"D5: 多租户物理隔离,Agent结果按租户隔离",
"D6: 企业微信作为唯一确认渠道",
"D7: 本地部署DeepSeek-R1 + Qwen2.5混合模型策略",
"D8: 评分阈值:高≥70, 中50-69, 低30-49, 放弃<30"
],
"dependencies": [],
"next_steps": [
"S1: 用户已回答5个业务问题,设计说明书已完善",
"S2: 人类审批签字后进入阶段2开发",
"S3: 阶段2任务:编写Agent节点提示词、构建回归测试、CI流水线"
],
"risks": [
"R1: 项目商机分析Agent输入字段过多,可能影响响应速度",
"R2: 需要GPU服务器部署DeepSeek-R1-32B/70B",
"R3: 15个节点同时开发可能导致资源不足,建议分批实施",
"R4: 企业微信集成需要CorpID和AgentID配置"
]
}
---
| 版本 | 日期 | 修改人 | 变更内容 | 审批状态 |
|---|
| v0.1 | 2026-06-14 | Hermes Agent | 初稿,识别15个节点,定义Schema框架 | 草案 |
| v1.0 | 2026-06-14 | Hermes Agent | 根据用户5个问题回答完善,确定模型部署、评分标准、多租户架构 | **已审批** |
---
**审批人**: admin@topcentral.cn / 麻一明
**审批方式**: 用户消息回复,回答5个业务问题
**审批时间**: 2026-06-14
**审批结论**:
**阶段1状态**: ✅ 完成,可进入阶段2
---
**文档访问**: http://47.96.253.194/docs/saas-agent-node-design-v1.md
**Git仓库**: https://gitee.com/storm0823/topcentral-mall/
**下次更新**: 阶段2完成后更新为v2.0