learning
实现多步推理
当前阅读:进阶视角
本单元目标
学完本单元后,你将能够基于 ReAct 模式设计一个具备“思考-行动-观察”循环的 Agent,使其在面对需要多步推理的复杂任务时,能够自主决策并完成工具调用,而非依赖预设的线性流程。
概念讲解
当任务不再是“查天气”这种单步操作,而是“帮我规划一个包含交通、住宿和景点的三天北京行程”时,传统的提示词工程就会失效——因为你无法预写所有分支。ReAct(Reason + Act)模式正是为此而生。它的核心思想是:让大模型在每一轮迭代中交替输出 Thought(推理)、Action(行动) 和 Observation(观察) 三个字段。Thought 是模型对当前状态的推理,例如“用户需要交通方案,我需要先查询高铁时刻表”;Action 是具体的工具调用指令,例如 `search_train("北京", "上海")`;Observation 是工具返回的结果,例如“最早班次为 G1,07:00 发车”。模型将 Observation 作为下一轮 Thought 的输入,循环往复,直到它认为信息足够,输出 Final Answer。
关键在于,这个循环不是预先编排的,而是由模型根据中间结果动态决定下一步。这赋予了 Agent 一种“试错与修正”的能力:如果查询结果不理想,它可以换一个关键词重新搜索;如果信息互相冲突,它可以发起二次验证。ReAct 本质上将推理轨迹外显化,让每一步决策都可追溯、可干预,这也是它与单纯“工具调用”或“思维链”提示的本质区别。
实操演练
- 定义一个工具函数字典,例如 `tools = {"search": search_func, "calc": calc_func}`,每个函数附带描述其用途的字符串元数据。
- 在系统提示词中明确要求模型按 JSON 格式输出 `{"thought": "...", "action": "tool_name", "action_input": "..."}`,并规定当任务完成时输出 `{"final_answer": "..."}`。
- 编写主循环:将用户问题与历史消息发送给模型,解析返回的 JSON;若含 `action`,则调用对应工具函数,将结果以“Observation”角色追加到消息历史中,然后再次调用模型。
- 设置最大迭代次数(如 5 次)作为熔断机制,防止模型陷入无限循环。
- 当模型输出 `final_answer` 时,终止循环并返回该答案;若超限,则返回最后一条 Thought 作为部分结果。
练习任务
- 基于 ReAct 模式实现一个“多源信息核验”Agent:给定一个存在争议的事实(如“某城市今日是否限行”),让它至少调用两个不同的搜索工具(模拟),并输出对比后的结论。
- 为上述 Agent 增加一个“自我纠错”场景:当第一次工具调用返回空结果时,观察模型是否会自主修改查询关键词并重试,记录其完整的 Thought-Action-Observation 轨迹。