1. Agent-Chat模式架构解析
Agent-Chat模式是一种基于大语言模型(LLM)的智能对话系统架构,其核心在于通过工具调用(Tool Calling)实现动态决策和任务执行。与传统Chat模式相比,它具备以下技术特点:
- 工具动态编排:根据用户意图自动选择API工具
- 多轮推理:通过循环调用LLM实现复杂任务分解
- 状态持久化:完整记录Agent思考过程和工具调用轨迹
典型应用场景包括:
- 需要调用外部API的查询(天气、股票等)
- 多步骤任务处理(订票、购物等)
- 需要实时数据验证的问答场景
2. 核心流程实现细节
2.1 请求处理链路
完整的请求处理涉及三个关键层次:
python复制HTTP请求 → API层 → 服务层 → 执行层
具体代码路径:
- API入口:
api/controllers/console/app/completion.py的ChatMessageApi.post() - 服务分发:
AppGenerateService.generate() - 执行引擎:
AgentChatAppGenerator.generate()
关键设计:采用分层架构隔离业务逻辑与实现细节,便于后续扩展不同对话模式
2.2 数据持久化设计
消息存储采用预创建模式,主要涉及4张核心表:
| 表名 | 字段说明 | 存储时机 |
|---|---|---|
| Conversation | 对话元信息(app_id, mode等) | 首次请求时创建 |
| Message | 用户查询和AI回复 | 请求到达立即创建 |
| MessageAgentThought | Agent推理过程记录 | 每次工具调用后保存 |
| MessageFile | 消息关联文件信息 | 文件上传时保存 |
特殊字段处理:
message字段初始为空,最终保存完整promptanswer字段流式更新,记录生成过程中的文本增量
3. Agent执行引擎剖析
3.1 双模式执行策略
系统根据模型能力自动选择执行策略:
mermaid复制graph TD
A[模型支持function calling?] -->|是| B[FunctionCallAgentRunner]
A -->|否| C[CotChatAgentRunner]
Function Calling模式特点:
- 模型原生支持工具调用语法
- 自动解析工具参数格式
- 支持并行工具调用
CoT(Chat of Thought)模式特点:
- 通过自然语言指导工具使用
- 需要额外提示词工程
- 单次执行单个工具
3.2 工具调用循环流程
Function Calling模式的核心循环:
python复制while True:
llm_result = model.invoke_llm(prompt_messages)
if not llm_result.tool_calls:
break # 退出条件
for tool_call in llm_result.tool_calls:
tool_output = ToolEngine.execute(
tool_call.name,
tool_call.arguments
)
prompt_messages.append(tool_output) # 将结果加入上下文
每次循环包含以下关键操作:
- 记录AgentThought到数据库
- 执行工具并获取结果
- 将工具结果格式化后加入prompt
- 发布工具调用事件到消息队列
4. 流式传输实现方案
4.1 事件驱动架构
系统采用生产者-消费者模式处理流式事件:
code复制Worker线程(生产者) → QueueManager → SSE管道(消费者)
支持的事件类型包括:
- LLM文本块(QueueLLMChunkEvent)
- Agent思考过程(QueueAgentThoughtEvent)
- 工具调用结果(QueueAgentMessageEvent)
- 结束信号(QueueMessageEndEvent)
4.2 SSE响应格式规范
事件标准结构:
json复制{
"event": "message",
"data": {
"conversation_id": "conv_123",
"message_id": "msg_456",
"answer": "正在查询天气...",
"metadata": {
"tool_used": "weather_api"
}
}
}
特殊事件处理:
message_end事件触发数据库最终更新error事件立即终止流式连接agent_thought事件携带推理过程详情
5. 性能优化实践
5.1 异步处理设计
关键异步操作点:
- Worker线程与主请求线程分离
- 数据库写入采用批量提交
- 工具调用支持超时熔断
线程管理示例代码:
python复制def _generate_worker():
try:
runner = AgentChatAppRunner(...)
runner.run()
except Exception as e:
QueueManager.publish_error(e)
thread = threading.Thread(target=_generate_worker)
thread.start()
5.2 缓存策略
三级缓存体系:
- 对话上下文缓存:最近3轮对话的原始prompt
- 工具结果缓存:TTL=5分钟的API响应缓存
- 模型输出缓存:相同prompt的LLM结果缓存
缓存键设计:
python复制cache_key = f"{app_id}:{hash(prompt_messages)}"
6. 问题排查指南
6.1 常见错误代码
| 错误码 | 原因 | 解决方案 |
|---|---|---|
| 502 | Worker线程崩溃 | 检查工具调用超时设置 |
| 504 | LLM响应超时 | 调整model_instance超时参数 |
| 422 | 工具参数验证失败 | 检查function calling schema |
6.2 日志分析要点
关键日志位置:
- Agent决策日志:
logs/agent_thought.log - 工具调用日志:
logs/tool_invoke.log - 流式事件日志:
logs/sse_event.log
典型错误日志模式:
code复制[ERROR] ToolExecutionTimeout: weather_api (3.2s > 3.0s)
[WARNING] LLMResponseFormatError: Missing required field 'tool_calls'
7. 扩展开发建议
7.1 自定义工具开发
工具接口规范:
python复制class CustomTool(BaseTool):
name = "my_tool"
description = "工具功能描述"
def invoke(self, params: dict):
# 实现工具逻辑
return {
"result": "...",
"metadata": {...}
}
注册方式:
python复制ToolEngine.register_tool(CustomTool())
7.2 监控指标埋点
建议监控的关键指标:
- 工具调用耗时百分位(TP99/TP95)
- LLM响应token速率(tokens/sec)
- 流式事件延迟(event_latency)
Prometheus示例配置:
yaml复制metrics:
tool_invoke_duration:
type: histogram
labels: [tool_name]
llm_response_size:
type: counter
labels: [model_type]
实际部署中发现,合理的工具超时设置(建议2-5秒)能显著提升系统稳定性。对于高频工具,实现本地缓存可使响应速度提升40%以上。