知识模块
🤖 Agent 知识模块
五、Agent 架构模式
Reflexion 反思模式

Reflexion 反思模式

Reflexion 是一种基于语言反馈的自我反思 Agent 架构,由 Shinn et al. 于 2023 年提出。其核心思想是通过"执行→评估→反思→改进"的闭环,让 Agent 从失败经验中学习,无需微调底层模型即可提升任务表现。


一、核心原理

1.1 设计哲学

Reflexion 的核心思想源于人类的"反思学习"模式:

┌─────────────────────────────────────────────────────────────┐
│                    Reflexion 设计哲学                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   传统 Agent:                                              │
│   ┌─────────┐     ┌─────────┐     ┌─────────┐             │
│   │  输入   │ ──→ │  执行   │ ──→ │  输出   │             │
│   └─────────┘     └─────────┘     └─────────┘             │
│                   执行一次,失败即终止                       │
│                                                             │
│   Reflexion 模式:                                          │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                                                      │  │
│   │   ┌─────────┐                                        │  │
│   │   │  输入   │                                        │  │
│   │   └────┬────┘                                        │  │
│   │        ↓                                             │  │
│   │   ┌─────────┐     ┌─────────┐     ┌─────────┐       │  │
│   │   │ Actor   │ ──→ │ Evaluator│ ──→ │Reflector│       │  │
│   │   │ 执行    │     │ 评估    │     │ 反思    │       │  │
│   │   └────┬────┘     └────┬────┘     └────┬────┘       │  │
│   │        │               │               │             │  │
│   │        │         失败时反馈      语言化反思           │  │
│   │        │               │               │             │  │
│   │        └───────────────┴───────────────┘             │  │
│   │                        ↓                              │  │
│   │              ┌─────────────────┐                     │  │
│   │              │   迭代改进      │                     │  │
│   │              │   Retry with    │                     │  │
│   │              │   Reflection    │                     │  │
│   │              └─────────────────┘                     │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   核心创新:用语言反馈替代标量奖励                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 三大核心组件

组件英文职责输出
Actor执行者生成动作序列,执行任务轨迹(Trajectory)
Evaluator评估者评估执行结果,给出反馈奖励信号/反馈文本
Self-Reflector反思器分析失败原因,生成改进建议反思文本(Reflection)

1.3 工作流程详解

┌─────────────────────────────────────────────────────────────┐
│                    Reflexion 工作流程                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   第一轮尝试(Trial 1)                                      │
│   ┌─────────────────────────────────────────────────────┐  │
│  │                                                       │  │
│  │  Actor: 生成初始答案                                   │  │
│  │    ↓                                                  │  │
│  │  Evaluator: 评估 → 结果:失败                          │  │
│  │    ↓                                                  │  │
│  │  Self-Reflector: 分析失败原因                          │  │
│  │    "答案不完整,缺少对X的考虑"                          │  │
│  │    ↓                                                  │  │
│  │  存入反思记忆                                          │  │
│  │                                                       │  │
│  └─────────────────────────────────────────────────────┘  │
│                          ↓                                  │
│   第二轮尝试(Trial 2)                                      │
│   ┌─────────────────────────────────────────────────────┐  │
│  │                                                       │  │
│  │  Actor: 参考反思记忆重新规划                           │  │
│  │    "注意要考虑X"                                       │  │
│  │    ↓                                                  │  │
│  │  生成改进后的答案                                      │  │
│  │    ↓                                                  │  │
│  │  Evaluator: 评估 → 结果:成功                          │  │
│  │    ↓                                                  │  │
│  │  输出最终答案                                          │  │
│  │                                                       │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.4 与传统强化学习的区别

对比维度Reflexion传统 RL
奖励类型语言反馈标量奖励
信息量高(详细解释)低(单一数值)
学习方式上下文学习权重更新
模型要求无需微调需要训练
适用场景任务可评估需要大量样本

二、工作流程

2.1 完整工作流程图

┌─────────────────────────────────────────────────────────────────────┐
│                    Reflexion 完整工作流程                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   ┌─────────────┐                                                  │
│   │  任务输入   │                                                  │
│   │  (Task)     │                                                  │
│   └──────┬──────┘                                                  │
│          │                                                         │
│          ↓                                                         │
│   ┌─────────────────────────────────────────────────────────────┐ │
│   │                    迭代循环                                   │ │
│   │  ┌───────────────────────────────────────────────────────┐  │ │
│   │  │                                                       │  │ │
│   │  │   ┌──────────────────────────────────────────────┐    │  │ │
│   │  │   │              Actor 阶段                       │    │  │ │
│   │  │   │                                              │    │  │ │
│   │  │   │   Context = Task + History + Reflections     │    │  │ │
│   │  │   │        ↓                                     │    │  │ │
│   │  │   │   生成动作序列 (Trajectory)                   │    │  │ │
│   │  │   │        ↓                                     │    │  │ │
│   │  │   │   执行工具调用                               │    │  │ │
│   │  │   │        ↓                                     │    │  │ │
│   │  │   │   生成答案                                   │    │  │ │
│   │  │   │                                              │    │  │ │
│   │  │   └──────────────────────────────────────────────┘    │  │ │
│   │  │                         │                             │  │ │
│   │  │                         ↓                             │  │ │
│   │  │   ┌──────────────────────────────────────────────┐    │  │ │
│   │  │   │            Evaluator 阶段                     │    │  │ │
│   │  │   │                                              │    │  │ │
│   │  │   │   输入:Task + Trajectory + Answer           │    │  │ │
│   │  │   │        ↓                                     │    │  │ │
│   │  │   │   评估函数判断                               │    │  │ │
│   │  │   │        ↓                                     │    │  │ │
│   │  │   │   输出:Success / Failure + Feedback         │    │  │ │
│   │  │   │                                              │    │  │ │
│   │  │   └──────────────────────────────────────────────┘    │  │ │
│   │  │                         │                             │  │ │
│   │  │               ┌─────────┴─────────┐                   │  │ │
│   │  │               ↓                   ↓                   │  │ │
│   │  │          ┌─────────┐        ┌──────────┐             │  │ │
│   │  │          │ 成功    │        │  失败    │              │  │ │
│   │  │          │ 输出答案 │        │ 进入反思 │              │  │ │
│   │  │          └────┬────┘        └────┬─────┘             │  │ │
│   │  │               │                  │                    │  │ │
│   │  │               │                  ↓                    │  │ │
│   │  │               │    ┌────────────────────────┐        │  │ │
│   │  │               │    │   Self-Reflector 阶段  │        │  │ │
│   │  │               │    │                        │        │  │ │
│   │  │               │    │   分析失败原因          │        │  │ │
│   │  │               │    │   生成反思文本          │        │  │ │
│   │  │               │    │   存入反思记忆          │        │  │ │
│   │  │               │    │        ↓               │        │  │ │
│   │  │               │    │   返回 Actor 重试      │        │  │ │
│   │  │               │    │                        │        │  │ │
│   │  │               │    └────────────────────────┘        │  │ │
│   │  │               │                                       │  │ │
│   │  │               ↓                                       │  │ │
│   │  │        ┌─────────────┐                               │  │ │
│   │  │        │  达到最大   │                               │  │ │
│   │  │        │  重试次数?  │                               │  │ │
│   │  │        └──────┬──────┘                               │  │ │
│   │  │               │                                       │  │ │
│   │  │        ┌──────┴──────┐                               │  │ │
│   │  │        ↓             ↓                               │  │ │
│   │  │   ┌────────┐   ┌──────────┐                         │  │ │
│   │  │   │  是    │   │    否    │                          │  │ │
│   │  │   │ 输出   │   │ 继续迭代 │                          │  │ │
│   │  │   │ 最佳   │   └──────────┘                          │  │ │
│   │  │   └────────┘                                         │  │ │
│   │  │                                                       │  │ │
│   │  └───────────────────────────────────────────────────────┘  │ │
│   │                                                              │ │
│   └─────────────────────────────────────────────────────────────┘ │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

2.2 反思记忆结构

@dataclass
class Reflection:
    """反思记录"""
    trial_id: int           # 尝试次数
    task: str               # 任务描述
    trajectory: List[str]   # 执行轨迹
    failure_reason: str     # 失败原因
    improvement: str        # 改进建议
    timestamp: datetime     # 时间戳
 
 
class ReflectionMemory:
    """反思记忆管理"""
    
    def __init__(self, max_reflections: int = 5):
        self.reflections: List[Reflection] = []
        self.max_reflections = max_reflections  # 滑动窗口大小
    
    def add(self, reflection: Reflection):
        """添加反思记录"""
        self.reflections.append(reflection)
        # 滑动窗口:只保留最近的 N 条
        if len(self.reflections) > self.max_reflections:
            self.reflections.pop(0)
    
    def get_context(self) -> str:
        """获取反思上下文"""
        if not self.reflections:
            return ""
        
        context = "历史反思:\n"
        for r in self.reflections:
            context += f"- \{r.improvement\}\n"
        return context

2.3 执行轨迹示例

┌─────────────────────────────────────────────────────────────┐
│                    Reflexion 执行轨迹示例                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  任务:编写一个 Python 函数,计算列表中的最大值              │
│                                                             │
│  === Trial 1 ===                                            │
│  Actor 输出:                                               │
│  ```python                                                  │
│  def find_max(lst):                                         │
│      return max(lst)                                        │
│  ```                                                        │
│                                                             │
│  Evaluator 评估:                                           │
│  - 测试用例 1: find_max([1,2,3]) → 3 ✓                     │
│  - 测试用例 2: find_max([]) → Error ✗                      │
│  结果:失败                                                 │
│                                                             │
│  Self-Reflector 反思:                                      │
│  "函数没有处理空列表的情况,需要添加边界检查"               │
│                                                             │
│  === Trial 2 ===                                            │
│  Actor 输出(参考反思):                                   │
│  ```python                                                  │
│  def find_max(lst):                                         │
│      if not lst:                                            │
│          return None                                        │
│      return max(lst)                                        │
│  ```                                                        │
│                                                             │
│  Evaluator 评估:                                           │
│  - 测试用例 1: find_max([1,2,3]) → 3 ✓                     │
│  - 测试用例 2: find_max([]) → None ✓                       │
│  - 测试用例 3: find_max([-1,-2]) → -1 ✓                    │
│  结果:成功                                                 │
│                                                             │
│  最终输出:改进后的函数                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

三、代码实现

3.1 基础实现

"""
Reflexion Agent 基础实现
基于语言反馈的自我反思学习
"""
 
from typing import List, Optional, Dict, Any, Callable
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
 
 
class EvaluationResult(Enum):
    """评估结果"""
    SUCCESS = "success"
    FAILURE = "failure"
 
 
@dataclass
class Reflection:
    """反思记录"""
    trial_id: int
    task: str
    trajectory: List[str]
    answer: str
    failure_reason: str
    improvement: str
    timestamp: datetime = field(default_factory=datetime.now)
 
 
@dataclass
class Trial:
    """一次尝试"""
    trial_id: int
    task: str
    trajectory: List[str] = field(default_factory=list)
    answer: str = ""
    result: Optional[EvaluationResult] = None
    feedback: str = ""
 
 
class ReflectionMemory:
    """反思记忆"""
    
    def __init__(self, max_size: int = 5):
        self.reflections: List[Reflection] = []
        self.max_size = max_size
    
    def add(self, reflection: Reflection):
        self.reflections.append(reflection)
        if len(self.reflections) > self.max_size:
            self.reflections.pop(0)
    
    def get_context(self) -> str:
        if not self.reflections:
            return "暂无历史反思记录。"
        
        context = "【历史反思】\n"
        for r in self.reflections:
            context += f"- 第\{r.trial_id\}次尝试:\{r.improvement\}\n"
        return context
 
 
class Actor:
    """执行者:生成动作和答案"""
    
    ACTOR_PROMPT = """
你是一个智能助手,请完成以下任务。
 
任务:\{task\}
 
\{reflection_context\}
 
请生成你的答案:
"""
    
    def __init__(self, llm, tools: List = None):
        self.llm = llm
        self.tools = tools or []
    
    def generate(self, task: str, reflection_context: str = "") -> Trial:
        """生成答案"""
        prompt = self.ACTOR_PROMPT.format(
            task=task,
            reflection_context=reflection_context
        )
        
        response = self.llm(prompt)
        
        trial = Trial(
            trial_id=0,
            task=task,
            answer=response
        )
        
        return trial
 
 
class Evaluator:
    """评估者:评估答案质量"""
    
    def __init__(self, eval_func: Callable = None):
        self.eval_func = eval_func or self._default_eval
    
    def _default_eval(self, task: str, answer: str) -> tuple:
        """默认评估函数"""
        # 简单的启发式评估
        if "错误" in answer or "失败" in answer:
            return EvaluationResult.FAILURE, "答案包含错误标记"
        return EvaluationResult.SUCCESS, "答案看起来合理"
    
    def evaluate(self, trial: Trial) -> tuple:
        """评估一次尝试"""
        result, feedback = self.eval_func(trial.task, trial.answer)
        trial.result = result
        trial.feedback = feedback
        return result, feedback
 
 
class SelfReflector:
    """反思器:生成反思文本"""
    
    REFLECTION_PROMPT = """
任务:\{task\}
 
你的答案:
\{answer\}
 
评估结果:失败
反馈:\{feedback\}
 
请分析失败原因,并给出改进建议:
1. 失败原因是什么?
2. 应该如何改进?
 
反思:
"""
    
    def __init__(self, llm):
        self.llm = llm
    
    def reflect(self, trial: Trial) -> Reflection:
        """生成反思"""
        prompt = self.REFLECTION_PROMPT.format(
            task=trial.task,
            answer=trial.answer,
            feedback=trial.feedback
        )
        
        reflection_text = self.llm(prompt)
        
        return Reflection(
            trial_id=trial.trial_id,
            task=trial.task,
            trajectory=trial.trajectory,
            answer=trial.answer,
            failure_reason=trial.feedback,
            improvement=reflection_text
        )
 
 
class ReflexionAgent:
    """Reflexion Agent"""
    
    def __init__(
        self,
        llm,
        eval_func: Callable = None,
        max_trials: int = 3,
        verbose: bool = True
    ):
        self.llm = llm
        self.actor = Actor(llm)
        self.evaluator = Evaluator(eval_func)
        self.reflector = SelfReflector(llm)
        self.memory = ReflectionMemory()
        self.max_trials = max_trials
        self.verbose = verbose
    
    def run(self, task: str) -> str:
        """运行 Agent"""
        best_answer = None
        
        for trial_id in range(self.max_trials):
            if self.verbose:
                print(f"\n{'='*50}")
                print(f"Trial {trial_id + 1}/{self.max_trials}")
                print('='*50)
            
            # 1. Actor 生成答案
            reflection_context = self.memory.get_context()
            trial = self.actor.generate(task, reflection_context)
            trial.trial_id = trial_id
            
            if self.verbose:
                print(f"\n[Actor] 生成答案:\n\{trial.answer[:200]\}...")
            
            # 2. Evaluator 评估
            result, feedback = self.evaluator.evaluate(trial)
            
            if self.verbose:
                print(f"\n[Evaluator] 结果: \{result.value\}")
                print(f"反馈: \{feedback\}")
            
            # 3. 成功则返回
            if result == EvaluationResult.SUCCESS:
                if self.verbose:
                    print(f"\n成功!返回答案")
                return trial.answer
            
            # 4. 失败则反思
            best_answer = trial.answer  # 保存最佳答案
            
            reflection = self.reflector.reflect(trial)
            self.memory.add(reflection)
            
            if self.verbose:
                print(f"\n[Reflector] 反思:\n\{reflection.improvement[:200]\}...")
        
        # 达到最大尝试次数
        if self.verbose:
            print(f"\n达到最大尝试次数,返回最佳答案")
        
        return best_answer or "无法完成任务"
 
 
# 使用示例
if __name__ == "__main__":
    from langchain_openai import OpenAI
    
    # 定义评估函数
    def code_eval(task: str, answer: str) -> tuple:
        """代码评估函数"""
        # 检查是否包含代码块
        if "```python" not in answer:
            return EvaluationResult.FAILURE, "答案未包含 Python 代码"
        
        # 提取代码并执行测试
        # 这里简化处理
        try:
            # 执行代码测试...
            return EvaluationResult.SUCCESS, "代码测试通过"
        except Exception as e:
            return EvaluationResult.FAILURE, f"代码执行错误: \{str(e)\}"
    
    # 创建 Agent
    llm = OpenAI(temperature=0)
    agent = ReflexionAgent(
        llm=llm,
        eval_func=code_eval,
        max_trials=3,
        verbose=True
    )
    
    # 运行
    result = agent.run("编写一个 Python 函数,实现冒泡排序")
    print(f"\n最终结果:\n\{result\}")

3.2 使用 LangGraph 实现

"""
使用 LangGraph 实现 Reflexion
"""
 
from typing import TypedDict, List, Optional
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
 
 
class ReflexionState(TypedDict):
    """Reflexion 状态"""
    task: str
    reflections: List[str]
    answer: str
    result: str  # "success" | "failure"
    feedback: str
    trial_count: int
 
 
def create_reflexion_graph(max_trials: int = 3):
    """创建 Reflexion 图"""
    
    llm = ChatOpenAI(model="gpt-4", temperature=0)
    
    # Actor 节点
    def actor_node(state: ReflexionState):
        reflections = state.get("reflections", [])
        reflection_context = "\n".join(reflections) if reflections else ""
        
        prompt = f"""任务:\{state['task']\}
 
历史反思:
\{reflection_context\}
 
请生成答案:"""
        
        response = llm.invoke(prompt)
        return {
            "answer": response.content,
            "trial_count": state.get("trial_count", 0) + 1
        }
    
    # Evaluator 节点
    def evaluator_node(state: ReflexionState):
        # 简化的评估逻辑
        answer = state["answer"]
        
        # 这里应该有真实的评估逻辑
        if len(answer) > 50 and "错误" not in answer:
            return {"result": "success", "feedback": "答案合理"}
        else:
            return {"result": "failure", "feedback": "答案不够完整"}
    
    # Reflector 节点
    def reflector_node(state: ReflexionState):
        prompt = f"""任务:\{state['task']\}
答案:\{state['answer']\}
失败原因:\{state['feedback']\}
 
请分析失败原因并给出改进建议:"""
        
        response = llm.invoke(prompt)
        
        reflections = state.get("reflections", [])
        reflections.append(response.content)
        
        return {"reflections": reflections}
    
    # 条件判断
    def should_continue(state: ReflexionState):
        if state["result"] == "success":
            return "end"
        if state["trial_count"] >= max_trials:
            return "end"
        return "reflect"
    
    # 创建图
    workflow = StateGraph(ReflexionState)
    
    # 添加节点
    workflow.add_node("actor", actor_node)
    workflow.add_node("evaluator", evaluator_node)
    workflow.add_node("reflector", reflector_node)
    
    # 设置入口
    workflow.set_entry_point("actor")
    
    # 添加边
    workflow.add_edge("actor", "evaluator")
    workflow.add_conditional_edges(
        "evaluator",
        should_continue,
        {
            "reflect": "reflector",
            "end": END
        }
    )
    workflow.add_edge("reflector", "actor")
    
    return workflow.compile()
 
 
# 使用示例
if __name__ == "__main__":
    graph = create_reflexion_graph(max_trials=3)
    
    result = graph.invoke({
        "task": "编写一个快速排序算法",
        "reflections": [],
        "trial_count": 0
    })
    
    print(f"最终答案: \{result['answer']\}")

3.3 代码生成场景实现

"""
Reflexion 在代码生成场景的应用
"""
 
class CodeReflexionAgent:
    """代码生成 Reflexion Agent"""
    
    CODE_EVAL_PROMPT = """
评估以下代码是否正确完成了任务。
 
任务:\{task\}
代码:
```python
\{code\}

测试用例:{test_cases}

请判断代码是否正确,如果错误请说明原因。 输出格式: 结果:成功/失败 原因:... """

def init(self, llm, max_trials: int = 3): self.llm = llm self.max_trials = max_trials self.memory = ReflectionMemory()

def generate_code(self, task: str, test_cases: str) -> str: """生成代码"""

for trial in range(self.max_trials):

1. 生成代码

reflection_context = self.memory.get_context() code = self._generate(task, reflection_context)

2. 评估代码

result, feedback = self._evaluate(task, code, test_cases)

if result == EvaluationResult.SUCCESS: return code

3. 反思

reflection = self._reflect(task, code, feedback) self.memory.add(reflection)

return code # 返回最后一次尝试

def _generate(self, task: str, context: str) -> str: """生成代码""" prompt = f""" 任务:{task}

{context}

请编写 Python 代码完成任务: """ return self.llm(prompt)

def _evaluate(self, task: str, code: str, test_cases: str) -> tuple: """评估代码"""

方法1:实际执行测试

try: exec_globals = exec(code, exec_globals)

运行测试用例...

return EvaluationResult.SUCCESS, "所有测试通过" except Exception as e: return EvaluationResult.FAILURE, f"执行错误: {str(e)}"

方法2:LLM 评估

prompt = self.CODE_EVAL_PROMPT.format(...)

response = self.llm(prompt)

...

def _reflect(self, task: str, code: str, feedback: str) -> Reflection: """生成反思""" prompt = f""" 代码任务:{task} 代码: {code}

失败原因:{feedback}

请分析问题并给出改进建议: """ reflection_text = self.llm(prompt)

return Reflection( trial_id=0, task=task, trajectory=[code], answer=code, failure_reason=feedback, improvement=reflection_text )


---

## 四、适用场景

### 4.1 最佳适用场景

| 场景类型 | 具体示例 | Reflexion 优势 |
|----------|----------|----------------|
| **代码生成** | 算法实现、函数编写 | 编译/测试反馈明确 |
| **决策任务** | 策略选择、路径规划 | 可验证正确性 |
| **复杂推理** | 数学证明、逻辑推理 | 步骤可追溯 |
| **知识问答** | 多跳问答 | 答案可验证 |

### 4.2 场景详解

┌─────────────────────────────────────────────────────────────┐ │ Reflexion 适用场景详解 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 代码生成场景 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 任务:实现二分查找算法 │ │ │ │ │ │ │ │ Trial 1: │ │ │ │ 代码:缺少边界处理 │ │ │ │ 测试:find([1,2,3], 4) → IndexError │ │ │ │ 反思:需要处理元素不存在的情况 │ │ │ │ │ │ │ │ Trial 2: │ │ │ │ 代码:添加 -1 返回 │ │ │ │ 测试:所有测试通过 ✓ │ │ │ │ │ │ │ │ 优势:从编译/测试错误中快速学习 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 2. 决策任务场景 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 任务:规划最优送货路线 │ │ │ │ │ │ │ │ Trial 1: │ │ │ │ 方案:A→B→C→D │ │ │ │ 评估:总路程 100km,超时 ❌ │ │ │ │ 反思:没有考虑时间窗口约束 │ │ │ │ │ │ │ │ Trial 2: │ │ │ │ 方案:A→C→B→D │ │ │ │ 评估:总路程 80km,满足时间窗口 ✓ │ │ │ │ │ │ │ │ 优势:明确的目标函数,反馈清晰 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 3. 复杂推理场景 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 任务:证明数学命题 │ │ │ │ │ │ │ │ Trial 1: │ │ │ │ 证明:步骤A → 步骤B → 步骤C │ │ │ │ 评估:步骤B推论有误 ❌ │ │ │ │ 反思:步骤B需要额外的中间步骤 │ │ │ │ │ │ │ │ Trial 2: │ │ │ │ 证明:步骤A → 步骤B' → 步骤B → 步骤C │ │ │ │ 评估:逻辑完整 ✓ │ │ │ │ │ │ │ │ 优势:推理步骤可验证,反馈具体 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘


### 4.3 不适用场景

| 场景 | 原因 | 推荐替代方案 |
|------|------|--------------|
| **主观任务** | 难以客观评估 | 直接 LLM 生成 |
| **一次性任务** | 反思价值低 | ReAct 模式 |
| **低延迟要求** | 多次迭代耗时长 | Plan-and-Execute |
| **无验证手段** | 无法给出反馈 | 结合人工审核 |

---

## 五、局限性与优化

### 5.1 主要局限性

| 局限性 | 具体表现 | 影响 |
|--------|----------|------|
| **评估依赖** | 需要可靠的评估函数 | 评估不准导致反思无效 |
| **迭代开销** | 多次尝试消耗资源 | 成本和时间增加 |
| **反思质量** | 反思可能不准确 | 错误反思导致错误改进 |
| **记忆容量** | 滑动窗口有限 | 早期经验可能丢失 |

### 5.2 优化策略

┌─────────────────────────────────────────────────────────────┐ │ Reflexion 优化策略 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 高质量评估函数 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 问题:评估不准确导致反思方向错误 │ │ │ │ │ │ │ │ 优化方案: │ │ │ │ • 多维度评估:正确性、完整性、效率 │ │ │ │ • 自动化测试:单元测试、集成测试 │ │ │ │ • LLM 评估:使用更强的模型评估结果 │ │ │ │ • 人工审核:关键任务加入人工确认 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 2. 结构化反思 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 问题:反思文本过于笼统 │ │ │ │ │ │ │ │ 优化方案:使用结构化格式 │ │ │ │ │ │ │ │ 反思模板: │ │ │ │ 1. 失败原因:[具体原因] │ │ │ │ 2. 问题定位:[哪一步出错] │ │ │ │ 3. 改进建议:[具体措施] │ │ │ │ 4. 注意事项:[需要避免的问题] │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 3. 渐进式改进 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 问题:每次从零开始效率低 │ │ │ │ │ │ │ │ 优化方案: │ │ │ │ • 保留成功部分的代码/内容 │ │ │ │ • 只修改失败的部分 │ │ │ │ • 使用 diff 方式应用改进 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 4. 智能记忆管理 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 问题:反思记忆容量有限 │ │ │ │ │ │ │ │ 优化方案: │ │ │ │ • 向量化存储:相似任务检索相关反思 │ │ │ │ • 摘要压缩:定期压缩历史反思 │ │ │ │ • 优先级排序:保留最有价值的反思 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘


### 5.3 与其他模式结合

```python
"""
Reflexion + ReAct 混合架构
"""

class ReflexionReActAgent:
    """结合 Reflexion 的 ReAct Agent"""
    
    def run(self, task: str) -> str:
        reflections = []
        
        for trial in range(self.max_trials):
            # 使用 ReAct 执行
            result = self.react_agent.run(
                task, 
                reflection_context=reflections
            )
            
            # 评估结果
            if self.evaluator.is_success(result):
                return result
            
            # 反思
            reflection = self.reflector.reflect(task, result)
            reflections.append(reflection)
        
        return result

六、面试常见问题

Q1: Reflexion 如何实现"无需微调的强化学习"?

A:

核心机制

传统 RL:
环境 → Agent → Action → Reward(标量)→ 更新权重

Reflexion:
环境 → Actor → Action → Evaluator → 语言反馈 → Self-Reflector → 反思文本

                                          存入上下文,下次参考

关键创新

  1. 语言反馈替代标量奖励:提供更丰富的信息
  2. 上下文学习:通过 Prompt 注入反思经验
  3. 无需权重更新:不改变模型参数

优势对比

维度传统 RLReflexion
奖励信息单一数值详细文本
学习方式权重更新上下文学习
数据需求大量样本少量尝试
部署成本高(需要训练)低(无需微调)

Q2: Reflexion 适用于哪些任务?不适用于哪些?

A:

适用任务特征

  • ✅ 有明确的评估标准(代码可测试、决策可验证)
  • ✅ 失败原因可分析(能给出具体反馈)
  • ✅ 改进方向明确(知道怎么修正)

不适用任务特征

  • ❌ 主观评估任务(创意写作、艺术创作)
  • ❌ 一次性任务(反思价值低)
  • ❌ 无验证手段的任务(难以给出反馈)

具体场景判断

任务类型是否适用原因
代码生成✅ 适用编译/测试反馈明确
数学推理✅ 适用答案可验证
创意写作❌ 不适用主观评估,无明确标准
数据分析✅ 适用结果可验证
客服对话❌ 不适用难以自动化评估质量

Q3: Reflexion 的反思记忆如何管理?

A:

记忆管理策略

class ReflectionMemory:
    """反思记忆管理"""
    
    def __init__(self, max_size: int = 5):
        self.reflections = []
        self.max_size = max_size  # 滑动窗口大小
    
    def add(self, reflection):
        self.reflections.append(reflection)
        # 只保留最近的 N 条
        if len(self.reflections) > self.max_size:
            self.reflections.pop(0)
    
    def get_relevant(self, task: str, top_k: int = 3):
        """检索相关反思"""
        # 使用向量相似度检索
        # 或使用关键词匹配
        pass

管理策略选择

策略优点缺点适用场景
滑动窗口实现简单可能丢失早期经验简单任务
向量检索相关性强需要额外存储复杂任务
摘要压缩信息保留需要额外处理长期记忆

Q4: 如何设计高质量的评估函数?

A:

评估函数设计原则

def design_evaluator():
    """
    评估函数设计原则
    """
    
    # 1. 多维度评估
    def evaluate_multi_dim(answer):
        scores = {
            "correctness": check_correctness(answer),
            "completeness": check_completeness(answer),
            "efficiency": check_efficiency(answer),
            "readability": check_readability(answer)
        }
        return scores
    
    # 2. 可操作的反馈
    def evaluate_with_feedback(answer):
        if not check_correctness(answer):
            return "失败:答案逻辑有误,请检查第3步的推理"
        if not check_completeness(answer):
            return "失败:答案不完整,缺少边界情况处理"
        return "成功"
    
    # 3. 自动化测试
    def evaluate_code(code, test_cases):
        for test in test_cases:
            result = execute(code, test["input"])
            if result != test["expected"]:
                return f"失败:测试用例 \{test['name']\} 未通过"
        return "成功"

不同场景的评估函数

场景评估方法示例
代码生成单元测试pytest 运行结果
数学推理答案验证数值比对
决策任务目标函数成本/收益计算
知识问答精确匹配字符串比对

Q5: Reflexion 与 Plan-and-Execute 如何结合?

A:

结合方案

class ReflexionPlanExecuteAgent:
    """Reflexion + Plan-Execute 混合"""
    
    def run(self, task: str) -> str:
        reflections = []
        
        for trial in range(self.max_trials):
            # 1. 规划阶段(参考反思)
            plan = self.planner.plan(task, reflections)
            
            # 2. 执行阶段
            result = self.executor.execute(plan)
            
            # 3. 评估
            if self.evaluator.is_success(result):
                return result
            
            # 4. 反思
            reflection = self.reflector.reflect(
                task, plan, result
            )
            reflections.append(reflection)
        
        return result

结合优势

  • Plan-and-Execute 提供结构化执行
  • Reflexion 提供失败恢复能力
  • 两者互补,提升整体可靠性

Q6: Reflexion 的 Token 消耗如何优化?

A:

Token 优化策略

策略方法效果
反思压缩摘要反思文本减少 50%
选择性反思只保留关键反思减少 30%
模板化输出使用结构化模板减少 20%
早期终止成功即停止减少迭代次数

优化代码示例

def compress_reflection(reflection: str) -> str:
    """压缩反思文本"""
    # 提取关键信息
    lines = reflection.split("\n")
    compressed = []
    for line in lines:
        if any(kw in line for kw in ["原因", "建议", "注意"]):
            compressed.append(line)
    return "\n".join(compressed[:5])  # 最多5行

七、总结

概念一句话总结面试关键词
Reflexion基于语言反馈的自我反思学习框架无需微调、迭代改进
Actor执行者,生成动作序列和答案执行、生成
Evaluator评估者,判断结果质量评估、反馈
Self-Reflector反思器,分析失败原因反思、改进建议
核心创新语言反馈替代标量奖励信息丰富、可操作
适用场景有明确评估标准的任务代码生成、决策任务

一句话总结:Reflexion 通过"执行-评估-反思-改进"的闭环,让 Agent 从失败中学习,无需微调即可提升表现,是构建可靠 Agent 的关键技术。


最后更新:2026年3月18日