12 KiB
12 KiB
iConsulting Agent 三层架构设计
问题背景
当前 AI 回复存在以下问题:
- 回复过于冗长,没有抓住用户核心需求
- 重复性表达多,效率低
- 缺乏对用户意图的准确理解
- 没有自我评估机制
设计目标
作为 Agent,应该做到:
- 准确理解用户意图 - 基于对话上下文、历史经验判断用户当前需要什么
- 自我评估 - 判断 AI 是否已经给出用户想要的答案
- 主动行动 - 如果未达到用户需求,主动调用工具寻找解决方案
- 简洁高效 - 回答抓住重点,简短有效
三层架构
┌─────────────────────────────────────────────────────────────┐
│ 用户消息输入 │
└─────────────────────────┬───────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 第一层:意图分类器 │
│ 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字 | 否 |
分类规则
- 关键词匹配 - 快速识别意图模式
- 上下文分析 - 判断是否为后续问题
- 实体提取 - 识别签证类型、职业等关键信息
- 工具推荐 - 根据意图推荐合适的工具
代码位置
packages/services/conversation-service/src/infrastructure/claude/intent-classifier.ts
第二层:ReAct Agent
ReAct 思维框架
在 System Prompt 中注入 ReAct 思维模式:
<thinking_framework>
在回答用户问题时,请遵循以下思维框架:
1. 理解 (Understand)
- 用户的核心问题是什么?
- 用户的真实需求是什么?
- 这是后续问题还是新问题?
2. 评估 (Evaluate)
- 我当前掌握的信息是否足够?
- 是否需要调用工具获取更多信息?
- 之前的对话是否已经回答过类似问题?
3. 行动 (Act)
- 如果信息不足,调用合适的工具
- 优先使用:知识库搜索 > 经验召回 > 网络搜索
4. 生成 (Generate)
- 直接回答核心问题
- 避免冗余的开场白和结束语
- 控制回复长度,抓住重点
</thinking_framework>
工具循环
- 最多支持 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
集成流程
// 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 |
🔄 待更新 | 集成三层架构 |
后续优化方向
- 机器学习分类 - 用训练数据替代规则分类
- 动态长度调整 - 根据反馈自动调整建议长度
- 个性化门控 - 根据用户偏好调整检查规则
- A/B 测试 - 对比优化前后的用户满意度