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

【由浅入深探究langchain】第二十一集-多智能体Supervisor Agent(上)

开篇

为什么我们需要多智能体?

在传统的 LLM 开发中,我们往往倾向于给一个 Agent 堆叠无数个 Tool。但随着业务逻辑变复杂,单一 Agent 会面临“选择困难症”(工具回调错误)和“上下文迷失”的问题。

LangChain 1.0 推出的多智能体架构,核心思想就是模块化。本系列文章将通过一个“个人助理”案例,带大家掌握最主流的Supervisor(集中式)架构。

本篇(上集)重点:我们先不急着写“主管”,而是先把基础打牢——编写两个专业的执行者:Calendar AgentEmail Agent

代码

先放两个work agent的完整代码

calander_agent.py

from langchain_openai import ChatOpenAI kimi_model = ChatOpenAI( model="kimi-k2.5", api_key="sk-uQ***", base_url="https://api.moonshot.cn/v1", # 重点:这里严格对应 Kimi 的 API 结构 extra_body={ "thinking": {"type": "disabled"} } ) from langchain_core.tools import tool from langchain.agents import create_agent CALENDAR_SYSTEM_PROMPT=( "You are a calendar scheduling assistant." "Parse natural language scheduling requests (e.g., 'next Tuesday at 2pm')" "into proper ISo datetime formats." "Use get_available_time_slots to check availability when needed." "Use create calendar event to schedule events." "Always confirm what was scheduled in your final response." ) @tool def get_available_time_slots( attendees:list[str], date:str, duration_minutes:int ) ->list[str]: """ Check calendar availability for given attendees on a specific date. """ print("get_available_time_slots工具被调用") return ["09:00","14:00","16:00"] @tool def create_calendar_event( title:str, start_time:str, end_time:str, attendees:list[str], location:str = "" )->str: """ Create a calendar event.Requires exact ISO datatime format. """ print("create_calendar_event工具被调用") return f"Event created:{title} from {start_time} to {end_time} with {len(attendees)} attendees." calander_agent = create_agent( model=kimi_model, system_prompt=CALENDAR_SYSTEM_PROMPT, tools=[get_available_time_slots,create_calendar_event] ) def test_calander_agent(): query = "hello" for event in calander_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() query = "Schedule a team meeting ['aaa@abc.com'] on 2026-03-30 at 2pm, 1hour" for event in calander_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() # test_calander_agent()

email_agent.py

from langchain_openai import ChatOpenAI kimi_model = ChatOpenAI( model="kimi-k2.5", api_key="sk-uQp***", base_url="https://api.moonshot.cn/v1", # 重点:这里严格对应 Kimi 的 API 结构 extra_body={ "thinking": {"type": "disabled"} } ) from langchain_core.tools import tool from langchain.agents import create_agent EMAIL_SYSTEM_PROMPT=( "You are an email assistant." "Compose professional emails based on natural language requests." "Extract recipient information and craft appropriate subject lines and body text." "Use send_email to send the message" "Always confirm what was sent in your final response" ) @tool def send_email( to:list[str], subject:str, body:str, cc:list[str] = [] )-> str: """ Send an email via email API,Requires properly formatted affresses. """ print("send_email工具被调用") return f"Email sent to {','.join(to)}-Subject:{subject}" email_agent = create_agent( model=kimi_model, system_prompt=EMAIL_SYSTEM_PROMPT, tools=[send_email] ) def test_email_agent(): query = "hello" for event in email_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() query = "Schedule a team meeting ['aaa@abc.com'] on 2026-03-30 at 2pm, 1hour" for event in email_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() # test_email_agent()
详解
1.初始化大模型

这个在之前的课程中已经说过无数次了,不再做过多赘述。

from langchain_openai import ChatOpenAI # 配置 Kimi 模型 kimi_model = ChatOpenAI( model="kimi-k2.5", api_key="YOUR_API_KEY", base_url="https://api.moonshot.cn/v1", extra_body={"thinking": {"type": "disabled"}} # 优化 API 响应速度 )
2.构建agent的提示词和tools

这里就和单Agent时一样,设置好PROMPT提示词。

定义本智能体需要的tools

calander_agent.py中定义了两个工具,一个叫get_available_time_slots,一个叫create_calendar_event,正如他们里面的描述,一个检查特定日期给定参会者的日历可用性,一个创建日历事件。需使用精确的ISO日期时间格式。

email_agent.py中定义了一个工具,叫做send_email,通过电子邮件API发送邮件,需提供格式正确的地址。当然我这里是写死的返回,实际开发中可以调用API完成功能。

CALENDAR_SYSTEM_PROMPT=( "You are a calendar scheduling assistant." "Parse natural language scheduling requests (e.g., 'next Tuesday at 2pm')" "into proper ISo datetime formats." "Use get_available_time_slots to check availability when needed." "Use create calendar event to schedule events." "Always confirm what was scheduled in your final response." ) @tool def get_available_time_slots( attendees:list[str], date:str, duration_minutes:int ) ->list[str]: """ Check calendar availability for given attendees on a specific date. """ print("get_available_time_slots工具被调用") return ["09:00","14:00","16:00"] @tool def create_calendar_event( title:str, start_time:str, end_time:str, attendees:list[str], location:str = "" )->str: """ Create a calendar event.Requires exact ISO datatime format. """ print("create_calendar_event工具被调用") return f"Event created:{title} from {start_time} to {end_time} with {len(attendees)} attendees."
EMAIL_SYSTEM_PROMPT=( "You are an email assistant." "Compose professional emails based on natural language requests." "Extract recipient information and craft appropriate subject lines and body text." "Use send_email to send the message" "Always confirm what was sent in your final response" ) @tool def send_email( to:list[str], subject:str, body:str, cc:list[str] = [] )-> str: """ Send an email via email API,Requires properly formatted affresses. """ print("send_email工具被调用") return f"Email sent to {','.join(to)}-Subject:{subject}"
3.创建agent

这里和单智能体的创建一样,以前教过,不做过多赘述

calander_agent = create_agent( model=kimi_model, system_prompt=CALENDAR_SYSTEM_PROMPT, tools=[get_available_time_slots,create_calendar_event] )
email_agent = create_agent( model=kimi_model, system_prompt=EMAIL_SYSTEM_PROMPT, tools=[send_email] )
4.测试方法

分别测试两个agent是否正常使用,测试完后记得#注释掉测试方法,免得之后重复调用

def test_calander_agent(): query = "hello" for event in calander_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() query = "Schedule a team meeting ['aaa@abc.com'] on 2026-03-30 at 2pm, 1hour" for event in calander_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() # test_calander_agent()
def test_email_agent(): query = "hello" for event in email_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() query = "Schedule a team meeting ['aaa@abc.com'] on 2026-03-30 at 2pm, 1hour" for event in email_agent.stream( {"messages":{"role":"user","content":query}}, stream_mode="values" ): event["messages"][-1].pretty_print() # test_email_agent()
代码运行结果展示

我们先发送了一个hello,之后发送了指令。

第一个截图中,AI得到hello的消息后,介绍了自己的功能,得到第二个指令后,检查并使用了自己的【create_calendar_event】Tool,最后返回了Successfully和Event Details

calander_agent.py:

email_agent.py:

第二个截图中,AI得到hello的消息后,介绍了自己的功能,得到第二个指令后,检查并使用了自己的【send_email】Tool,最后返回了Successfully sent the .....

小结

通过上面的代码,我们完成了两个具备独立作战能力的执行者。它:

  • 懂业务:理解自然语言中的时间。

  • 会操作:能够准确调用 API。

  • 有边界:只处理日历事务或者操作邮件。

这种高内聚、低耦合的设计,为我们下集引入 Supervisor Agent 奠定了基础。在多智能体系统中,只有每个 Worker 足够专业,整体的协作才会有意义。

http://www.jsqmd.com/news/564729/

相关文章:

  • Cursor Free VIP:破解Cursor Pro限制的终极解决方案
  • 定制网站建设公司甄选推荐:国内信誉好、实力稳的10家网站设计开发公司一览 - 资讯焦点
  • DJI Payload-SDK认证芯片集成深度解析:硬件级安全通信的3大要点
  • 别再只调A*算法了!聊聊ROS机器人导航中,OpenCV视觉信息如何与激光雷达数据“打配合”
  • 嵌入式行业及技术的未来展望
  • RevokeMsgPatcher全方位防护:消息防撤回技术深度解析与实战指南
  • 分析做别墅全屋定制能包设计包安装的公司,珑宅值得关注 - mypinpai
  • 2026年地铁盾构/隧道注浆用水玻璃厂家推荐:速溶水玻璃/高模数水玻璃/液体水玻璃专业供应商精选 - 品牌推荐官
  • 终极NCM转MP3指南:三步解锁网易云音乐加密文件
  • BERT文本分割效果惊艳展示:同一份采访稿经模型处理前后的阅读体验对比
  • YOLO系列算法改进 | C3k2改进篇 | 融合FSTA频率驱动的时空注意力模块 | 以极少的可学习参数自适应校准不同时间/帧间的特征重要性 | AAAI 2025
  • 【吴恩达2026 Agentic AI】面试向+项目实战(含面试题+项目案例)-2
  • Go语言中的MySQL操作:database/sql实战
  • 2026年广州别墅整木定制品牌排名,珑宅全屋定制口碑出众值得推荐 - 工业品网
  • GTR与IGBT的世纪对决:老牌电力晶体管的生存之道与现代替代方案对比
  • Laravel Pint版本演进:从v0.1.0到v1.26.0的完整发展历程
  • 引言:办公家具回收的核心需求 - 资讯焦点
  • s2-proGPU部署方案:多模型共存时s2-pro显存隔离与QoS保障策略
  • 如何用10MB工具解决Steam创意工坊三大痛点:WorkshopDL全解析
  • 掌握AI专著生成技巧,借助优质工具,轻松完成学术巨作
  • 分析气流混合机噪音小的品牌,2026年度性价比品牌推荐 - 工业设备
  • Vue3 + Three.js 实战:用GSAP和射线拾取,打造一个可点击移动的3D角色(保姆级避坑指南)
  • Super IO Blender插件:基于剪贴板机制的跨平台资产工作流优化方案
  • intv_ai_mk11从零开始教程:不写代码,纯浏览器操作完成全部AI交互
  • AI论文生成工具有哪些?8款写论文的AI亲测,AI论文AIGC与低查重兼得! - 掌桥科研-AI论文写作
  • 计算机领域·未来十年黄金赛道:2026年薪资将超传统行业 3 倍,人才缺口达 327 万!
  • Python入门项目:用10行代码调用MogFace-large实现人脸检测
  • Win11Debloat:Windows系统轻量化优化工具全解析
  • 2026年4月 山东彩钢瓦翻新防水卷材厂家实力推荐 最新排名 - 资讯焦点
  • 半导体制造中的ProcessJob与Control Job:从定义到实战避坑指南