内容来自Antonio Gullí的Agentic Design Patterns: A Hands-On Guide to Building Intelligent Systems一书。

一、反思模式概述

在前几章中,我们探讨了一些基本的Agent行为模式:用于实现顺序执行的“链式处理模式”、用于动态选择路径的“路由模式”,以及用于并行执行任务的“并行处理模式”。这些模式使Agent能够更高效、更灵活地完成复杂任务。然而,即使采用了这些先进的工作流程,Agent的初始输出或计划也可能并不理想、不准确或不够完整。这时,“反思模式”就派上了用场。

“反思”模式是指Agent对其自身的工作成果、输出内容或内部状态进行评估,并根据这些评估结果来提升自身的性能或优化其行为方式。这是一种自我修正、自我改进的形式,使Agent能够根据反馈信息、内部评估结果或与预期标准的对比,不断优化其输出内容或调整其工作方法。在某些情况下,还可以通过另一个专门的Agent来协助进行“反思”过程——这个专门Agent的主要职责就是分析初始Agent的输出结果。

与简单的顺序处理流程不同,顺序处理输出会直接传递到下一个处理步骤;也与路由机制不同——路由只是确定数据传输的路径,反思机制引入了反馈循环。Agent在产生输出后,会仔细分析该输出本身或产生该输出的过程,找出其中存在的问题或需要改进的地方,然后根据这些发现来生成更优化的结果或调整未来的行为。

反思的过程步骤如下:

1.执行:Agent 执行相应的任务或生成初始结果。

2.评估:Agent会通过调用其他 LLM 或依据一系列规则来分析上一步得到的结果。这种评估通常会检查结果事实的准确性、逻辑连贯性、表达风格、完整性以及是否遵循了相关指令等标准。

3.反思:根据收到的反馈意见,Agent 会确定应该如何进行改进。这可能包括生成更完善的输出结果、调整后续步骤中的相关参数,甚至对整个计划进行修改。

4.迭代:执行经过优化后的输出结果或调整后的方法,然后继续进行反馈循环,直到获得满意的结果或满足停止条件为止。

反思模式的一种关键且高效的实现方式是将整个过程划分为两个截然不同的逻辑角色:生产者与评论者。这种模式通常被称为“生成器-评论者”模型或“生产者-审核者”模型。虽然单个Agent也可以进行自我反思,但使用两个专门的Agent来进行处理,或者通过两次不同的LLM调用并使用不同的系统提示,往往能够获得更加稳定、更加客观的结果。

  1. 生产Agent:该Agent的主要职责是执行任务的具体操作。它的全部工作都集中在内容的生成上,无论是编写代码、撰写博客文章,还是制定计划等。它会根据接收到的初始指令,生成内容的第一个版本。思维链(CoT)和 ReAct可以当做一个生产 Agent。

  2. 评估Agent:该Agent的唯一职责就是评估生产者生成的输出结果。它会被赋予不同的指令,通常还会被赋予特定的角色设定(例如“你是一名资深软件工程师”,“你是一名一丝不苟的事实核查员”)。根据这些指令,评估Agent会依据特定的标准来分析生产者的工作成果,这些标准可能包括事实的准确性、代码的质量、风格要求以及内容的完整性等。它的作用在于发现存在的问题、提出改进建议,并提供有条理的反馈意见。

这种职责分离的设计非常有效,因为它能够避免负责审查自己工作的人员产生“认知偏差”。负责审查的“评审者”会以全新的视角来审视输出结果,其唯一任务就是发现其中的错误并找出需要改进的地方。随后,评审者提供的反馈会被传递给负责生成最终输出的“生成者”;生成者会根据这些反馈来优化输出结果,从而生成更完善的新版本。LangChain和ADK的代码示例都实现了这种双Agent模型:LangChain示例通过使用特定的“reflector_prompt”来创建评审者的角色;而ADK示例则明确区分了生成者与评审者的职责。

实现反思功能通常需要对Agent的工作流程进行相应的调整,以便在其中加入这些反馈机制。这可以通过在代码中使用迭代循环来实现,也可以借助那些支持状态管理以及根据评估结果进行条件判断的框架来完成。虽然可以在 LangChain/LangGraph、ADK 或 Crew.AI 等技术框架中单独实现评估与优化的过程,但真正的迭代反思机制通常需要更复杂的协调机制才能正常运行。

“反思模式”对于构建生成高质量输出、处理复杂任务,并具备一定自我意识与适应能力的Agent来说至关重要。它使Agent不再仅仅局限于执行指令,而是能够以更复杂的方式解决问题并生成所需内容。

反思与目标设定及监控之间的结合值得我们注意。目标为Agent的自我评估提供了最终的参考标准,而监控则用于追踪其进展。在许多实际应用中,反思可以起到纠正作用——通过分析监控获得的反馈来识别偏差并调整策略。这种协同作用使Agent从一个被动的执行者转变为一个能够主动适应环境、为实现目标而不断调整自身行为的系统。

此外,当LLM能够记录对话内容时,反思模式的效果会显著提升(详见第8章)。这些对话记录为评估阶段提供了重要的参考依据,使Agent不仅能够单独评估自己的输出结果,还能将其与之前的互动记录、用户反馈以及不断变化的目标相结合来进行评估。这样,Agent就能够从过去的反馈中学习,从而避免重复犯错。如果没有这些记录,每次反思都只是独立发生的事件;而有了这些记录,反思就变成了一个累积的过程——每个反馈循环都会在前一个循环的基础上进行改进,从而使得代理的决策更加智能、更加符合实际情境。

二、实际应用与案例

在那些对输出质量、准确性或对各种复杂约束的遵守要求极高的场景中,反思模式显得非常有用。

1.创意写作与内容创作

对生成的文本、故事、诗歌或营销文案进行优化处理。

  • 案例:使用 Agent 写博客
    反思:首先起草文章初稿,然后从文章的逻辑结构、语气表达以及清晰度等方面对其进行评估;根据评估结果对初稿进行修改。重复这个过程,直到文章达到预期的质量标准
    优势:生成更加完善、更具说服力的内容。

2.代码生成与调试

编写代码、查找错误并加以修复。

  • 案例:使用 Agent 写 Python 代码
    反思:首先编写初始代码,然后运行测试或进行静态分析,以发现其中存在的错误或效率低下的地方;根据分析结果对代码进行相应的修改。
    优势:能够编写出更加稳定、功能更完善的代码。

3.复杂问题的解决能力

在多步骤推理任务中,对中间步骤或提出的解决方案进行评估。

  • 案例:使用 Agent 解决逻辑谜题
    反思:提出一个解决方案,评估该方案是否有助于更接近问题的真正解决之道或者是否引发矛盾;如有必要,可以及时调整策略或选择其他解决方案。
    优势:能够显著提升 Agent 处理复杂问题的能力。

4.总结与信息整合

进一步完善这些摘要,以提高其准确性、完整性和间接性。

  • 案例:使用 Agent 总结长篇文档
    反思:首先生成初步的摘要,然后将其与原始文档中的关键内容进行对比,进一步修改摘要以补充确实的信息或提高其准确性。
    优势:能够生成更加准确、全面的摘要。

5.规划策略

评估拟定中的计划,找出其中可能存在的缺陷或需要改进的地方。

  • 案例:使用 Agent 通过规划一系列用的来实现目标
    反思:制定计划,模拟其执行过程,或根据各种限制条件评估计划的可行性,并根据评估结果对计划进行修改。
    优势:制定出更加有效且切实可行的计划。

6.对话式 Agent

回顾对话中的前几轮内容,以便保持对话的连贯性、消除误解或提高回应的质量。

  • 案例:客户支持聊天机器人
    反思:在用户做出反应后,应查看对话记录以及聊天机器人生成的最新消息,以确保对话的连贯性,并准确理解用户的最新需求。
    优势:能够使对话更加自然、更加有效。

反思机制为自主系统增添了元认知的能力,使它们能够从自身的输出结果及运行过程中学习经验,从而产生更加智能、可靠且高质量的结果。

代码示例(LangChain)

from ast import Nonlocal
import os
import asyncio
from langchain_core.prompts import PromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import Runnable, RunnablePassthrough, RunnableParallel, RunnableBranch
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_deepseek import ChatDeepSeek
from dotenv import load_dotenv
load_dotenv()
llm = ChatDeepSeek(
model="deepseek-chat",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
# other params...
)
def run_reflection_loop():
"""
这个示例展示了一个多步骤的人工智能反馈循环机制,通过该机制可以逐步优化Python函数的性能。
"""
task_prompt = """
你的任务是创建一个名字为‘calculate_factorial’的Python函数。
这个函数需要完成以下功能:
1.接收一个整数n作为输入。
2.计算它的阶乘n!
3.为该函数添加清晰的文档说明
4.处理特殊情况:0的阶乘为1
5.处理无效输入:如果输入的是负数,应排除ValueError异常
"""
#--反思循环
max_interations = 3
current_code = ""
message_history = [HumanMessage(content=task_prompt)]
for i in range(max_interations):
if i == 0:
response = llm.invoke(message_history)
current_code = response.content
else:
message_history.append(HumanMessage(content=f"请根据之前的反馈意见优化代码。"))
response = llm.invoke(message_history)
current_code = response.content
print("\n--- 生成代码第{}轮 ---\n".format(i+1) + current_code)
message_history.append(response)
# 反思阶段
reflector_prompt = [
SystemMessage(content="""你是一名资深软件工程师,也是Python方面的专家。你的职责是对代码进行细致的审查,根据任务要求对提供的Python代码进行严格评估。
你需要找出其中的错误、代码风格问题、未考虑到的边界情况以及需要改进的地方。如果代码完美无缺且完全符合要求,请回复‘CODE_IS_PERFECT’;否则,请列出你
的批评意见。"""),
HumanMessage(content=f"原始任务:\n{task_prompt}\n\n 需要审查的到吗:\n{current_code}")
]
critique_response = llm.invoke(reflector_prompt)
critique = critique_response.content
# 结束条件
if "CODE_IS_PERFECT" in critique:
print("\n--- 代码完美无缺,结束循环 ---\n")
break
else:
message_history.append(HumanMessage(content=f"对之前代码的审核意见:\n{critique}"))
print("\n--- 经过审核后的代码 ---\n")
print(current_code)
if __name__ == "__main__":
run_reflection_loop()
--- 生成代码第1轮 ---
```python
def calculate_factorial(n):
"""
计算非负整数n的阶乘(n!)
阶乘的定义:
n! = n × (n-1) × (n-2) × ... × 2 × 1
特别地,0! = 1
参数:
n (int): 要计算阶乘的非负整数
返回:
int: n的阶乘结果
异常:
ValueError: 当n为负数时抛出
示例:
>>> calculate_factorial(5)
120
>>> calculate_factorial(0)
1
>>> calculate_factorial(1)
1
"""
# 检查输入是否为负数
if n < 0:
raise ValueError("阶乘只能计算非负整数,输入不能为负数")
# 处理特殊情况:0的阶乘为1
if n == 0:
return 1
# 计算阶乘
result = 1
for i in range(1, n + 1):
result *= i
return result
# 测试函数
if __name__ == "__main__":
# 正常情况测试
print(f"5! = {calculate_factorial(5)}")  # 应该输出 120
print(f"0! = {calculate_factorial(0)}")  # 应该输出 1
print(f"1! = {calculate_factorial(1)}")  # 应该输出 1
# 异常情况测试
try:
calculate_factorial(-5)
except ValueError as e:
print(f"错误捕获: {e}")  # 应该输出错误信息

这个函数具有以下特点:

  1. 清晰的文档说明:使用docstring详细说明了函数的功能、参数、返回值和异常情况
  2. 输入验证:检查输入是否为负数,如果是则抛出ValueError异常
  3. 特殊情况处理:正确处理0的阶乘为1的情况
  4. 核心逻辑:使用循环计算阶乘,代码简洁易懂
  5. 测试代码:包含测试用例来验证函数的正确性
    函数的时间复杂度为O(n),空间复杂度为O(1),对于大多数实际应用场景来说都是高效的。
    — 代码完美无缺,结束循环 —

What:Agent的初始输出往往不够理想,存在信息不准确、内容不完整等问题,也无法满足复杂的任务要求。现有的Agent工作流程中缺乏让Agent自行识别并纠正错误的机制。为了解决这个问题,可以让Agent自行评估自己的工作表现;或者更有效地办法是引入一个独立的逻辑Agent来充当“评审者”的角色,从而确保初始响应不会成为最终结果,无论其质量如何。

Why:反思模式通过引入自我修正与优化的机制来解决问题。它构建了一个反馈循环:首先由“生产者”生成输出结果,然后由“评估者”(可以是另一个Agent,也可以是生产者本身)根据预先设定的标准对输出结果进行评估;根据评估结果,生产者会生成改进后的版本。这种“生成-评估-优化”的迭代过程不断提升最终结果的质量,从而产生更加准确、连贯且可靠的结果。

经验法则:当最终输出的质量、准确度及细节比速度和成本更为重要时,应使用“反思模式”。该模式特别适用于生成高质量的长篇内容、编写及调试代码以及制定详细计划等任务。而当任务需要高度客观的评估或专业的分析时,应使用专门的“评估代理”来完成任务,因为普通的“生产代理”可能无法胜任这些任务。

关键要点

  • 反思模式的主要优势在于它能够通过迭代的方式不断自我调整和完善输出结果,从而显著提高输出的质量、准确性以及执行复杂指令的能力。
  • 它包含执行、评估/反馈以及改进这三个环节,形成了一个循环系统。对于那些需要高质量、准确结果或精细处理的任务来说,反思是至关重要的。
  • 一种非常有效的实现方式是“生产者-评论者”模型:在这种模型中,会有一个独立的Agent来评估初始输出结果。这种职责的分离不仅提高了评估的客观性,还使得反馈更加专业化、更有条理。
  • 然而,这些优势需要以增加延迟和计算成本为代价;同时,还存在模型超出其上下文长度的风险,或者可能受到API服务的限制。
  • 虽然完全的迭代式反思通常需要使用具有状态管理功能的工作流程来实现(例如 LangGraph),但在 LangChain 中,可以通过使用 LCEL 来完成单次反思操作,从而获取反馈结果并进行后续优化。
  • Google ADK可以通过一系列有序的工作流程来实现反馈机制:其中一个Agent的输出会由另一个Agent进行评估,从而促使后续的优化工作得以进行。
  • 这种模式使Agent能够自我调整,从而提升其性能。

三、结论

这种反思机制为Agent的工作流程提供了自我修正的功能,从而实现了通过多次迭代来不断改进结果的目标。具体实现方式是:系统首先生成输出结果,然后根据特定的评估标准对输出结果进行评估,并根据评估结果生成更优化的结果。这种评估可以由Agent本身完成(即自我反思),但通常更有效的方式是由专门的“评估Agent”来执行评估任务。这种“评估Agent”的存在,是该反思机制中的关键设计要素之一。

虽然完全自主的多步骤反思过程需要一个强大的状态管理架构来支持其运行,但其核心原理其实可以通过简单的单步流程来有效体现;通过与其他基础设计模式相结合,就可以构建出更加稳定、功能更复杂的智能系统。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐