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

适用场景:

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

不适用场景:

  • ❌ 实时性要求极高的应用
  • ❌ 简单的单步任务
  • ❌ 成本敏感的大规模部署
  • ❌ 需要精确控制的确定性任务
相关推荐
Three~stone2 分钟前
MATLAB vs Python 两者区别和安装教程
开发语言·python·matlab
AI成长日志5 分钟前
【GitHub开源项目专栏】黑客松获奖项目技术深潜:从垂直领域AI到安全基础设施的创新实践
人工智能·开源·github
ofoxcoding7 分钟前
Claude 全系模型怎么选?Opus 4.6 / Sonnet 4.6 / Haiku 4.6 实测对比 + 调用教程(2026)
ai
soragui14 分钟前
【Python】第 1 章:Python 解释器原理
开发语言·python
Ulyanov14 分钟前
卡尔曼滤波技术博客系列:第三篇 雷达目标跟踪:运动模型与坐标转换
python·目标跟踪·系统仿真·雷达电子战
H Journey16 分钟前
openCV图像学-二值化
人工智能·opencv·计算机视觉
算法即正义16 分钟前
知识竞赛计分规则设置指南:七种计分模式详解与实操建议
人工智能
这张生成的图像能检测吗20 分钟前
(论文速读)基于微调大语言模型的数控车床故障诊断
人工智能·语言模型·故障诊断·车床技术
UAq6wn76j20 分钟前
.NET源码生成器使用SyntaxTree生成代码及简化语法
java·开发语言·.net
火飞鹰20 分钟前
封装MinIO为starter
java·数据库·spring boot