1. 从单 Agent 到多 Agent为什么你的 LangChain 项目需要一次架构升级如果你已经用 LangChain 写过几个单 Agent 应用大概率遇到过这样的场景一个 Agent 既要查数据库、又要调搜索、还要做代码解释system prompt 越写越长工具列表越挂越多最后模型开始犯迷糊——该调 A 工具的时候调了 B该输出结构化结果的时候给你一段散文。这不是模型不行而是职责边界模糊导致的典型症状。LangChain 的 Multi Agent 能力正是为解决这类问题设计的。它把一个大而全的 Agent 拆成若干职责单一的子 Agent通过主代理调度、控制权转移或路由分发的方式协同完成复杂任务。核心价值有三个上下文隔离每个子 Agent 只看到自己领域的信息避免 token 爆炸、并行执行多个子任务同时跑缩短总延迟、可维护性不同团队可以独立迭代各自的 Agent。这篇文章面向的是想从单 Agent 升级到多 Agent 的开发者。我会用一套可复制的代码带你跑通主代理分派 → 子代理并行执行 → 汇总节点整合的完整链路并且全程用 TaoToken 统一 Key 和 API 通道避免在多个模型供应商之间来回切换配置。读完你能拿到一份可直接运行的 Multi Agent 配置、一套工具绑定模板、以及调用失败时的排查清单。适合谁看写过 LangChain 基础 Chain 或单 Agent、想理解多 Agent 协作机制、并且希望用统一 API 通道降低接入成本的开发者。如果你还没接触过 LangChain建议先补一下 AgentExecutor 和 Tool 的基本用法再回来。2. TaoToken 前置准备统一 Key 与 API 通道让多 Agent 调用不再东拼西凑多 Agent 架构有个容易被忽视的工程问题调用入口的碎片化。主代理、子代理、汇总节点可能分别调用不同的模型如果每个都单独配置 base_url 和 api_key代码里会散落一堆环境变量调试时很难定位是哪一路调用出了问题。TaoToken 在这里的作用就是提供一个统一的 API 通道所有 Agent 走同一个 Base URL 和同一个 Key模型通过 Model ID 区分。2.1 获取 Key 与确认接入信息先到 TaoToken 控制台创建 API Key。地址是https://taotoken.net/api-keys登录后在 API Keys 页面点新建复制生成的 Key形如sk-开头的一串字符妥善保存页面关闭后不再完整显示。接入信息三件套如下后面所有配置都围绕这三个值展开配置项值说明Base URLhttps://taotoken.net/api所有 Agent 共用注意不要带多余路径API Key控制台生成建议放环境变量不要硬编码Model ID按需选择主代理和子代理可以用不同模型注意Base URL 是https://taotoken.net/api不要写成带/v1或其他后缀的形式否则会出现 404 或路径拼接错误。这是新手最容易踩的坑之一。2.2 环境变量配置我习惯把 Key 放进.env文件用python-dotenv加载。这样代码里只引用变量名切换环境时不用改代码# .env TAOTOKEN_API_KEYsk-你的实际key TAOTOKEN_BASE_URLhttps://taotoken.net/api安装依赖pip install langchain langchain-openai python-dotenv这里用langchain-openai是因为 TaoToken 的接口兼容 OpenAI 协议ChatOpenAI类可以直接通过base_url参数指向 TaoToken不需要额外的适配层。这一点对多 Agent 特别友好——所有 Agent 共享同一个客户端配置只是 Model ID 不同。2.3 为什么多 Agent 场景更适合统一通道单 Agent 时你可能只调一个模型配不配统一通道差别不大。但多 Agent 一旦铺开主代理做路由判断、子代理做领域推理、汇总节点做整合调用次数可能是单 Agent 的 3 到 5 倍。如果每路调用都单独管理凭证出问题时排查成本会成倍上升。统一通道后你只需要在一个地方看调用日志、一个地方管配额定位问题快很多。3. 可复制配置LangChain Multi Agent 角色定义与工具绑定这一节是全文的核心给出可直接运行的配置。我采用Subagents 模式作为主线因为它的职责划分最清晰也最容易理解多 Agent 的协作本质主代理负责分派和汇总子代理各自独立执行。3.1 统一 LLM 客户端配置先写一个工厂函数所有 Agent 都从这里拿 LLM 实例import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() def build_llm(model_id: str, temperature: float 0.2) - ChatOpenAI: return ChatOpenAI( modelmodel_id, api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL), temperaturetemperature, timeout60, max_retries2, )base_url指向 TaoTokenmodel传 Model ID。主代理我一般用推理能力强的模型子代理用响应快的模型通过参数区分即可客户端配置完全复用。3.2 定义子代理工具每个子代理本质上是一个被包装成 Tool 的执行单元。先定义两个示例子代理一个负责技术方案分析一个负责成本估算。from langchain_core.tools import tool tool def tech_analysis_agent(topic: str) - str: 技术方案分析子代理输入一个技术主题返回该主题的优劣势分析。 llm build_llm(gpt-4o-mini) prompt ( f你是一名资深架构师。请针对「{topic}」给出三点技术优势 f和两点潜在风险每点不超过40字用编号列表输出。 ) return llm.invoke(prompt).content tool def cost_estimate_agent(topic: str) - str: 成本估算子代理输入一个技术主题返回粗略的成本区间判断。 llm build_llm(gpt-4o-mini) prompt ( f你是一名技术成本顾问。请针对「{topic}」估算开发与运维的 f相对成本等级低/中/高并给出一句理由。 ) return llm.invoke(prompt).content注意每个子代理的 docstring 要写清楚输入输出主代理靠这段描述决定何时调用它。这是多 Agent 协作的关键——工具描述就是子代理的接口契约。3.3 主代理配置与协作流程主代理挂载子代理工具负责分派任务和汇总结果from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_core.prompts import ChatPromptTemplate MAIN_PROMPT ChatPromptTemplate.from_messages([ (system, 你是一个任务调度主代理。用户提出技术选型问题时 你需要调用可用的子代理工具收集信息最后整合成一份结论。 如果问题涉及多个维度请分别调用对应子代理。), (human, {input}), (placeholder, {agent_scratchpad}), ]) def build_main_agent() - AgentExecutor: llm build_llm(gpt-4o) tools [tech_analysis_agent, cost_estimate_agent] agent create_openai_tools_agent(llm, tools, MAIN_PROMPT) return AgentExecutor( agentagent, toolstools, verboseTrue, max_iterations6, handle_parsing_errorsTrue, )max_iterations控制主代理最多调度几轮防止死循环。handle_parsing_errorsTrue让模型输出格式异常时自动重试多 Agent 场景下这个参数很实用。3.4 完整调用入口if __name__ __main__: executor build_main_agent() result executor.invoke({ input: 帮我分析一下在中小团队里引入 Rust 重写核心服务的可行性和成本。 }) print(result[output])跑起来后verboseTrue会打印主代理的每一步思考、调用了哪个子代理、子代理返回了什么最后是整合结论。这就是一次完整的多智能体任务分派与汇总。4. 验证请求跑通多智能体任务分派与汇总的完整结果配置写完后最关键的一步是验证它真的跑通了。我分三个层次来验证单子代理能否独立工作、主代理能否正确分派、汇总结果是否合理。4.1 先验证子代理独立可用在跑主代理之前先单独测一个子代理确认 TaoToken 通道是通的if __name__ __main__: print(tech_analysis_agent.invoke(Rust 重写核心服务))如果这一步就报错说明问题出在 Key、Base URL 或 Model ID 上跟多 Agent 逻辑无关先解决接入问题。正常输出应该是一段带编号的优劣势分析。4.2 再验证主代理分派跑完整入口后观察 verbose 日志。一个健康的执行流程长这样 Entering new AgentExecutor chain... Invoking: tech_analysis_agent with {topic: Rust 重写核心服务} [子代理返回的技术分析...] Invoking: cost_estimate_agent with {topic: Rust 重写核心服务} [子代理返回的成本估算...] [主代理整合后的最终结论] Finished chain.关键看两点主代理是否分别调用了两个子代理而不是只调一个以及最终输出是否整合了两路结果。如果只调了一个通常是主代理的 system prompt 没强调多维度分别调用可以补一句指令。4.3 结果合理性检查多 Agent 的输出质量取决于汇总节点的整合能力。检查最终结论是否满足包含技术维度和成本维度、没有把子代理的原始输出直接拼接、有明确的倾向性判断。如果发现只是把两段结果粘在一起说明主代理的汇总 prompt 需要加强可以改成请基于以下子代理结果给出一段不超过200字的综合建议不要罗列原始内容。4.4 用模型对话快速验证通道如果你只想先确认 TaoToken 通道本身没问题不想跑完整代码可以直接用模型对话页面发一条测试消息看返回是否正常。这比调试代码快得多适合在正式接入前做一次连通性确认。5. 本篇常见错误排查401、local proxy failed 与 reading choices 报错多 Agent 跑不起来八成是接入层的问题而不是协作逻辑的问题。下面是我实际遇到过的几类报错和对应解法。5.1 401 Unauthorized最常见。原因通常是 Key 没读到或读错了。检查顺序.env文件是否在项目根目录、load_dotenv()是否在读取环境变量之前调用、Key 是否有多余空格或换行。可以加一行调试print(os.getenv(TAOTOKEN_API_KEY)[:8])只打印前 8 位确认读到了又不会泄露完整 Key。如果打印出None说明环境变量没加载成功。5.2 local proxy failed / connection error这类报错指向网络层。先确认base_url写的是https://taotoken.net/api没有多余路径。然后检查本机是否有其他网络配置干扰了请求。如果公司网络有出口限制换一个网络环境测试。注意不要使用任何非正规的网络工具直接连即可。5.3 reading choices 报错这个报错通常意味着返回体结构不符合预期choices字段不存在。原因可能是 Model ID 写错了或者请求被重定向到了非预期地址。检查model参数是否与控制台可用的 Model ID 完全一致大小写敏感。另外确认base_url没有写成带/v1/chat/completions的完整路径——ChatOpenAI会自动拼接你只需要给到/api。5.4 OAuth 相关报错如果你在配置里混入了某些需要 OAuth 的客户端比如某些 CLI 工具的登录态可能会看到 OAuth 报错。多 Agent 场景下我们用的是 API Key 模式不涉及 OAuth。检查是否误装了其他 SDK 并覆盖了环境变量。清理掉无关的认证配置只保留 TaoToken 的 Key 即可。5.5 子代理被调用但返回空如果 verbose 显示子代理被调用了但返回内容为空多半是子代理内部的 prompt 或模型调用出了问题。单独 invoke 那个子代理复现看是模型返回空还是解析失败。常见原因是子代理的temperature设得太低导致输出被截断或者max_tokens没设置导致默认值过小。5.6 排查速查表报错关键词最可能原因处理方向401Key 未加载检查 .env 与 load_dotenvlocal proxy failed网络或 base_url 错误核对 URL换网络reading choicesModel ID 或路径错误核对 Model ID去掉多余路径OAuth混入其他认证清理无关 SDK 配置子代理返回空子代理内部 prompt 问题单独 invoke 复现6. 从跑通到用好多 Agent 的下一步与统一通道的长期价值跑通上面这套流程后你已经掌握了多 Agent 最核心的骨架主代理分派、子代理执行、汇总整合。接下来可以往三个方向深化。第一是换协作模式。Subagents 适合并行分派但如果你的任务是有先后依赖的流程比如先分析再决策再执行Handoffs 模式更合适——控制权在 Agent 之间显式转移状态持续保留。LangChain 里可以通过让 Agent 返回特定的 handoff 指令来实现。Router 模式则适合入口分类明确的场景路由节点只做分发不做推理聚合交给独立节点职责更单一。第二是工具集治理。子代理多了以后工具描述会变成新的复杂度来源。建议给每个子代理写一份简短的接口文档明确输入输出格式主代理的 system prompt 里只引用这些契约不展开细节。这样新增子代理时主代理的 prompt 几乎不用改。第三是统一通道的长期收益。多 Agent 的调用量会随子代理数量线性增长如果每路调用都单独管理凭证和配额运维成本会很快失控。用 TaoToken 统一 Key 和 Base URL 后你只需要在一个地方看用量、调配额、排查异常。对于长期跑 Agent 任务的项目这种统一入口带来的可观测性比省下的那点配置时间值钱得多。如果你打算把多 Agent 用到生产环境建议先从 Coding Plan 这类长期编码场景切入把调用量和稳定性摸清楚再逐步扩展到更复杂的任务编排。跑通是第一步跑稳才是目标。