FEATURED · 精选文章

ReAct模式:AI Agent的思考与行动循环详解

发布时间 / 2026/9/13 12:48:08
来源 / 创域科博编辑部
栏目 / 资讯中心
ReAct模式:AI Agent的思考与行动循环详解 1. ReAct模式AI Agent的思考与行动循环ReActReasoning Acting模式是当前AI Agent开发中最主流的设计范式之一。这种模式的核心在于模拟人类的认知过程——不是一次性给出答案而是通过思考-行动-观察的循环逐步解决问题。我在实际开发中发现这种渐进式的方法特别适合需要结合外部工具或实时数据的任务场景。1.1 ReAct的核心工作机制ReAct的工作流程可以分解为四个关键阶段思考ThoughtAgent分析当前问题和已有信息决定下一步行动行动Action选择合适工具并执行具体操作观察Observation获取工具执行结果新一轮思考评估结果并决定继续或终止这种循环机制使得Agent能够处理比LLM自身知识范围更广的任务。例如在股票价格比较的场景中Thought: 我需要获取青岛啤酒的股票收盘价 Action: get_closing_price Action Input: {name: 青岛啤酒} Observation: 67.92 Thought: 现在需要获取贵州茅台的收盘价 Action: get_closing_price Action Input: {name: 贵州茅台} Observation: 1488.21 Final Answer: 贵州茅台的股票收盘价更高1.2 三种主流实现方案1.2.1 基础文本解析方案这是最原始的ReAct实现方式通过Prompt工程让LLM输出特定格式的文本然后手动解析const REACT_PROMPT You run in a loop of Thought, Action, Action Input, PAUSE, Observation. Available actions: {tools} Example: Question: 今天北京天气怎么样 Thought: 我需要调用get_weather工具 Action: get_weather Action Input: {city: BeiJing} PAUSE Observation: 北京的气温是0度 Final Answer: 北京的气温是0度 New input: {input} ;这种方案的优点是实现简单但缺点也很明显需要复杂的文本解析且容易因LLM输出格式不规范导致流程中断。1.2.2 函数调用方案现代LLM API如OpenAI提供了原生函数调用支持大幅简化了实现async function functionCallAgent(query: string) { const messages [{role: user, content: query}]; while (true) { const response await client.chat.completions.create({ model: gpt-4o, messages, tools: [{ type: function, function: { name: get_closing_price, description: 获取股票收盘价, parameters: { type: object, properties: { name: { type: string } } } } }] }); const toolCalls response.choices[0]?.message?.tool_calls; if (!toolCalls) return response.choices[0]?.message?.content; for (const toolCall of toolCalls) { const result await toolRegistry[toolCall.function.name]( JSON.parse(toolCall.function.arguments) ); messages.push({ role: tool, content: result, tool_call_id: toolCall.id }); } } }这种方案利用LLM原生功能不再需要复杂的文本解析稳定性和可维护性显著提升。1.2.3 LangGraph状态机方案对于复杂场景可以使用LangChain的LangGraph构建状态机import {StateGraph, END} from langchain/langgraph; const workflow new StateGraph() .addNode(agent, callModel) .addNode(tools, callTools) .addEdge(__start__, agent) .addConditionalEdges(agent, shouldContinue) .addEdge(tools, agent); const app workflow.compile();LangGraph将Agent执行为状态图每个节点代表特定操作边定义转移条件。这种架构特别适合需要记忆、反思等高级功能的复杂Agent。1.3 关键实现细节与避坑指南1.3.1 工具设计的黄金法则原子性每个工具应只完成一个明确的小任务自描述工具的描述要足够清晰让LLM能准确理解其用途错误处理工具应返回结构化错误信息而非原始异常// 好的工具定义示例 { name: get_weather, description: 获取指定城市当前天气状况包括温度和天气现象, parameters: { type: object, properties: { city: { type: string, description: 城市全称如北京市 } }, required: [city] } }1.3.2 循环终止条件必须设置合理的终止条件避免无限循环最大迭代次数通常10-15次足够超时机制单个任务不超过2分钟明确终止词Final Answer等标记要统一let iterations 0; const MAX_ITERATIONS 10; while (iterations MAX_ITERATIONS) { // ReAct循环逻辑 if (response.includes(Final Answer:)) { return extractFinalAnswer(response); } }1.3.3 实战中的经验教训Token消耗优化随着对话轮次增加历史消息会迅速膨胀。解决方案定期摘要历史消息移除不相关的中间步骤使用GPT-4-turbo等长上下文模型错误恢复策略try { await toolCall(); } catch (error) { // 将错误信息作为Observation返回 return { messages: [{ role: user, content: 工具执行出错: ${error.message} }] }; }工具选择优化当多个工具可能适用时在工具描述中添加排他性说明提供工具选择示例必要时引入工具选择评分机制2. ReAct模式的高级应用技巧2.1 动态工具加载机制在实际项目中工具集可能需要动态变化。我们可以实现工具的热加载class ToolRegistry { private tools new Mapstring, Tool(); register(tool: Tool) { this.tools.set(tool.name, tool); this.updateLLMTools(); } private updateLLMTools() { this.llm.updateTools([...this.tools.values()]); } }这种设计允许在运行时添加新工具例如当用户上传自定义插件时。2.2 多Agent协作模式复杂任务可以分解给多个专业Agent协作完成[任务] 分析某公司股票是否值得投资 1. 数据采集Agent获取财务数据、新闻舆情 2. 分析Agent计算财务指标、风险评估 3. 报告生成Agent整理专业投资建议实现框架示例const researchAgent createReactAgent({/* 配置 */}); const analysisAgent createReactAgent({/* 配置 */}); const reportAgent createReactAgent({/* 配置 */}); async function analyzeStock(symbol: string) { const data await researchAgent.invoke(获取${symbol}相关数据); const insights await analysisAgent.invoke(分析数据${data}); return reportAgent.invoke(生成投资报告${insights}); }2.3 混合推理策略结合不同策略提升效果CoTReAct混合先进行链式思考Chain-of-Thought再进入ReAct循环并行推理同时生成多个可能的行动路径选择最优回溯机制当陷入死胡同时回退到上一步def hybrid_agent(question): # 第一步生成推理链 cot_prompt f请分析以下问题并给出解决思路 问题{question} 分步思考 reasoning llm.generate(cot_prompt) # 第二步基于推理链执行ReAct react_agent ReActAgent(initial_contextreasoning) return react_agent.run(question)3. 性能优化与监控3.1 关键指标监控建立完善的监控体系指标预警阈值测量方法平均回合数8统计完整任务执行过程工具调用错误率15%错误调用/总调用平均响应时间5s端到端计时Token消耗/任务2000API返回统计3.2 缓存策略对稳定数据实施缓存const cachedFetch async (url: string) { const cacheKey cache:${md5(url)}; const cached await redis.get(cacheKey); if (cached) return JSON.parse(cached); const data await fetch(url); await redis.setex(cacheKey, 3600, JSON.stringify(data)); // 缓存1小时 return data; };3.3 极限情况处理工具不可用实现备用工具机制API限流自动退避重试敏感操作人工确认机制async function callWithRetry(fn, maxRetries 3) { let lastError; for (let i 0; i maxRetries; i) { try { return await fn(); } catch (error) { lastError error; if (error.status 429) { await sleep(1000 * (i 1)); } } } throw lastError; }4. 典型应用场景剖析4.1 金融数据分析场景特点需要实时市场数据涉及复杂计算结果准确性要求高实现方案tools [ Tool( nameget_stock_data, funcget_stock_data, desc获取股票历史数据包括开盘价、收盘价等 ), Tool( namecalculate_indicators, funccalculate_technical_indicators, desc计算技术指标如RSI、MACD ) ] agent ReActAgent(toolstools) result agent.run(分析AAPL过去三个月的技术指标趋势)4.2 智能客服系统特殊考虑需要访问知识库处理模糊查询多轮对话支持增强设计class CustomerSupportAgent { constructor() { this.tools [ searchKnowledgeBase, checkOrderStatus, escalateToHuman ]; this.memory new ConversationMemory(); } async handleQuery(query) { const enrichedQuery await this.memory.enrich(query); return reactAgent.run(enrichedQuery); } }4.3 科研辅助工具独特需求文献检索与摘要数据可视化学术规范检查工具配置示例research_tools [ Tool( namesearch_scholar, funcgoogle_scholar_search, desc搜索学术文献 ), Tool( namegenerate_chart, funcplot_data, desc生成数据图表 ), Tool( namecheck_citation, funcvalidate_citation, desc检查引用格式 ) ]5. 前沿发展与优化方向5.1 自动工具学习最新研究尝试让Agent自动发现和使用工具工具描述生成自动创建清晰准确的工具说明相似工具推荐根据任务推荐相关工具工具组合学习自动发现工具链式调用模式5.2 强化学习优化使用RL优化ReAct决策奖励设计减少不必要的工具调用策略学习优化工具选择策略离线训练基于历史交互数据微调5.3 可视化调试工具开发专用调试界面执行轨迹可视化图形化展示思考过程工具调用分析统计工具使用情况性能分析识别耗时瓶颈const debugInfo { timeline: [ { type: thought, content: 需要查询天气 }, { type: action, tool: get_weather }, { type: observation, result: 22°C sunny } ], metrics: { totalTime: 1240ms, tokensUsed: 856, toolsCalled: 1 } };6. 避坑指南与最佳实践6.1 常见陷阱工具描述模糊导致LLM误用工具错误示例处理数据正确示例计算数组元素的平均值输入格式{values: number[]}缺乏错误处理单个工具失败导致整个任务中断过度依赖LLM应该把专业工作交给专用工具6.2 性能优化检查清单[ ] 工具响应时间监控[ ] 冗余调用分析[ ] 上下文长度管理[ ] 缓存策略评估[ ] 错误恢复测试6.3 安全防护措施工具权限控制const SAFE_TOOLS [search, calculate]; if (!SAFE_TOOLS.includes(toolName)) { throw new Error(工具${toolName}未授权); }输入验证def sanitize_input(input): if isinstance(input, dict): return {k: sanitize_input(v) for k,v in input.items()} if isinstance(input, str): return input.replace(, lt;) return input执行隔离# Docker容器中运行不可信工具 docker run --rm -i tool-container input.json在实际项目中ReAct模式的实现需要根据具体需求不断调整和优化。经过多个项目的实践验证我发现良好的工具设计和完善的监控机制是成功的关键因素。建议从简单任务开始逐步扩展复杂度同时建立全面的测试用例库确保Agent行为的可靠性和稳定性。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻