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 针对性优化

适用场景:

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

不适用场景:

  • ❌ 实时性要求极高的应用
  • ❌ 简单的单步任务
  • ❌ 成本敏感的大规模部署
  • ❌ 需要精确控制的确定性任务
相关推荐
xier_ran1 小时前
【第二周】关键词解释:RAG (Retrieval-Augmented Generation,检索增强生成)
人工智能·语言模型·prompt·rag
zhangx1234_1 小时前
java list介绍
java·开发语言·list
Dxy12393102161 小时前
PyTorch的OneCycleLR详细介绍:解锁“超级收敛”的油门控制术
人工智能·pytorch·python
识君啊1 小时前
拆分与合并的艺术·分治思想:Java归并排序深度解析
java·数据结构·算法·排序算法·归并排序·分治
wasp5201 小时前
MiroFish 核心技术:重塑 AI 仿真的工程范式
人工智能
明月(Alioo)1 小时前
开发机上通过Ollama安装了qwen2.5:7b-instruct大模型后curl请求示例
ai·aigc·agent
左左右右左右摇晃1 小时前
Java Object 类笔记
java·笔记
橘bird1 小时前
LangChain1.2 学习笔记(自用)(未完结)
笔记·python·学习·langchain
小箌1 小时前
JavaWeb & SpringBoot 总结
java·spring boot·后端