LLM 智能突破:ReAct与Reflexion如何让大模型学会思考、行动与反思

🚀ReAct与Reflexion框架赋能LLM,攻克复杂任务,实现智能推理、工具交互与错误自纠正,是下一代AI核心技术!

原文标题:为什么 LLM 搞不定复杂任务?ReAct 与 Reflexion 技术综述

原文作者:阿里云开发者

冷月清谈:

大语言模型(LLM)在处理复杂任务时面临事实幻觉、缺乏实时信息、规划不足及错误传播等挑战。为解决这些问题,ReAct和Reflexion两大提示技术框架应运而生。ReAct通过将“推理”与“行动”相结合,使LLM能动态地执行“思考-行动-观察-再思考”循环,利用外部工具获取实时信息并分解任务,有效减少了幻觉并提升规划能力。在此基础上,Reflexion引入了评估与自我反思机制,通过语言反馈帮助模型从错误中学习,实现“行动-评估-反思-迭代”的闭环优化。当两者结合时,ReAct提供即时推理行动的基础,Reflexion则赋予模型长期的自我适应与学习能力。这两种框架共同显著提升了LLM在知识密集型、决策型及编程任务上的表现,预示着构建下一代智能系统的核心方向,未来重点在于记忆机制、评估器及多模态集成等方面优化。

怜星夜思:

1、ReAct框架里LLM会调用外部工具,比如搜索引擎。但外部工具的信息可不都是百分百准确或者完全中立的。那我们怎么确保LLM在调用这些工具后,不会被“带偏”或者产生新的“幻觉”呢?这会不会导致一些意想不到的后果?
2、Reflexion强调模型能从错误中学习。听起来很酷,但如果我们的AI助手自己学会了“反思”和“迭代”,那么我们作为用户,是不是还需要像现在这样,不断地给它纠正和反馈,或者说,我们与AI的交互模式会有什么根本性的改变?会不会感觉像养了个孩子?
3、文章提到Reflexion效果依赖评估者的准确性。对于那些结果比较主观或者没有标准答案的复杂任务(比如创意写作、战略规划),我们怎么才能设计一个既鲁棒又不会带有偏见的评估器,来准确判断LLM的表现好坏呢?

原文内容

在人工智能领域,特别是大语言模型(LLM)的应用中,尽管模型在许多任务上表现出色,但在处理复杂任务时仍存在明显局限性。大型语言模型在处理需要多步骤推理、实时信息获取和动态决策的任务时,常常面临以下挑战:

  • 事实幻觉模型可能生成看似合理但不准确的信息;

  • 缺乏实时信息模型训练数据截止后的新信息无法获取;

  • 规划能力不足面对复杂任务时难以分解和制定有效策略;

  • 错误传播单个错误推理可能导致整个任务失败;

为了解决这些问题,研究人员提出了多种提示技术框架,其中ReAct(Reasoning + Acting)和Reflexion(Self-Reflection)作为两个关键创新,通过将推理、行动和反思机制融入模型行为中,显著提升了LLM在知识密集型、决策型和编程任务上的表现。

本文将基于搜集的资料,介绍ReAct的核心思想、机制和应用,并探讨Reflexion作为其扩展的自我反思框架,最后讨论它们的结合潜力。

ReAct框架:推理与行动的协同

ReAct的核心思想

ReAct框架由Yao等人于2022年提出,其名称源于"Reasoning"(推理)和"Acting"(行动)的结合。该框架的核心灵感来源于人类决策过程:我们不只是被动思考,而是通过思考制定计划、执行行动、观察结果,并据此调整策略。ReAct将这一过程应用到LLM中,使模型能够动态处理复杂任务。

  • 推理(Reasoning)模型生成内部思考轨迹,例如"我需要先做什么,再做什么",类似于链式思考(Chain-of-Thought, CoT)。这有助于分解任务、制定计划和处理异常。

  • 行动(Acting)模型生成可执行的操作,例如"搜索[关键词]"或"计算[表达式]",以调用外部工具(如搜索引擎或计算器)获取实时信息。

通过"思考 → 行动 → 观察 → 再思考"的循环,ReAct使LLM能够融入外部知识,避免纯内部推理的局限性。

ReAct解决的问题

传统方法存在明显短板:

  • 链式思考(CoT无法与外部世界互动,容易导致事实幻觉(Fact Hallucination)和错误传播。

  • 仅行动(Act-Only)缺乏规划能力,在多步骤任务中表现不佳。

ReAct通过行动步骤验证信息、减少幻觉,并通过推理步骤分解复杂问题。在知识密集型任务(如问答和事实验证)中,ReAct优于Act-Only,并与CoT结合时效果最佳。在决策型任务(如文字游戏)中,它显著提升性能,尽管与人类专家仍有差距。

ReAct的运作机制

ReAct依赖于特殊的提示方法:

1. 从训练集选取案例,改写成"思考-行动-观察"(Thought-Action-Observation)的轨迹。

2. 将这些轨迹作为少样本示例输入LLM。

3. LLM模仿格式,生成自己的循环直到得出答案。

示例:

任务: 清洗一个非常油腻的平底锅

模型生成的 ReAct 轨迹(模拟):

思考 1:平底锅很油腻,我需要有效的清洗方法,可能涉及去油剂。  
行动 1:搜索[清洗非常油腻平底锅的方法] 
观察 1:推荐使用热水的、洗洁精和小苏打;先浸泡,然后擦洗。  
思考 2:我有方法,现在执行步骤。  
行动 2:执行[用热水浸泡锅子;添加洗洁精和小苏打;用海绵擦洗;冲洗干净]  
观察 2:锅子清洁。  
思考 3:如果仍有残留,重复擦洗。  
行动 3:结束[锅子已清洗干净]

实践应用

ReAct框架在多个领域都有广泛的应用场景,以下是一些典型的使用场景和实践示例:

1. 知识密集型问答

在需要准确事实信息的任务中,ReAct能够通过外部工具获取最新信息,避免模型幻觉。

# 知识密集型问答示例
agent.run("2024年诺贝尔物理学奖得主是谁?他们的主要贡献是什么?")
2. 复杂决策任务

在需要多步骤规划和决策的任务中,ReAct能够制定策略并动态调整。

# 旅行规划示例
agent.run("为一个三口之家规划一个周末从北京到天津的亲子旅行,预算3000元")
3. 数据分析与计算

结合计算器等工具,ReAct能够执行复杂的数值计算和数据分析任务。

# 数据分析示例
agent.run("计算2023年公司各季度销售额增长率,并预测2024年第一季度销售额")
4. 客户服务

在客户服务场景中,ReAct能够根据用户问题检索相关信息并提供解决方案。

# 客户服务示例
agent.run("用户报告无法登录账户,错误代码为AUTH-001,请提供解决方案")
5. 编程辅助

在编程任务中,ReAct能够通过搜索文档、执行代码片段来辅助开发,以爱码仕ai编程工具使用为例,ReAct框架被用于智能代码生成、错误诊断与修复、技术选型建议等场景。

# 爱码仕中的ReAct应用示例
agent.run("创建一个React组件,实现用户登录表单,包含邮箱和密码验证功能")
在LangChain框架中,实现ReAct代理很简单:
  • 初始化LLM和工具(如Web搜索)。

  • 使用initialize_agent创建代理。

实例代码:
# 更新或安装必要的库
# !pip install --upgrade openai
# !pip install --upgrade langchain
# !pip install --upgrade python-dotenv
# !pip install google-search-results
# 引入库
import os
from openai import OpenAI
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain.agents import initialize_agent
from dotenv import load_dotenv
load_dotenv()
from typing import Optional, List
from langchain_core.language_models.llms import LLM
from langchain.tools import BaseTool
class CustomLLM(LLM):
    api_key: str
    client: Optional[OpenAI] = None
    def __init__(self, api_key: str, **kwargs):
        # 初始化OpenAI客户端,使用阿里云通义千问API
        client = OpenAI(
            api_key=api_key,
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        )
        super().__init__(api_key=api_key, client=client, **kwargs)
    @property
    def _llm_type(self) -> str:
        return"qwen3-max"
    def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
        # 添加ReAct格式的系统提示
        system_prompt = """你是一个严格遵循ReAct模式的AI助手。
核心规则 - 必须严格遵守:
1. 每次回复只能包含一个Thought和一个Action
2. 格式必须完全按照以下模式,不能有任何偏差:
Thought: [你的思考过程]
Action: [工具名称]
Action Input: [工具输入]
3. 绝对不能在一次回复中包含多个Thought或Action
4. 绝对不能直接给出Final Answer,除非前面有"Thought: I now know the final answer"
5. 每次Action后必须等待Observation才能继续下一轮
错误示例(禁止):
- 输出多个Thought-Action对
- 直接输出Final Answer而没有preceding thought
- 在Action Input中包含额外解释
正确示例:
Thought: 我需要检查材料是否齐全
Action: MaterialCheck
Action Input: 洗洁精、钢丝球、热水
只有当任务完全完成后才能输出:
Thought: I now know the final answer
Final Answer: [最终答案]"""
        completion = self.client.chat.completions.create(
            # 使用通义千问plus模型
            model="qwen-plus",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": prompt}
            ],
            temperature=0.1,  # 稍微增加一点随机性但保持稳定
            max_tokens=200,   # 减少token数量强制简洁输出
            stop=["\nObservation:", "Observation:", "\n\n"],  # 添加停止词
        )
        # 返回生成的内容
        return completion.choices[0].message.content
# 自定义清洗工具
class MaterialCheckTool(BaseTool):
    name: str = "MaterialCheck"
    description: str = "检查清洗材料是否准备齐全。输入材料列表,返回检查结果。"
    def _run(self, materials: str) -> str:
        return f"已检查材料:{materials}。所有材料准备就绪,可以开始清洗。"
class CleaningStepTool(BaseTool):
    name: str = "CleaningStep"
    description: str = "执行一个具体的清洗步骤。输入步骤描述,返回执行结果。"
    def _run(self, step: str) -> str:
        return f"已完成步骤:{step}。步骤执行成功,可以继续下一步。"
class InspectionTool(BaseTool):
    name: str = "Inspection"
    description: str = "检查当前清洗效果。输入检查内容,返回检查结果。"
    def _run(self, inspection: str) -> str:
        return f"检查结果:{inspection}。清洗效果良好,建议继续或完成清洗。"
llm = CustomLLM(api_key=os.getenv("DASHSCOPE_API_KEY"))
# 创建自定义工具实例
material_check = MaterialCheckTool()
cleaning_step = CleaningStepTool()
inspection = InspectionTool()
# 组合所有工具
math_tools = load_tools(["llm-math"], llm=llm)
custom_tools = [material_check, cleaning_step, inspection]
tools = math_tools + custom_tools
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True, handle_parsing_errors=True)

agent.run(“任务:清洗一个非常油腻的平底锅”)

输出类似于:
> python3 react.py
> Entering new AgentExecutor chain...
Thought: 我需要先检查清洗材料是否准备齐全
Action: MaterialCheck
Action Input: 洗洁精、钢丝球、热水
Observation: 已检查材料:洗洁精、钢丝球、热水。所有材料准备就绪,可以开始清洗。
Thought:Thought: 材料已准备齐全,现在可以开始执行清洗步骤。
Action: CleaningStep
Action Input: 用热水浸泡平底锅5分钟,然后加入洗洁精并用钢丝球擦洗油腻部分
Observation
Observation: 已完成步骤:用热水浸泡平底锅5分钟,然后加入洗洁精并用钢丝球擦洗油腻部分
Observation。步骤执行成功,可以继续下一步。
Thought:Thought: 我需要检查当前的清洗效果,确保油腻已被清除。
Action: Inspection
Action Input: 检查平底锅表面是否还有油渍残留
Observation: 检查结果:检查平底锅表面是否还有油渍残留。清洗效果良好,建议继续或完成清洗。
Thought:Thought: 清洗效果良好,没有油渍残留,清洗任务已完成。
Final Answer: 平底锅已成功清洗,表面无油渍残留,清洗任务完成。

> Finished chain.


Reflexion:ReAct的自我反思扩展

Reflexion的核心思想

Reflexion是一个强化学习框架,由Shinn等人提出,它通过生成语言反馈(口头强化)帮助智能体从错误中学习,而非传统标量奖励。Reflexion模仿人类反思过程,让模型在尝试后获得具体改进建议,如"上次搜索范围太宽,下次更具体"。

Reflexion的三大组件

Reflexion构建在ReAct基础上,添加评估和反思机制,形成闭环:

  • 参与者(Actor)基于ReAct或CoT生成行动轨迹。

  • 评估者(Evaluator)对轨迹打分,判断成功或失败。

  • 自我反思(Self-Reflection)核心组件,生成语言反馈并存入长期记忆,指导下次行动。

工作流程:行动 → 评估 → 反思 → 迭代。通过滑动窗口记忆,Reflexion保留反思内容,实现持续优化。

示例:

任务: 清洗一个非常油腻的平底锅

Reflexion 通过行动、评估、反思和迭代来优化响应。假设初始尝试失败,然后通过反思改进。

初始行动轨迹(Actor 生成,基于 ReAct):
思考 1:平底锅很油腻,需要简单清洗。
行动 1:执行[用冷水冲洗锅子;擦干]
观察 1:锅子仍有油渍。
评估(Evaluator): 失败 - 锅子未完全清洁。
反思(Self-Reflection): 上次尝试使用冷水无效,因为油渍需要热分解。下次应该搜索有效方法,包括热水的、洗洁精和小苏打,并详细列出步骤。存储到记忆:优先考虑热处理和去油剂。

迭代行动轨迹(Actor 使用记忆改进):
思考 1:根据记忆,使用热水和去油剂。
行动 1:搜索[清洗油腻平底锅的详细步骤]
观察 1:步骤:1. 用热水浸泡;2. 添加洗洁精和小苏打;3. 用海绵擦洗顽固污渍;4. 冲洗并检查;5. 如有残留,重复。
思考 2:现在有详细步骤,可以执行。
行动 2:执行[上述步骤]
观察 2:锅子完全清洁。
评估(Evaluator): 成功。

最终输出: 详细步骤包括热水浸泡、添加洗洁精和小苏打、擦洗、冲洗和检查。

适用场景与局限性

Reflexion适合需要试错学习的任务,如决策、推理和编程。它计算效率高,无需模型微调,提供详细反馈和高可解释性。但局限包括依赖评估准确性、简单记忆机制,以及在非确定性编程任务中的挑战。

ReAct与Reflexion的比较与结合

ReAct聚焦于即时推理-行动循环,适合实时任务;Reflexion扩展为学习闭环,强调从失败中迭代,适用于需要优化的场景。两者结合(如在Reflexion中使用ReAct作为Actor)可发挥最大潜力:ReAct提供基础机制,Reflexion添加反思层,提升长期性能。

在提示技术中,这种结合减少了幻觉、提高了准确性,并增强了模型的自适应能力。

详细区别分析

虽然 ReAct 和 Reflexion 在示例中看起来相似(如两者都涉及思考-行动循环),但它们在机制和应用上存在关键差异:

结合优势

在实践中,Reflexion 可以将 ReAct 作为其 Actor 组件,实现两者无缝结合:

  • ReAct 提供基础的动态推理机制;

  • Reflexion 添加评估、反思和记忆层;

  • 结合后形成完整的"感知-行动-评估-学习"闭环;

总之,ReAct 提供基础的动态推理,而 Reflexion 通过添加评估、反思和记忆,将其提升为自适应学习系统。

性能比较

实验结果表明,Reflexion 在多种任务上都取得了显著的性能提升,与 ReAct 和其他方法相比:

  • 决策任务 (AlfWorld):性能显著优于 ReAct,几乎解决了所有测试任务。

Reflexion Heuristic (启发式评估):本质上是一种简单、高效的硬编码逻辑(预先定义了一套成功或失败的规则,类似工程判断,快、便宜、黑白分明,但死板、僵化)

Reflexion GPT:使用一个强大的大语言模型(如 GPT-4)作为评估者(灵活智能、通用性强,但是贵)

  • 推理任务 (HotPotQA):在几个学习步骤内,其性能就显著优于标准的 CoT 方法。

  • 编程任务 (HumanEval 等):在 Python 和 Rust 代码生成任务上,通常优于之前的 SOTA (State-of-the-Art) 方法。

资料来源

Reflexion:Language Agents with Verbal Reinforcement Learning

https://arxiv.org/pdf/2303.11366


总结与未来方向

ReAct和Reflexion作为提示技术中的重要创新,为大语言模型在复杂任务中的应用提供了有效解决方案:

主要贡献

1. ReAct框架通过将推理和行动相结合,使模型能够与外部环境交互,获取实时信息,有效减少了模型幻觉问题。

2. Reflexion框架在ReAct基础上增加了评估和反思机制,形成了完整的"感知-行动-评估-学习"闭环,使模型能够从错误中学习并持续优化。

3. 两者的结合充分发挥了各自优势,既保证了即时响应能力,又具备了长期学习和优化的潜力。

应用前景

随着大语言模型技术的不断发展,ReAct和Reflexion将在以下领域发挥更大作用:

  • 智能助手构建更智能的个人和企业助手,能够处理复杂的多步骤任务;

  • 自动编程辅助开发者进行代码编写、调试和优化;

  • 科学研究协助研究人员进行文献检索、数据分析和假设验证;

  • 教育培训提供个性化的学习路径规划和知识答疑;

未来发展方向

1. 记忆机制优化开发更智能的记忆管理机制,包括记忆的存储、检索和遗忘策略;

2. 评估器改进设计更准确、更高效的评估器,减少误判对学习过程的影响;

3. 多模态集成将ReAct和Reflexion与视觉、语音等多模态能力结合,扩展应用范围;

4. 个性化适应根据用户偏好和历史交互记录,动态调整策略和行为模式;

5. 可解释性增强进一步提高模型决策过程的透明度,增强用户信任;

通过持续的研究和优化,ReAct和Reflexion有望成为构建下一代智能系统的核心技术,推动人工智能在更多领域的深度应用。

Qwen-Image,生图告别文字乱码


针对AI绘画文字生成不准确的普遍痛点,本方案搭载业界领先的Qwen-Image系列模型,提供精准的图文生成和图像编辑能力,助您轻松创作清晰美观的中英文海报、Logo与创意图。此外,本方案还支持一键图生视频,为内容创作全面赋能。


点击阅读原文查看详情。


针对“ReAct调用外部工具可能引入偏见和幻觉”的问题,学术界正在探索多源信息交叉验证和可信度评估机制。例如,通过调用多个搜索引擎或数据库获取信息,并比对信息一致性;同时,可以引入知识图谱或专家系统作为“事实核查器”,对LLM提取的关键信息进行独立验证。这需要构建复杂的集成策略和一套动态的信任评分系统,以量化和管理不同来源信息的可靠性。此外,对于潜在的“意想不到的后果”,强化事后审计和监控,通过人类反馈循环(Human-in-the-Loop)及时发现和纠正模型行为偏差,也是不可或缺的缓解措施。

这确实是个大坑!我们公司在实践中会给LLM配置一个“工具箱”,里面不是放什么工具都行,而是经过严格筛选和封装的。比如,搜索引擎我们会限制它只用权威学术数据库或者内部知识库,而不是开放的互联网搜索。而且,我们会强制LLM在输出前进行多轮的“内部思考”和“外部验证”,比如,让它先搜索A,再搜索B,然后比较A和B的差异,甚至要求它引用来源。如果检测到信息冲突,就触发一个“不确定”的警报,让人工介入。有点像给AI装了个“信息鉴别器”,虽然不能完全杜绝,但能大大降低风险。

哈哈,你说AI会不会被“带偏”?这简直就是个升级版的“大数据杀熟”或者“信息茧房”嘛!AI用的搜索引擎,可能跟我们用的还不一样,它如果搜到一堆“标题党”或者“伪科学”,然后信以为真,那输出给我们的答案岂不是更离谱?就像是给一个学生,只允许看某个特定的教材,还没法判断教材对不对。后果嘛,轻则闹笑话,重则可能误导决策,万一AI听了某个“专家”的建议给我炒股,亏了钱找谁说理去?所以啊,AI最终还是得有“独立思考”的能力,或者我们人类得做它的“编辑部主任”,帮它把把关!

Reflexion框架的引入确实预示着人机交互模式的深刻转变。从传统指令式或问答式,将逐步演变为更具“协同性”和“教学性”的范式。用户可能不再仅仅是提出需求,而更多地参与到AI的“学习”和“成长”过程中,通过提供高价值的、结构化的反馈样本,而非简单的“对错”判断,来引导模型优化其反思策略和决策过程。这类似于“示范学习(Learning from Demonstration)”或“纠正式教学(Corrective Teaching)”,最终目标是减少显性纠错的频率,使模型能够更快地内化用户偏好和领域知识。这种“养孩子”的比喻在一定程度上是恰当的,因为它强调了长期、有策略的投入对AI能力进化的重要性。

养孩子?我觉得更像养个“养成系”偶像!刚开始啥也不是,得天天盯着它,一错就给它发“小红花”(或者“小黑屋”警告),告诉它哪里不对,哪里可以更好。但慢慢地,它会越来越聪明,越来越“听话”,知道你的喜好,会主动帮你做你想要的事情,甚至还会给你惊喜!等它强大到一定程度,可能就变成“它反思我”,给我提意见了:“主人,你昨天晚睡了,今天的任务效率会下降哦。”那时候,估计就不是我在养它,而是它在“管理”我了,想想还有点小激动呢!

设计针对主观和无标准答案任务的鲁棒无偏评估器是Reflexion框架面临的核心挑战。纯粹的规则或启发式评估在此类任务中显得力不从心。研究方向包括:1. 多维度评估框架: 不再依赖单一得分,而是构建一个包含创意性、连贯性、创新性、实用性等多个维度的评估体系,并引入多模型评分机制,即让多个不同的LLM或专家模型从不同角度对结果进行交叉评估。2. 人类参与的渐进式评估: 引入“众包评估”或“专家小循环”机制,在关键评估点注入少量高质量的人类判断,并利用这些判断来训练或微调评估器,使其能逐步学习人类的偏好和评估标准。3. 相对排序而非绝对评分: 对于主观任务,相比于量化“好坏”,判断哪个方案“更好”可能更可行。评估器可以通过对不同生成方案进行两两比较(pairwise comparison)来学习排序偏好,从而避免直接赋予绝对分数时可能出现的偏见。

在实际应用中,尤其遇到创意或战略这种高度主观的任务,我们不可能甩给一个“评估器”就完事。通常的做法是,先从可量化维度入手,比如创意写作,至少可以评估语法、词汇丰富度、逻辑连贯性等客观指标。对于主观维度,我们会构建一套“专家反馈系统”。这意味着,不是一个机器评估器说了算,而是有一组领域专家(或者高阶用户)对AI生成的内容进行投票、打分,甚至提供详细的文字反馈。这些反馈被收集起来,作为Reflexion的“口头强化”信号,来训练评估器,让它逐步“学习”人类的审美和判断标准。这是一种持续的、迭代的过程,就像公司招了新人想让他做战略,一开始总要请资深顾问带着,慢慢他才能学到精髓。

这个问题问到了点子上!这就像艺术品到底好不好,不是机器说了算,是观众和历史说了算。当AI写了首诗、画了幅画、或者提了个战略,谁来评判它“好”呢?如果我们让另一个AI来评,那不就是“自娱自乐”了吗?如果人类来评,那每个人的审美和立场都不同,又怎么做到“无偏见”?也许根本就不存在一个绝对“鲁棒且无偏见”的评估器。我们能做的,可能就是设计一个“多元化”的评估机制,让不同背景、不同偏好的人都来投票,最终形成一个“共识性”的结果,虽然不完美,但至少能反映大多数人的认可度。这就像我们选美,不是一个人说了算,而是评委团的综合意见。AI再聪明,也得过得了“人情世故”这一关啊!