13 - 推理能力:让 Agent “想清楚再回答”
一句话总结:通过
reasoning=True、reasoning_model和ReasoningTools三种方式,让 Agent 从”脱口而出”升级为”深思熟虑”。
快思考 vs 慢思考
你有没有发现,大模型有时候回答得太”快”了?
问它”一个商品先打八折再打九折,最终是几折”,它可能直接说”七折” – 错了。问它一个需要多步推理的逻辑题,它也经常跳步骤,给你一个看起来像回答但经不起推敲的结果。
这不是模型笨,而是它在”快思考”模式下跳过了推理过程。就像你口算 17 x 23,脑子里不打草稿很容易算错一样。
Agno 提供了三种方式给 Agent 加上”慢思考”能力,让它先想清楚再开口。
方法一:reasoning=True(最简单)
最直接的做法 – 加一个参数就行。Agno 会在 Agent 生成最终回答之前,先让它进行一轮逐步推理。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
reasoning=True,
instructions="你是一个逻辑推理专家,解决问题时要展示思考过程",
markdown=True,
)
agent.print_response(
"一个房间里有3只猫,每只猫看到2只其他猫。房间里一共有几只猫?",
stream=True,
)
开了 reasoning=True 之后,Agent 不会直接蹦出答案。它会先把问题拆开,一步一步想,最后再给你结论。你在输出里能看到类似”思考过程”的内容。
控制推理步数
默认情况下,Agent 最少推理 1 步,最多 10 步。你可以调整:
agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
reasoning=True,
reasoning_min_steps=2, # 至少想2步
reasoning_max_steps=5, # 最多想5步
markdown=True,
)
步数越多,思考越深入,但延迟也越高。简单问题 2-3 步就够了,复杂分析可以开到 5-10 步。
显示完整推理过程
调用 print_response 时可以控制推理过程的展示:
agent.print_response(
"一个农民有17只羊,除了9只都死了。还剩几只?",
stream=True,
show_full_reasoning=True, # 展示完整推理过程
)
show_full_reasoning=True 会把每一步推理的细节都打印出来,方便你调试和观察 Agent 的思维链。
方法二:reasoning_model(用更强的模型来想)
这个思路很妙 – 用一个便宜的模型负责最终输出,用一个更强的模型负责背后的推理。就像公司里实习生写报告,但有个资深员工帮他理清思路。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"), # 便宜模型:负责最终回答
reasoning_model=OpenAIChat(id="gpt-4o"), # 强模型:负责推理思考
instructions="你是一个数学老师,用中文解释解题过程",
markdown=True,
)
agent.print_response(
"如果一个商品打8折后又打9折,最终是原价的几折?",
stream=True,
)
执行流程是这样的:
- 用户的问题先发给
reasoning_model(gpt-4o),让它深入思考、拆解问题 - 推理结果传给主
model(gpt-4o-mini),由它组织语言、生成最终回答
这样做的好处是:推理质量高(因为用了更强的模型),但最终输出的成本低(因为用的是便宜模型)。对于大部分场景,这是性价比最好的方案。
配合 reasoning 参数一起用
reasoning_model 可以和 reasoning=True 以及步数参数组合使用:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
reasoning_model=OpenAIChat(id="gpt-4o"),
reasoning=True,
reasoning_min_steps=2,
reasoning_max_steps=5,
markdown=True,
)
agent.print_response(
"三个人住酒店,房费30元,每人交10元。后来老板说只要25元,"
"让服务员退5元。服务员偷了2元,退给每人1元。"
"每人实际交了9元,3x9=27,加上服务员的2元=29。少了1元去哪了?",
stream=True,
show_full_reasoning=True,
)
这个经典的”少了一块钱”的逻辑陷阱,模型在快思考模式下很容易掉进去。加了推理之后,它会先把账目一步步算清楚,然后告诉你这个问题本身的加法就是错的。
方法三:ReasoningTools(推理工具)
前两种方式是让 Agent 在回答之前先”内部思考”。第三种方式不太一样 – 它给 Agent 提供了两个工具:think 和 analyze,让 Agent 在解决问题的过程中随时可以”打草稿”。
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.reasoning import ReasoningTools
agent = Agent(
model=OpenAIChat(id="gpt-4o"),
tools=[ReasoningTools(add_instructions=True)],
instructions="你是一个分析师,解决问题时要深思熟虑",
markdown=True,
)
agent.print_response(
"一个人要带狐狸、鸡和一袋谷物过河。"
"船一次只能载人和一样东西。"
"狐狸会吃鸡,鸡会吃谷物。"
"怎么安全过河?",
stream=True,
)
think 和 analyze 是什么
这两个工具的作用:
- think – 打草稿。Agent 可以在这里写下”我觉得应该先带鸡过去”之类的中间想法,整理思路,规划下一步。就像你在纸上画示意图一样。
- analyze – 评估结果。Agent 做完一步之后,用这个工具来检查”我刚才的推理对不对”“下一步该怎么走”。
关键的一点:这些推理步骤不会直接展示给用户。Agent 在内部用工具调用的方式完成思考,最终只把结论呈现给你。
和其他工具配合
ReasoningTools 的真正威力在于它可以和其他工具一起用。比如一个需要搜索信息再做分析的场景:
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.reasoning import ReasoningTools
from agno.tools.websearch import WebSearchTools
agent = Agent(
model=OpenAIChat(id="gpt-4o"),
tools=[
ReasoningTools(add_instructions=True),
WebSearchTools(enable_news=False),
],
instructions="你是一个研究分析师,先搜索资料再做深入分析",
markdown=True,
)
agent.print_response(
"比较一下 Python 和 Rust 在 Web 后端开发中的优劣势",
stream=True,
)
Agent 的执行流程大概是:
- 调用
think:”我需要从性能、生态、学习曲线等角度来比较” - 调用 WebSearch 搜索相关资料
- 调用
analyze:”搜索结果显示 Rust 性能更好但生态较小…” - 再调用
think:”还需要考虑开发效率和团队技能…” - 最终输出结构化的对比分析
整个过程中,Agent 在”思考”和”行动”之间来回切换,每一步都有据可依。
三种方式怎么选
| 方式 | 原理 | 延迟 | 成本 | 适用场景 |
|---|---|---|---|---|
reasoning=True |
Agent 内部多步推理 | 中 | 低 | 简单逻辑题、数学题 |
reasoning_model |
用更强模型做推理 | 中高 | 中 | 需要高质量推理但控制输出成本 |
ReasoningTools |
工具调用式思考 | 高 | 高 | 复杂多步任务、需配合其他工具 |
简单的经验法则:
- 只需要 Agent 想一想再回答?用
reasoning=True - 想要推理质量高但不想输出模型太贵?用
reasoning_model - Agent 需要边查资料边分析、多步骤协作?用
ReasoningTools
当然你也可以混合使用。比如 reasoning=True + reasoning_model 是很常见的组合。
什么时候不需要推理
推理能力不是免费的午餐,它带来更高的延迟和成本。以下场景完全不需要开:
- 简单问答 – “Python 怎么读取 JSON 文件?”不需要推理。
- 翻译 – 直来直去,不需要”想”。
- 文本摘要 – 提炼信息不需要多步推理。
- 闲聊 – “今天天气真好”不需要逻辑链。
推理最有用的场景:
- 数学和逻辑题
- 多步规划(”帮我设计一个系统架构”)
- 需要权衡利弊的决策分析
- 容易掉进陷阱的脑筋急转弯
- 需要交叉验证信息的研究任务
性能考量
几个实用的建议:
-
不要给每个 Agent 都开推理 – 大部分 Agent 不需要。只有那些真正处理复杂问题的才需要。
-
先试 reasoning=True – 最轻量,如果效果够用就不需要升级到其他方案。
-
reasoning_model 选对模型很重要 – 推理模型不需要和主模型是同一个提供商。你可以用 OpenAI 的模型做推理,用更便宜的模型做输出。
-
ReasoningTools 的开销最大 – 每次 think/analyze 都是一次工具调用,会增加 token 消耗。只在确实需要”边做边想”的场景下使用。
-
调整 max_steps – 默认 10 步对大部分场景偏多。从 3-5 步开始试,按需调整。
今天学了什么
回顾一下关键要点:
- reasoning=True 是最简单的方式,让 Agent 在回答前先进行逐步推理
- reasoning_model 允许你用一个更强的模型专门负责推理,主模型负责输出
- ReasoningTools 提供
think和analyze两个工具,让 Agent 在执行过程中随时”打草稿” - reasoning_min_steps / reasoning_max_steps 控制推理步数
- show_full_reasoning=True 可以在输出中展示完整的推理过程
- 推理不是万金油,只在需要深度思考的场景下使用
- 三种方式可以按需组合,不冲突
下一篇预告
14 - 学习系统:让 Agent 从经验中进步
推理让 Agent 想得更深,但每次都从零开始想。如果 Agent 能从过去的经验中学习,下次遇到类似问题直接用之前的最佳策略呢?下一篇我们聊 Agno 的学习系统 – 让 Agent 越用越聪明。