ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

《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**模式就是给智能体装上自我审视的能力让它评估自己的输出、识别问题、再优化一版。它把智能体从只会执行指令推向会自我纠正。一、什么是反思给流程加一条反馈回路与顺序链、路由那种输出直接往下传不同反思引入了一条反馈循环智能体不仅产生输出还会回过头来检查它找出改进空间再基于这些洞察生成更优版本。书里把反思过程抽象成四个步骤执行智能体执行任务或生成初始输出评估/评审通常靠另一次 LLM 调用或规则集分析上一步结果从事实准确性、连贯性、风格、完整性、指令遵循度等维度打分反思/优化基于评审意见确定改进方向——可能产出优化输出、调整后续参数甚至修改整体计划迭代可选但常见继续执行优化后的结果循环往复直到满意或达到停止条件。是否/满意执行/生成评估/评审有改进空间?反思/优化输出最终结果二、最有效的实现方式生产者-评审者模型书中强调反思的一种关键且高效的实现是把流程拆成两个逻辑角色——生产者和评审者也叫生成器-评审者/生产者-审查者模型。角色职责设计要点生产者智能体执行初始工作专注内容生成只负责做出第一版代码、草稿、计划评审者智能体评估生产者的输出用不同指令 / 角色如高级软件工程师“事实核查员”按标准挑毛病、给结构化反馈为什么拆两个角色更好因为单一智能体在评审自己输出时容易有**“认知偏差”——它倾向于为自己的方案辩护。评审者以全新视角**看待输出更容易客观发现问题。评审意见再回传给生产者助它产出优化版。顺带一提书中提醒反思模式和另外两章有交叉目标设定与监控第 11 章——目标给自我评估提供基准、监控追踪进展反思常扮演纠正引擎记忆管理第 8 章——有对话记忆时反思能结合过往交互与用户反馈来评估而不只是孤立地看单次输出从而从过去的评审中学习。三、应用场景反思在输出质量、准确性、对复杂约束的遵循度很关键的场景里极具价值创意写作生成草稿 → 评审流畅性/语气/清晰度 → 重写直到达标代码生成与调试写代码 → 跑测试/静态分析 → 找错与低效 → 修改复杂问题求解提出一个步骤 → 评估是否更接近解/引入矛盾 → 必要时回溯换步摘要与信息综合生成初始摘要 → 对照原文关键点 → 补齐缺失信息、提升准确度规划与策略生成计划 → 模拟执行 / 评估约束可行性 → 修订对话智能体用户响应后回顾对话历史与上一条消息确保连贯、准确回应。本质上反思给智能体加了一层**“元认知”**——从自己输出和过程中学习。四、代码实战一用 LangChain 迭代改进代码书中用 LangChain 实现了一个写阶乘函数的反思循环生成 → 评审扮演高级软件工程师→ 优化 → 再评审……直到合格或达到最大迭代次数。pipinstalllangchain langchain-community langchain-openaiimportosfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.messagesimportSystemMessage,HumanMessage llmChatOpenAI(modelgpt-4o,temperature0.1)defrun_reflection_loop():task_prompt 你的任务是创建一个名为 calculate_factorial 的 Python 函数。 此函数应执行以下操作 1. 接受单个整数 n 作为输入。 2. 计算其阶乘 (n!)。 3. 包含清楚解释函数功能的文档字符串。 4. 处理边缘情况0 的阶乘是 1。 5. 处理无效输入如果输入是负数则引发 ValueError。 max_iterations3current_codemessage_history[HumanMessage(contenttask_prompt)]foriinrange(max_iterations):# --- 1. 生成 / 完善阶段 ---ifi0:responsellm.invoke(message_history)# 第一次生成else:message_history.append(HumanMessage(content请使用提供的批评完善代码。))responsellm.invoke(message_history)# 后续基于批评完善current_coderesponse.content message_history.append(response)# 把代码加入历史# --- 2. 反思阶段扮演高级工程师做审查 ---reflector_prompt[SystemMessage(content 你是一名高级软件工程师和 Python 专家。 仔细审查这段代码查找错误、风格问题、缺失的边缘情况和改进领域。 如果代码完美并满足所有要求用单一短语 CODE_IS_PERFECT 响应。 否则提供批评的项目符号列表。 ),HumanMessage(contentf原始任务\n{task_prompt}\n\n要审查的代码\n{current_code})]critiquellm.invoke(reflector_prompt).content# --- 3. 停止条件 ---ifCODE_IS_PERFECTincritique:print(未发现进一步批评。代码令人满意。)breakmessage_history.append(HumanMessage(contentf对先前代码的批评\n{critique}))print(\n--- 最终精炼代码 ---)print(current_code)if__name____main__:run_reflection_loop()逻辑要点用一个message_history累积任务 代码 批评让每次生成既有上下文评审者是用一个不同系统提示的角色扮演“高级软件工程师”——这正是关注点分离的体现停止条件靠特殊信号短语CODE_IS_PERFECT或者达到循环上限生产中真正的多步迭代反思往往需要有状态的工作流如 LangGraph本例演示的是单个周期的原理。五、代码实战二用 Google ADKSequentialAgent 顺序流水线ADK 的思路更直白用SequentialAgent把先生产者、后评审者串起来各自通过output_key传递状态。fromgoogle.adk.agentsimportSequentialAgent,LlmAgent## 第一个智能体生成初始草稿。generatorLlmAgent(nameDraftWriter,description生成关于给定主题的初始草稿内容。,instruction撰写关于用户主题的简短、信息丰富的段落。,output_keydraft_text# 输出保存到此状态键。)## 第二个智能体评审草稿。reviewerLlmAgent(nameFactChecker,description审查给定文本的事实准确性并提供结构化评审。,instruction 你是一个细致的事实核查员。 1. 阅读状态键 draft_text 中提供的文本。 2. 仔细验证所有声明的事实准确性。 3. 你的最终输出必须是包含两个键的字典 - status: 字符串ACCURATE 或 INACCURATE。 - reasoning: 字符串解释判断依据并引用具体问题。 ,output_keyreview_output)## 确保生成器在评审者之前运行。review_pipelineSequentialAgent(nameWriteAndReview_Pipeline,sub_agents[generator,reviewer])执行流generator先把段落存进state[draft_text]随后reviewer读出它、做事实核查把{status, reasoning}存进state[review_output]。通过状态键在智能体间传递数据是最自然的 ADK 反思结构书中还提到可用LoopAgent做真正的迭代循环。六、必须正视的代价书里特别提醒反思不是免费的——它有明显的权衡更高的延迟与成本每个优化循环都可能是一次新的 LLM 调用迭代越多越慢越贵对时间敏感的应用并不友好内存密集每次迭代对话历史都在膨胀——初始输出、评审、优化全都要留着有越界风险迭代多了可能超出模型的上下文窗口或撞上 API 服务限额。七、速览问题背景智能体初始输出往往次优——不准确、不完整或没满足复杂要求基础工作流缺少让智能体内建识别并修复自身错误的环节。解决方案引入自我纠正机制建立反馈循环。生产者生成 → 评审者或生产者自身按标准评估 → 用评审产出改进版迭代提升质量。实践建议当质量、准确性、细节比速度和成本更重要时使用反思。对精炼的长篇内容、写和调试代码、创建详细计划等任务很有效当需要高客观性或专门评审时用独立评审者智能体。可视化总结图 1反思设计模式——智能体对自身输出进行自我反思单一智能体内部循环。图 2反思设计模式——生产者与评审者智能体的双角色结构。关键要点反思能迭代地自我纠正、优化输出显著提升质量、准确性与指令遵循度核心是执行 → 评估/评审 → 优化的反馈循环强大的实现是生产者-评审者模型——独立智能体或提示角色评估输出关注点分离增强客观性、支持更专业的结构化反馈代价是更高的延迟与成本以及超出上下文窗口 / API 限额的风险完整迭代反思常用有状态工作流如 LangGraph单步反思可用 LCELADK 用顺序工作流实现。结语与个人思考反思模式标志着智能体从被动执行者向有意识的自我完善者的跃迁它是整本书第一个真正触及智能体’知道自己在干嘛’的模式也是后续Agent 自我纠错、自我评估类模式的地基。几条实打实的工程心得用双角色而非单角色自己审自己容易自信过头找个独立评审者哪怕只是换个系统提示通常更客观。这是书中反复强调的。杀手锏是停止条件没有明确的停止信号如CODE_IS_PERFECT、最大迭代反思会无限空转烧钱。工程上一定要给循环设上满意阈值 迭代上限双保险。迭代 vs 成本要算计既然每轮都花钱就要想清楚追到什么质量就停。很多场景里反思一轮就够再多轮性价比反而下降。和记忆、目标联动才完整孤立的一次反思帮助有限配合记忆管理记住以前的错和目标监控知道偏离了多少反思才能从偶发修正变成稳定能力。下一步建议阅读第 5 章工具使用Tool Use——让模型不再空有知识而是能真正调用外部工具拿实时数据、执行精确计算是实现完整 Agent 能力的关键跨越。本文基于开源书籍《Agentic Design Patterns》https://github.com/xindoo/agentic-design-patterns 在线阅读 https://adp.xindoo.xyz/ 整理供学习交流版权归原作者所有。
返回列表