2025年8月6日

提示词工程-反思模式

作者 柳 永强
内容目录

提示词工程-反思模式

什么是 Reflexion?

Reflexion 是一种先进的 AI Agent 架构,其核心思想是让 Agent 具备自我反思和自我修正的能力。它不仅仅是简单地执行任务(像传统的 ReAct – Reason and Act 模式),而是在遇到失败或障碍时,能够停下来“复盘”自己的行为轨迹,从中吸取教训,并形成指导性的“经验”,用于下一次的尝试。

简单来说,Reflexion 赋予了 Agent 一种从失败中学习的机制,模拟了人类在解决复杂问题时的试错和总结过程。

这项技术主要源于康奈尔大学等机构在 2023 年发表的论文《Reflexion: Language Agents with Verbal Reinforcement Learning》。

Reflexion 与传统方法的区别

特性传统 ReAct AgentReflexion Agent
核心循环思考 -> 行动 -> 观察 (Thought -> Act -> Observation)尝试 -> 评估 -> 反思 -> 再次尝试 (Trial -> Evaluate -> Reflect -> Retry)
失败处理可能会在当前步骤卡住,或进行无效的重复尝试。将整个失败的“轨迹”作为学习材料,进行深入分析。
记忆通常是短期的“暂存器”(Scratchpad),记录当前任务的步骤。拥有一个长期、不断累积的“反思记忆库”(Reflexion Memory)。
学习方式主要依赖于 In-context Learning,受限于单次提示的长度和内容。通过“语言强化学习”,将反思(Verbal Feedback)作为内部奖励信号来指导后续行为。

Reflexion 的核心组件

一个完整的 Reflexion 流程包含三个关键角色,它们都可以由同一个大型语言模型(LLM)通过不同的 Prompt 来扮演:

  1. 行动者 (Actor):

    • 职责: 根据任务目标和当前的“反思记忆”,生成思考和具体行动指令。
    • 工作方式: 这是 Agent 的“手和脚”,负责与外部环境(如代码解释器、搜索引擎)交互。在后续的尝试中,Actor 的 Prompt 会包含之前失败后总结的反思,从而避免重蹈覆辙。
  2. 评估者 (Evaluator):

    • 职责: 判断行动者的输出结果是成功、失败还是部分成功。
    • 工作方式: 评估者检查 Actor 的行动轨迹(Trajectory)和最终结果。评估可以是简单的基于规则的检查(例如,代码是否成功运行),也可以是复杂的、基于 LLM 的语义判断(例如,生成的文章是否回答了问题)。
  3. 自我反思者 (Self-Reflector):

    • 职责: 这是 Reflexion 的核心。当评估者给出“失败”信号时,反思者被激活。它会分析整个失败的行动轨迹,并生成一段简洁、高度概括、具有指导意义的反思文本 (Reflection Text)
    • 工作方式: 反思者会被要求回答“为什么之前的尝试会失败?”以及“下一次应该如何做才能避免这个错误?”。生成的反思文本会被存储到“反思记忆库”中。

工作流程图

下面是 Reflexion Agent 的典型工作流程:


如何使用 Reflexion Prompt 开发 Agent

开发一个 Reflexion Agent 的本质,就是设计一套精巧的 Prompt 链,来分别驱动 Actor, Evaluator 和 Reflector 这三个角色,并管理好“反思记忆库”。

第1步:定义 Agent 的核心组件

你需要准备三个主要的 LLM 调用函数,或者说三个核心 Prompt。

1. Actor Prompt (行动者提示)

这是 Agent 执行任务的基础。与 ReAct 不同的是,你需要为它注入“反思记忆”。

  • 基础结构:

    你是一个{Agent角色,如AI程序员}。你需要解决以下任务。
    
    # 任务
    {task_description}
    
    # 思考过程
    你需要一步步思考,然后选择一个工具/行动。可用的工具有: {tool_list}。
    
    # 反思 (如果记忆库不为空)
    在之前的尝试中,你犯了一些错误。请参考以下从失败中总结的经验教训,避免重蹈覆覆:
    {reflection_memory}
    
    # 行动轨迹 (Scratchpad)
    {scratchpad}
  • {reflection_memory}: 这是一个变量,用于动态插入所有过去的反思文本。在第一次尝试时,这里是空的。
  • {scratchpad}: 用于记录当前尝试中的“Thought, Action, Observation”序列。

2. Evaluator Prompt (评估者提示)

评估可以是简单的代码检查,也可以是复杂的 LLM 判断。对于需要语义理解的评估,可以使用如下 Prompt:

  • 基础结构:

    # 角色
    你是一个严谨的评估机器人。
    
    # 原始任务
    {task_description}
    
    # Agent 的行动轨迹
    {agent_trajectory}
    
    # 评估标准
    请根据以下标准判断 Agent 是否成功完成了任务:
    1.  {criterion_1}
    2.  {criterion_2}
    
    # 你的判断
    请严格回答 "Success" 或 "Failure"。
  • {agent_trajectory}: 传入 Actor 在一次完整尝试中的所有记录。

3. Self-Reflector Prompt (自我反思提示)

这是整个 Reflexion 机制的灵魂。当 Evaluator 返回 "Failure" 时,调用此 Prompt。

  • 基础结构:

    # 角色
    你是一个善于反思和总结的 AI 导师。
    
    # 失败的尝试
    一个 Agent 在尝试解决以下任务时失败了。
    任务: {task_description}
    
    这是它失败的完整行动轨迹:
    {failed_trajectory}
    
    # 你的任务
    请仔细分析上述轨迹,找出导致失败的关键原因。然后,生成一条或几条简洁、通用、具有指导意义的反思。这条反思应该像一个警句或策略,帮助 Agent 在未来的尝试中避免同样的错误。
    
    # 输出要求
    - 直接输出反思文本。
    - 语言要精炼,不超过 50 个字。
    - 专注于策略层面,而不是具体的代码细节。
    
    # 你的反思:
  • 示例输出 (反思文本):
    • "如果一个库的某个函数不存在,应该先检查库的版本或者查阅官方文档,而不是猜测函数名。"
    • "在进行文件写入前,必须先确认目标目录是否存在,如果不存在则需要创建它。"
    • "当网页爬取不到预期内容时,应检查请求头(Headers)是否模拟了真实浏览器,以防被屏蔽。"

第2步:搭建 Agent 的主循环

有了这三个核心 Prompt,你就可以编写 Agent 的主控制逻辑了。

伪代码示例:

def run_reflexion_agent(task, max_trials=3):
    # 初始化反思记忆库
    reflection_memory = []

    for i in range(max_trials):
        print(f"--- 开始第 {i+1} 次尝试 ---")

        # 1. 执行一次完整的尝试 (Actor)
        # Actor 的 prompt 中会包含 reflection_memory
        current_trajectory = execute_trial(task, reflection_memory)

        # 2. 评估结果 (Evaluator)
        is_successful = evaluate_trial(task, current_trajectory)

        if is_successful:
            print("任务成功!")
            return current_trajectory
        else:
            print("尝试失败,开始反思...")
            # 3. 如果失败,进行反思 (Self-Reflector)
            new_reflection = generate_reflection(current_trajectory)
            print(f"新的反思: {new_reflection}")

            # 4. 更新记忆库
            reflection_memory.append(new_reflection)

    print("已达到最大尝试次数,任务失败。")
    return None

# --- Helper Functions ---
def execute_trial(task, reflections):
    # 调用 LLM (Actor Prompt) 来生成一系列的 thought-action-observation
    # ... 实现细节 ...
    return trajectory

def evaluate_trial(task, trajectory):
    # 调用 LLM (Evaluator Prompt) 或其他规则来判断成功与否
    # ... 实现细节 ...
    return True_or_False

def generate_reflection(failed_trajectory):
    # 调用 LLM (Self-Reflector Prompt) 来生成反思文本
    # ... 实现细节 ...
    return reflection_text

关键的实现细节与建议

  1. 管理记忆库和上下文窗口: 反思记忆会不断增长。如果记忆过多,可能会超出 LLM 的上下文窗口限制。你需要策略来管理它,例如:

    • 只保留最近的 N 条反思。
    • 对所有反思进行一次更高层次的总结。
    • 使用向量数据库,根据当前失败情境检索最相关的反思。
  2. 反思的质量至关重要: Self-Reflector Prompt 的设计直接决定了 Agent 的学习效率。一个好的反思应该是通用且可操作的,而不是简单地复述错误。

  3. 分层反思 (Hierarchical Reflection): 对于非常复杂的任务,可以设计两层反思。第一层针对短期策略,第二层在多次失败后进行更高层次、更长远的战略总结。

总结

Reflexion 是一种强大但实现起来也更复杂的 Agent 架构。它通过将失败转化为学习机会,极大地提升了 Agent 在需要多步推理、试错和规划的复杂任务上的鲁棒性和成功率。

要成功开发一个 Reflexion Agent,关键在于设计出能够精准驱动 Actor、Evaluator 和 Self-Reflector 这三大核心角色的 Prompt,并实现一个有效的主循环来调度它们和管理反思记忆。这不仅仅是技术实现,更是一门 Prompt Engineering 的艺术。