知识模块
🤖 Agent 知识模块
自我反思

自我反思与纠错

自我反思(Self-Reflection) 是 Agent 的高级能力,让 Agent 能够评估自己的执行结果、分析失败原因、生成改进方案。这是 Agent 从"执行者"升级为"学习者"的关键能力。


一、核心概念

1.1 什么是自我反思?

自我反思 是 Agent 对自身行为和结果进行评估、分析和改进的能力:

┌─────────────────────────────────────────────────────────────┐
│                    自我反思流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                   执行任务                           │  │
│   │                   得到结果                           │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                   自我反思                           │  │
│   │                                                     │  │
│   │   ┌─────────────┐   ┌─────────────┐   ┌─────────┐ │  │
│   │   │   评估结果   │ → │ 分析原因   │ → │ 改进方案│ │  │
│   │   │  (Evaluate) │   │ (Analyze)  │   │ (Improve)│ │  │
│   │   └─────────────┘   └─────────────┘   └─────────┘ │  │
│   │                                                     │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                   再次执行                           │  │
│   │                   改进结果                           │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 反思的时机

时机描述适用场景
执行后反思任务完成后进行整体评估常规任务、结果验证
过程中反思执行过程中检测偏差长任务、高风险任务
失败后反思任务失败时分析原因错误恢复、学习改进

1.3 反思的核心要素

┌─────────────────────────────────────────────────────────────┐
│                    反思三要素                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   1. 验证器(Validator)                                    │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ 作用:判断执行结果是否正确                            │  │
│   │                                                     │  │
│   │ 输入:执行结果 + 预期目标                            │  │
│   │ 输出:验证通过/失败 + 差异说明                       │  │
│   │                                                     │  │
│   │ 示例:                                              │  │
│   │ • 代码测试:运行单元测试                            │  │
│   │ • 数学验证:反向计算验证                            │  │
│   │ • 人工反馈:用户确认                                │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   2. 反思器(Reflector)                                    │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ 作用:分析失败原因,生成改进建议                     │  │
│   │                                                     │  │
│   │ 输入:执行历史 + 失败原因                           │  │
│   │ 输出:问题分析 + 改进方案                           │  │
│   │                                                     │  │
│   │ 示例:                                              │  │
│   │ • "工具参数错误,应该使用正确的格式"                │  │
│   │ • "推理方向错误,应该从另一个角度思考"              │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   3. 修正器(Corrector)                                    │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ 作用:根据反思结果修正执行方案                       │  │
│   │                                                     │  │
│   │ 输入:原方案 + 改进建议                             │  │
│   │ 输出:修正后的执行方案                              │  │
│   │                                                     │  │
│   │ 示例:                                              │  │
│   │ • 修改工具参数                                      │  │
│   │ • 更换工具                                          │  │
│   │ • 调整推理路径                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

二、反思机制设计

2.1 Reflexion 架构

Reflexion 是一种经典的反思架构,由 Shinn et al. 于 2023 年提出:

┌─────────────────────────────────────────────────────────────────────┐
│                    Reflexion 架构                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   ┌─────────────────────────────────────────────────────────────┐ │
│   │                        任务输入                              │ │
│   └─────────────────────────────────────────────────────────────┘ │
│                               │                                     │
│                               ↓                                     │
│   ┌─────────────────────────────────────────────────────────────┐ │
│   │                     Actor(执行器)                          │ │
│   │                                                             │ │
│   │   输入:任务 + 记忆(历史反思)                             │ │
│   │   输出:行动轨迹                                           │ │
│   │                                                             │ │
│   └─────────────────────────────────────────────────────────────┘ │
│                               │                                     │
│                               ↓                                     │
│   ┌─────────────────────────────────────────────────────────────┐ │
│   │                    Evaluator(评估器)                       │ │
│   │                                                             │ │
│   │   输入:行动轨迹                                           │ │
│   │   输出:奖励分数(成功/失败/部分成功)                      │ │
│   │                                                             │ │
│   └─────────────────────────────────────────────────────────────┘ │
│                               │                                     │
│                               ↓                                     │
│                     ┌────────┴────────┐                            │
│                     │   是否成功?     │                            │
│                     └────────┬────────┘                            │
│                              │                                      │
│               ┌──────────────┴──────────────┐                      │
│               ↓                              ↓                      │
│           成功                              失败                    │
│               │                              │                      │
│               ↓                              ↓                      │
│           结束            ┌─────────────────────────────────┐      │
│                          │    Self-Reflection(自我反思)   │      │
│                          │                                 │      │
│                          │   输入:行动轨迹 + 失败原因     │      │
│                          │   输出:反思总结                │      │
│                          │                                 │      │
│                          │   存入记忆,用于下次执行        │      │
│                          └─────────────────────────────────┘      │
│                                          │                         │
│                                          ↓                         │
│                                    重新执行                         │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

2.2 反思类型

类型描述示例
结果反思评估最终结果是否符合预期"输出格式不符合要求"
过程反思评估执行过程是否合理"走了弯路,应该直接搜索"
策略反思评估整体策略是否正确"分解策略不合理,粒度太粗"
学习反思从成功/失败中提取经验"记住:API 调用需要先认证"

2.3 反思深度

┌─────────────────────────────────────────────────────────────┐
│                    反思深度层次                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   第一层:表面反思                                          │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ 直接观察到的错误                                     │  │
│   │ 例:"工具调用失败,参数格式错误"                     │  │
│   │ 修正:修改参数格式                                   │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   第二层:原因反思                                          │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ 分析错误的根本原因                                   │  │
│   │ 例:"参数格式错误是因为理解了错误的 API 文档"        │  │
│   │ 修正:重新阅读文档,确认参数规范                     │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   第三层:策略反思                                          │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ 分析策略层面的问题                                   │  │
│   │ 例:"应该先做小规模测试,再正式调用"                 │  │
│   │ 修正:添加测试步骤到执行流程                         │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   第四层:学习反思                                          │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ 提取可复用的经验                                     │  │
│   │ 例:"所有 API 调用前都应该先测试连通性"              │  │
│   │ 修正:更新默认执行策略                               │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

三、代码实现

3.1 基础反思机制

"""
自我反思机制基础实现
包含验证器、反思器、修正器
"""
 
from typing import List, Optional, Dict, Any
from dataclasses import dataclass
from enum import Enum
 
from langchain_openai import ChatOpenAI
 
 
class ReflectionType(Enum):
    """反思类型"""
    RESULT = "result"        # 结果反思
    PROCESS = "process"      # 过程反思
    STRATEGY = "strategy"    # 策略反思
    LEARNING = "learning"    # 学习反思
 
 
@dataclass
class ExecutionTrace:
    """执行轨迹"""
    task: str                      # 任务描述
    actions: List[Dict[str, Any]]  # 执行动作列表
    result: Any                    # 最终结果
    success: bool                  # 是否成功
    error: Optional[str] = None    # 错误信息
 
 
@dataclass
class Reflection:
    """反思结果"""
    type: ReflectionType           # 反思类型
    issue: str                     # 发现的问题
    cause: str                     # 问题原因
    suggestion: str                # 改进建议
    confidence: float              # 置信度
 
 
class Validator:
    """
    验证器
    判断执行结果是否正确
    """
    
    VALIDATION_PROMPT = """
请验证以下执行结果是否正确完成任务。
 
任务:{task}
执行结果:{result}
 
请判断:
1. 任务是否完成?
2. 结果是否符合预期?
3. 有什么问题或不足?
 
请按以下格式输出:
状态:成功/失败/部分成功
问题:(如果有)
建议:(如果有)
"""
    
    def __init__(self, model_name: str = "gpt-4"):
        self.llm = ChatOpenAI(model=model_name, temperature=0)
    
    def validate(self, trace: ExecutionTrace) -> tuple[bool, str]:
        """
        验证执行结果
        
        Returns:
            (是否成功, 反馈信息)
        """
        prompt = self.VALIDATION_PROMPT.format(
            task=trace.task,
            result=str(trace.result)
        )
        
        response = self.llm.invoke(prompt)
        content = response.content
        
        # 解析状态
        if "成功" in content and "失败" not in content:
            return True, content
        elif "部分成功" in content:
            return False, content
        else:
            return False, content
 
 
class Reflector:
    """
    反思器
    分析失败原因,生成改进建议
    """
    
    REFLECTION_PROMPT = """
请分析以下执行失败的原因,并提出改进建议。
 
任务:{task}
执行动作:
{actions}
 
执行结果:{result}
失败原因:{error}
 
请进行深度反思:
1. 问题出在哪里?(表面原因)
2. 根本原因是什么?(深层原因)
3. 如何改进?(具体建议)
4. 有什么经验教训?(可复用的知识)
 
请按以下格式输出:
问题:...
原因:...
建议:...
教训:...
"""
    
    def __init__(self, model_name: str = "gpt-4"):
        self.llm = ChatOpenAI(model=model_name, temperature=0.7)
    
    def reflect(self, trace: ExecutionTrace) -> Reflection:
        """
        进行反思
        
        Returns:
            反思结果
        """
        # 格式化动作历史
        actions_text = "\n".join([
            f"  {i+1}. {action}"
            for i, action in enumerate(trace.actions)
        ])
        
        prompt = self.REFLECTION_PROMPT.format(
            task=trace.task,
            actions=actions_text,
            result=str(trace.result),
            error=trace.error or "未达到预期目标"
        )
        
        response = self.llm.invoke(prompt)
        content = response.content
        
        # 解析反思结果
        issue = self._extract_section(content, "问题")
        cause = self._extract_section(content, "原因")
        suggestion = self._extract_section(content, "建议")
        
        return Reflection(
            type=ReflectionType.RESULT,
            issue=issue,
            cause=cause,
            suggestion=suggestion,
            confidence=0.8
        )
    
    def _extract_section(self, text: str, section: str) -> str:
        """提取指定部分"""
        lines = text.split('\n')
        result = []
        capturing = False
        
        for line in lines:
            if line.startswith(f"{section}:") or line.startswith(f"{section}:"):
                capturing = True
                result.append(line.split(':', 1)[-1].split(':', 1)[-1].strip())
            elif capturing:
                if any(line.startswith(s) for s in ["问题", "原因", "建议", "教训"]):
                    break
                result.append(line.strip())
        
        return '\n'.join(result) if result else ""
 
 
class SelfReflectionAgent:
    """
    自我反思 Agent
    整合验证器、反思器,支持迭代改进
    """
    
    def __init__(
        self,
        model_name: str = "gpt-4",
        max_reflections: int = 3
    ):
        self.llm = ChatOpenAI(model=model_name, temperature=0)
        self.validator = Validator(model_name)
        self.reflector = Reflector(model_name)
        self.max_reflections = max_reflections
        self.reflection_memory: List[Reflection] = []
    
    def execute(self, task: str) -> ExecutionTrace:
        """执行任务(简化实现)"""
        # 这里简化为直接调用 LLM
        response = self.llm.invoke(task)
        
        return ExecutionTrace(
            task=task,
            actions=[{"type": "llm_call", "input": task}],
            result=response.content,
            success=True
        )
    
    def run_with_reflection(self, task: str) -> dict:
        """
        带反思的执行
        
        Args:
            task: 任务描述
            
        Returns:
            执行结果和反思历史
        """
        for iteration in range(self.max_reflections):
            # 执行任务
            trace = self.execute(task)
            
            # 验证结果
            is_success, feedback = self.validator.validate(trace)
            trace.success = is_success
            
            if is_success:
                return {
                    "task": task,
                    "success": True,
                    "result": trace.result,
                    "iterations": iteration + 1
                }
            
            # 反思失败原因
            trace.error = feedback
            reflection = self.reflector.reflect(trace)
            self.reflection_memory.append(reflection)
            
            # 根据反思调整任务描述
            task = self._adjust_task(task, reflection)
        
        return {
            "task": task,
            "success": False,
            "result": trace.result,
            "iterations": self.max_reflections,
            "reflections": [
                {
                    "issue": r.issue,
                    "cause": r.cause,
                    "suggestion": r.suggestion
                }
                for r in self.reflection_memory
            ]
        }
    
    def _adjust_task(self, task: str, reflection: Reflection) -> str:
        """根据反思调整任务"""
        return f"""
原始任务:{task}
 
注意避免以下问题:
- {reflection.issue}
原因:{reflection.cause}
建议:{reflection.suggestion}
 
请重新执行任务,注意改进。
"""
 
 
# 使用示例
if __name__ == "__main__":
    agent = SelfReflectionAgent(max_reflections=3)
    
    result = agent.run_with_reflection(
        "写一个 Python 函数,计算斐波那契数列的第 n 项"
    )
    
    print(f"任务:{result['task']}")
    print(f"成功:{result['success']}")
    print(f"迭代次数:{result['iterations']}")
    if not result['success']:
        print("\n反思历史:")
        for i, r in enumerate(result['reflections'], 1):
            print(f"\n{i}次反思:")
            print(f"  问题:{r['issue']}")
            print(f"  原因:{r['cause']}")
            print(f"  建议:{r['suggestion']}")

3.2 使用 LangGraph 实现

"""
使用 LangGraph 实现反思循环
"""
 
from typing import TypedDict, List, Optional
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
 
 
class ReflectionState(TypedDict):
    """反思状态"""
    task: str
    actions: List[str]
    result: str
    is_valid: bool
    feedback: str
    reflection: str
    iteration: int
    max_iterations: int
 
 
def create_reflection_graph():
    """创建反思图"""
    
    llm = ChatOpenAI(model="gpt-4", temperature=0)
    
    # 执行节点
    def execute(state: ReflectionState) -> ReflectionState:
        """执行任务"""
        # 构建带反思历史的提示
        prompt = state["task"]
        if state["reflection"]:
            prompt = f"""
任务:{state['task']}
 
之前的反思:
{state['reflection']}
 
请改进后重新执行。
"""
        
        response = llm.invoke(prompt)
        
        return {
            **state,
            "result": response.content,
            "actions": state["actions"] + [prompt[:100]],
            "iteration": state["iteration"] + 1
        }
    
    # 验证节点
    def validate(state: ReflectionState) -> ReflectionState:
        """验证结果"""
        prompt = f"""
验证以下结果是否正确完成任务。
 
任务:{state['task']}
结果:{state['result']}
 
请判断:成功/失败
如果失败,请说明原因。
"""
        
        response = llm.invoke(prompt)
        content = response.content
        
        is_valid = "成功" in content and "失败" not in content
        
        return {
            **state,
            "is_valid": is_valid,
            "feedback": content
        }
    
    # 反思节点
    def reflect(state: ReflectionState) -> ReflectionState:
        """反思失败原因"""
        prompt = f"""
分析失败原因并提出改进建议。
 
任务:{state['task']}
执行结果:{state['result']}
失败原因:{state['feedback']}
 
请分析问题并提出改进建议。
"""
        
        response = llm.invoke(prompt)
        
        return {
            **state,
            "reflection": response.content
        }
    
    # 条件判断
    def should_continue(state: ReflectionState) -> str:
        """判断是否继续"""
        if state["is_valid"]:
            return "end"
        if state["iteration"] >= state["max_iterations"]:
            return "end"
        return "reflect"
    
    # 创建图
    workflow = StateGraph(ReflectionState)
    
    # 添加节点
    workflow.add_node("execute", execute)
    workflow.add_node("validate", validate)
    workflow.add_node("reflect", reflect)
    
    # 设置入口
    workflow.set_entry_point("execute")
    
    # 添加边
    workflow.add_edge("execute", "validate")
    workflow.add_conditional_edges(
        "validate",
        should_continue,
        {
            "end": END,
            "reflect": "reflect"
        }
    )
    workflow.add_edge("reflect", "execute")
    
    return workflow.compile()
 
 
# 使用示例
if __name__ == "__main__":
    graph = create_reflection_graph()
    
    result = graph.invoke({
        "task": "实现一个冒泡排序算法",
        "actions": [],
        "result": "",
        "is_valid": False,
        "feedback": "",
        "reflection": "",
        "iteration": 0,
        "max_iterations": 3
    })
    
    print(f"最终结果:{result['is_valid']}")
    print(f"迭代次数:{result['iteration']}")

四、反思的应用场景

4.1 适用场景

场景反思价值示例
代码生成验证代码正确性运行测试用例
数学推理验证计算结果反向计算验证
创意写作质量评估改进自我评分改进
问题解决多次尝试优化穷举搜索优化

4.2 反思时机选择

┌─────────────────────────────────────────────────────────────┐
│                    反思时机决策                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │               是否需要反思?                         │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│              ┌───────────┴───────────┐                     │
│              ↓                       ↓                      │
│           需要验证                 不需要                   │
│              │                       │                      │
│              ↓                       ↓                      │
│   ┌─────────────────┐         直接输出                     │
│   │ 验证成本高吗?  │                                       │
│   └────────┬────────┘                                       │
│            │                                                │
│     ┌──────┴──────┐                                        │
│     ↓             ↓                                         │
│    高            低                                          │
│     │             │                                          │
│     ↓             ↓                                          │
│  事后反思     过程中反思                                    │
│  (执行完再验证) (边执行边验证)                           │
│                                                             │
│   示例决策:                                                │
│   • 写代码 → 高验证成本 → 事后反思(运行测试)             │
│   • 数学计算 → 低验证成本 → 过程中反思(逐步检查)         │
│   • 创意写作 → 主观评估 → 事后反思(自我评分)             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

五、反思机制的挑战

5.1 主要挑战

挑战描述影响
反思本身可能出错LLM 的反思结论不一定正确可能导致错误修正
无限循环反思后仍然失败,继续反思资源浪费
反思频率权衡反思次数多成本高,少则效果差效率与质量权衡
经验提取难从失败中提取可复用经验不容易学习效果有限

5.2 解决方案

┌─────────────────────────────────────────────────────────────┐
│                    挑战应对策略                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   1. 反思验证                                               │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • 使用外部验证器验证反思结论                         │  │
│   │ • 多次反思取共识                                     │  │
│   │ • 设置置信度阈值                                     │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   2. 循环控制                                               │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • 设置最大反思次数                                   │  │
│   │ • 检测重复反思(无新进展则终止)                     │  │
│   │ • 降级策略(多次失败后换方法)                       │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   3. 成本优化                                               │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • 快速失败检测(先做简单验证)                       │  │
│   │ • 分层反思(先浅层,失败再深层)                     │  │
│   │ • 缓存反思结果(类似问题复用)                       │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   4. 经验固化                                               │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • 将反思结论写入长期记忆                             │  │
│   │ • 结构化存储(问题-原因-解决方案)                   │  │
│   │ • 定期总结提炼                                       │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

六、面试高频问题

Q1: 自我反思机制的核心要素是什么?

答案要点:

  • 验证器:判断结果是否正确
  • 反思器:分析失败原因
  • 修正器:生成改进方案
  • 三者形成闭环,支持迭代改进

Q2: 如何避免无限反思循环?

答案要点:

  • 设置最大反思次数
  • 检测重复反思(无新进展则终止)
  • 实现降级策略(多次失败后换方法)
  • 使用外部验证器判断

Q3: 反思机制适用于哪些场景?

答案要点:

  • 代码生成:通过测试验证正确性
  • 数学推理:通过反向计算验证
  • 复杂任务:需要多次尝试优化
  • 学习场景:需要从失败中积累经验

Q4: 反思深度如何选择?

答案要点:

  • 表面反思:快速定位明显错误
  • 原因反思:分析根本原因
  • 策略反思:优化执行策略
  • 学习反思:提取可复用经验
  • 根据失败次数递进深入

Q5: Reflexion 架构的核心思想是什么?

答案要点:

  • Actor 执行任务
  • Evaluator 评估结果
  • Self-Reflection 反思失败原因
  • 反思结果存入记忆,用于下次执行
  • 形成"执行-评估-反思-改进"的闭环

七、小结

概念一句话总结面试关键词
自我反思Agent 评估自身行为并改进的能力Self-Reflection、迭代改进
验证器判断执行结果是否正确Validator、结果验证
反思器分析失败原因Reflector、原因分析
Reflexion经典的反思架构Actor-Evaluator-Reflector

一句话总结:自我反思是 Agent 从"执行者"升级为"学习者"的关键能力,通过验证-反思-改进的闭环实现持续优化。


最后更新:2026年3月19日