3.6 KiB
3.6 KiB
自主Agent改进总结
概述
成功将原来的固定RAG管道改造为基于Function Call的自主Agent系统。
主要改进
1. 架构变更
原来的实现:
- 固定的两阶段RAG流程:工具调用 → 答案生成
- 硬编码的工具调用序列
- 无法根据上下文动态调整策略
新的实现:
- 基于Function Call的自主Agent
- LLM自主决策使用哪些工具
- 支持多轮工具调用和迭代推理
- 根据前面的输出动态调用后续工具
2. 技术实现
配置更新 (config.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)
TOOL_SCHEMAS = [
{
"type": "function",
"function": {
"name": "retrieve_standard_regulation",
"description": "Search for standard/regulation metadata...",
"parameters": {...}
}
},
...
]
自主Agent节点 (service/graph/graph.py)
- 自主决策:LLM分析问题并决定使用哪些工具
- 迭代执行:支持最多3轮工具调用迭代
- 动态调整:根据工具返回结果决定下一步行动
- 错误处理:完善的异常处理和降级机制
3. 工作流程
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按逻辑顺序执行工具调用,先获取概览信息,再获取详细内容
✅ 完整的响应流程:
- 工具调用阶段(tool_start, tool_result事件)
- 答案合成阶段(agent_done事件)
- 后处理阶段(post_append事件)
与传统模式的对比
| 特性 | 原来的RAG管道 | 新的自主Agent |
|---|---|---|
| 工具选择 | 硬编码固定 | LLM自主决策 |
| 执行策略 | 预定义序列 | 动态调整 |
| 多轮推理 | 不支持 | 支持最多3轮 |
| 上下文感知 | 有限 | 完整对话上下文 |
| 错误恢复 | 基本 | 智能降级 |
| Token效率 | 中等 | 优化(避免ReAct冗余) |
优势
- 智能化:根据问题复杂度和上下文自动调整策略
- 灵活性:支持各种问题类型,不限于预定义场景
- 效率:避免不必要的工具调用,减少Token消耗
- 可扩展:易于添加新工具,Agent会自动学会使用
- 鲁棒性:完善的错误处理和降级机制
使用方法
# 启动服务
./scripts/start_service.sh
# 测试自主Agent
uv run python scripts/test_autonomous_api.py
结论
成功实现了基于Function Call的自主Agent,相比原来的固定RAG管道,新系统具有更强的智能化、灵活性和扩展性,同时保持了高效的Token使用和可靠的错误处理能力。