手机免费做网站,怎么查网站的关键词排名,单位网站建设开发公司,邢台市应急管理局简介
本文全面介绍多智能体系统在大模型中的应用#xff0c;详细解析10种架构模式包括并行、顺序、循环、路由器等#xff0c;探讨多智能体如何解决单智能体在复杂任务中的局限性。通过专业化分工提高系统效率和可扩展性#xff0c;同时深入分析智能体间通信机制如图状态、…简介本文全面介绍多智能体系统在大模型中的应用详细解析10种架构模式包括并行、顺序、循环、路由器等探讨多智能体如何解决单智能体在复杂任务中的局限性。通过专业化分工提高系统效率和可扩展性同时深入分析智能体间通信机制如图状态、工具调用和共享消息列表等为构建高效AI协作网络提供全面参考指南。一、引言Agent系统的开发这些系统可能会随着时间的推移变得越来越复杂从而难以管理和扩展。例如可能会遇到以下问题智能体调用的工具太多导致工具选择的失误率大增上下文变得过于复杂单个代理无法胜任智能体系统中需要多个专业领域例如规划师、研究员、数学专家等。为了解决这些问题可以考虑将单智能体拆分成多个较小的独立代理并将它们组合成一个多智能体系统 。这些独立智能体可以像提示词和 LLM 调用一样简单也可以像 ReAct 代理甚至更复杂一样复杂。随着智能体框架的发展许多公司开始构建自己的多智能体系统并寻求解决所有智能体任务的万能方案。两年前研究人员设计了一个名为 ChatDev 的多智能体协作系统。ChatDev 就像一家虚拟软件公司通过各种智能体运作这些智能体扮演着不同的角色例如首席执行官、首席产品官、美术设计师、程序员、审校员、测试员等等就像一家普通的软件工程公司一样。这些智能体协同工作、相互沟通最终成功开发出一款电子游戏。这一成就让许多人相信任何软件工程任务都可以使用这种多智能体架构来解决其中每个人工智能都扮演着独特的角色。然而现实世界的实验表明并非所有问题都能用这种架构解决。在某些情况下更简单的架构反而能提供更高效、更经济的解决方案。1.1 单智能体架构与多智能体架构单智能体方案起初可能很合理例如一个智能体可以完成从浏览器导航到文件操作的所有任务。但随着时间的推移任务变得越来越复杂工具的数量也越来越多单智能体方案将开始捉襟见肘。一直在更新更多的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】二、Multi-agent架构单智能体架构和多智能体架构各有优缺点。当任务简单明了、定义明确且资源没有具体限制时单智能体架构是理想之选。当用例复杂多变、需要更专业的知识和协作或者具有可扩展性和适应性要求时多智能体架构则更为有效。2.1 Multi-agent系统中的模式在多智能体系统中连接各个智能体有多种方法2.1.1 并行多个智能体同时处理任务的不同部分。例如 我们希望使用 3 个代理同时对给定文本进行总结 、 翻译和情感分析 。完整示例代码请查看https://t.zsxq.com/q4cc02.1.2 顺序任务按顺序处理一个代理的输出成为下一个代理的输入。例如 多步骤审批。完整示例代码请查看https://t.zsxq.com/sP9eD2.1.3 循环智能体以迭代循环的方式运行根据其他智能体的反馈不断改进其输出。例如 评估用例如代码编写和代码测试。完整示例代码请查看https://t.zsxq.com/NwAtr2.1.4 路由器中央路由器根据任务或输入确定要调用哪个代理。示例 客户支持工单路由完整示例代码请查看https://t.zsxq.com/bRBi92.1.5 聚合器或合成器收集各个智能体的贡献输出并综合这些输出形成最终结果。例如 社交媒体情感分析聚合器完整示例代码请查看https://t.zsxq.com/hcJcj2.1.6 网络或水平智能体之间以多对多的方式直接通信形成去中心化网络。这种架构适用于没有清晰的代理层级结构或没有特定代理调用顺序的问题。优点 分布式协作和群体驱动决策。即使部分智能体出现故障系统仍能正常运行。缺点 管理智能体之间的沟通可能变得具有挑战性。更多的沟通可能会导致效率低下并可能出现智能体重复工作的情况。完整示例代码请查看https://t.zsxq.com/lZPGu2.1.7 交接在多智能体架构中智能体可以表示为图节点。每个智能体节点执行其步骤并决定是完成执行还是路由到另一个智能体包括可能路由到自身例如循环运行。多智能体交互中常见的模式是交接即一个智能体将控制权移交给另一个智能体。交接允许您指定目标 要导航到的目标代理例如要前往的节点名称有效载荷 要传递给该代理的信息 例如状态更新为了在 LangGraph 中实现切换agent节点可以返回 Command 对象该对象允许您将控制流和状态更新结合起来def agent(state) - Command[Literal[agent, another_agent]]: # the condition for routing/halting can be anything, e.g. LLM tool call / structured output, etc. goto get_next_agent(...) # agent / another_agent return Command( # Specify which agent to call next gotogoto, # Update the graph state update{my_state_key: my_state_value} )在更复杂的场景中如果每个agent节点本身就是一个图即子图 则某个agent子图中的节点可能需要导航到另一个代理。例如如果您有两个代理 alice 和 bob 父图中的子图节点并且 alice 需要导航到 bob 则可以在 Command 对象中设置 graphCommand.PARENT def some_node_inside_alice(state) return Command( gotobob, update{my_state_key: my_state_value}, # specify which graph to navigate to (defaults to the current graph) graphCommand.PARENT, )如果您需要支持使用 Command(graphCommand.PARENT) 进行通信的子图的可视化则需要将它们包装在带有 Command 注解的节点函数中例如而不是这样builder.add_node(alice)而是def call_alice(state) - Command[Literal[bob]]: return alice.invoke(state) builder.add_node(alice, call_alice)交接作为一种工具最常见的agent类型之一是 ReAct 风格的工具调用agent。对于这类agent常见的模式是将交接操作封装在工具调用中例如def transfer_to_bob(state): Transfer to bob. return Command( gotobob, update{my_state_key: my_state_value}, graphCommand.PARENT, )这是从工具更新图状态的一个特殊情况除了状态更新之外还包含了控制流。如果你想使用返回 Command 的工具你可以使用预构建的 create_react_agent / ToolNode 组件或者实现你自己的工具执行节点该节点收集工具返回的 Command 对象并返回一个列表例如def call_tools(state): ... commands [tools_by_name[tool_call[name]].invoke(tool_call) for tool_call in tool_calls] return commands现在让我们仔细看看不同的多智能体架构。2.1.8 主管在这个架构中我们将agents定义为节点并添加一个监管节点LLM由其决定接下来应该调用哪些agents节点。我们使用 Command 根据监管节点的决策将执行路由到相应的agents节点。该架构也非常适合并行运行多个agents或使用 MapReduce 模式。from typing import Literal from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, MessagesState, START, END model ChatOpenAI() def supervisor(state: MessagesState) - Command[Literal[agent_1, agent_2, END]]: # you can pass relevant parts of the state to the LLM (e.g., state[messages]) # to determine which agent to call next. a common pattern is to call the model # with a structured output (e.g. force it to return an output with a next_agent field) response model.invoke(...) # route to one of the agents or exit based on the supervisors decision # if the supervisor returns __end__, the graph will finish execution return Command(gotoresponse[next_agent]) def agent_1(state: MessagesState) - Command[Literal[supervisor]]: # you can pass relevant parts of the state to the LLM (e.g., state[messages]) # and add any additional logic (different models, custom prompts, structured output, etc.) response model.invoke(...) return Command( gotosupervisor, update{messages: [response]}, ) def agent_2(state: MessagesState) - Command[Literal[supervisor]]: response model.invoke(...) return Command( gotosupervisor, update{messages: [response]}, ) builder StateGraph(MessagesState) builder.add_node(supervisor) builder.add_node(agent_1) builder.add_node(agent_2) builder.add_edge(START, supervisor) supervisor builder.compile()2.1.9 主管工具调用在这种监管架构中我们将各个智能体定义为工具 并在监管节点中使用支持工具调用的 LLM。可以实现为一个 ReAct 风格的代理包含两个节点——一个 LLM 节点监管节点和一个执行工具在本例中为代理的工具调用节点。from typing import Annotated from langchain_openai import ChatOpenAI from langgraph.prebuilt import InjectedState, create_react_agent model ChatOpenAI() # this is the agent function that will be called as tool # notice that you can pass the state to the tool via InjectedState annotation def agent_1(state: Annotated[dict, InjectedState]): # you can pass relevant parts of the state to the LLM (e.g., state[messages]) # and add any additional logic (different models, custom prompts, structured output, etc.) response model.invoke(...) # return the LLM response as a string (expected tool response format) # this will be automatically turned to ToolMessage # by the prebuilt create_react_agent (supervisor) return response.content def agent_2(state: Annotated[dict, InjectedState]): response model.invoke(...) return response.content tools [agent_1, agent_2] # the simplest way to build a supervisor w/ tool-calling is to use prebuilt ReAct agent graph # that consists of a tool-calling LLM node (i.e. supervisor) and a tool-executing node supervisor create_react_agent(model, tools)2.1.10 层级式或垂直式Agents以树状结构组织其中高级代理主管代理管理低级代理。随着系统中智能体数量增加主管智能体可能难以管理所有智能体。主管智能体可能会在选择下一个调用的智能体时做出错误的决策上下文也可能变得过于复杂以至于单个主管智能体无法跟踪。换句话说最终你会遇到多智能体架构的那些问题。为了解决这个问题可以采用层级式系统设计。例如创建由各个主管管理的独立、专业的代理团队以及一个顶级主管来管理这些团队。from typing import Literal from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, MessagesState, START, END from langgraph.types import Command model ChatOpenAI() # define team 1 (same as the single supervisor example above) def team_1_supervisor(state: MessagesState) - Command[Literal[team_1_agent_1, team_1_agent_2, END]]: response model.invoke(...) return Command(gotoresponse[next_agent]) def team_1_agent_1(state: MessagesState) - Command[Literal[team_1_supervisor]]: response model.invoke(...) return Command(gototeam_1_supervisor, update{messages: [response]}) def team_1_agent_2(state: MessagesState) - Command[Literal[team_1_supervisor]]: response model.invoke(...) return Command(gototeam_1_supervisor, update{messages: [response]}) team_1_builder StateGraph(Team1State) team_1_builder.add_node(team_1_supervisor) team_1_builder.add_node(team_1_agent_1) team_1_builder.add_node(team_1_agent_2) team_1_builder.add_edge(START, team_1_supervisor) team_1_graph team_1_builder.compile() # define team 2 (same as the single supervisor example above) class Team2State(MessagesState): next: Literal[team_2_agent_1, team_2_agent_2, __end__] def team_2_supervisor(state: Team2State): ... def team_2_agent_1(state: Team2State): ... def team_2_agent_2(state: Team2State): ... team_2_builder StateGraph(Team2State) ... team_2_graph team_2_builder.compile() # define top-level supervisor builder StateGraph(MessagesState) def top_level_supervisor(state: MessagesState) - Command[Literal[team_1_graph, team_2_graph, END]]: # you can pass relevant parts of the state to the LLM (e.g., state[messages]) # to determine which team to call next. a common pattern is to call the model # with a structured output (e.g. force it to return an output with a next_team field) response model.invoke(...) # route to one of the teams or exit based on the supervisors decision # if the supervisor returns __end__, the graph will finish execution return Command(gotoresponse[next_team]) builder StateGraph(MessagesState) builder.add_node(top_level_supervisor) builder.add_node(team_1_graph, team_1_graph) builder.add_node(team_2_graph, team_2_graph) builder.add_edge(START, top_level_supervisor) builder.add_edge(team_1_graph, top_level_supervisor) builder.add_edge(team_2_graph, top_level_supervisor) graph builder.compile()优点 不同层级agent的角色和职责划分清晰。沟通流程精简高效。适用于具有结构化决策流程的大型系统。缺点 高层级的故障可能导致整个系统瘫痪。底层agent的独立性有限。2.1.11 自定义多代理工作流程每个智能体只与智能体的一部分通信。部分智能体通信是确定的部分智能体可以决定接下来要呼叫哪些其他智能体。在这种架构中我们将各个智能体添加为图节点并预先定义智能体在自定义工作流中的调用顺序。在 LangGraph 中工作流可以通过两种方式定义显式控制流普通边 LangGraph 通过普通图边显式定义应用程序的控制流即智能体之间的通信顺序这是上述架构中最具确定性的变体——我们可以预先知道接下来会调用哪个智能体。动态控制流命令 在 LangGraph 中可以通过使用 Command 来实现 LLM 动态控制应用程序部分内容。一种特殊情况是监督工具调用架构。在这种情况下驱动监督智能体工具调用的 LLM 将决定工具智能体的调用顺序。from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, MessagesState, START model ChatOpenAI() def agent_1(state: MessagesState): response model.invoke(...) return {messages: [response]} def agent_2(state: MessagesState): response model.invoke(...) return {messages: [response]} builder StateGraph(MessagesState) builder.add_node(agent_1) builder.add_node(agent_2) # define the flow explicitly builder.add_edge(START, agent_1) builder.add_edge(agent_1, agent_2)三、Agent之间通信构建多智能体系统时最重要的是弄清楚智能体之间如何通信。这其中涉及以下几个方面智能体是通过图状态进行通信还是通过工具调用进行通信如果两个智能体具有不同的状态模式会怎样如何通过共享邮件列表进行沟通3.1 图状态与工具调用智能体之间传递的“有效载荷”是什么在上述大多数架构中智能体通过图状态进行通信。对于带有工具调用功能的监管者而言有效载荷是工具调用参数。图状态为了通过图状态进行通信需要将各个智能体定义为图节点 。这些节点可以作为函数或整个子图添加。在图执行的每个步骤中智能体节点接收图的当前状态执行智能体代码然后将更新后的状态传递给下一个节点。例如在社交媒体聚合器的代码中我们将图状态定义为通常情况下智能体节点共享同一个状态模式 。但是您可能希望设计具有不同状态模式的智能体节点。3.2 不同的状态模式某个智能体可能需要与其他智能体不同的状态模式。例如搜索代理可能只需要跟踪查询和检索到的文档。在 LangGraph 中有两种方法可以实现这一点为子智能体定义独立的状态模式。如果子图和父图之间没有共享的状态键通道则必须添加输入/输出转换 以便父图知道如何与子图通信为智能体节点函数定义一个私有的输入状态模式 该模式与整体图状态模式不同。这样就可以传递仅执行该特定智能体所需的信息。3.3 共享消息列表智能体之间最常见的通信方式是通过共享状态通道通常是一个消息列表。这假设状态中始终至少存在一个由智能体共享的通道键。通过共享消息列表进行通信时还需要考虑另一个问题智能体应该共享其完整的思考过程还是只共享最终结果 四、结论多智能体 LLM 系统提供了一种强大的范式它利用并行、顺序、路由器和聚合器工作流等各种架构模式来处理复杂任务正如本博客所探讨的那样。通过对共享状态、消息列表和工具调用等通信机制的详细研究我们已经了解了智能体如何协作以实现无缝协调。五、如何系统的学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。一直在更新更多的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】01.大模型风口已至月薪30K的AI岗正在批量诞生2025年大模型应用呈现爆发式增长根据工信部最新数据国内大模型相关岗位缺口达47万初级工程师平均薪资28K数据来源BOSS直聘报告70%企业存在能用模型不会调优的痛点真实案例某二本机械专业学员通过4个月系统学习成功拿到某AI医疗公司大模型优化岗offer薪资直接翻3倍02.大模型 AI 学习和面试资料1️⃣ 提示词工程把ChatGPT从玩具变成生产工具2️⃣ RAG系统让大模型精准输出行业知识3️⃣ 智能体开发用AutoGPT打造24小时数字员工熬了三个大夜整理的《AI进化工具包》送你✔️ 大厂内部LLM落地手册含58个真实案例✔️ 提示词设计模板库覆盖12大应用场景✔️ 私藏学习路径图0基础到项目实战仅需90天第一阶段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%免费】