iconsulting/docs/AGENT_THREE_LAYER_ARCHITECT...

253 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 思维模式:
```
<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`
## 集成流程
```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签证要多少分
AI189签证需要至少65分才能提交EOI。
目前获邀分数线约为85-95分具体取决于职业。
主要加分项:年龄、英语、工作经验、学历、州担保等。
```
## 文件清单
| 文件 | 状态 | 说明 |
|------|------|------|
| `intent-classifier.ts` | ✅ 已创建 | 意图分类器 |
| `response-gate.ts` | ✅ 已创建 | 回复质量门控 |
| `system-prompt.ts` | 🔄 待更新 | 加入 ReAct 框架 |
| `claude-agent.service.ts` | 🔄 待更新 | 集成三层架构 |
## 后续优化方向
1. **机器学习分类** - 用训练数据替代规则分类
2. **动态长度调整** - 根据反馈自动调整建议长度
3. **个性化门控** - 根据用户偏好调整检查规则
4. **A/B 测试** - 对比优化前后的用户满意度