Agent学习-ReAct框架

ReAct 框架学习笔记

一、什么是 ReAct?

ReAct(Reasoning and Acting)是一种将**推理(Reasoning)行动(Acting)**相结合的 AI Agent 框架。它让大语言模型能够:

  • 通过思考来分析问题
  • 调用外部工具获取信息
  • 基于观察结果继续推理
  • 最终得出答案

核心思想:Think → Act → Observe → Think → ...


二、ReAct 的工作流程

2.1 核心循环

复制代码
1. Thought(思考):分析当前问题,规划下一步
2. Action(行动):调用工具或输出答案
3. Observation(观察):获取工具执行结果
4. 重复 1-3,直到得出最终答案

2.2 实现架构

python 复制代码
class ReActAgent:
    - llm_client: 大语言模型客户端
    - tool_executor: 工具执行器
    - max_steps: 最大迭代步数
    - history: 历史记录(Action + Observation)

三、关键技术细节

3.1 提示词设计

关键要素:

  • 当前时间:让模型知道当前日期,避免搜索过时信息
  • 工具列表:明确可用工具及其用法
  • 格式规范:严格定义 Thought/Action 输出格式
  • 历史记录:提供之前的 Action-Observation 对

示例:

复制代码
当前时间:2026年03月15日

可用工具:
- Search[query]: 网页搜索

格式:
Thought: 你的思考
Action: Tool[input] 或 Finish[答案]

Question: 华为最新的手机是什么?
History: [之前的交互记录]

3.2 输出解析

三个关键解析函数:

  1. _parse_output(text): 从 LLM 响应中提取 Thought 和 Action
  2. _parse_action(action_text): 解析 Action 格式 ToolName[input]
  3. _parse_action_input(action_text): 提取 Action 的输入参数

注意事项:

  • 需要处理 LLM 输出的格式变化(如反引号)
  • 使用正则表达式进行鲁棒解析
  • 支持 re.DOTALL 处理多行输入

3.3 历史记录管理

每次工具调用后,将 Action 和 Observation 追加到历史:

python 复制代码
self.history.append(f"Action: {action}")
self.history.append(f"Observation: {observation}")

这让模型能够基于之前的结果继续推理。


四、实际案例分析

4.1 问题:华为最新的手机是什么?

执行过程:

第 1 步:

  • Thought: 需要搜索最新信息,我的知识可能过时
  • Action: Search[华为最新手机型号 2026年]
  • Observation: 返回华为 Mate X6、Pura 系列等信息

第 2 步:

  • Thought: 需要确认 Mate X6 的详细配置和卖点
  • Action: Search[华为Mate X6 2026年 主要卖点 配置]
  • Observation: 获取折叠屏、电池、摄像头等详细信息

第 3 步:

  • Thought: 已收集足够信息,可以回答
  • Action: Finish[华为最新手机是 Mate X6...]

4.2 关键改进点

问题:模型搜索时带了错误年份(2023)

原因:

  • 提示词中没有提供当前时间
  • 模型使用了训练数据的截止日期

解决方案:

python 复制代码
current_date = datetime.now().strftime("%Y年%m月%d日")
prompt = REACT_PROMPT_TEMPLATE.format(
    current_date=current_date,  # 关键:注入当前时间
    tools=tools_desc,
    question=question,
    history=history_str
)

五、ReAct 的优势

✅ 1. 可解释性强

  • 每一步都有明确的 Thought(思考过程)
  • 用户可以看到 Agent 的推理链路
  • 便于调试和优化

✅ 2. 灵活性高

  • 可以动态调用多种工具
  • 支持多步推理和信息整合
  • 适应复杂的多步骤任务

✅ 3. 容错能力

  • 通过历史记录纠正错误
  • 可以根据 Observation 调整策略
  • 支持重试和备选方案

✅ 4. 易于扩展

  • 添加新工具只需注册到 ToolExecutor
  • 提示词模板可灵活调整
  • 支持不同的 LLM 后端

✅ 5. 实时信息获取

  • 通过搜索工具获取最新数据
  • 突破 LLM 知识截止日期限制
  • 适合需要实时信息的场景

六、ReAct 的缺点

❌ 1. Token 消耗大

  • 每步都需要完整的提示词(工具列表 + 历史记录)
  • 历史记录随步数增长而膨胀
  • 成本随迭代次数线性增长

示例:

复制代码
第1步:提示词 1000 tokens
第2步:提示词 1000 + 历史 200 = 1200 tokens
第3步:提示词 1000 + 历史 400 = 1400 tokens

❌ 2. 响应速度慢

  • 每步都需要调用 LLM(串行执行)
  • 无法并行处理独立任务
  • 多步推理导致总延迟高

❌ 3. 依赖 LLM 能力

  • 弱模型可能无法正确遵循格式
  • 输出解析容易失败(格式不规范)
  • 需要强大的推理能力才能有效规划

❌ 4. 容易陷入循环

  • 可能重复执行相同的 Action
  • 缺乏全局规划能力
  • 需要设置 max_steps 防止无限循环

❌ 5. 工具调用开销

  • 每次工具调用都有网络延迟
  • 搜索 API 可能有速率限制
  • 工具失败会浪费一个步数

❌ 6. 提示词工程复杂

  • 需要精心设计格式规范
  • 不同模型可能需要不同的提示词
  • 难以处理边界情况(如模型输出反引号)

七、优化建议

7.1 减少 Token 消耗

  • 压缩历史记录(只保留关键信息)
  • 使用更小的模型处理简单步骤
  • 实现历史记录摘要机制

7.2 提升响应速度

  • 使用流式输出(边生成边解析)
  • 缓存常用工具结果
  • 并行调用独立工具

7.3 增强鲁棒性

  • 添加输出格式校验和重试机制
  • 检测循环并主动打破
  • 提供更多示例(Few-shot)

7.4 改进规划能力

  • 在开始前生成完整计划
  • 使用更强的模型(如 GPT-4)
  • 结合其他框架(如 Plan-and-Execute)

八、总结

ReAct 是一个简单但强大的 Agent 框架,特别适合:

  • 需要多步推理的复杂任务
  • 需要调用外部工具的场景
  • 需要可解释性的应用

但要注意其成本和速度问题,在生产环境中需要权衡:

  • 任务复杂度 vs Token 成本
  • 响应速度 vs 推理质量
  • 通用性 vs 针对性优化

适用场景:

  • ✅ 信息检索和整合
  • ✅ 数据分析和报告生成
  • ✅ 客服和问答系统
  • ✅ 研究助手和知识探索

不适用场景:

  • ❌ 实时性要求极高的应用
  • ❌ 简单的单步任务
  • ❌ 成本敏感的大规模部署
  • ❌ 需要精确控制的确定性任务
相关推荐
AIGC大时代19 小时前
AI Agent 六大趋势怎么看
科技·ai·科普
云边云科技_云网融合19 小时前
企业出海的 “数字丝绸之路“:SD-WAN 如何重构全球网络竞争力
大数据·运维·网络·人工智能
X566119 小时前
CSS如何处理SSR中CSS引入_在服务端渲染时提取关键CSS
jvm·数据库·python
超级架构师19 小时前
Huiwen Han — Preprints Public Inventory v10.15
人工智能
Apache RocketMQ20 小时前
RocketMQ源码解析——秒级定时消息介绍
java·云原生·消息队列·rocketmq·java-rocketmq
duke86926721420 小时前
PostgreSQL 中高效插入多对多关联数据的三种方案对比与最佳实践
jvm·数据库·python
狮子座明仔20 小时前
AgentSPEX:当 Agent 框架开始把“控制流“从 Python 里抠出来
开发语言·python
GISer_Jing20 小时前
浏览器 Agent 插件开发规格书 (SPEC)
前端·ai·前端框架·edge浏览器
m0_4636722020 小时前
mysql数据库如何进行逻辑备份与物理备份对比_优缺点分析
jvm·数据库·python
xiaoming001820 小时前
JAVA项目打包部署运维全流程(多服务、批量)
java·linux·运维