三分钟说清楚 ReAct Agent 的技术实现

作者:indieAI日期:2026/1/15

ReAct Agent 技术实现主要依赖于精心设计的 Prompt 模板输出解析器执行循环三大核心机制。


1. 核心 Prompt 工程

LangChain 使用特定的 Prompt 模板引导 LLM 按 Thought → Action → Observation 格式输出:

1# 简化的 Prompt 结构
2template = """
3用以下工具回答问题:
4
5工具: 
6- search: 搜索引擎, 输入: "查询词"
7- calculator: 计算器, 输入: "算式"
8
9现在开始!
10
11问题: {input}
12Thought: {agent_scratchpad}
13"""
14

关键设计:

  • agent_scratchpad :存储历史 Thought-Action-Observation 链,确保上下文连续
  • 工具描述:每个工具都有标准化描述,帮助 LLM 理解何时使用
  • Few-shot 示例:内置典型交互样例,教会 LLM 输出格式

2. 输出解析机制

LLM 输出纯文本后,通过 AgentOutputParser 解析结构化数据:

1# LLM 输出示例文本
2"""
3Thought: 需要计算 2+2*2
4Action: calculator
5Action Input: "2+2*2"
6"""
7

解析过程:

  1. 正则匹配:提取 Thought:/Action:/Action Input:
  2. 格式验证:确保符合预定 schema,否则触发格式错误处理
  3. 工具映射:将 Action 字符串映射到具体工具实例

关键代码(简化):

1class ReActParser:
2    def parse(self, text: str):
3        thought = re.search(r"Thought: (.*?)\n", text).group(1)
4        action = re.search(r"Action: (.*?)\n", text).group(1)
5        action_input = re.search(r"Action Input: (.*?)\n", text).group(1)
6        return AgentAction(tool=action, input=action_input, log=thought)
7

3. AgentExecutor 循环控制

这是 ReAct 的"大脑",管理整个执行流程:

1class AgentExecutor:
2    def run(self, query):
3        # 初始化
4        scratchpad = ""  # 交互历史
5        steps = 0
6        
7        while steps < max_iterations:
8            # 1. 调用 LLM 生成下一步
9            llm_output = self.llm(
10                prompt.format(input=query, agent_scratchpad=scratchpad)
11            )
12            
13            # 2. 解析输出
14            action = self.output_parser(llm_output)
15            
16            # 3. 判断终止条件
17            if isinstance(action, AgentFinish):
18                return action.return_values["output"]
19            
20            # 4. 执行工具
21            observation = self.tools[action.tool].run(action.input)
22            
23            # 5. 更新 scratchpad
24            scratchpad += f"{action.log}\nObservation: {observation}\nThought: "
25            
26            steps += 1
27        
28        return "达到最大迭代次数"
29

关键设计模式:

  • while 循环 :实现 Thought-Action-Observation 循环
  • scratchpad 累积:将每轮结果追加,形成完整上下文
  • 终止判断:当解析出 AgentFinish 时返回最终结果

4. 工具调用架构

工具通过标准化接口集成:

1class BaseTool:
2    name: str  # 工具唯一标识
3    description: str  #  LLM 看的说明
4    args_schema: BaseModel  # 参数结构
5    
6    def _run(self, input: str) -> str:
7        # 具体实现
8        pass
9

动态注册机制:

1# 工具自动发现
2tools = [
3    Tool(name="search", func=search_api, description="搜索引擎..."),
4    Tool(name="calculator", func=calculate, description="计算器...")
5]
6
7# 传递给 Agent
8agent = create_react_agent(llm, tools, prompt)
9

5. 错误处理与鲁棒性

常见错误类型:

  • 格式错误:LLM 未按指定格式输出 → 捕获异常并重新提示
  • 工具不存在:LLM 幻想了不存在的工具 → 返回错误 Observation
  • 参数错误:工具调用参数格式不对 → 捕获异常并反馈

自我修复机制:

1except OutputParserException:
2    # 将错误信息加入 scratchpad,让 LLM 自我纠正
3    scratchpad += f"解析错误,请严格遵循格式:Action: tool_name\nAction Input: input\n"
4    continue  # 重新循环
5

6. 记忆管理

ReAct Agent 的记忆体现在两个层面:

短期记忆(核心):

  • agent_scratchpad:当前任务的交互历史
  • 每轮循环自动清空,任务结束即丢弃

长期记忆(可选):

  • 集成 ConversationBufferMemory 实现多轮对话
  • 在 Prompt 中注入历史对话摘要

技术实现总结

组件实现方式关键技术
推理生成Prompt Engineering + LLM 调用Few-shot、Scratchpad
行动解析正则/结构化输出解析Pydantic、OutputParser
工具执行标准化接口 + 动态调用BaseTool、回调机制
循环控制While 循环 + 状态机AgentExecutor、终止判断
错误恢复异常捕获 + 上下文反馈Try-Except、自我修复

这种设计将确定性代码逻辑(循环、解析)与非确定性 LLM 生成完美结合,既保证了流程可控,又充分发挥了 LLM 的灵活性。


三分钟说清楚 ReAct Agent 的技术实现》 是转载文章,点击查看原文


相关推荐


基于 Squoosh WASM 的浏览器端图片转换库
jump_jump2026/1/7

在 Web 开发中,图片处理是一个常见需求。传统方案要么依赖服务端处理,要么使用 Canvas API,但前者增加服务器负担,后者在压缩质量上不尽人意。Google 的 Squoosh 项目提供了基于 WASM 的高质量图片编解码器,但直接使用比较繁琐。 于是我封装了 use-squoosh,一个零依赖的浏览器端图片转换库,通过 CDN 按需加载编解码器,开箱即用。 为什么需要这个库 现有方案的局限性 方案优点缺点服务端处理稳定可靠增加


微调—— LlamaFactory工具:使用WebUI微调
华如锦2025/12/29

启动web Ui面板 进入到LLaMA-Factory目录下,执行以下命令启动web ui面板: cd LLaMA-Factory llamafactory-cli webui llamafactory-cli webui 进入web ui面板 微调前准备 1. 数据准备 LLaMA-Factory 自带数据集以 .json 格式存放在项目根目录的 LLaMA-Factory/data 文件夹中,在图形化微调界面中可直接通过下拉框选择这些数据集。)。


Python入门指南(五) - 为什么选择 FastAPI?
吴佳浩2025/12/20

Python入门指南(五) - 为什么选择 FastAPI? 欢迎来到Python入门指南的第五部分!在上一章中,我们完成了Python开发环境的初始化配置。现在,让我们进入实战阶段——选择合适的Web框架来构建我们的API服务。 本章将深入对比 Flask 和 FastAPI,帮助你理解为什么在现代Python开发中,FastAPI正在成为越来越多开发者的首选。 ** 为什么需要Web框架?** 在进入对比之前,先理解Web框架的核心作用: 处理HTTP请求和响应:接收用户请求,返回处理


【转载】为什么我们选择GPT-5.2作为Augment Code Review的模型
是魔丸啊2025/12/12

转载 2025年12月11日 Augment Code Review在唯一的AI辅助代码审查公共基准测试中取得了最高的准确度,在整体质量上比Cursor Bugbot、CodeRabbit等其他系统高出约10个百分点。一个关键原因是什么?我们选择GPT-5.2作为代码审查的基础模型——以及我们的模型无关方法让我们能够为软件开发生命周期的每个阶段选择最佳工具。Augment Code Review最初基于GPT-5构建,但随着我们观察到OpenAI最新推理模型的质量提升,我们升级到了5.2版本。


doc文件?【图文详解】docx文件?xls/xlsx/ppt/pptx/pdf等办公文件怎么打开?
极智-9962025/12/3

一、问题背景         有时候电脑里蹦出个 “XX.docx” 文件,想打开却懵圈 —— 这后缀名跟 “XX.doc” 就差个 x,到底有啥不一样?存表格时纠结存成 “xls” 还是 “xlsx”,怕选错了下次打不开;看到 “ppt” 和 “pptx” 更是犯嘀咕,明明都是演示文稿,为啥名字尾巴不一样?还有 PDF,明明跟 Word 都能存文字,却死活改不了内容,这又是为啥?         其实啊,这些长得像 “小尾巴” 的后缀名,就是办公文件的 “身份证”!咱们每天用电脑处理工作、


多网卡如何区分路由,使用宽松模式测试网络
venus602026/1/23

一、什么是 Linux 的“非对称路由” 1️⃣ 定义(先给结论) 非对称路由指的是: 数据包从 A 网卡进来,但回包却从 B 网卡出去 在多网卡、多出口服务器上非常常见,比如: 双网卡 多默认网关 同一台服务器连多个网络 你之前的情况就是典型的非对称路由。 2️⃣ Linux 默认为什么不喜欢非对称路由? 因为它可能意味着: IP 欺骗(spoofing) 流量劫持 路由异常 所以 Linux 默认启用了一个安全机制: 👉

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客