125 lines
3.6 KiB
Markdown
125 lines
3.6 KiB
Markdown
|
|
# 自主Agent改进总结
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
成功将原来的固定RAG管道改造为基于Function Call的自主Agent系统。
|
|||
|
|
|
|||
|
|
## 主要改进
|
|||
|
|
|
|||
|
|
### 1. 架构变更
|
|||
|
|
|
|||
|
|
**原来的实现:**
|
|||
|
|
- 固定的两阶段RAG流程:工具调用 → 答案生成
|
|||
|
|
- 硬编码的工具调用序列
|
|||
|
|
- 无法根据上下文动态调整策略
|
|||
|
|
|
|||
|
|
**新的实现:**
|
|||
|
|
- 基于Function Call的自主Agent
|
|||
|
|
- LLM自主决策使用哪些工具
|
|||
|
|
- 支持多轮工具调用和迭代推理
|
|||
|
|
- 根据前面的输出动态调用后续工具
|
|||
|
|
|
|||
|
|
### 2. 技术实现
|
|||
|
|
|
|||
|
|
#### 配置更新 (`config.yaml`)
|
|||
|
|
```yaml
|
|||
|
|
llm:
|
|||
|
|
rag:
|
|||
|
|
# 新增自主Agent prompts
|
|||
|
|
agent_system_prompt: |
|
|||
|
|
You are an AI assistant with access to tools...
|
|||
|
|
synthesis_system_prompt: |
|
|||
|
|
You synthesize information from retrieved documents...
|
|||
|
|
synthesis_user_prompt: |
|
|||
|
|
User Query: {{user_query}}...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### LLM客户端增强 (`service/llm_client.py`)
|
|||
|
|
- 添加了 `bind_tools()` 方法支持function calling
|
|||
|
|
- 新增 `ainvoke_with_tools()` 方法处理工具调用
|
|||
|
|
- 支持流式响应和工具调用
|
|||
|
|
|
|||
|
|
#### 工具Schema定义 (`service/tools/schemas.py`)
|
|||
|
|
```python
|
|||
|
|
TOOL_SCHEMAS = [
|
|||
|
|
{
|
|||
|
|
"type": "function",
|
|||
|
|
"function": {
|
|||
|
|
"name": "retrieve_standard_regulation",
|
|||
|
|
"description": "Search for standard/regulation metadata...",
|
|||
|
|
"parameters": {...}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
...
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 自主Agent节点 (`service/graph/graph.py`)
|
|||
|
|
- **自主决策**:LLM分析问题并决定使用哪些工具
|
|||
|
|
- **迭代执行**:支持最多3轮工具调用迭代
|
|||
|
|
- **动态调整**:根据工具返回结果决定下一步行动
|
|||
|
|
- **错误处理**:完善的异常处理和降级机制
|
|||
|
|
|
|||
|
|
### 3. 工作流程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TD
|
|||
|
|
A[用户查询] --> B[Agent分析]
|
|||
|
|
B --> C{需要工具吗?}
|
|||
|
|
C -->|是| D[选择并调用工具]
|
|||
|
|
D --> E[处理工具结果]
|
|||
|
|
E --> F{需要更多工具?}
|
|||
|
|
F -->|是| D
|
|||
|
|
F -->|否| G[最终合成答案]
|
|||
|
|
C -->|否| G
|
|||
|
|
G --> H[返回答案]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 验证结果
|
|||
|
|
|
|||
|
|
通过API测试验证了以下功能:
|
|||
|
|
|
|||
|
|
✅ **自主工具选择**:Agent根据问题"电动汽车充电标准有哪些?"自动选择了两个工具
|
|||
|
|
- `retrieve_standard_regulation` - 获取标准元数据
|
|||
|
|
- `retrieve_doc_chunk_standard_regulation` - 获取详细文档内容
|
|||
|
|
|
|||
|
|
✅ **智能调用序列**:Agent按逻辑顺序执行工具调用,先获取概览信息,再获取详细内容
|
|||
|
|
|
|||
|
|
✅ **完整的响应流程**:
|
|||
|
|
1. 工具调用阶段(tool_start, tool_result事件)
|
|||
|
|
2. 答案合成阶段(agent_done事件)
|
|||
|
|
3. 后处理阶段(post_append事件)
|
|||
|
|
|
|||
|
|
## 与传统模式的对比
|
|||
|
|
|
|||
|
|
| 特性 | 原来的RAG管道 | 新的自主Agent |
|
|||
|
|
|------|--------------|-------------|
|
|||
|
|
| 工具选择 | 硬编码固定 | LLM自主决策 |
|
|||
|
|
| 执行策略 | 预定义序列 | 动态调整 |
|
|||
|
|
| 多轮推理 | 不支持 | 支持最多3轮 |
|
|||
|
|
| 上下文感知 | 有限 | 完整对话上下文 |
|
|||
|
|
| 错误恢复 | 基本 | 智能降级 |
|
|||
|
|
| Token效率 | 中等 | 优化(避免ReAct冗余) |
|
|||
|
|
|
|||
|
|
## 优势
|
|||
|
|
|
|||
|
|
1. **智能化**:根据问题复杂度和上下文自动调整策略
|
|||
|
|
2. **灵活性**:支持各种问题类型,不限于预定义场景
|
|||
|
|
3. **效率**:避免不必要的工具调用,减少Token消耗
|
|||
|
|
4. **可扩展**:易于添加新工具,Agent会自动学会使用
|
|||
|
|
5. **鲁棒性**:完善的错误处理和降级机制
|
|||
|
|
|
|||
|
|
## 使用方法
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 启动服务
|
|||
|
|
./scripts/start_service.sh
|
|||
|
|
|
|||
|
|
# 测试自主Agent
|
|||
|
|
uv run python scripts/test_autonomous_api.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 结论
|
|||
|
|
|
|||
|
|
成功实现了基于Function Call的自主Agent,相比原来的固定RAG管道,新系统具有更强的智能化、灵活性和扩展性,同时保持了高效的Token使用和可靠的错误处理能力。
|