首页 > AI教程资讯

AI智能体(八):构建多智能体系统

文章来源:万象ai发布时间:2025-07-28 11:48:01

神译局是旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。

编者按:2025年是AI智能体元年。本系列文章旨在介绍AI智能体的概念、类型、原理、架构、开发等,为进一步了解AI智能体提供入门知识。本文为系列文章的第八篇,文章来自编译。

1.引言

在评估智能体能在什么地方创造价值时,可优先考虑那些传统方法难以实现自动化、特别是会遇到瓶颈的工作流:

复杂决策:涉及微妙判断、例外情况或依赖上下文决策的工作流,比方说客户服务流程中的退款审批。

难以维护的规则:因规则集庞大且复杂而导致更新成本高或易出错、变得难以管理的系统,比方说执行供应商安全审查。

严重依赖非结构化数据:涉及解释自然语言、从文档中提取含义或与用户进行对话式交互的场景,比方说处理家庭保险理赔。在决定构建智能体之前,务必明确确认你的用例能满足上述条件。否则,一个确定性的解决方案可能就足够了。

2.智能体设计组件

就最基本形式而言,智能体包含了三个核心组件:

模型(Model):为智能体的推理和决策提供动力的LLM。

工具(Tools):智能体可用于执行操作的外部函数或API。

指令(Instructions):定义智能体行为方式的明确指导方针和防护措施。

2.1选择模型

不同的模型在任务复杂性、延迟和成本方面有不同的优势和权衡。并非每个任务都需要最智能的模型——一个简单的检索或意图分类任务可能由更小、更快的模型处理,而像决定是否批准退款这样的困难任务则可能受益于能力更强的模型。一个行之有效的方法是:在构建智能体原型时,为每个任务使用能力最强的模型,以建立性能基准。然后,尝试用小一点的模型替换,看看是否仍能达到可接受的结果。这样,你就不会过早限制智能体的能力,并且可以诊断出小一点的模型什么时候能行什么时候行不通。总之,选择模型的原则很简单:

建立评估机制,设定性能基准。

专注于用当前可用的最佳模型达到准确度目标。

在可能的情况下,用更小的模型替换更大的模型,以优化成本和延迟。

什么是函数调用最好的小模型?

选项通常可以从任何开源模型开始,如Llama、Mistral、Qwen、ClaudeOpus等。

2.2定义工具

函数调用(Functioncalling)是让大模型(LLMs)与工具交互的主要方式。你经常会看到“函数(Function)”和“工具(Tool)”可以互换使用,因为“函数”(可重用的代码块)就是智能体用来执行任务的“工具”。

工具通过利用底层应用或系统的API来扩展智能体的能力。对于没有API的遗留系统,智能体可以依靠计算机使用模型(computer-usemodels),像人类一样通过网页和应用UI直接与这些应用和系统交互。每个工具都应有一个标准化的定义,从而实现工具与智能体之间灵活的多对多关系。文档完善、经过充分测试且可重用的工具可以提高可发现性、简化版本管理并防止重复定义。

广义上而言,智能体需要三种类型的工具:

比方说,在使用AgentsSDK时,你可以这样为上面定义的智能体配备一系列工具:

Python

fromagentsimportAgent,WebSearchTool,function_tool

@function_tool

defsave_results(output):

db.insert({"output":output,"timestamp":datetime.time()})

return"文件已保存"

search_agent=Agent(

name="搜索智能体",

instructions="帮助用户搜索互联网,并在要求时保存结果。",

tools=[WebSearchTool(),save_results],

)

随着所需工具数量的增加,可以考虑将任务拆分给多个智能体。

2.3配置指令

高质量的指令对于任何基于LLM的应用都至关重要,对于智能体尤其如此。清晰的指令可以减少歧义,改进智能体的决策,从而实现更流畅的工作流执行和更少的错误。

你可以使用高级模型,如o1或o3-mini,根据现有文档自动生成指令。以下是一个说明这种方法的示例提示:

3.编排

在具备了基础组件之后,你就可以考虑编排模式,好让智能体能够有效地执行工作流。

多智能体系统可以建模成图(graph),智能体表示为节点(node)。在管理者和监督者模式中,边(edge)代表工具调用(toolcalls);而在去中心化和军团模式中,边代表交接(handoffs),即在智能体之间转移执行权。

不管采用哪种编排模式,AI智能体工作过程通常遵循以下4个步骤:

1.接收输入:智能体获取用户或环境的指令。

2.推理:智能体处理输入、评估当前状态,并决定后续动作。

3.执行动作:智能体执行决策,如调用工具、生成响应或与其他智能体互动。

4.输出结果:智能体将执行结果反馈给用户或系统。

无论采用何种编排模式,核心原则都是一样的:保持组件灵活可变、可组合,并由清晰、结构良好的提示驱动。

在去中心化模式中,智能体可以彼此“交接”(handoff)工作流的执行权。交接是一种单向转移,允许一个智能体将任务委托给另一个智能体。

4.实现:监督者模式

创建一个监督者智能体(supervisoragent)来编排多个专业化的智能体。

```python

pipinstalllanggraph-supervisorlangchain-openai

exportOPENAI_API_KEY=

fromlangchain_openaiimportChatOpenAI

fromlanggraph.graphimportSTART,END

fromlangchain_community.tools.tavily_searchimportTavilySearchResults

fromlanggraph.prebuiltimportcreate_react_agent

fromlanggraph_supervisorimportcreate_supervisor

fromIPython.displayimportImage,display

importos

#选择语言模型

model=ChatOpenAI(model="gpt-4o",api_key=os.getenv("OPENAI_API_KEY"))

#定义工具

defadd(a:float,b:float)->float:

"""将两个数字相加。"""

returna+b

defmultiply(a:float,b:float):

"""将两个数字相乘。"""

returna*b

defdivide(a:float,b:float):

"""将两个数字相除。"""

returna/b

tavily_api_key=os.getenv("TAVILY_API_KEY","你的TavilyAPI密钥")

web_search=TavilySearchResults(max_results=3,tavily_api_key=tavily_api_key)

#创建工作智能体(WorkerAgents)

research_agent=create_react_agent(

model=model,

tools=[web_search],

name="research_agent",

prompt=(

"你是一个研究型智能体。"

"指令:"

"-只协助完成与研究相关的任务,切勿执行任何数学计算"

"-完成任务后,直接回复监督者"

"-回复内容仅包含你的工作结果,不要包含任何其他文本。"

)

)

math_agent=create_react_agent(

model=model,

tools=[add,multiply,divide],

name="math_agent",

prompt=(

"你是一个数学智能体。"

"指令:"

"-只协助完成与数学相关的任务"

"-完成任务后,直接回复监督者"

"-回复内容仅包含你的工作结果,不要包含任何其他文本。"

)

)

#创建监督者智能体(SupervisorAgent)

supervisor_agent=create_supervisor(

model=model,

agents=[research_agent,math_agent],

prompt=(

"你是一个监督者,管理着两个智能体:"

"-一个研究智能体。将研究相关任务分配给这个智能体"

"-一个数学智能体。将数学相关任务分配给这个智能体"

"一次只分配给一个智能体工作,不要并行调用智能体。"

"你自己不要执行任何工作。"

),

add_handoff_back_messages=True,

output_mode="full_history",

).compile()#编译图

#显示图结构(可选)

display(Image(supervisor_agent.get_graph().draw_mermaid_png()))

```

我们用`pretty_print_messages`辅助函数来美化渲染智能体流式输出:

```python

fromlangchain_core.messagesimportconvert_to_messages

defpretty_print_message(message,indent=False):

"""美化打印消息内容"""

pretty_message=message.pretty_repr(html=True)

ifnotindent:

print(pretty_message)

return

indented="".join(""+cforcinpretty_message.split(""))

print(indented)

defpretty_print_messages(update,last_message=False):

"""批量美化打印消息更新"""

is_subgraph=False

ifisinstance(update,tuple):

ns,update=update

#跳过父图的更新打印

iflen(ns)==0:

return

graph_id=ns[-1].split(":")[0]

print(f"来自子图{graph_id}的更新:")

print("")

is_subgraph=True

fornode_name,node_updateinupdate.items():

update_label=f"来自节点{node_name}的更新:"

ifis_subgraph:

update_label=""+update_label

print(update_label)

print("")

messages=convert_to_messages(node_update["messages"])

iflast_message:

messages=messages[-1:]

forminmessages:

pretty_print_message(m,indent=is_subgraph)

print("")

```

测试该工作流:

```python

deftest_supervisor_functionality():

"""测试监督者模式功能,使用特定GDP查询验证交接过程。"""

query="查询:查找美国和纽约州2024年的GDP。纽约州GDP占美国GDP的百分比是多少?"

print(query)

print("-"*80)

try:

#模拟用户输入进行流式处理

forchunkinsupervisor_agent.stream(

{

"messages":[

{

"role":"user",

"content":"查找美国和纽约州2024年的GDP。纽约州GDP占美国GDP的百分比是多少?",

}

]

},

subgraphs=False#不显示子图内部细节

):

pretty_print_messages(chunk,last_message=True)#只打印最后一个有意义的消息

print(f"测试成功完成")

exceptExceptionase:

print(f"测试失败,错误信息:{str(e)}")

print("="*80)

#运行测试

if__name__=="__main__"orTrue:#允许在笔记本中直接运行

test_supervisor_functionality()

```

输出示例:

```

查询:查找美国和纽约州2024年的GDP。纽约州GDP占美国GDP的百分比是多少?

--------------------------------------------------------------------------------

来自节点supervisor的更新:

=================================工具消息=================================

名称:transfer_to_research_agent

成功交接给research_agent

来自节点research_agent的更新:

=================================工具消息=================================

名称:transfer_back_to_supervisor

成功交回给supervisor

来自节点supervisor的更新:

=================================工具消息=================================

名称:transfer_to_math_agent

成功交接给math_agent

来自节点math_agent的更新:

=================================工具消息=================================

名称:transfer_back_to_supervisor

成功交回给supervisor

来自节点supervisor的更新:

==================================AI消息==================================

名称:supervisor

2024年,纽约州GDP约占美国GDP的8.15%。

测试成功完成

================================================================================

```

4.1消息历史管理

智能体的消息如何添加到多智能体系统的整体对话历史当中是可以控制的:

*包含智能体的完整消息历史:

```python

supervisor=create_supervisor(

agents=[agent1,agent2],

output_mode="full_history"#输出模式:完整历史

)

```

*仅包含智能体的最终响应:

```python

supervisor=create_supervisor(

agents=[agent1,agent2],

output_mode="last_message"#输出模式:仅最后一条消息

)

```

4.2多层结构

你可以通过创建一个管理多个监督者的监督者,来构建多层系统:

research_team=create_supervisor([research_agent,math_agent],model=model,supervisor_name="research_supervisor").compile(name="research_team")writing_team=create_supervisor([writing_agent,publishing_agent],model=model,supervisor_name="writing_supervisor").compile(name="writing_team")top_level_supervisor=create_supervisor([research_team,writing_team],model=model,supervisor_name="top_level_supervisor").compile(name="top_level_supervisor")

4.3自定义交接工具

默认情况下,监督者使用预建的`create_handoff_tool`函数创建的交接工具(handofftools)。你也可以创建自己的自定义交接工具。以下是一些修改默认实现的想法:

更改工具名称和/或描述:让工具名和描述更符合你的业务场景。

添加工具调用参数:让LLM填写参数,比方说为下一个智能体添加任务描述。

更改交接时传递给子智能体的数据:默认情况下,`create_handoff_tool`会传递完整的消息历史(监督者到此时生成的所有消息)以及一个指示交接成功的工具消息。你可以修改这个行为。

以下是如何将自定义的交接工具传递给`create_supervisor`的示例:

fromlanggraph_supervisorimportcreate_handoff_tool

workflow=create_supervisor(

[research_agent,math_agent],

tools=[

create_handoff_tool(agent_name="math_expert",name="assign_to_math_expert",description="Assigntasktomathexpert"),

create_handoff_tool(agent_name="research_expert",name="assign_to_research_expert",description="Assigntasktoresearchexpert")

],

model=model,

)

还可以控制交接工具消息是否添加到状态,默认情况下,交接工具调用的消息会被添加到状态历史中(`add_handoff_messages=True`)。你可以禁用此功能,让历史记录变得更简洁::

workflow=create_supervisor([research_agent,math_agent],model=model,add_handoff_messages=False)

还可以自定义自动生成的交接工具的前缀:

workflow=create_supervisor(

[research_agent,math_agent],

model=model,

handoff_tool_prefix="delegate_to"

)

#Thiswillcreatetoolsnamed:delegate_to_research_expert,delegate_to_math_expert

自定义交接工具的实现示例:

```python

fromtypingimportAnnotated

fromlangchain_core.toolsimporttool,InjectedToolCallId

fromlanggraph.prebuiltimportInjectedState

fromlanggraph.graphimportStateGraph,START,MessagesState,END

fromlanggraph.typesimportCommand

#自定义创建交接工具的函数

defcreate_handoff_tool(*,agent_name:str,description:str|None=None):

name=f"transfer_to_{agent_name}"#工具名称格式

description=descriptionorf"Ask{agent_name}forhelp."#默认描述

@tool(name,description=description)

defhandoff_tool(

state:Annotated[MessagesState,InjectedState],#注入当前状态

tool_call_id:Annotated[str,InjectedToolCallId],#注入工具调用ID

)->Command:

#创建工具消息(指示交接成功)

tool_message={

"role":"tool",

"content":f"Successfullytransferredto{agent_name}",#成功消息

"name":name,

"tool_call_id":tool_call_id,

}

#返回命令:跳转到目标智能体节点,更新状态(添加工具消息),并指定在父图中执行跳转

returnCommand(

goto=agent_name,#目标节点名称

update={state,"messages":state["messages"]+[tool_message]},#更新状态(添加工具消息)

graph=Command.PARENT,#在父图中执行跳转

)

returnhandoff_tool

#使用自定义函数创建研究智能体的交接工具

assign_to_research_agent=create_handoff_tool(

agent_name="research_agent",

description="Assigntasktoaresearcheragent.",#自定义描述

)

#使用自定义函数创建数学智能体的交接工具

assign_to_math_agent=create_handoff_tool(

agent_name="math_agent",

description="Assigntasktoamathagent.",#自定义描述

)

#创建监督者智能体,使用自定义的交接工具

supervisor_agent=create_react_agent(

model="openai:gpt-4o-mini",#使用的模型

tools=[assign_to_research_agent,assign_to_math_agent],#使用自定义工具

prompt=(

"你是一个监督者,管理着两个智能体:"

"-一个研究智能体。将研究相关任务分配给这个智能体"

"-一个数学智能体。将数学相关任务分配给这个智能体"

"一次只分配给一个智能体工作,不要并行调用智能体。"

"你自己不要执行任何工作。"

),

name="supervisor",#智能体名称

)

#定义多智能体监督者图

supervisor=(

StateGraph(MessagesState)#使用消息状态图

#添加监督者节点(destinations仅用于可视化,不影响运行时行为)

.add_node(supervisor_agent,destinations=("research_agent","math_agent",END))

.add_node(research_agent)#添加研究智能体节点

.add_node(math_agent)#添加数学智能体节点

.add_edge(START,"supervisor")#起始边:START->supervisor

#定义返回边:智能体完成任务后总是返回监督者

.add_edge("research_agent","supervisor")

.add_edge("math_agent","supervisor")

.compile()#编译图

)

#(可选)显示图结构

display(Image(supervisor.get_graph().draw_mermaid_png()))

```

输出示例(运行查询):

```python

#使用编译好的监督者图处理查询

forchunkinsupervisor.stream(

{

"messages":[

{

"role":"user",

"content":"findUSandNewYorkstateGDPin2024.what%ofUSGDPwasNewYorkstate?",

}

]

},

):

pretty_print_messages(chunk,last_message=True)#美化打印每个更新块的最后一条消息

#获取最终的消息历史

final_message_history=chunk["supervisor"]["messages"]#最终状态中的消息历史

```

Updatefromnodesupervisor:=================================ToolMessage=================================Name:transfer_to_research_agentSuccessfullytransferredtoresearch_agentUpdatefromnoderesearch_agent:==================================AiMessage==================================Name:research_agent-USGDPin2024:Approximately$28.18trillionUSD(Statista).-NewYorkStateGDPin2024:ThespecificGDPnumberforNewYorkStatein2024hasnotbeendirectlylocated,butrelevantforecastsareprovidedinthestateassemblyreports.ForcalculationsregardingthepercentageoftheUSGDPthatNewYorkStatecomprises,specificfigureswouldneedtobesourced.Updatefromnodesupervisor:=================================ToolMessage=================================Name:transfer_to_math_agentSuccessfullytransferredtomath_agentUpdatefromnodemath_agent:==================================AiMessage==================================Name:math_agent5.93%Updatefromnodesupervisor:==================================AiMessage==================================Name:supervisorIn2024,theapproximateGDPoftheUnitedStatesis$28.18trillionUSD.NewYorkState"sGDPisestimatedtobearound$1.671trillionUSD.Therefore,NewYorkStatecontributesabout5.93%ofthetotalUSGDP.

上面已经实现了final_message_history.现在需要检查一下完整的结果消息历史:

formessageinfinal_message_history:message.pretty_print()

输出:

================================HumanMessage=================================findUSandNewYorkstateGDPin2024.what%ofUSGDPwasNewYorkstate?==================================AiMessage==================================Name:supervisorToolCalls:transfer_to_research_agent(call_9Innk7roc0BYXdvTnvljH267)CallID:call_9Innk7roc0BYXdvTnvljH267Args:=================================ToolMessage=================================Name:transfer_to_research_agentSuccessfullytransferredtoresearch_agent==================================AiMessage==================================Name:research_agentToolCalls:tavily_search_results_json(call_6rXCVDfY6Rg9FiWHsxbyBxQG)CallID:call_6rXCVDfY6Rg9FiWHsxbyBxQGArgs:query:USGDP2024forecasttavily_search_results_json(call_hAsCKkl3tMIFwixTTp7eh0zt)CallID:call_hAsCKkl3tMIFwixTTp7eh0ztArgs:query:NewYorkstateGDP2024forecast=================================ToolMessage=================================Name:tavily_search_results_json[{"title":"GDPforecastU.S.2034-Statista","url":"https://www.statista.com/statistics/216985/forecast-of-us-gross-domestic-product/","content":"[](https://www.statista.com/statistics/216985/forecast-of-us-gross-domestic-product/#statisticContainer)ThisgraphshowsaforecastofthegrossdomesticproductoftheUnitedStatesofAmericaforfiscalyears2024to2034.GDPreferstothemarketvalueofallfinalgoodsandservicesproducedwithinacountryinagivenperiod.AccordingtotheCBO,theUnitedStatesGDPwillincreasesteadilyoverthenextdecadefrom28.18trillionU.S.dollarsin2023to41.65trillionU.S.dollarsin[...]*[Economy&Politics](https://www.statista.com/markets/2535/economy-politics/)›*[Economy](https://www.statista.com/markets/2535/topic/970/economy/)U.S.GDPforecast2024-2034===========================Publishedby[AbigailTierney](https://www.statista.com/aboutus/our-research-commitment/3508/abigail-tierney),Jul5,2024[...].%20dollars)%C2%A0https://www.statista.com/statistics/216985/forecast-of-us-gross-domestic-product/)[](mailto:?subject=Statista%C2%A0-%C2%A0Forecast%20of%20the%20gross%20domestic%20product%20of%20the%20United%20States%20from%20fiscal%20year%202024%20%20to%20fiscal%20year%202034%20(in%20billion%20U.S.%20dollars)&body=This%20graph%20shows%20a%20forecast%20of%20the%20gross%20domestic%20product%20of%20the%20United%20States%20of%20America%20for%20fiscal%20years%202024%20to%202034","score":0.9245858},{"title":"UnitedStatesGDPGrowthRate-TradingEconomics","url":"https://tradingeconomics.com/united-states/gdp-growth","content":"|[GDPfromServices](https://tradingeconomics.com/united-states/gdp-from-services)|17050.50|16949.30|USDBillion|Dec2024||[GDPfromTransport](https://tradingeconomics.com/united-states/gdp-from-transport)|730.50|721.40|USDBillion|Dec2024||[GDPfromUtilities](https://tradingeconomics.com/united-states/gdp-from-utilities)|350.80|341.40|USDBillion|Dec2024|[...]|[GDPfromManufacturing](https://tradingeconomics.com/united-states/gdp-from-manufacturing)|2406.80|2402.80|USDBillion|Dec2024||[GDPfromMining](https://tradingeconomics.com/united-states/gdp-from-mining)|343.60|337.60|USDBillion|Dec2024||[GDPfromPublicAdministration](https://tradingeconomics.com/united-states/gdp-from-public-administration)|2653.10|2635.50|USDBillion|Dec2024|[...]|[GrossFixedCapitalFormation](https://tradingeconomics.com/united-states/gross-fixed-capital-formation)|4346.50|4265.90|USDBillion|Mar2025||[GrossNationalProduct](https://tradingeconomics.com/united-states/gross-national-product)|23620.90|23427.70|USDBillion|Dec2024||[RealConsumerSpending](https://tradingeconomics.com/united-states/real-consumer-spending)|1.20|4.00|percent|Mar2025|","score":0.8458536},{"title":"Apost-cycleeconomyfacesgreaterpolicyuncertainty","url":"https://am.jpmorgan.com/us/en/asset-management/adv/insights/market-insights/investment-outlook/us-economic-outlook/","content":"Thisyear,theeconomysawsurprisinglyrobustgrowthwithrealGDPontracktoexpandata1.8%annualizedrateinthefourthquarter,closing2024with2.3%annualgrowth,byourestimates.Thebiggestdriverofthisstrengthhasbeenconsumerspending,whichcontributedanaverage78%ofrealGDPgrowthinthefirstthreequarters.Despitepushingbackonhighretailprices,athriftierconsumermanagedtostretchtheirbudgetandstillexpandtheirshoppingcart.Inflation-adjustedconsumer","score":0.83290404}]=================================ToolMessage=================================Name:tavily_search_results_json[{"title":"AnnualStateoftheCity"sEconomyandFinances2024","url":"https://comptroller.nyc.gov/reports/annual-state-of-the-citys-economy-and-finances-2024/","content":"[[1]](https://comptroller.nyc.gov/reports/annual-state-of-the-citys-economy-and-finances-2024/#_ftnref1)Atthattime,theComptroller’sOfficeexpectedfive-yearcumulativerealGDPgrowth,2020to2024,of8.7percentwhilethemayorexpected9.5percent.[[2]](https://comptroller.nyc.gov/reports/annual-state-of-the-citys-economy-and-finances-2024/#_ftnref2)U.S.BureauofLaborStatisticsLocalAreaUnemploymentStatistics(LAUS).[...]Nationally,theeconomyisexpectedtogrowby2.3percentin2025,strongerthanthe1.6percentthatwaslastforecastinMay,accordingtotheOfficeoftheNewYorkCityComptroller’sforecast.Short-terminterestratesareprojectedtodeclinemorerapidlyoverthenextfewyears,reaching3percentbyearly2026,whileinflationremainsneartargetedlevels.AveragewagesandoverallemploymentlevelsinNewYorkCityareestimatedtohavebeenstrongerthanhadbeenforecastin2024.The[...](constant2019dollars)22,55015,32213,59619,45121,21121,096_%change_(32.1%)(11.3%)43.1%9.0%(0.5%)Source:NYStateDepartmentofTaxationandFinanceandOfficeoftheNewYorkCityComptroller","score":0.882276},{"title":"NewYorkbytheNumbersMonthlyEconomicandFiscalOutlook","url":"https://comptroller.nyc.gov/newsroom/newsletter/new-york-by-the-numbers-monthly-economic-and-fiscal-outlook-no-101-may-2025/","content":"|A|Current(2024-25)|YearEarlier(2023-24)|Pre-Pandemic*|E||---|---|---|---|---||Jan-24|1,335|1,810|1,307|||Feb-24|1,937|1,292|1,316|||Mar-24|1,641|1,232|884|||Apr-24|1,360|929|947|||May-24|652|1,377|1,020|||Jun-24|665|1,200|1,265|||Jul-24|529|905|1,232|||Aug-24|516|754|935|||Sep-24|355|805|806|||Oct-24|375|844|1,026|||Nov-24|431|801|1,476||[...]|26-Oct-24|5.30%|12.50%||2-Nov-24|9.40%|6.90%||9-Nov-24|3.40%|0.30%||16-Nov-24|6.50%|-1.00%||23-Nov-24|5.20%|-1.20%||30-Nov-24|-2.90%|-1.10%||7-Dec-24|3.30%|5.00%||14-Dec-24|3.50%|6.20%||21-Dec-24|-1.80%|6.70%||28-Dec-24|2.60%|7.30%||4-Jan-25|-5.00%|2.90%||11-Jan-25|-4.90%|4.70%||18-Jan-25|-2.90%|5.60%||25-Jan-25|-5.60%|2.40%||1-Feb-25|-4.60%|2.40%||8-Feb-25|-5.60%|-0.70%|[...]|6-Jul-24|-16.10%|-5.40%||13-Jul-24|-14.80%|-1.10%||20-Jul-24|-11.70%|0.60%||27-Jul-24|-12.40%|4.40%||3-Aug-24|-5.90%|4.00%||10-Aug-24|-2.50%|0.90%||17-Aug-24|-2.80%|-0.50%||24-Aug-24|-0.60%|-2.60%||31-Aug-24|0.30%|0.30%||7-Sep-24|0.70%|2.80%||14-Sep-24|1.40%|5.20%||21-Sep-24|2.00%|6.60%||28-Sep-24|2.70%|7.30%||5-Oct-24|-0.50%|12.10%||12-Oct-24|4.20%|14.70%||19-Oct-24|0.10%|14.80%|","score":0.8576849}]==================================AiMessage==================================Name:research_agentToolCalls:tavily_search_results_json(call_WwAmuE7MF6MvQRUPZ7SrBaT3)CallID:call_WwAmuE7MF6MvQRUPZ7SrBaT3Args:query:NewYorkstateGDP2024forecastindollars=================================ToolMessage=================================Name:tavily_search_results_json[{"title":"[PDF]NewYorkStateEconomicandRevenueReport","url":"https://nyassembly.gov/Reports/WAM/2025economic_revenue/2025_report.pdf?v=1740533306","content":"NewYorkStateEconomicOutlook(PercentChange)ActualEstimateForecastForecast2023-242024-252025-262026-27EmploymentPercentChange1.81.51.00.8Level(Thousands)9,441.69,589.79,694.39,773.6PersonalIncomePercentChange5.25.84.64.4Level(Billions)1,581.51,671.11,754.91,835.0TotalWagesPercentChange4.26.74.44.0Level(Billions)864.0915.9964.31,005.1BaseWagesPercentChange5.15.44.44.3Level(Billions)764.0803.1840.7876.6VariableCompensation[...]Sources:FederalReserve;NYSAssemblyWaysandMeansCommitteestaff.NYSASSEMBLY|U.S.ECONOMICFORECASTATAGLANCE|15ActualActualActualForecastForecast20222023202420252026RealGDP2.52.92.82.42.1Consumption3.02.52.82.72.1Investment6.00.14.03.13.8Exports7.52.83.22.41.1Imports8.6(1.2)5.43.51.3Government(1.1)3.93.41.50.1Federal(3.2)2.92.51.70.2StateandLocal0.24.43.91.40.1PersonalIncome3.15.95.55.04.9Wages&Salaries7.85.4[...]three-monthmovingaverageof2.5millioninDecember2023to872,000inDecember2024.Theratioofjobopeningstounemployedpersons,anotherkeymetricforassessingthebalancebetweenlabordemandandsupply,hasalsosteadilydeclinedinrecentmonths.ByDecember2024,thisratiohaddroppedto1.10,downfromitspeakof2.03inMarch2022.24|U.S.ECONOMICFORECASTANALYSIS|NYSASSEMBLYWithdiminishingsupplyshortagesinthelabormarket,growthoflaborandotherincomeswill","score":0.83290404},{"title":"AnnualStateoftheCity"sEconomyandFinances2024","url":"https://comptroller.nyc.gov/reports/annual-state-of-the-citys-economy-and-finances-2024/","content":"(constant2019dollars)22,55015,32213,59619,45121,21121,096_%change_(32.1%)(11.3%)43.1%9.0%(0.5%)Source:NYStateDepartmentofTaxationandFinanceandOfficeoftheNewYorkCityComptroller[...][[1]](https://comptroller.nyc.gov/reports/annual-state-of-the-citys-economy-and-finances-2024/#_ftnref1)Atthattime,theComptroller’sOfficeexpectedfive-yearcumulativerealGDPgrowth,2020to2024,of8.7percentwhilethemayorexpected9.5percent.[[2]](https://comptroller.nyc.gov/reports/annual-state-of-the-citys-economy-and-finances-2024/#_ftnref2)U.S.BureauofLaborStatisticsLocalAreaUnemploymentStatistics(LAUS).[...]|RetailTrade|301,565|$56,208|14.4|(0.6)|(5.2)|2.7|2.9|2.2|2.1||Leisure&Hospitality|431,227|$56,086|96.2|32.4|15.4|8.9|3.8|4.5|7.3||Total:LowWageSectors|1,997,491|$62,185|184.6|102.2|91.6|62.7|32.0|26.8|29.3||TotalNYCEmployment|4,485,695|$114,294|307.7|119.9|78.1|88.0|65.1|53.2|51.4|","score":0.81979275}]==================================AiMessage==================================Name:research_agent-USGDPin2024:Approximately$28.18trillionUSD(Statista).-NewYorkStateGDPin2024:ThespecificGDPnumberforNewYorkStatein2024hasnotbeendirectlylocated,butrelevantforecastsareprovidedinthestateassemblyreports.ForcalculationsregardingthepercentageoftheUSGDPthatNewYorkStatecomprises,specificfigureswouldneedtobesourced.==================================AiMessage==================================Name:supervisorToolCalls:transfer_to_math_agent(call_oaEpCKr9zw496FBNjBB5dujp)CallID:call_oaEpCKr9zw496FBNjBB5dujpArgs:=================================ToolMessage=================================Name:transfer_to_math_agentSuccessfullytransferredtomath_agent==================================AiMessage==================================Name:math_agentToolCalls:divide(call_e6ZYc9SkjuKzEZjhBo2C77P2)CallID:call_e6ZYc9SkjuKzEZjhBo2C77P2Args:a:1.6711b:28.18=================================ToolMessage=================================Name:divide0.05930092264017033==================================AiMessage==================================Name:math_agentToolCalls:multiply(call_j3rCjTQ5AGqobs2UTXXTT07w)CallID:call_j3rCjTQ5AGqobs2UTXXTT07wArgs:a:0.05930092264017033b:100=================================ToolMessage=================================Name:multiply5.930092264017033==================================AiMessage==================================Name:math_agent5.93%==================================AiMessage==================================Name:supervisorIn2024,theapproximateGDPoftheUnitedStatesis$28.18trillionUSD.NewYorkState"sGDPisestimatedtobearound$1.671trillionUSD.Therefore,NewYorkStatecontributesabout5.93%ofthetotalUSGDP.

4.4消息转发功能

你可以给监督者配个小工具,用`create_forward_message_tool`方法把某个工作Agent的最后回复直接推送到最终输出结果里。当监督者觉得某个Agent的回复已经很完整,不需要再加工或总结时特别管用。这样既省监督者的计算资源,又能避免二次转述把原意带跑偏。

```python

fromlanggraph_supervisor.handoffimportcreate_forward_message_tool

#假设research_agent和math_agent已按之前方式定义

forwarding_tool=create_forward_message_tool("supervisor")#参数指定转发消息的署名

workflow=create_supervisor(

[research_agent,math_agent],

model=model,

#把转发工具和其他交接工具一起传进去

tools=[forwarding_tool]

)

```

这样就创建了个叫`forward_message`的工具,监督者调用时需要传个`from_agent`参数,指明要转发哪个Agent的消息。

5.群体协作模式实战

下面是使用`langgraph_swarm`库实现群体协作的代码(该库基于LangGraph),让不同Agent能动态协作和交接任务。我们用和监督者模式相同的数学Agent和研究Agent来演示:

```python

fromlangchain_openaiimportChatOpenAI

fromlanggraph.graphimportSTART,END

fromlangchain_community.tools.tavily_searchimportTavilySearchResults

fromlanggraph.prebuiltimportcreate_react_agent

fromlanggraph_swarmimportcreate_swarm,create_handoff_tool

fromIPython.displayimportImage,display

importos

#选个语言模型

model=ChatOpenAI(model="gpt-4o-mini",api_key=os.getenv("OPENAI_API_KEY"))

#定义工具函数

defadd(a:float,b:float)->float:

"""两数相加"""

returna+b

defmultiply(a:float,b:float):

"""两数相乘"""

returna*b

defdivide(a:float,b:float):

"""两数相除"""

returna/b

#群体协作专属交接工具

handoff_to_research_agent=create_handoff_tool(

agent_name="research_agent",

description="把控制权转给研究Agent处理搜索任务/资料收集"

)

handoff_to_math_agent=create_handoff_tool(

agent_name="math_agent",

description="把控制权转给数学Agent处理计算问题"

)

tavily_api_key=os.getenv("TAVILY_API_KEY","你的tavily密钥")

web_search=TavilySearchResults(max_results=3,tavily_api_key=tavily_api_key)

#创建工作Agent

research_agent=create_react_agent(

model=model,

tools=[web_search,handoff_to_math_agent],

name="research_agent",

prompt=(

"你是专门搞网络搜索的情报员"

"行动指南:"

"-只管查资料/做调研/收集信息"

"-碰到数学题立刻甩锅给handoff_to_math_agent()"

"-干完活要交完整调研报告"

"-需要算数时调用handoff_to_math_agent()"

)

)

math_agent=create_react_agent(

model=model,

tools=[add,multiply,divide,handoff_to_research_agent],

name="math_agent",

prompt=(

"你是专注解题的数学小能手"

"行动指南:"

"-只管算数/解方程/分析数据"

"-碰到查资料需求立刻甩锅给handoff_to_research_agent()"

"-算完题要写清楚步骤和答案"

"-需要查资料时调用handoff_to_research_agent()"

)

)

swarm_agent=create_swarm(

agents=[research_agent,math_agent],

default_active_agent="math_agent",

).compile()

display(Image(swarm_agent.get_graph().draw_mermaid_png()))

```

测试流程代码

```python

deftest_swarm_functionality():

"""测试群体协作功能:通过GDP查询验证任务交接机制"""

print(f"查询:查找2024年美国及纽约州GDP,纽约州GDP占全美比例是多少?")

print("-"*80)

try:

forchunkinswarm_agent.stream(

{

"messages":[

{

"role":"user",

"content":"findUSandNewYorkstateGDPin2024.what%ofUSGDPwasNewYorkstate?",

}

]

},

subgraphs=False

):

pretty_print_messages(chunk,last_message=True)

print(f"测试成功完成")

exceptExceptionase:

print(f"测试失败,错误信息:{str(e)}")

print("="*80)

#执行测试

if__name__=="__main__"orTrue:

test_swarm_functionality()

```

测试输出结果

```

查询:查找2024年美国及纽约州GDP,纽约州GDP占全美比例是多少?

--------------------------------------------------------------------------------

来自math_agent节点的更新:

=================================工具消息=================================

名称:transfer_to_research_agent

成功转交给research_agent

来自research_agent节点的更新:

=================================工具消息=================================

名称:transfer_to_math_agent

成功转交给math_agent

来自math_agent节点的更新:

==================================AI消息==================================

名称:math_agent

###计算结果:

-2024年美国GDP:约28.18万亿美元

-2024年纽约州GDP:约2.29万亿美元

-纽约州GDP占全美比例:约8.13%

这意味着2024年纽约州预计将贡献美国GDP总量的8.13%

测试成功完成

================================================================================

```

6.运行智能体

6.1调用模式

代理支持两种运行方式:

同步模式:用`.invoke()`或`.stream()`——调用方(用户/系统)必须等代理完成任务才能继续操作

异步模式:用`await.ainvoke()`或`asyncfor.astream()`——代理收到请求后开始处理,调用方无需等待可继续其他任务,结果通过回调/通知返回

同步调用示例

```python

fromlanggraph.prebuiltimportcreate_react_agent

agent=create_react_agent(...)

response=agent.invoke({"messages":[{"role":"user","content":"旧金山天气怎么样"}]})

```

异步调用示例

```python

fromlanggraph.prebuiltimportcreate_react_agent

agent=create_react_agent(...)

response=awaitagent.ainvoke({"messages":[{"role":"user","content":"旧金山天气怎么样"}]})

```

6.2输入格式

代理输入必须是包含`messages`键的字典:

`messages`键值要求:消息对象列表

可通过额外字段实现动态行为(如运行时数据传递)