欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > LLM大语言模型多智能体(Multi-Agent)的概念与构建方法

LLM大语言模型多智能体(Multi-Agent)的概念与构建方法

2025/1/8 12:09:51 来源:https://blog.csdn.net/u013261578/article/details/144976738  浏览:    关键词:LLM大语言模型多智能体(Multi-Agent)的概念与构建方法

构建多智能体的目的:

如果工具函数增多,一个Agent可能很难同时完成对工具的决策与对问题的回答。

如果用户提问了一个需要使用多个工具函数的问题,那答疑机器人也将无法给出正确答案。

比如:“张三的HR是谁?给他请三天假”

1.Multi-Agent(多智能体)系统的设计思路

如果说单Agent的工作方式像一个独立开发者,那么Multi-Agent的工作方式就像一个部门,每个人都有自己的职责,相互之间按照规则进行交互。

Multi-Agent系统有多种设计思路,我们在这里介绍一个由Router Agent、若干个负责执行工具函数的Agent,以及一个Summary Agent组成的Multi-Agent系统。

Router Agent:根据用户的输入内容,判断要将任务分发给哪个Agent。
执行工具函数的Agent:根据Router Agent分发的任务,执行属于自己的工具函数。
Summary Agent:根据用户的输入,以及执行工具函数的Agent的输出,生成总结并返回给用户。

在这里插入图片描述
回到之前的示例——“张三的HR是谁?给他请三天假”。在多智能体系统中,这个任务会被拆解成两个子任务:

查询张三的HR信息:由一个Agent负责。

发送请假申请:由另一个Agent负责。

通过多智能体系统,Planner Agent首先分析用户请求并拆解成这两个子任务,然后将每个任务交给对应的执行Agent处理。最后,Summary Agent会将各个Agent的结果汇总,生成最终的响应。

2.Planner Agent

Planner Agent 是 Multi-Agent 系统的核心部分,它负责分析问题,并决定将任务分发到哪个Agent或Agent组合上。

首先利用 Assistant API 创建 Planner Agent,此处你可以先不对instructions进行指定:

# 决策级别的agent,决定使用哪些agent,以及它们的运行顺序。
planner_agent = Assistants.create(model="qwen-plus",name='流程编排机器人',description='你是团队的leader,你的手下有很多agent,你需要根据用户的输入,决定要以怎样的顺序去使用这些agent'
)print("Planner Agent创建完成")

创建完成后你可以先来看看在未定义instructions时,Planner Agent 的输出是什么样的:

print(get_agent_response(planner_agent,'谁是张三的HR?教育部门一共有多少员工?'))

在这里插入图片描述

从机器人的回答中你可以发现,其输出的回答包含许多额外的信息且没有告知所需要调用的Agent名称。

接下来你需要通过 instructions 指定其可调用的 Agent 及输出格式。

目前,你需要机器人能够帮助员工进行公司内部员工信息查询、请假申请以及其他日常对话。

另外,由于 Agent 的返回值为字符串格式,当你后续需要通过返回内容来分别调用所对应的智能体时会产生不便,所以你需要要求 Planner Agent 输出列表形式的字符串。例如:[“employee_info_agent”, “leave_agent”, “company_info_agent”],以便后续使用字符串解析工具将其转换为结构化数据。

planner_agent=Assistants.update(planner_agent.id,instructions="""你的团队中有以下agent。employee_info_agent:可以查询公司的员工信息,如果提问中关于部门、HR等信息,则调用该agent;leave_agent:可以帮助员工发送请假申请,如果用户提出请假,则调用该agent;chat_agent:如果用户的问题无需以上agent,则调用该agent。你需要根据用户的问题,判断要以什么顺序使用这些agent,一个agent可以被多次调用。你的返回形式是一个列表,不能返回其它信息。比如:["employee_info_agent", "leave_agent"]或者["chat_agent"],列表中的元素只能为上述的agent。""")print("Planner Agent 的 instructions 已更新")

接下来尝试几个测试问题,看下Planner Agent能否分发到正确的Agent。

query_stk = ["谁是张三的HR?教育部门一共有多少员工?","王五在哪个部门?帮我提交下周三请假的申请","你好"
]
for query in query_stk:print("提问是:")print(query)print(get_agent_response(planner_agent,query))print("\n")

在这里插入图片描述
对于这三个测试问题,Planner Agent都做出了正确的选择。

你可以观察到当Planner Agent返回任务规划结果后,其输出是一个描述任务执行顺序的列表形式字符串,例如:[“employee_info_agent”, “leave_agent”]。为了便于后续处理和执行,你需要将其转换为 Python 原生的列表结构(list)并保留相对应的调用顺序。在这里,你可以使用了 Python的ast.literal_eval方法,它可以安全地将字符串表达式解析为相应的 Python 数据类型,例如列表、字典等。

通过这种方式,你可以将任务规划结果转化为易于操作的列表对象,并逐步解析出每个任务的执行步骤,以简化后续的多智能体协作。

import ast# 使用Planner Agent获取任务规划
planner_response = get_agent_response(planner_agent, "王五在哪个部门?帮我提交下周三请假的申请")# 将Planner Agent的字符串形式回复解析为列表
# Planner Agent返回的是一个描述调用顺序的列表形式字符串,例如:["employee_info_agent", "leave_agent"]
order_stk = ast.literal_eval(planner_response)# 打印出Planner Agent的规划结果
print("Planner Agent的任务规划结果:")
for i, agent in enumerate(order_stk, start=1):print(f'第{i}步调用:{agent}')

3.执行工具函数的Agent

上一章节你已经完成了Planner Agent的规划工作。它如同蚁巢中的蚁后,能够统筹规划任务并下达命令。然而,单靠蚁后是不足以让整个蚁巢运转起来的——需要无数的工蚁去执行具体任务,比如搜集食物或修筑巢穴。同样的道理,在你的多智能体系统中,仅有 Planner Agent 还不足以完成任务,必须为其配备执行具体任务的 工具函数Agent,才能真正实现整个系统的高效协作。

以下,你将需要基于上节中的规划结果,为两个不同任务创建独立的 执行工具函数Agent,使它们分别负责具体的操作任务。这种设计不仅让系统更加模块化,还能最大限度地发挥 Planner Agent 的协调作用。

需要确保agent变量名与Router Agent的instructions中定义的agent变量名一致。

# 员工信息查询agent
employee_info_agent = Assistants.create(model="qwen-plus",name='员工信息查询助手',description='一个智能助手,能够查询员工信息。',instructions='''你是员工信息查询助手,负责查询员工姓名、部门、HR等信息''',tools=[{'type': 'function','function': {'name': '查询员工信息','description': '当需要查询员工信息时非常有用,比如查询员工张三的HR是谁,查询教育部门总人数等。','parameters': {'type': 'object','properties': {'query': {'type': 'str','description': '用户的提问。'},},'required': ['query']},}}]
)
print(f'{employee_info_agent.name}创建完成')# 请假申请agent
leave_agent = Assistants.create(model="qwen-plus",name='请假申请助手',description='一个智能助手,能够帮助员工提交请假申请。',instructions='''你是员工请假申请助手,负责帮助员工提交请假申请。''',tools=[{'type': 'function','function': {'name': '发送请假申请','description': '当需要帮助员工发送请假申请时非常有用。','parameters': {'type': 'object','properties': {# 需要请假的时间'date': {'type': 'str','description': '员工想要请假的时间。'},},'required': ['date']},}}]
)
print(f'{leave_agent.name}创建完成')
# 功能是回复日常问题。对于日常问题来说,可以使用价格较为低廉的模型作为agent的基座
chat_agent = Assistants.create(# 因为该Agent对大模型性能要求不高,因此使用成本较低的qwen-turbo模型model="qwen-turbo",name='回答日常问题的机器人',description='一个智能助手,解答用户的问题',instructions='请礼貌地回答用户的问题'
)
print(f'{chat_agent.name}创建完成')

4.创建Summary Agent并测试Multi-Agent效果

在完成了Planner Agent和执行工具函数Agent的创建后,你还需要创建Summary Agent,该Agent会根据用户的问题与之前Agent输出的参考信息,全面、完整地回答用户问题。

summary_agent = Assistants.create(model="qwen-plus",name='总结机器人',description='一个智能助手,根据用户的问题与参考信息,全面、完整地回答用户问题',instructions='你是一个智能助手,根据用户的问题与参考信息,全面、完整地回答用户问题'
)
print(f'{summary_agent.name}创建完成')
# 将列表中的字符串映射到Agent对象上
# 将字符串格式的Agent名称映射到具体Agent对象
agent_mapper = {"employee_info_agent": employee_info_agent,"leave_agent": leave_agent,"chat_agent": chat_agent
}def get_multi_agent_response(query):# 获取Agent的运行顺序agent_order = get_agent_response(planner_agent,query)# 由于大模型输出可能不稳定,因此加入异常处理模块处理列表字符串解析失败的问题try:order_stk = ast.literal_eval(agent_order)print("Planner Agent正在工作:")for i in range(len(order_stk)):print(f'第{i+1}步调用:{order_stk[i]}')# 随着多Agent的加入,需要将Agent的输出添加到用户问题中,作为参考信息cur_query = queryAgent_Message = ""# 依次运行Agentfor i in range(len(order_stk)):cur_agent = agent_mapper[order_stk[i]]response = get_agent_response(cur_agent,cur_query)Agent_Message += f"*{order_stk[i]}*的回复为:{response}\n\n"# 如果当前Agent为最后一个Agent,则将其输出作为Multi Agent的输出if i == len(order_stk)-1:prompt = f"请参考已知的信息:{Agent_Message},回答用户的问题:{query}。"multi_agent_response = get_agent_response(summary_agent,prompt)print(f'Multi-Agent回复为:{multi_agent_response}')return multi_agent_response# 如果当前Agent不是最后一个Agent,则将上一个Agent的输出response添加到下一轮的query中,作为参考信息else:# 在参考信息前后加上特殊标识符,可以防止大模型混淆参考信息与提问cur_query = f"你可以参考已知的信息:{response}你要完整地回答用户的问题。问题是:{query}。"# 兜底策略,如果上述程序运行失败,则直接调用大模型except Exception as e:return get_agent_response(chat_agent,query)# 此处来用 “王五在哪个部门?帮我提交下周三请假的申请”进行一个测试
get_multi_agent_response("王五在哪个部门?帮我提交下周三请假的申请")

5.大模型平台的多智能体编排功能

可以看出,在自主构建一个Multi-Agent系统时,虽然能够提供高度的灵活性,但也伴随着一定的工作量和复杂性。对于许多企业来说,快速实现复杂业务逻辑更为重要。
Dify 是智能体流程画布的开创者之一。Dify的画布工具让用户能够通过可视化的流程图来设计和管理智能体任务的执行逻辑,在业内树立了标杆。其直观的界面设计,为许多开发者提供了参考。

Dify.ai 在智能体流程编排方面表现出色,国内也推出相应的平台(如阿里巴巴的百炼平台)供国内企业与开发者使用。

百炼平台的多智能体编排功能,依托大模型的强大能力,支持智能体自主决策和任务分工。通过平台内置的画布式编排工具,用户可以轻松实现以下目标:
在这里插入图片描述

定义智能体的执行逻辑:用户能够直观地通过画布式工具配置各个智能体的执行规则和逻辑链路。
编排多个智能体之间的协作:通过模块化设计,各个智能体能够高效配合,完成复杂任务。
快速验证业务效果:内置的仿真和测试功能,帮助用户快速验证编排逻辑是否符合预期。
百炼平台支持用户从零开始设计智能体系统,即使没有深厚的技术背景,用户也可以通过其易用的界面快速搭建并验证多智能体协作系统。对于需要快速落地多智能体技术的企业,百炼平台是一个理想的选择。
详情请见百炼智能体应用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com