ReAct(Reasoning + Action)是一种让大语言模型(LLM)自主完成任务的核心架构。与传统直接生成答案的模式不同,ReAct 要求代理交替执行以下两步:
推理(Reasoning):分析当前状态,规划下一步行动
行动(Action):调用工具(Tools)获取信息或执行操作
典型案例:
用户问:“特斯拉当前股价是多少?相比去年同期涨了多少百分比?”传统 LLM 可能直接编造数据,而 ReAct 代理会:
调用金融API获取当前股价
查询历史数据库找出去年同期股价
使用计算工具执行百分比运算
这与人类解决问题的方式类似:
我们思考该做什么
执行某项操作(例如查找某些内容或进行计算),
观察结果
然后将其融入到我们的下一个想法中。
工具是实现行动的关键,需满足 3 个设计原则:
原子性:每个工具只做一件事(如 Calculator 仅负责计算)
强契约:明确定义输入/输出格式(如 JSON Schema)
安全性:隔离高风险操作(如数据库写入需权限控制)
from math import sqrt tools = [ Tool( name="GoogleSearch", func=search_api, # 对接搜索引擎API description="获取实时信息,输入:搜索关键词" ), Tool( name="Calculator", func=lambda x: eval(x), # 注意:生产环境需替换为安全计算库 description="执行数学计算,输入:数学表达式" ), Tool( name="DataPlotter", func=generate_chart, # 数据可视化工具 description="生成折线图,输入:{x:[1,2,3], y:[4,5,6]}" ) ]
你是一个自主代理,请通过以下步骤解决问题: 1. 思考:分析当前需要什么信息 2. 行动:调用工具获取信息(格式:ACTION: 工具名(参数)) 3. 观察:记录工具返回结果 4. 循环直到得出最终答案 当前任务:{query} 历史记录: {memory} 请输出下一步指令:
思考:需要知道2024年奥斯卡最佳影片 ACTION: GoogleSearch("2024 Oscar best picture winner") 观察:"《奥本海默》获得2024年奥斯卡最佳影片" 思考:用户还要求主演名单 ACTION: GoogleSearch("Oppenheimer cast") 观察:"基里安·墨菲、艾米莉·布朗特..." 思考:答案已完整 FINAL_ANSWER: 最佳影片是《奥本海默》,主演包括...
原生实现后需考虑五大增强方向:
短路机制:当工具返回明确结果时跳过冗余思考
if "答案直接可见" in tool_result: return tool_result # 提前终止循环
错误回退:工具调用失败时尝试替代方案
令牌压缩:用摘要替代完整历史记录减少 token 消耗
动态工具加载:运行时按需加载工具降低内存占用
置信度阈值:低置信度时要求人工干预
推荐策略:用原生实现理解原理 → 在 CrewAI 中实践复杂任务 → 定制框架扩展点