22 行,全部重点在一句提示词里
对应清单 5.5
import asyncio
from agents import Agent, Runner, set_default_openai_api, set_tracing_disabled
from dotenv import load_dotenv
# 仓库原文没有这三行,是为了接第三方模型加的
load_dotenv()
set_default_openai_api("chat_completions")
set_tracing_disabled(True)
# 定义一个永远会一步步讲清自己推理过程的智能体
cot_agent = Agent(
name="TimeTravelerCoT",
instructions=(
"你是一个时间旅行问题的解答者。"
"请一步一步地推导出解法,然后再给出最终答案。"
),
)
# 一道时间旅行的例题
question = (
"从 2025 年出发,你先回到 10 年前,然后又前进 5 年。"
"你最终停在哪一年?"
)
# 运行智能体(异步环境里用 await,脚本里也可以用 Runner.run_sync)
result = asyncio.run(Runner.run(cot_agent, input=question))
print(result.final_output)
起作用的就是那半句:「请一步一步地推导出解法,然后再给出最终答案」。 没有工具、没有循环、没有第二个 agent。代价是多花几个 token,收益是算术题正确率明显上升。
回想第二章那句「LLM 是概率性的 token 机器」——它是一个词一个词往外蹦的, 而且吐出来的词会成为它下一个词的输入。你让它直接给答案, 它就得在一个 token 里「一步到位」;你让它先写过程, 那些中间步骤就变成了它自己的草稿纸,后面的推理能读到前面的结论。
所以 CoT 不是什么玄学,它是在给模型争取「算草稿」的空间。 这也解释了它的边界:草稿本身错了,它照样一路错到底—— 因为它没有任何办法验证自己。这正是后面三种形状要解决的。