# iConsulting Agent 三层架构设计 ## 问题背景 当前 AI 回复存在以下问题: - 回复过于冗长,没有抓住用户核心需求 - 重复性表达多,效率低 - 缺乏对用户意图的准确理解 - 没有自我评估机制 ## 设计目标 作为 Agent,应该做到: 1. **准确理解用户意图** - 基于对话上下文、历史经验判断用户当前需要什么 2. **自我评估** - 判断 AI 是否已经给出用户想要的答案 3. **主动行动** - 如果未达到用户需求,主动调用工具寻找解决方案 4. **简洁高效** - 回答抓住重点,简短有效 ## 三层架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ 用户消息输入 │ └─────────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 第一层:意图分类器 │ │ IntentClassifier │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ • 分析用户意图类型(简单查询/深度咨询/需要行动/闲聊) ││ │ │ • 确定建议的最大回复长度 ││ │ │ • 识别是否需要调用工具 ││ │ │ • 检测是否为后续问题 ││ │ │ • 提取关键实体(签证类型、职业等) ││ │ └─────────────────────────────────────────────────────────┘│ │ 输出:IntentResult { type, maxResponseLength, needsTools } │ └─────────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 第二层:ReAct Agent │ │ Claude API + Tool Loop │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ 思考 (Thought) ││ │ │ └─► 分析用户真实需求 ││ │ │ └─► 评估当前信息是否足够 ││ │ │ └─► 决定是否需要调用工具 ││ │ │ ││ │ │ 行动 (Action) ││ │ │ └─► 调用合适的工具获取信息 ││ │ │ └─► 支持最多10轮工具调用 ││ │ │ ││ │ │ 观察 (Observation) ││ │ │ └─► 分析工具返回结果 ││ │ │ └─► 决定是否需要继续行动 ││ │ │ ││ │ │ 生成 (Generate) ││ │ │ └─► 根据意图分类结果控制回复长度 ││ │ │ └─► 聚焦用户核心问题 ││ │ └─────────────────────────────────────────────────────────┘│ │ 输出:AI 回复文本 │ └─────────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 第三层:回复质量门控 │ │ ResponseGate │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ 质量检查: ││ │ │ • 长度检查 - 是否超过建议长度 ││ │ │ • 相关性检查 - 是否回答了用户问题 ││ │ │ • 冗余检查 - 是否包含重复/冗余表达 ││ │ │ • 完整性检查 - 是否包含必要信息 ││ │ │ • 语气检查 - 是否符合场景要求 ││ │ │ ││ │ │ 优化处理: ││ │ │ • 裁剪过长回复(在句子边界处裁剪) ││ │ │ • 移除冗余表达 ││ │ └─────────────────────────────────────────────────────────┘│ │ 输出:优化后的最终回复 │ └─────────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 最终回复输出 │ └─────────────────────────────────────────────────────────────┘ ``` ## 第一层:意图分类器 (IntentClassifier) ### 意图类型 | 类型 | 说明 | 建议长度 | 需要工具 | |------|------|----------|----------| | `SIMPLE_QUERY` | 简单查询,直接回答 | 300字 | 否 | | `DEEP_CONSULTATION` | 深度咨询,需要知识库 | 800字 | 是 | | `ACTION_NEEDED` | 需要执行操作 | 500字 | 是 | | `CHAT` | 闲聊寒暄 | 100字 | 否 | | `CLARIFICATION` | 需要追问澄清 | 150字 | 否 | | `CONFIRMATION` | 确认/否定 | 200字 | 否 | ### 分类规则 1. **关键词匹配** - 快速识别意图模式 2. **上下文分析** - 判断是否为后续问题 3. **实体提取** - 识别签证类型、职业等关键信息 4. **工具推荐** - 根据意图推荐合适的工具 ### 代码位置 `packages/services/conversation-service/src/infrastructure/claude/intent-classifier.ts` ## 第二层:ReAct Agent ### ReAct 思维框架 在 System Prompt 中注入 ReAct 思维模式: ``` 在回答用户问题时,请遵循以下思维框架: 1. 理解 (Understand) - 用户的核心问题是什么? - 用户的真实需求是什么? - 这是后续问题还是新问题? 2. 评估 (Evaluate) - 我当前掌握的信息是否足够? - 是否需要调用工具获取更多信息? - 之前的对话是否已经回答过类似问题? 3. 行动 (Act) - 如果信息不足,调用合适的工具 - 优先使用:知识库搜索 > 经验召回 > 网络搜索 4. 生成 (Generate) - 直接回答核心问题 - 避免冗余的开场白和结束语 - 控制回复长度,抓住重点 ``` ### 工具循环 - 最多支持 10 轮工具调用 - 每轮:思考 → 调用工具 → 观察结果 → 决定下一步 - 当信息足够时停止调用,生成最终回复 ### 代码位置 `packages/services/conversation-service/src/infrastructure/claude/prompts/system-prompt.ts` ## 第三层:回复质量门控 (ResponseGate) ### 检查项 | 检查项 | 说明 | 未通过处理 | |--------|------|------------| | `length` | 长度是否超标 | 裁剪至建议长度 | | `relevance` | 是否与问题相关 | 标记警告 | | `redundancy` | 是否有冗余表达 | 移除冗余 | | `completeness` | 是否信息完整 | 标记警告 | | `tone` | 语气是否合适 | 标记警告 | ### 冗余表达清单 ``` - "根据我的了解" - "让我来帮您" - "非常感谢您的咨询" - "希望以上信息对您有所帮助" - "如果您还有其他问题" - ... ``` ### 代码位置 `packages/services/conversation-service/src/infrastructure/claude/response-gate.ts` ## 集成流程 ```typescript // claude-agent.service.ts 伪代码 async sendMessage(message, history) { // 第一层:意图分类 const intent = intentClassifier.classify(message, history); // 构建带 ReAct 框架的 System Prompt const systemPrompt = buildSystemPrompt({ ...config, intentHint: intent, // 注入意图信息 }); // 第二层:ReAct Agent 处理 const response = await this.claudeClient.chat({ systemPrompt, messages: history, tools: intent.needsTools ? this.getTools() : [], maxTokens: this.calculateMaxTokens(intent), }); // 第三层:回复质量门控 const gateResult = responseGate.check(response, intent, message); // 返回优化后的回复 return gateResult.optimizedResponse || response; } ``` ## 预期效果 ### 改进前 ``` 用户:189签证要多少分? AI:非常感谢您的咨询!关于澳大利亚189独立技术移民签证, 这是一个非常重要的移民类别。让我来为您详细解答。 首先,189签证是一种打分制签证,需要达到一定的分数才能获邀。 根据目前的政策...(以下省略500字) 希望以上信息对您有所帮助!如果您还有其他问题,欢迎继续咨询。 ``` ### 改进后 ``` 用户:189签证要多少分? AI:189签证需要至少65分才能提交EOI。 目前获邀分数线约为85-95分,具体取决于职业。 主要加分项:年龄、英语、工作经验、学历、州担保等。 ``` ## 文件清单 | 文件 | 状态 | 说明 | |------|------|------| | `intent-classifier.ts` | ✅ 已创建 | 意图分类器 | | `response-gate.ts` | ✅ 已创建 | 回复质量门控 | | `system-prompt.ts` | 🔄 待更新 | 加入 ReAct 框架 | | `claude-agent.service.ts` | 🔄 待更新 | 集成三层架构 | ## 后续优化方向 1. **机器学习分类** - 用训练数据替代规则分类 2. **动态长度调整** - 根据反馈自动调整建议长度 3. **个性化门控** - 根据用户偏好调整检查规则 4. **A/B 测试** - 对比优化前后的用户满意度