LangChain 多工具协作:一个 Agent 不够用时怎么办
个人主页 for_ever_love__ 欢迎各位大佬莅临其他栏目: 大模型开发从0到1 其他栏目: iOS项目总结大全 其他栏目: 我想学python了 其他栏目: iOS UI 文章目录LangChain 多工具协作一个 Agent 不够用时怎么办一、先理解问题根源工具越多越不准二、解法一工具分组 路由先试这个2.1 用 RunnableBranch 做路由2.2 更省的做法用关键词/规则先兜一层三、解法二多 Agent 分工Supervisor 模式3.1 手写 Supervisor3.2 官方的 langgraph-supervisor四、两种方案怎么选五、多 Agent 的三个坑5.1 消息爆炸5.2 无限来回5.3 子 Agent 抢活六、小结LangChain 多工具协作一个 Agent 不够用时怎么办给一个 Agent 挂十几个工具很快就会发现它开始乱选该查天气的去查了数据库该下单的去搜了网页。这篇讲两种解法——工具分组路由和多 Agent 分工以及什么时候该用哪个。一、先理解问题根源工具越多越不准这不是玄学有三个实际原因schema 占用上下文每个工具的名称、描述、参数都要送进 prompt20 个工具能吃掉几千 token挤压真正的任务信息选择空间变大模型要在 20 个选项里挑一个描述稍微有点重叠比如search_doc和search_wiki就会选错注意力稀释长 schema 列表里排在中间的工具容易被忽略。经验阈值单个 Agent 的工具数控制在 10 个以内超过就要拆分。二、解法一工具分组 路由先试这个思路不把所有工具都给一个 Agent而是先判断任务类型再把对应的一组工具注入进去。用户提问 ↓ 路由一次轻量 LLM 调用只做分类 ↓ ┌────────┬────────┬────────┐ 订单组 物流组 售后组 (3工具) (2工具) (4工具) ↓ 对应 Agent 执行2.1 用 RunnableBranch 做路由fromlangchain_core.runnablesimportRunnableBranch,RunnableLambdafromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser route_promptChatPromptTemplate.from_template( 判断下面的用户问题属于哪一类只输出一个词order / logistics / service / other 问题{question} )routerroute_prompt|llm|StrOutputParser()defbuild_agent(category:str):tool_map{order:[search_order,list_orders,cancel_order],logistics:[query_logistics,change_address],service:[create_ticket,refund,send_email],}toolstool_map.get(category,[])ifnottools:returnNonereturncreate_react_agent(llm,tools)defhandle(question:str):categoryrouter.invoke({question:question}).strip()agentbuild_agent(category)ifagentisNone:returngeneral_chain.invoke(question)returnagent.invoke({messages:[(user,question)]})路由本身只是一次极轻的 LLM 调用输出一个词代价远小于给 20 个工具让模型慢慢挑。2.2 更省的做法用关键词/规则先兜一层能不调 LLM 就别调importre RULES[(r物流|快递|发货|签收|单号,logistics),(r退款|退货|投诉|发票,service),(r订单|下单|购买|支付,order),]defcheap_route(question:str):forpattern,catinRULES:ifre.search(pattern,question):returncatreturnNonedefhandle(question:str):catcheap_route(question)orrouter.invoke({question:question}).strip()...规则命中率高的话能省掉大部分路由调用。规则没命中再降级到 LLM 分类。这是典型的快慢结合。三、解法二多 Agent 分工Supervisor 模式当任务真的复杂到需要多个角色各自推理、再汇总时才上多 Agent。典型结构┌────────────┐ │ supervisor │ ← 负责分派和汇总 └──────┬─────┘ ┌──────────┼──────────┐ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │research │ │ code │ │ writer │ │ Agent │ │ Agent │ │ Agent │ └─────────┘ └─────────┘ └─────────┘supervisor不干活只判断下一步交给谁和是不是可以结束了子 Agent各自有专门的工具和 prompt只负责自己那一摊。3.1 手写 SupervisorfromtypingimportLiteralfrompydanticimportBaseModelfromlanggraph.graphimportStateGraph,MessagesState,START,ENDfromlanggraph.prebuiltimportcreate_react_agentfromlanggraph.typesimportCommand# --- 子 Agent ---research_agentcreate_react_agent(llm,[web_search,read_page],prompt你负责搜集资料只做检索不写结论。)code_agentcreate_react_agent(llm,[run_python,read_file],prompt你负责写代码并运行验证只做计算不写文章。)# --- Supervisor 的决策 schema ---classRoute(BaseModel):next:Literal[research,coder,FINISH]supervisor_llmllm.with_structured_output(Route)defsupervisor(state:MessagesState):respsupervisor_llm.invoke([(system,你是团队主管。根据对话进展决定下一步交给谁。research需要查资料coder需要算数据FINISH信息够了可以结束。),*state[messages],])return{next:resp.next}defcall_research(state:MessagesState):resultresearch_agent.invoke({messages:state[messages]})return{messages:result[messages][-1:]}defcall_coder(state:MessagesState):resultcode_agent.invoke({messages:state[messages]})return{messages:result[messages][-1:]}# --- 组装图 ---graphStateGraph(MessagesState)graph.add_node(supervisor,supervisor)graph.add_node(research,call_research)graph.add_node(coder,call_coder)graph.add_edge(START,supervisor)graph.add_conditional_edges(supervisor,lambdas:s[next],{research:research,coder:coder,FINISH:END,})graph.add_edge(research,supervisor)graph.add_edge(coder,supervisor)teamgraph.compile()要点子 Agent 的返回只取最后一条消息塞回主 state否则主对话会被子 Agent 的中间过程撑爆supervisor 用with_structured_output保证输出可控每个子 Agent 的 prompt 要明确边界“只做检索不写结论”否则它们会互相抢活。3.2 官方的 langgraph-supervisor不想手写可以用官方包pipinstalllanggraph-supervisorfromlanggraph_supervisorimportcreate_supervisor workflowcreate_supervisor([research_agent,code_agent,writer_agent],modelllm,prompt你是一个三人团队的主管合理分派任务最后汇总成一个完整报告。,)appworkflow.compile()它帮你处理了消息传递、路由、终止条件这些样板代码。但建议先手写一遍理解原理再用官方包不然出了问题不知道怎么调。四、两种方案怎么选维度工具分组路由多 Agent 分工复杂度低高LLM 调用次数少1 次路由 1 个 Agent多每轮 supervisor 子 Agent延迟低高适用场景任务一次就能归到某一类任务需要多角色接力调试难度低高决策依据任务是否需要接力。“帮我查一下这个订单的物流” → 一类工具搞定 →分组路由“调研一下竞品写份分析报告” → 要先检索、再分析、再写作 →多 Agent。能用分组路由解决的别上多 Agent。多 Agent 的成本是数倍增长的而且调试非常折磨人。五、多 Agent 的三个坑5.1 消息爆炸子 Agent 跑 5 步就有 10 条消息全塞回主 state几轮下来上下文就满了。解法只回传结论。defcall_research(state:MessagesState):resultresearch_agent.invoke({messages:state[messages]})# 只取最终那条 AI 消息并重标记来源finalresult[messages][-1]return{messages:[AIMessage(contentf[调研结果]{final.content},nameresearch)]}用name字段标记来源supervisor 能分得清是谁说的。5.2 无限来回supervisor 可能让 research 和 coder 反复横跳。解法限制轮数。classState(MessagesState):rounds:intdefsupervisor(state:State):ifstate.get(rounds,0)6:return{next:FINISH}...return{next:resp.next,rounds:state.get(rounds,0)1}5.3 子 Agent 抢活没有明确边界时research 也会写结论writer 又去检索一遍。解法prompt 里写死不做什么比写要做什么更重要你是资料检索员。 只做使用搜索工具收集信息返回原文要点。 不做不要分析、不要下结论、不要撰写报告、不要调用其他角色的工具。六、小结工具超过10 个就要拆否则模型选择准确率明显下降先试工具分组路由一次轻量分类 → 注入对应工具组代价小效果好路由可以规则优先、LLM 兜底省调用多 Agent 只在任务需要多角色接力时才上Supervisor 模式子 Agent 只回传结论用name标记来源、限制轮数、prompt 里写死不做什么官方langgraph-supervisor能省样板代码但建议先手写一遍理解原理。下一篇讲 LangGraph 的 State 设计——多节点之间怎么安全共享数据。

相关新闻

LangChain Tool Calling 工具调用:让大模型真正‘动手

LangChain Tool Calling 工具调用:让大模型真正‘动手

个人主页&#xff1a;> for_ever_love__ <&#xff08;欢迎各位大佬莅临&#x1f60a;&#xff09; 其他栏目: > 大模型开发从0到1 < 其他栏目: > iOS项目总结大全 < 其他栏目: > 我想学python了 < 其他栏目: > iOS UI < 文章目录LangChain Tool…

2026/10/16 6:29:54 阅读更多 →
Word部分内容不打印:隐藏文字加一个设置就行

Word部分内容不打印:隐藏文字加一个设置就行

有时候一份Word文档&#xff0c;屏幕上看着内容齐全&#xff0c;但打印出来需要去掉某些部分&#xff0c;这部分内容不希望出现在纸质版上&#xff0c;应该怎么做呢&#xff1f;Word没有直接标一个“不打印”的选项&#xff0c;但通过“隐藏文字”加打印设置&#xff0c;可以轻…

2026/10/16 6:29:53 阅读更多 →
MySQL数据库进阶应用(1)—事务管理

MySQL数据库进阶应用(1)—事务管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 6:28:53 阅读更多 →

最新新闻

面向对象核心知识详解:从类与对象到封装继承多态

面向对象核心知识详解:从类与对象到封装继承多态

最近重新翻出自己几年前记的一套面向对象基础笔记&#xff0c;边看边感慨。当年跟着一套讲得很细的Java基础课&#xff0c;逐行敲代码、抄概念、画内存图的日子&#xff0c;其实才是真正把编程底子打牢的阶段。面向对象这四个字&#xff0c;很多新手一听就觉得抽象&#xff0c;…

2026/10/16 7:14:04 阅读更多 →
antenna-forge 的核心信条:为什么『绝不伪造结果』是电磁仿真平台不可妥协的底线

antenna-forge 的核心信条:为什么『绝不伪造结果』是电磁仿真平台不可妥协的底线

【免费下载链接】antenna-forge AI-driven inverse antenna design with real NEC2 openEMS in the loop. Try the live in-browser playground. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/an/antenna-forge 点击查看 免费下载 antenna-forge&#xff08;YAF&…

2026/10/16 7:14:04 阅读更多 →
Markdown转知识卡片:解决公众号手机端排版难题的利器

Markdown转知识卡片:解决公众号手机端排版难题的利器

作为一个常年用 Markdown 码字、又经常要打理手机端内容的人&#xff0c;我最烦的一件事就是&#xff1a;电脑上排得好好的文章&#xff0c;一到公众号后台粘贴就彻底翻车。代码块没有高亮、列表层级全丢、整段文字挤成一堵密不透风的墙&#xff0c;读者拿手机看两行就划走了。…

2026/10/16 7:14:04 阅读更多 →
SSM+Vue实战:学生作业管理系统开发全攻略

SSM+Vue实战:学生作业管理系统开发全攻略

每年到毕业季&#xff0c;总有学生为毕设选题和实现头疼。如果你正好在找Java方向的系统类毕设&#xff0c;或者想做一个能跑通前后端分离的完整项目&#xff0c;“基于SSMVue的学生作业管理系统”是个非常经典且性价比极高的选择。这个项目不复杂但五脏俱全&#xff0c;覆盖了…

2026/10/16 7:14:04 阅读更多 →
REPENTOGON 的 Lua Vector 类深度指南:运算符元方法、FromAngle 与 nil 安全修复

REPENTOGON 的 Lua Vector 类深度指南:运算符元方法、FromAngle 与 nil 安全修复

游戏开发插件系统 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址&#xff1a; https://gitcode.com/gh_mirrors/re/REPENTOGON 点击查看 免费下载 Vector 是《以撒的结合&#xff1a;忏悔》&#xff08;The Binding of Isaac: R…

2026/10/16 7:14:04 阅读更多 →
OCR自动标注工具实战:检测识别与人工复核的全流程解析

OCR自动标注工具实战:检测识别与人工复核的全流程解析

说到OCR自动标注&#xff0c;做过数据标注或者AI数据集相关工作的人应该都不陌生。不管是票据、合同、书页扫描件&#xff0c;还是截图、卡片、白底商品图&#xff0c;只要涉及文字信息结构化&#xff0c;第一步都是把图片里的文字区域框出来&#xff0c;再把文字内容读出来&am…

2026/10/16 7:13:04 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课&#xff0c;其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置&#xff0c;通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测&#xff0c;本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章&#xff0c;跟着敲完了投票应用&#xff0c;大概会有一种"我好像会了&#xff0c;又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型&#xff0c;下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →