【Agentic RL 专题】深入浅出了解ReAct

? 前言:从 cot 到 react

在只有基础对话能力的阶段,大模型更多像一个“一次性回答机”:

User: 问题 LLM : 一次性生成答案

即便我们加上了 Memory、RAG,智能体也只是多了“能记”和“会查”:

Memory:记住过去发生了什么(多轮对话、历史任务状态) RAG:在回答前去查一查知识库或互联网

但这仍然是“问一答一”的模式,缺少真正的多步决策与行动能力。

ReAct(Reasoning + Acting) 正是为了解决这个问题提出的:

在推理过程中,显式地交替输出“思考内容(Thought)”和“行动指令(Action)”,再利用环境反馈(Observation)更新后续推理。

一、ReAct 范式长什么样?

原论文《ReAct: Synergizing Reasoning and Acting in Language Models》采用的典型轨迹格式如下:

Question: (用户问题)Thought 1: 我需要先查一下 X 的相关背景。Action 1: search["X 的维基百科页面"]Observation 1: (搜索工具返回的摘要文本)Thought 2: 现在我知道了 X 的定义,还需要确认 Y。Action 2: lookup["Y 相关条目"]Observation 2: (查具体条目返回的信息)Thought 3: 根据 Observation 1 和 2,可以得出结论……Final Answer: (给用户的最终回答)

可以发现,在思考的过程中的关键元素如表所示:

元素

是否改变环境

主要作用

示例

Thought

❌ 不改变环境

作为“内心独白”,用于规划下一步、整理当前已知信息、解释为什么要调用某个工具

“我需要先查一下 2024 年奥运会的举办城市。”

Action

✅ 通过调用工具/环境间接改变环境

发出结构化“命令”,触发具体操作(检索、查表、移动等)

search["query"]lookup["entity"]move["north"](如 ALFWorld 中的移动)

Observation

✅ 环境产生的结果

记录环境或工具对 Action 的反馈,为下一步 Thought 提供依据

搜索结果文本、API 返回的 JSON、环境状态描述

Final Answer

❌ 自身不再行动(但对用户是最终输出)

标志推理/行动序列结束,给出最终对用户的回答

Final Answer: 2024 年奥运会举办城市是巴黎…

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【Agentic RL 专题】深入浅出了解ReAct

LLM 的工作就变成了:

二、从 CoT 到 ReAct

先来看一下CoT(Chain-of-Thought) 的流程形式:

Q: 2 + 3 * 4 = ?

A:

Step 1: 先算乘法 3*4 = 12

Step 2: 再算加法 2 + 12 = 14

所以答案是 14

Type Type

生成草稿,转换文本,获得写作帮助-等等。

Type 83 查看详情 Type

链式思考的出现大大提升了大模型的数学推理能力,他并不是重新训练大模型来得到这种能力的,而是通过prompting来挖掘大模型本就有的推理能力。

CoT的基础上,ReAct 的核心变化就是:在 “思考链(Thought)” 中间插入 “动作(Action)” 和 “环境反馈(Observation)”, 然后多轮循环。具体流程如下:

step 1. 在 Prompt 里定义协议

你是一个可以一边思考一边操作工具的助手。

你必须严格按下面格式输出(非常重要):

Question: {用户问题}

Thought: …

Action: 工具名”参数”

Observation: …

当你已经可以回答用户问题时,输出:

Final Answer: …

step 2. 循环控制伪代码

while True:    llm_output = call_llm(prompt)    if "Final Answer:" in llm_output:        提取最终答案,结束    action = parse_action(llm_output)         # 找 Action: xxx["..."]    obs = run_tool(action)                    # 真正调用工具    prompt += llm_output + f"Observation: {obs}"
【Agentic RL 专题】深入浅出了解ReAct

学到这里,我们可以说,ReAct其实本质就是一种更加“高级 prompting + 外层控制逻辑”

三、手撕“迷你 ReAct 循环”

为了帮助读者更好的理解ReAct·,我们先手撕简化版 ReAct 循环(伪代码,逻辑关键):

step 0. 工具自定义

import refrom typing import Dict, Callable# 假设这是一个Chat LLM 接口def call_llm(prompt: str) -> str:    passTOOLS: Dict[str, Callable[[str], str]] = {}def register_tool(name: str):    def decorator(fn):        TOOLS[name] = fn        return fn    return decorator@register_tool("calculator")def calculator(expr: str) -> str:    """计算简单数学表达式"""    try:        return str(eval(expr))    except Exception as e:        return f"计算错误: {e}"

step 1. 在 Prompt 里定义协议

REACT_SYSTEM_PROMPT = """你是一个可以一边思考一边使用工具的助手。交互格式如下:Thought: 先解释你在想什么Action: 工具名["参数"]Observation: 我会用工具返回的结果填在这里...最后当你可以回答用户问题时,请输出:Final Answer: 给出最终回答当前可用工具:- calculator: 计算数学表达式,格式如 calculator["1+2*3"]"""

step 2. 循环控制

def react_loop(question: str, max_steps: int = 5):    scratchpad = ""    for step in range(1, max_steps + 1):        prompt = (            REACT_SYSTEM_PROMPT            + f"Question: {question}"            + scratchpad            + "请给出下一步 Thought / Action 或 Final Answer:"        )        llm_output = call_llm(prompt)        # 1. 先看是否已经给出 Final Answer        if "Final Answer:" in llm_output:            answer = llm_output.split("Final Answer:")[1].strip()            print("✅ Final Answer:", answer)            return answer        # 2. 解析 Action        action_match = re.search(r"Action:s*(w+)["(.*)"]", llm_output)        if action_match:            tool_name, tool_input = action_match.groups()            if tool_name not in TOOLS:                observation = f"工具 {tool_name} 不存在。"            else:                observation = TOOLS[tool_name](tool_input)            # 把这一步的 Thought / Action / Observation 追加到 scratchpad            scratchpad += (                f"{llm_output.strip()}"                f"Observation: {observation}"            )        else:            # 如果没解析出 Action,只把 Thought 拼进去,继续下一轮            scratchpad += f"{llm_output.strip()}"    print("⚠️ 达到最大步数仍未得到 Final Answer")    return None

拼 prompt:系统提示 + 问题 + 之前的 Thought/Action/Observation 轨迹;让 LLM 输出下一步:要么继续 Thought + Action;要么直接给出 Final Answer;解析 Action,调用对应工具,补上 Observation;循环直到终止。

LangChain 做的事情,本质上就是把这个“循环 + 解析 + 工具调用”封装成一个可复用的 LCEL 运行图,并提供不少内置工具和 Prompt 模板。

四、 LangChain 框架实现ReAct Agent

⚙️ 依赖安装(示例环境)

pip install -U langchain langchain-openai langchain-community duckduckgo-search`

3.1 定义 LLM 与工具

# 带搜索 + 计算器的 ReAct Agent 示例import osfrom langchain_openai import ChatOpenAIfrom langchain_community.tools import DuckDuckGoSearchRunfrom langchain_core.tools import tool# 远程调用,需要KEYos.environ["OPENAI_API_KEY"] = "你的 key"# 1️⃣ LLM:底层使用 Chat 接口(如 GPT-4 / DeepSeek 等)llm = ChatOpenAI(    model="gpt-4o-mini",   # 或者 deepseek/chat 等    temperature=0)# 本地定义llm#from langchain_community.chat_models import ChatOllama#llm = ChatOllama(#    model="qwen2.5:7b-instruct",  # 本地 ollama 已经拉好的模型#    temperature=0#)# 2️⃣ 定义一个自定义工具:计算器@tooldef calculator(expression: str) -> str:    """计算一个数学表达式,例如 '1+2*3'。"""  #docstring    try:        return str(eval(expression))    except Exception as e:        return f"计算出错: {e}"#内置的 DuckDuckGo 搜索工具,简单的网页搜索工具,无需keysearch = DuckDuckGoSearchRun()tools = [calculator, search]

@tool 装饰器会自动把 Python 函数包装成 LangChain 的 BaseTool 对象;

3.2 ReAct Prompt

在第三章我们提过,需要在 Prompt 里定义协议;

而在LangChain Hub 中这些事已经不需要我们做了, 因为已经有现成的 ReAct Prompt(hwchase17/react)以直接拿来用:[

from langchain import hub# 从 LangChain Hub 拉取 ReAct Promptprompt = hub.pull("hwchase17/react")print(prompt.template[:400], "...")

你打印一下会看到类似结构(英文),明确告诉 LLM 要循环输出 Thought / Action / Observation,直到给出 Final Answer。

Answer the following questions as best you can. You have access to the following tools:{tools}Use the following format:Question: the input question you must answerThought: you should always think about what to doAction: the action to take, should be one of [{tool_names}]Action Input: the input to the actionObservation: the result of the action.. (this Thought/Action/Action Input/Observation can repeat N times)Thought: I now know the final answerFinal Answer: the final answer to the original input questionBegin!Question: {input}Thought:

3.3 使用 create_react_agent 构建 Agent + Executor

LangChain 提供了一个封装好的工厂函数:create_react_agent,专门用来构造 ReAct 风格的 Agent。

from langchain.agents import create_react_agent, AgentExecutor# 5️⃣ 构建 ReAct Agent(本质是一个 LCEL runnable)agent = create_react_agent(    llm=llm,    tools=tools,    prompt=prompt,)# 6️⃣ 用 AgentExecutor 包一层循环执行逻辑agent_executor = AgentExecutor(    agent=agent,    tools=tools,    verbose=True,        # 打印中间 Thought / Action / Observation 轨迹    max_iterations=5,    # 最多迭代 5 轮    handle_parsing_errors=True,)

3.4 测试

query = "请查一下 2024 年奥运会举办城市,然后算一下这个城市名称的长度平方是多少?"result = agent_executor.invoke({"input": query})print("? 最终回答:", result["output"])

verbose=True 的情况下,你会在控制台看到类似这样的轨迹(示意):

Thought: 我需要先查一下 2024 年奥运会的举办城市。Action: duckduckgo_searchAction Input: "2024 Summer Olympics host city"Observation: The 2024 Summer Olympics were held in Paris, France. ...Thought: 我知道了举办城市是 Paris。现在需要计算城市名称长度的平方。Action: calculatorAction Input: "len('Paris')**2"Observation: 25Thought: 我已经知道了最终答案。Final Answer: 2024 年奥运会举办城市是巴黎(Paris),城市名 "Paris" 的长度为 5,5 的平方为 25,因此答案是 25。

分析一下:

1. 第一步 Thought:说明“先查办奥运会城市”;2. 第一步 Action:调用 `duckduckgo_search`;    3. Observation 包含了搜索结果(告诉你是 Paris);    4. 第二步 Thought:决定用 calculator 计算长度平方;    5. 第二步 Action:调用 `calculator`;    6. Observation 给出 25;    7. 最后 Thought + Final Answer:给出解释 + 最终结论。

可以发现,这个过程和我们上面手写的 ReAct loop 是一一对应的,只不过 LangChain 帮我们封装了细节。

四、ReAct的发展

? 4.1 在 ReAct 之上叠“反思(Reflexion)”

在 ReAct 的基础循环上,再叠一层“学习自己的经验”的外环。比如 Reflexion 让 Agent 在失败后,用自然语言总结“刚才哪一步错了,下次应该怎么改”,再写入 Memory,下一轮参考。Reflexion: Language Agents with Verbal Reinforcement Learning

? 4.2 与「规划(Planning)」结合

原生 ReAct 偏“短视”——每一步都是 “想一点 → 做一步”,对需要长远规划、多阶段子任务的场景不够强。比如 2025 的 Pre-Act 工作就直接点名:ReAct 通常是“即时思考 + 即时动作”,对复杂任务效果有限,于是提出“先做多步规划,再结合 ReAct 执行”的框架

【Agentic RL 专题】深入浅出了解ReAct

五、总结

到这一章,我们已经让智能体具备了三种“能力模块”:

Memory 让它记住发生过什么,RAG 让它查询外部世界的知识,而 Planner 则让它从“一问一答”升级为“多步决策的任务执行者”。

但目前这一切,仍然是“静态策略”:

规划规则、检索策略、记忆使用方式,都是我们人为写在 prompt 里或硬编码在逻辑中的。 在未来的学习中,我们希望让这些策略自己学会变好,自然就得进一步引出 Agentic RL:

以上就是【Agentic RL 专题】深入浅出了解ReAct的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/983484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 21:06:40
下一篇 2025年12月1日 21:07:02

相关推荐

  • soul怎么发长视频瞬间_Soul长视频瞬间发布方法

    可通过分段发布、格式转换或剪辑压缩三种方法在Soul上传长视频。一、将长视频用相册编辑功能拆分为多个30秒内片段,依次发布并标注“Part 1”“Part 2”保持连贯;二、使用“格式工厂”等工具将视频转为MP4(H.264)、分辨率≤1080p、帧率≤30fps、大小≤50MB,适配平台要求;三、…

    2025年12月6日 软件教程
    500
  • 天猫app淘金币抵扣怎么使用

    在天猫app购物时,淘金币是一项能够帮助你节省开支的实用功能。掌握淘金币的抵扣使用方法,能让你以更实惠的价格买到心仪商品。 当你选好商品并准备下单时,记得查看商品页面是否支持淘金币抵扣。如果该商品支持此项功能,在提交订单的页面会明确显示相关提示。你会看到淘金币的具体抵扣比例——通常情况下,淘金币可按…

    2025年12月6日 软件教程
    500
  • Pboot插件缓存机制的详细解析_Pboot插件缓存清理的命令操作

    插件功能异常或页面显示陈旧内容可能是缓存未更新所致。PbootCMS通过/runtime/cache/与/runtime/temp/目录缓存插件配置、模板解析结果和数据库查询数据,提升性能但影响调试。解决方法包括:1. 手动删除上述目录下所有文件;2. 后台进入“系统工具”-“缓存管理”,勾选插件、…

    2025年12月6日 软件教程
    100
  • Word2013如何插入SmartArt图形_Word2013SmartArt插入的视觉表达

    答案:可通过四种方法在Word 2013中插入SmartArt图形。一、使用“插入”选项卡中的“SmartArt”按钮,选择所需类型并插入;二、从快速样式库中选择常用模板如组织结构图直接应用;三、复制已有SmartArt图形到目标文档后调整内容与格式;四、将带项目符号的文本选中后右键转换为Smart…

    2025年12月6日 软件教程
    000
  • 《kk键盘》一键发图开启方法

    如何在kk键盘中开启一键发图功能? 1、打开手机键盘,找到并点击“kk”图标。 2、进入工具菜单后,选择“一键发图”功能入口。 3、点击“去开启”按钮,跳转至无障碍服务设置页面。 4、在系统通用设置中,进入“已下载的应用”列表。 j2me3D游戏开发简单教程 中文WORD版 本文档主要讲述的是j2m…

    2025年12月6日 软件教程
    100
  • 怎样用免费工具美化PPT_免费美化PPT的实用方法分享

    利用KIMI智能助手可免费将PPT美化为科技感风格,但需核对文字准确性;2. 天工AI擅长优化内容结构,提升逻辑性,适合高质量内容需求;3. SlidesAI支持语音输入与自动排版,操作便捷,利于紧急场景;4. Prezo提供多种模板,自动生成图文并茂幻灯片,适合学生与初创团队。 如果您有一份内容完…

    2025年12月6日 软件教程
    000
  • Pages怎么协作编辑同一文档 Pages多人实时协作的流程

    首先启用Pages共享功能,点击右上角共享按钮并选择“添加协作者”,设置为可编辑并生成链接;接着复制链接通过邮件或社交软件发送给成员,确保其使用Apple ID登录iCloud后即可加入编辑;也可直接在共享菜单中输入邮箱地址定向邀请,设定编辑权限后发送;最后在共享面板中管理协作者权限,查看实时在线状…

    2025年12月6日 软件教程
    100
  • 哔哩哔哩的视频卡在加载中怎么办_哔哩哔哩视频加载卡顿解决方法

    视频加载停滞可先切换网络或重启路由器,再清除B站缓存并重装应用,接着调低播放清晰度并关闭自动选分辨率,随后更改播放策略为AVC编码,最后关闭硬件加速功能以恢复播放。 如果您尝试播放哔哩哔哩的视频,但进度条停滞在加载状态,无法继续播放,这通常是由于网络、应用缓存或播放设置等因素导致。以下是解决此问题的…

    2025年12月6日 软件教程
    000
  • REDMI K90系列正式发布,售价2599元起!

    10月23日,redmi k90系列正式亮相,推出redmi k90与redmi k90 pro max两款新机。其中,redmi k90搭载骁龙8至尊版处理器、7100mah大电池及100w有线快充等多项旗舰配置,起售价为2599元,官方称其为k系列迄今为止最完整的标准版本。 图源:REDMI红米…

    2025年12月6日 行业动态
    200
  • 买家网购苹果手机仅退款不退货遭商家维权,法官调解后支付货款

    10 月 24 日消息,据央视网报道,近年来,“仅退款”服务逐渐成为众多网购平台的常规配置,但部分消费者却将其当作“免费试用”的手段,滥用规则谋取私利。 江苏扬州市民李某在某电商平台购买了一部苹果手机,第二天便以“不想要”为由在线申请“仅退款”,当时手机尚在物流运输途中。第三天货物送达后,李某签收了…

    2025年12月6日 行业动态
    000
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • 当贝X5S怎样看3D

    当贝X5S观看3D影片无立体效果时,需开启3D模式并匹配格式:1. 播放3D影片时按遥控器侧边键,进入快捷设置选择3D模式;2. 根据片源类型选左右或上下3D格式;3. 可通过首页下拉进入电影专区选择3D内容播放;4. 确认片源为Side by Side或Top and Bottom格式,并使用兼容…

    2025年12月6日 软件教程
    100
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    100
  • 华为新机发布计划曝光:Pura 90系列或明年4月登场

    近日,有数码博主透露了华为2025年至2026年的新品规划,其中pura 90系列预计在2026年4月发布,有望成为华为新一代影像旗舰。根据路线图,华为将在2025年底至2026年陆续推出mate 80系列、折叠屏新机mate x7系列以及nova 15系列,而pura 90系列则将成为2026年上…

    2025年12月6日 行业动态
    100
  • TikTok视频无法下载怎么办 TikTok视频下载异常修复方法

    先检查链接格式、网络设置及工具版本。复制以https://www.tiktok.com/@或vm.tiktok.com开头的链接,删除?后参数,尝试短链接;确保网络畅通,可切换地区节点或关闭防火墙;更新工具至最新版,优先选用yt-dlp等持续维护的工具。 遇到TikTok视频下载不了的情况,别急着换…

    2025年12月6日 软件教程
    100
  • Linux如何防止缓冲区溢出_Linux防止缓冲区溢出的安全措施

    缓冲区溢出可通过栈保护、ASLR、NX bit、安全编译选项和良好编码实践来防范。1. 使用-fstack-protector-strong插入canary检测栈破坏;2. 启用ASLR(kernel.randomize_va_space=2)随机化内存布局;3. 利用NX bit标记不可执行内存页…

    2025年12月6日 运维
    000
  • 2025年双十一买手机选直板机还是选折叠屏?建议看完这篇再做决定

    随着2025年双十一购物节的临近,许多消费者在选购智能手机时都会面临一个共同的问题:是选择传统的直板手机,还是尝试更具科技感的折叠屏设备?其实,这个问题的答案早已在智能手机行业的演进中悄然浮现——如今的手机市场已不再局限于“拼参数、堆配置”的初级竞争,而是迈入了以形态革新驱动用户体验升级的新时代。而…

    2025年12月6日 行业动态
    000
  • Linux如何优化系统性能_Linux系统性能优化的实用方法

    优化Linux性能需先监控资源使用,通过top、vmstat等命令分析负载,再调整内核参数如TCP优化与内存交换,结合关闭无用服务、选用合适文件系统与I/O调度器,持续按需调优以提升系统效率。 Linux系统性能优化的核心在于合理配置资源、监控系统状态并及时调整瓶颈环节。通过一系列实用手段,可以显著…

    2025年12月6日 运维
    000
  • Pboot插件数据库连接的配置教程_Pboot插件数据库备份的自动化脚本

    首先配置PbootCMS数据库连接参数,确保插件正常访问;接着创建auto_backup.php脚本实现备份功能;然后通过Windows任务计划程序或Linux Cron定时执行该脚本,完成自动化备份流程。 如果您正在开发或维护一个基于PbootCMS的网站,并希望实现插件对数据库的连接配置以及自动…

    2025年12月6日 软件教程
    000
  • Linux命令行中wc命令的实用技巧

    wc命令可统计文件的行数、单词数、字符数和字节数,常用-l统计行数,如wc -l /etc/passwd查看用户数量;结合grep可分析日志,如grep “error” logfile.txt | wc -l统计错误行数;-w统计单词数,-m统计字符数(含空格换行),-c统计…

    2025年12月6日 运维
    000

发表回复

登录后才能评论
关注微信