《Agentic Design Patterns》第 4 章导读:反思(Reflection)

《Agentic Design Patterns》第 4 章导读:反思(Reflection)

本文是对开源书籍《Agentic Design Patterns》第 4 章的解读与导读,内容忠实呈现原文,并附个人思考。

原书在线阅读:https://adp.xindoo.xyz/ | 翻译项目代码仓库:https://github.com/xindoo/agentic-design-patterns


前三章我们把工作流编排得又快又顺:链条保证顺序、路由动态分流、并行化提速。但有个根本问题没解决------模型第一次给出的输出,往往不是最优的。可能有错误、不够完整、或者没完全满足要求。如果"第一次生成 = 最终交付",那再好的编排也只是把次品跑得更快。

第 4 章的**反思(Reflection)**模式,就是给智能体装上"自我审视"的能力:让它评估自己的输出、识别问题、再优化一版。它把智能体从"只会执行指令"推向"会自我纠正"。


一、什么是反思:给流程加一条"反馈回路"

与顺序链、路由那种"输出直接往下传"不同,反思引入了一条反馈循环:智能体不仅产生输出,还会回过头来检查它,找出改进空间,再基于这些洞察生成更优版本。

书里把反思过程抽象成四个步骤:

  1. 执行:智能体执行任务或生成初始输出;
  2. 评估/评审:通常靠另一次 LLM 调用(或规则集)分析上一步结果,从事实准确性、连贯性、风格、完整性、指令遵循度等维度打分;
  3. 反思/优化:基于评审意见确定改进方向------可能产出优化输出、调整后续参数,甚至修改整体计划;
  4. 迭代(可选但常见):继续执行优化后的结果,循环往复直到满意或达到停止条件。

#mermaid-svg-xVWhvZSlWjlyjYa9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xVWhvZSlWjlyjYa9 .error-icon{fill:#552222;}#mermaid-svg-xVWhvZSlWjlyjYa9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xVWhvZSlWjlyjYa9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .marker.cross{stroke:#333333;}#mermaid-svg-xVWhvZSlWjlyjYa9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xVWhvZSlWjlyjYa9 p{margin:0;}#mermaid-svg-xVWhvZSlWjlyjYa9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .cluster-label text{fill:#333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .cluster-label span{color:#333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .cluster-label span p{background-color:transparent;}#mermaid-svg-xVWhvZSlWjlyjYa9 .label text,#mermaid-svg-xVWhvZSlWjlyjYa9 span{fill:#333;color:#333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .node rect,#mermaid-svg-xVWhvZSlWjlyjYa9 .node circle,#mermaid-svg-xVWhvZSlWjlyjYa9 .node ellipse,#mermaid-svg-xVWhvZSlWjlyjYa9 .node polygon,#mermaid-svg-xVWhvZSlWjlyjYa9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xVWhvZSlWjlyjYa9 .rough-node .label text,#mermaid-svg-xVWhvZSlWjlyjYa9 .node .label text,#mermaid-svg-xVWhvZSlWjlyjYa9 .image-shape .label,#mermaid-svg-xVWhvZSlWjlyjYa9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-xVWhvZSlWjlyjYa9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xVWhvZSlWjlyjYa9 .rough-node .label,#mermaid-svg-xVWhvZSlWjlyjYa9 .node .label,#mermaid-svg-xVWhvZSlWjlyjYa9 .image-shape .label,#mermaid-svg-xVWhvZSlWjlyjYa9 .icon-shape .label{text-align:center;}#mermaid-svg-xVWhvZSlWjlyjYa9 .node.clickable{cursor:pointer;}#mermaid-svg-xVWhvZSlWjlyjYa9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .arrowheadPath{fill:#333333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xVWhvZSlWjlyjYa9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xVWhvZSlWjlyjYa9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xVWhvZSlWjlyjYa9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xVWhvZSlWjlyjYa9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xVWhvZSlWjlyjYa9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xVWhvZSlWjlyjYa9 .cluster text{fill:#333;}#mermaid-svg-xVWhvZSlWjlyjYa9 .cluster span{color:#333;}#mermaid-svg-xVWhvZSlWjlyjYa9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xVWhvZSlWjlyjYa9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xVWhvZSlWjlyjYa9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-xVWhvZSlWjlyjYa9 .icon-shape,#mermaid-svg-xVWhvZSlWjlyjYa9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xVWhvZSlWjlyjYa9 .icon-shape p,#mermaid-svg-xVWhvZSlWjlyjYa9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xVWhvZSlWjlyjYa9 .icon-shape .label rect,#mermaid-svg-xVWhvZSlWjlyjYa9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xVWhvZSlWjlyjYa9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xVWhvZSlWjlyjYa9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xVWhvZSlWjlyjYa9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否/满意
执行/生成
评估/评审
有改进空间?
反思/优化
输出最终结果

二、最有效的实现方式:生产者-评审者模型

书中强调:反思的一种关键且高效 的实现,是把流程拆成两个逻辑角色------生产者 和评审者(也叫"生成器-评审者"/"生产者-审查者"模型)。

角色 职责 设计要点
生产者智能体 执行初始工作,专注内容生成 只负责做出第一版(代码、草稿、计划)
评审者智能体 评估生产者的输出 用不同指令 / 角色(如"高级软件工程师""事实核查员"),按标准挑毛病、给结构化反馈

为什么拆两个角色更好? 因为单一智能体在评审自己输出时容易有**"认知偏差"------它倾向于为自己的方案辩护。评审者以全新视角**看待输出,更容易客观发现问题。评审意见再回传给生产者,助它产出优化版。

顺带一提,书中提醒反思模式和另外两章有交叉:目标设定与监控(第 11 章) ------目标给自我评估提供基准、监控追踪进展,反思常扮演"纠正引擎";记忆管理(第 8 章)------有对话记忆时,反思能结合过往交互与用户反馈来评估,而不只是孤立地看单次输出,从而"从过去的评审中学习"。

三、应用场景

反思在输出质量、准确性、对复杂约束的遵循度很关键的场景里极具价值:

  • 创意写作:生成草稿 → 评审流畅性/语气/清晰度 → 重写,直到达标;
  • 代码生成与调试:写代码 → 跑测试/静态分析 → 找错与低效 → 修改;
  • 复杂问题求解:提出一个步骤 → 评估是否更接近解/引入矛盾 → 必要时回溯换步;
  • 摘要与信息综合:生成初始摘要 → 对照原文关键点 → 补齐缺失信息、提升准确度;
  • 规划与策略:生成计划 → 模拟执行 / 评估约束可行性 → 修订;
  • 对话智能体:用户响应后回顾对话历史与上一条消息,确保连贯、准确回应。

本质上,反思给智能体加了一层**"元认知"**------从自己输出和过程中学习。

四、代码实战一:用 LangChain 迭代改进代码

书中用 LangChain 实现了一个写阶乘函数的反思循环:生成 → 评审(扮演高级软件工程师)→ 优化 → 再评审......直到合格或达到最大迭代次数。

bash 复制代码
pip install langchain langchain-community langchain-openai
python 复制代码
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage

llm = ChatOpenAI(model="gpt-4o", temperature=0.1)

def run_reflection_loop():
    task_prompt = """
    你的任务是创建一个名为 `calculate_factorial` 的 Python 函数。
    此函数应执行以下操作:
    1. 接受单个整数 `n` 作为输入。
    2. 计算其阶乘 (n!)。
    3. 包含清楚解释函数功能的文档字符串。
    4. 处理边缘情况:0 的阶乘是 1。
    5. 处理无效输入:如果输入是负数,则引发 ValueError。
    """

    max_iterations = 3
    current_code = ""
    message_history = [HumanMessage(content=task_prompt)]

    for i in range(max_iterations):
        # --- 1. 生成 / 完善阶段 ---
        if i == 0:
            response = llm.invoke(message_history)          # 第一次:生成
        else:
            message_history.append(HumanMessage(content="请使用提供的批评完善代码。"))
            response = llm.invoke(message_history)          # 后续:基于批评完善
        current_code = response.content
        message_history.append(response)                    # 把代码加入历史

        # --- 2. 反思阶段:扮演高级工程师做审查 ---
        reflector_prompt = [
            SystemMessage(content="""
                你是一名高级软件工程师和 Python 专家。
                仔细审查这段代码,查找错误、风格问题、缺失的边缘情况和改进领域。
                如果代码完美并满足所有要求,用单一短语 'CODE_IS_PERFECT' 响应。
                否则,提供批评的项目符号列表。
            """),
            HumanMessage(content=f"原始任务:\n{task_prompt}\n\n要审查的代码:\n{current_code}")
        ]
        critique = llm.invoke(reflector_prompt).content

        # --- 3. 停止条件 ---
        if "CODE_IS_PERFECT" in critique:
            print("未发现进一步批评。代码令人满意。")
            break
        message_history.append(HumanMessage(content=f"对先前代码的批评:\n{critique}"))

    print("\n--- 最终精炼代码 ---")
    print(current_code)

if __name__ == "__main__":
    run_reflection_loop()

逻辑要点:

  • 用一个 message_history 累积"任务 + 代码 + 批评",让每次生成既有上下文;
  • 评审者 是用一个不同系统提示的角色扮演("高级软件工程师")------这正是"关注点分离"的体现;
  • 停止条件 靠特殊信号短语 CODE_IS_PERFECT,或者达到循环上限;
  • 生产中真正的多步迭代反思往往需要有状态的工作流(如 LangGraph),本例演示的是单个周期的原理。

五、代码实战二:用 Google ADK(SequentialAgent 顺序流水线)

ADK 的思路更直白:用 SequentialAgent 把"先生产者、后评审者"串起来,各自通过 output_key 传递状态。

python 复制代码
from google.adk.agents import SequentialAgent, LlmAgent

## 第一个智能体生成初始草稿。
generator = LlmAgent(
    name="DraftWriter",
    description="生成关于给定主题的初始草稿内容。",
    instruction="撰写关于用户主题的简短、信息丰富的段落。",
    output_key="draft_text"   # 输出保存到此状态键。
)

## 第二个智能体评审草稿。
reviewer = LlmAgent(
    name="FactChecker",
    description="审查给定文本的事实准确性并提供结构化评审。",
    instruction="""
    你是一个细致的事实核查员。
    1. 阅读状态键 'draft_text' 中提供的文本。
    2. 仔细验证所有声明的事实准确性。
    3. 你的最终输出必须是包含两个键的字典:
       - "status": 字符串,"ACCURATE" 或 "INACCURATE"。
       - "reasoning": 字符串,解释判断依据并引用具体问题。
    """,
    output_key="review_output"
)

## 确保生成器在评审者之前运行。
review_pipeline = SequentialAgent(
    name="WriteAndReview_Pipeline",
    sub_agents=[generator, reviewer]
)

执行流 :generator 先把段落存进 state['draft_text'];随后 reviewer 读出它、做事实核查,把 {status, reasoning} 存进 state['review_output']。通过状态键在智能体间传递数据,是最自然的 ADK 反思结构(书中还提到可用 LoopAgent 做真正的迭代循环)。

六、必须正视的代价

书里特别提醒,反思不是免费的------它有明显的权衡:

  • 更高的延迟与成本 :每个优化循环都可能是一次新的 LLM 调用,迭代越多越慢越贵,对时间敏感的应用并不友好;
  • 内存密集:每次迭代对话历史都在膨胀------初始输出、评审、优化全都要留着;
  • 有越界风险:迭代多了可能超出模型的上下文窗口,或撞上 API 服务限额。

七、速览

  • 问题背景:智能体初始输出往往次优------不准确、不完整或没满足复杂要求;基础工作流缺少让智能体内建"识别并修复自身错误"的环节。
  • 解决方案:引入自我纠正机制,建立反馈循环。生产者生成 → 评审者(或生产者自身)按标准评估 → 用评审产出改进版,迭代提升质量。
  • 实践建议 :当质量、准确性、细节比速度和成本更重要时使用反思。对精炼的长篇内容、写和调试代码、创建详细计划等任务很有效;当需要高客观性或专门评审时,用独立评审者智能体。

可视化总结

图 1:反思设计模式------智能体对自身输出进行自我反思(单一智能体内部循环)。

图 2:反思设计模式------生产者与评审者智能体的双角色结构。

关键要点

  • 反思能迭代地自我纠正、优化输出,显著提升质量、准确性与指令遵循度;
  • 核心是"执行 → 评估/评审 → 优化"的反馈循环;
  • 强大的实现是生产者-评审者模型------独立智能体(或提示角色)评估输出,关注点分离增强客观性、支持更专业的结构化反馈;
  • 代价是更高的延迟与成本,以及超出上下文窗口 / API 限额的风险;
  • 完整迭代反思常用有状态工作流(如 LangGraph);单步反思可用 LCEL;ADK 用顺序工作流实现。

结语与个人思考

反思模式标志着智能体从"被动执行者 "向"有意识的自我完善者"的跃迁,它是整本书第一个真正触及"智能体'知道自己在干嘛'"的模式,也是后续"Agent 自我纠错、自我评估"类模式的地基。

几条实打实的工程心得:

  • 用"双角色"而非"单角色":自己审自己容易自信过头,找个独立评审者(哪怕只是换个系统提示)通常更客观。这是书中反复强调的。
  • 杀手锏是"停止条件" :没有明确的停止信号(如 CODE_IS_PERFECT、最大迭代),反思会无限空转烧钱。工程上一定要给循环设上"满意阈值 + 迭代上限"双保险。
  • 迭代 vs 成本要算计 :既然每轮都花钱,就要想清楚"追到什么质量就停"。很多场景里,反思一轮就够;再多轮性价比反而下降。
  • 和记忆、目标联动才完整:孤立的一次反思帮助有限;配合记忆管理(记住以前的错)和目标监控(知道偏离了多少),反思才能从"偶发修正"变成"稳定能力"。

下一步建议阅读第 5 章 工具使用(Tool Use)------让模型不再"空有知识",而是能真正调用外部工具拿实时数据、执行精确计算,是实现完整 Agent 能力的关键跨越。


本文基于开源书籍《Agentic Design Patterns》(https://github.com/xindoo/agentic-design-patterns ,在线阅读 https://adp.xindoo.xyz/ )整理,供学习交流,版权归原作者所有。

相关推荐
llqbzllll2 小时前
Spring AI 工具调用不是反射一下就结束:用 2.0.1 跑通失败恢复与调用上限
人工智能·后端
北冥有鱼被烹2 小时前
砷化镓与磷化铟:光模块的地基——从化学键到AI缺货潮的底层逻辑
人工智能·python
xiaohaiAIgeo2 小时前
【2026年】通风柜合规检查清单:安全评估打分项解析
人工智能·安全·科普知识
回眸&啤酒鸭2 小时前
【回眸】Space-Bunny-Alpha 智能场景应用实战指南
人工智能
CVer儿2 小时前
基于文本提示 视觉提示的主流模型
人工智能·自然语言处理·知识图谱
看浪的路人2 小时前
第6讲:敏感数据检测与脱敏
人工智能·深度学习
倔强的石头1062 小时前
ChatGLM系列解析_清华智谱大模型技术路线
人工智能·大模型
龙亘川2 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
IanSkunk2 小时前
长葛儿童近视防控的一个真问题:机构能做与不能做的边界,从建档到转诊的流程拆解
人工智能