Agno 推理引擎与逐步思考
Agno 推理引擎与逐步思考
学习目标
本章将分析 Agno 的推理系统:
reasoning=True启用默认推理引擎reasoning_model/reasoning_agent自定义推理模型reasoning_min_steps/reasoning_max_steps控制思考深度- 10+ 提供商的推理实现
前置知识
建议先阅读:
- Agent 核心循环设计 — Session/Turn 循环与推理集成点
下文假设你已理解上述概念,直接聚焦 Agno 的具体实现。
项目实践
三种推理模式
Agno 支持三种推理配置:
# 模式 1:启用默认推理引擎agent = Agent( model=OpenAIResponses(id="gpt-4o"), reasoning=True, # 使用默认推理引擎)
# 模式 2:自定义推理模型agent = Agent( model=OpenAIResponses(id="gpt-4o"), reasoning_model=OpenAIResponses(id="o3"), # 使用专门的推理模型)
# 模式 3:自定义推理 Agentagent = Agent( model=OpenAIResponses(id="gpt-4o"), reasoning_agent=Agent( # 完全自定义推理逻辑 model=AnthropicClaude(id="claude-opus-4-8"), instructions="请逐步分析问题,考虑多种可能性。", ),)步数控制
agent = Agent( reasoning=True, reasoning_min_steps=1, # 最少思考步数 reasoning_max_steps=10, # 最多思考步数)步数含义:
min_steps=1:即使问题简单,也至少进行一步推理max_steps=10:防止无限思考循环
推理管线
推理在主管线步骤 8 执行(handle_reasoning),在模型调用之前:
推理结果作为额外的上下文注入系统提示,帮助主模型做出更好的决策。
提供商实现
Agno 的 reasoning/ 目录包含 10+ 提供商的推理实现:
| 提供商 | 文件 | 推理方式 |
|---|---|---|
| OpenAI | openai.py | o 系列模型的 reasoning_content |
| Anthropic | anthropic.py | 扩展思考(extended thinking) |
| Gemini | gemini.py | 推理模式 |
| DeepSeek | deepseek.py | DeepSeek-R1 推理 |
| Groq | groq.py | 推理模型 |
| Ollama | ollama.py | 本地推理模型 |
| Azure AI Foundry | azure_ai_foundry.py | Azure 推理 |
| Vertex AI | vertexai.py | Google 推理 |
推理与工具调用的交互
推理步骤在工具调用之前执行。这意味着:
- 推理结果可以帮助 Agent 更好地选择工具
- 推理不会在工具调用之间重复执行(只执行一次)
- 如果工具返回的结果需要进一步推理,由主循环决定是否需要新一轮推理
问题与规避
1. 推理步骤的额外延迟
每一步推理都需要一次 LLM 调用。max_steps=10 可能增加 10 倍的延迟。
规避:
- 对于简单任务,设置
reasoning_max_steps=1 - 使用更便宜的推理模型(如通过
reasoning_model指定) - 监控推理效果与延迟的权衡
2. 推理结果注入上下文导致膨胀
推理过程可能产生大量中间文本,占用上下文窗口。
规避:
- 推理引擎可以配置摘要模式(只保留最终推理结果)
- 结合上下文压缩(
compress_tool_results=True) - 使用支持更大上下文窗口的模型
3. 推理与结构化输出的冲突
如果 Agent 同时启用了推理和结构化输出(output_schema),推理结果可能影响结构化输出的格式。
规避:推理结果注入系统提示,不影响输出格式。但如果推理 Agent 的输出格式与期望不符,可能导致解析失败。确保推理 Agent 的指令包含格式要求。
设计取舍
为什么推理在工具调用之前?
优势:推理帮助 Agent 做出更好的工具选择决策,避免盲目调用 代价:如果工具返回的结果需要进一步推理,无法在工具调用后自动触发新一轮推理 替代方案:在每次工具调用后都进行推理——更全面但延迟更高
为什么默认 reasoning_min_steps=1?
优势:确保即使简单问题也有一定的思考深度 代价:对于显而易见的问题(如”1+1=?”),推理步骤可能是不必要的开销 替代方案:默认 0——让模型直接回答,不调用推理