当前位置: 首页 > news >正文

Agent 设计模式

大型语言模型(LLM)的 Agent 设计模式是构建复杂、智能应用的关键。这些模式赋予 LLM 规划、反思、使用工具以及与其他 Agent 协作的能力。

1. Tool Use Pattern(工具使用模式)

核心思想: Agent 能够调用外部工具来扩展自身能力,弥补 LLM 无法进行实时计算、访问最新信息或执行特定操作的局限。这是最基础也是最普遍的 Agent 能力。

浅入深: 从调用单个简单工具开始,逐步过渡到调用多个不同类型的工具。

需要工具
不需要工具
用户输入查询
LLM 判断是否需要工具
LLM 选择工具和参数
执行工具并获取结果
LLM 基于结果生成最终响应
返回最终响应
from langchain_community.llms import OpenAI
from langchain.agents import AgentExecutor, create_react_agent, Tool
from langchain import PromptTemplate
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper# 1. 定义工具
wikipedia = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
tools = [Tool(name="Wikipedia",func=wikipedia.run,description="用于查询维基百科的工具。当你需要了解历史事件、人物、科学概念等知识时,可以使用它。")
]# 2. 定义 LLM
llm = OpenAI(temperature=0) # 实际使用时请替换为你的LLM客户端和API Key# 3. 定义提示模板 (ReAct 风格,这里简化为Tool Use)
template = """
你是一个智能助手,可以回答用户的问题。
你可以使用以下工具:
{tools}请严格按照以下格式回答:
问题: 用户的问题
思考: 你需要思考如何回答这个问题。
工具: 如果你需要使用工具,请指定工具名称和输入参数。例如: Wikipedia[输入参数]
工具输出: 工具的输出
思考: 对工具输出进行总结并生成最终答案。
最终答案: 最终答案问题: {input}
{agent_scratchpad}
"""
prompt = PromptTemplate.from_template(template)# 4. 创建 Agent (使用 create_react_agent 简化创建过程)
agent = create_react_agent(llm, tools, prompt)# 5. 创建 Agent 执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)# 6. 运行 Agent
response = agent_executor.invoke({"input": "秦始皇的出生日期和去世日期是什么?"})
print("\n--- 最终响应 ---")
print(response["output"])

2. ReAct Pattern(思考-行动模式)

核心思想: ReAct (Reasoning and Acting) 模式结合了 LLM 的推理能力(思考)和外部工具的使用(行动)。Agent 通过内部的“思考”步骤来决定下一步的“行动”,并在观察行动结果后继续“思考”,形成一个循环,直到完成任务。

浅入深: 理解 ReAct 的核心循环,并能识别思考和行动的日志输出。

调用工具
生成答案
用户输入任务
思考: LLM进行推理
行动: LLM调用工具或生成答案
观察: 工具执行结果
返回最终结果

上面 Tool Use 的代码示例实际上已经包含了 ReAct 的思想,因为 create_react_agent 默认就是使用 ReAct 模式。verbose=True 会打印出每次“思考”和“行动”的日志。

在实际运行上述代码时,会看到类似这样的输出:

> Entering new AgentExecutor chain...
思考: 用户问的是秦始皇的出生日期和去世日期,这些信息可以在维基百科上找到。我需要使用Wikipedia工具来查询“秦始皇”。
工具: Wikipedia[秦始皇]
工具输出: (此处省略维基百科查询结果,包含出生和去世日期)
思考: 我已经从维基百科获取了秦始皇的出生日期和去世日期。我可以根据这些信息生成最终答案了。
最终答案: 秦始皇(嬴政)出生于公元前259年,去世于公元前210年。> Finished chain.

这里“思考”和“工具”就是 ReAct 模式的核心体现。


3. Reflection Pattern(反思模式)

核心思想: Agent 不仅能执行任务,还能对自己或任务的执行过程进行反思、评估,并从错误中学习。这使得 Agent 能够自我纠正、提高任务完成的质量和效率。

浅入深: 从简单的结果评估开始,发展到对整个决策过程的反思。

评估不满意
重新规划或调整执行
评估满意
任务输入
Agent 执行任务
Agent 评估任务结果或过程
反思: LLM分析问题原因/改进策略
返回最终结果

LangChain 中的 langchain_experimental.autonomous_agents.autogptlangchain.agents.AgentExecutorhandle_parsing_errors 参数可以部分体现反思。更复杂的反思通常需要多Agent协同或自定义的循环逻辑。

from langchain_community.llms import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParserllm = OpenAI(temperature=0.7)# 1. 任务执行 Agent
task_agent_prompt = PromptTemplate.from_template("""
你是一个内容生成专家。请为主题 "{topic}" 生成一篇短文。
要求:至少包含300字,并且语言生动有趣。
短文:
""")
task_agent_chain = task_agent_prompt | llm | StrOutputParser()# 2. 反思 Agent
reflection_prompt = PromptTemplate.from_template("""
你是一个内容评估专家。请评估以下短文:
---
{article}
---
请根据以下标准给出评价:
1. 字数是否达到300字?
2. 语言是否生动有趣?
3. 内容是否切题?
如果存在不足,请给出改进建议。如果非常满意,请直接说“满意”。评估和建议:
""")
reflection_chain = reflection_prompt | llm | StrOutputParser()def run_with_reflection(topic, max_attempts=3):print(f"--- 开始为 '{topic}' 生成文章 ---")current_article = ""for attempt in range(max_attempts):print(f"\n--- 尝试 {attempt + 1} ---")current_article = task_agent_chain.invoke({"topic": topic})print(f"生成的文章:\n{current_article[:200]}...") # 打印部分内容reflection = reflection_chain.invoke({"article": current_article})print(f"反思评估:\n{reflection}")if "满意" in reflection or "符合要求" in reflection: # 简化判断print("--- 评估满意,任务完成!---")return current_articleelse:print("--- 评估不满意,尝试改进。---")# 在实际应用中,这里需要将 reflection 的建议反馈给 task_agent_chain# 例如:修改 task_agent_prompt,加入“请根据上次的评估:[reflection] 进行改进”# 为简化,本示例仅演示循环print("--- 达到最大尝试次数,任务结束。---")return current_article# 运行带有反思的 Agent
generated_article = run_with_reflection("量子计算的未来影响")
print("\n--- 最终生成的文章 ---")
print(generated_article)

4. Planning Pattern(规划模式)

核心思想: Agent 能够将复杂的任务分解为更小、更易管理的子任务,并为每个子任务制定执行步骤。这使得 Agent 能够处理多步骤、高难度的任务。

浅入深: 从简单的链式规划(一步接一步)到复杂的树状规划(分支和子任务)。

子任务1
子任务2
结果1
结果2
用户输入复杂任务
Agent 识别并分解子任务
制定子任务1执行计划
制定子任务2执行计划
执行子任务1
执行子任务2
Agent 整合子任务结果
返回最终结果
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate# 1. 定义子任务 LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)# 2. 定义规划 Agent
planning_prompt = PromptTemplate.from_template("""
你是一个任务规划专家。请将以下复杂任务分解为一系列清晰、可执行的子任务,并按顺序给出。
任务: {task}
输出格式:
1. 子任务一:...
2. 子任务二:...
...
""")
planning_chain = planning_prompt | llm | StrOutputParser()# 3. 定义执行 Agent (简化为根据子任务生成内容)
execution_prompt = PromptTemplate.from_template("""
你是一个执行专家,正在完成一个任务分解后的子任务。
当前任务主题是: {overall_task}
请完成以下子任务: {sub_task}
你的输出应该直接是完成子任务的内容。
""")
execution_chain = execution_prompt | llm | StrOutputParser()def run_planning_agent(overall_task):print(f"--- 任务规划: {overall_task} ---")plan_output = planning_chain.invoke({"task": overall_task})print("\n生成的计划:")print(plan_output)sub_tasks = [line.strip() for line in plan_output.split('\n') if line.strip().startswith(tuple(str(i) + '.' for i in range(1,10)))]results = []print("\n--- 执行子任务 ---")for i, sub_task in enumerate(sub_tasks):print(f"\n执行 {sub_task}")result = execution_chain.invoke({"overall_task": overall_task, "sub_task": sub_task})print(f"结果: {result[:100]}...") # 打印部分结果results.append(result)# 4. 整合结果integration_prompt = PromptTemplate.from_template("""
你是一个结果整合专家。请将以下子任务的成果整合起来,形成关于主题 "{overall_task}" 的最终报告。
子任务成果:
{results}
最终报告:
""")final_report = integration_prompt.invoke({"overall_task": overall_task, "results": "\n".join(results)})print("\n--- 最终报告 ---")print(final_report)# 运行规划 Agent
run_planning_agent("撰写一篇关于人工智能在教育领域应用现状与前景的详细报告")

5. Multi-Agent Pattern(多 Agent 模式)

核心思想: 多个 Agent 各自拥有专门的角色和能力,它们通过协作、沟通来共同解决更复杂、更大规模的任务。每个 Agent 可以是上述任何一种模式的实例。

浅入深: 从两个 Agent 的简单对话协作,到形成团队(如辩论、专家组),再到复杂的Agent组织结构。

分发任务
分发任务
协作/沟通
产出子结果
产出子结果
整合结果
用户输入复杂问题
总控 Agent
Agent A
Agent B
总控 Agent
返回最终响应

多智能体这里只是给出一个简化例子

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser# 初始化 LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.5)# 1. Agent A: 内容专家
content_expert_prompt = ChatPromptTemplate.from_messages([SystemMessage("你是一位内容创建专家,擅长生成引人入胜的营销文案。"),HumanMessage("{input}")
])
content_expert_chain = content_expert_prompt | llm | StrOutputParser()# 2. Agent B: 营销策略专家
marketing_strategy_prompt = ChatPromptTemplate.from_messages([SystemMessage("你是一位营销策略专家,擅长评估文案的营销效果,并给出改进建议,使其更具吸引力。"),HumanMessage("请评估以下营销文案,并给出详细的改进建议:\n{copy}\n\n你的评估和建议:")
])
marketing_strategy_chain = marketing_strategy_prompt | llm | StrOutputParser()# 3. 协调 Agent (Driver Agent)
def multi_agent_workflow(product_info, max_iterations=2):print(f"--- 多 Agent 协作开始:{product_info} ---")current_copy = ""for i in range(max_iterations):print(f"\n--- 迭代 {i + 1} ---")if i == 0:# 第一次迭代由内容专家基于产品信息生成初稿print("内容专家正在生成初稿...")current_copy = content_expert_chain.invoke({"input": f"为以下产品信息生成一份营销文案:{product_info}"})else:# 后续迭代由内容专家根据营销策略专家的建议进行改进print("内容专家正在根据建议改进文案...")current_copy = content_expert_chain.invoke({"input": f"这是现有的营销文案:{current_copy}\n请根据以下建议进行改进:{last_suggestion}"})print(f"当前文案:\n{current_copy[:150]}...")print("营销策略专家正在评估并给出建议...")last_suggestion = marketing_strategy_chain.invoke({"copy": current_copy})print(f"营销策略专家的建议:\n{last_suggestion}")if "完美" in last_suggestion or "无需改进" in last_suggestion: # 简化判断print("--- 评估满意,协作完成!---")breakprint("\n--- 最终营销文案 ---")return current_copy# 运行多 Agent 协作
final_marketing_copy = multi_agent_workflow("一款新型智能家居控制器,特点是语音识别精准、可连接所有品牌家电、隐私保护严格。")
print(final_marketing_copy)

总结

  • Tool UseReAct 是最基本且强大的能力,让 Agent 能够与外部世界交互。
  • Reflection 赋予 Agent 自我学习和纠错的能力,提高可靠性。
  • Planning 让 Agent 能够处理复杂的多步骤任务。
  • Multi-Agent 模式则将个体 Agent 的能力汇聚成协同工作的系统,开启了构建真正智能的自治系统的大门。
http://www.lryc.cn/news/586440.html

相关文章:

  • 卫星通信终端天线的5种对星模式之二:DVB跟踪
  • Mamba架构的模型 (内容由deepseek辅助汇总)
  • 关于赛灵思的petalinux zynqmp.dtsi文件的理解
  • C++ Primer(第5版)- Chapter 7. Classes -001
  • Web学习笔记3
  • Windows环境下JS计时器精度差异揭秘
  • Qt:QCustomPlot类介绍
  • LangChain极速入门:用Python构建AI应用的新范式
  • zcbus使用数据抽取相当数据量实况
  • Scrapy爬虫中间件核心技术解析:定制化爬虫的神经中枢
  • CCS-MSPM0G3507-2-基础篇-定时器中断
  • 69 局部变量的空间分配
  • 通俗范畴论13 鸡与蛋的故事番外篇
  • C++类模板继承部分知识及测试代码
  • Golang操作MySQL json字段优雅写法
  • Hap包引用的Hsp报签名错误怎么解决
  • 【数据分析】03 - Matplotlib
  • LangChain 内存(Memory)
  • Java 大视界 -- Java 大数据机器学习模型在电商用户复购行为预测与客户关系维护中的应用(343)
  • C语言基础知识--动态内存管理
  • AD芯片(模数转换器)的有效位数(ENOB)
  • scrapy项目开发流程
  • C++中的容斥原理
  • Springboot aop面向切面编程
  • 虚拟商品交易维权指南:数字经济时代的消费者权益保护
  • Boost.Asio 中的定时器类 steady_timer
  • python如何把两张图片拼成一张
  • Gitee Push 失败 7 日谈:每天一个踩坑故事
  • Java中的方法传参机制
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘multiprocessing’问题