多智能体协作这件事,我从去年下半年开始密集折腾,从最早的扣子工作流,到后面自己写Agent编排脚本,中间踩过的坑能写满一个笔记本。现在市面上工具多到眼花缭乱,扣子、Dify、AgentScope、LangGraph,还有各种基于DeepSeek搭建的方案,每个都宣称自己能做多智能体。但实际用下来你会发现,选错工具比不会写Prompt更致命——有些工具天生就不适合做多Agent协作,硬上只会把自己埋进无尽的调试里。
这篇文章我想聊的是:当你手里有一个明确的多智能体协作需求时,到底该怎么选工具、怎么搭架构、怎么避开那些看起来很美但实际很坑的方案。不管你是刚接触Agent概念的产品经理,还是已经写过几个单Agent想往多Agent方向走的开发者,我都会把选型逻辑、实操步骤、参数配置和排查经验完整拆开讲。核心关键词就几个:多智能体、AI工具、Agent、扣子、DeepSeek,全文围绕这些展开,不跑题。
1. 先搞清楚多智能体到底解决什么问题
1.1 单Agent的天花板在哪里
很多人一开始用扣子或者DeepSeek网页版搭一个单Agent,感觉挺爽——能查资料、能写文案、能调API。但一旦任务复杂度上来,单Agent就开始露怯了。我举个实际例子:你要做一个“行业研究报告自动生成”的流程,需要完成信息检索、数据清洗、趋势分析、图表生成、报告撰写、事实核查这六个环节。如果全塞给一个Agent,会发生什么?
第一,上下文窗口会被撑爆。每个环节的输出都要留在记忆里,检索回来的原始资料可能就有几万字,还没到分析环节,模型已经开始“遗忘”前面的指令了。第二,角色冲突。同一个Agent既要当“严谨的研究员”又要当“有创意的撰稿人”,System Prompt里写两套完全矛盾的指令,模型会精神分裂。第三,错误无法隔离。检索环节抓了一堆垃圾数据,后面所有环节全盘皆输,你连是哪一步出的问题都定位不到。
这三个问题就是单Agent的硬天花板。不是模型不够强,而是架构本身不支持任务分解和职责隔离。
1.2 多智能体协作的核心价值
多智能体系统的本质思路很简单:把一个大任务拆成若干子任务,每个子任务交给一个专门的Agent,Agent之间通过消息传递来协作。这跟公司里组建项目组是一个道理——你不会让一个人同时干市场调研、财务核算和文案撰写,而是分给不同的人,最后汇总。
具体来说,多智能体带来三个核心价值。职责隔离:每个Agent有自己的System Prompt、自己的工具集、自己的记忆空间,互不干扰。并行加速:没有依赖关系的子任务可以同时跑,比如“竞品分析”和“用户调研”完全可以并行。错误可追溯:哪个Agent输出有问题,直接定位到那个节点,单独调试,不用全链路重跑。
但这里有个关键认知:多智能体不是银弹。如果你的任务本身很简单,比如就是“根据关键词写一篇小红书文案”,那单Agent完全够用,硬拆成多Agent只会增加延迟和调试成本。我见过太多人为了“用上多智能体”而强行拆分任务,最后效果还不如一个精心调教的单Agent。
1.3 什么场景才真正需要多智能体
判断标准其实就一条:任务能否被清晰地分解为多个有依赖关系的子任务,且每个子任务需要不同的能力或知识域。
能拆且需要不同能力的,上多智能体。比如:自动化客服系统(意图识别Agent + 知识检索Agent + 回复生成Agent + 情绪安抚Agent)、代码审查流水线(语法检查Agent + 逻辑审查Agent + 安全扫描Agent + 修改建议Agent)、内容生产流水线(选题Agent + 素材收集Agent + 初稿撰写Agent + 事实核查Agent + 润色Agent)。
不能拆或者拆了也没意义的,老老实实用单Agent。比如:简单的问答机器人、单一功能的文本转换、不需要多步推理的分类任务。
注意:多智能体系统的调试复杂度是指数级上升的。两个Agent之间的交互有N种可能的状态组合,三个Agent就是N的平方。所以在决定上多智能体之前,先问自己:单Agent真的做不了吗?
2. 主流AI工具在多智能体场景下的真实表现
2.1 扣子:低代码入门的首选,但有边界
扣子(Coze)是我用得最多的平台之一,它的优势非常明显:可视化编排、内置插件生态、一键发布到多个渠道。对于不写代码的产品经理或者刚入门的开发者来说,扣子的工作流模式能让你在半小时内搭出一个能跑的多Agent原型。
扣子做多智能体的方式主要是通过“工作流”和“多Agent模式”。工作流模式下,你可以把每个节点当作一个独立的处理单元,节点之间通过变量传递数据。多Agent模式下,你可以创建多个Bot,每个Bot有自己的Prompt和插件,然后通过“对话流”或者“工作流”把它们串起来。
但扣子有几个硬伤。第一,调试信息不够透明。当工作流跑出错误结果时,你很难看到中间每个节点的完整输入输出,只能靠日志和变量快照去猜。第二,复杂逻辑表达受限。扣子的条件分支和循环能力相对基础,遇到需要动态规划或者递归调用的场景就很吃力。第三,版本管理和团队协作弱。多人同时编辑一个工作流时,冲突解决机制不够完善。
我实测下来,扣子最适合的场景是:任务流程固定、分支不超过三层、不需要复杂状态管理的多Agent协作。比如“用户提问 → 意图分类Agent → 路由到对应知识库Agent → 生成回复”这种线性流程,扣子做起来非常顺手。
2.2 Dify:开源可控,适合有技术底子的团队
Dify是我在需要私有化部署时的首选。它开源、支持本地部署、API设计清晰,而且对多Agent的支持比扣子更灵活。Dify的核心概念是“应用”和“工作流”,你可以通过工作流编排多个LLM节点、代码节点、条件分支节点。
Dify做多智能体的优势在于:你可以完全控制每个节点的模型选择。比如意图识别用DeepSeek这种便宜且快的模型,最终生成用更强的模型,成本控制非常精细。另外Dify的代码节点支持Python,你可以写自定义逻辑来处理Agent之间的消息路由和状态管理。
但Dify的学习曲线比扣子陡。你需要理解它的变量传递机制、会话管理、API调用方式。而且Dify的可视化编排在复杂场景下会变得非常臃肿,一个几十个节点的工作流,拖拽起来很痛苦。我的经验是:Dify适合那种“需要私有化 + 有一定技术团队 + 任务流程中等复杂度”的场景。
2.3 AgentScope:研究向框架,灵活但重
AgentScope是阿里开源的多智能体框架,它的设计理念跟扣子、Dify完全不同——它是一个代码优先的框架,你需要用Python来定义Agent、消息传递机制和协作协议。
AgentScope的优势在于极高的灵活性。你可以自定义Agent的通信方式(广播、点对点、组播)、自定义消息格式、自定义决策逻辑。它还内置了一些多智能体协作模式,比如辩论、投票、流水线。如果你要做多智能体强化学习或者研究型的协作实验,AgentScope是很合适的底座。
但它的缺点也很明显:没有可视化界面,一切靠代码。搭建一个简单的多Agent系统,你可能要写几百行Python。而且AgentScope的文档和社区还不如LangGraph活跃,遇到问题排查起来比较费劲。我一般只在需要做“非标准协作模式”的时候才会用它。
2.4 LangGraph:当前最成熟的编排框架
LangGraph是我目前做生产级多Agent系统的首选。它把Agent协作抽象成“图”结构——节点是Agent或者处理函数,边是消息传递路径,状态在图中流转。这个抽象非常优雅,能表达几乎所有的协作模式:顺序、并行、条件分支、循环、人工介入。
LangGraph的核心优势:状态管理极其清晰。每个节点的输入输出都明确定义在State里,调试时你可以精确看到每一步的状态变化。支持循环和递归,这意味着你可以实现“审查-修改-再审查”这种迭代流程。人工介入节点,可以在关键步骤暂停等待人工确认,这对生产环境非常重要。
代价是:你需要写代码,而且需要理解LangGraph的StateGraph、Checkpointer、Interrupt等概念。学习成本不低,但一旦掌握,搭建复杂多Agent系统的效率远超低代码平台。
2.5 DeepSeek在多智能体中的角色定位
DeepSeek本身不是多智能体框架,它是一个模型。但在多智能体系统里,DeepSeek可以扮演“大脑”的角色——每个Agent的推理和决策都可以调用DeepSeek的API。
我为什么推荐在多智能体系统里用DeepSeek?三个原因。成本低:DeepSeek的API价格远低于同级别模型,多Agent系统意味着多次API调用,成本敏感度很高。推理能力强:DeepSeek在逻辑推理和指令遵循上表现不错,适合做Agent的决策核心。支持长上下文:多Agent协作时,消息历史会很长,长上下文能力很关键。
但要注意:DeepSeek不适合做所有Agent。比如需要多模态理解的Agent(看图、看视频),DeepSeek就做不了。另外,如果你的场景对响应延迟极其敏感,DeepSeek的推理速度可能不够快。我的做法是混合使用:关键决策节点用DeepSeek,简单分类节点用更轻量的模型,多模态节点用专门的多模态模型。
2.6 工具选型对照表
| 工具 | 适合场景 | 上手难度 | 灵活性 | 私有化 | 多Agent支持 |
|---|---|---|---|---|---|
| 扣子 | 快速原型、线性流程 | 低 | 中 | 不支持 | 工作流+多Bot |
| Dify | 私有化部署、中等复杂度 | 中 | 中高 | 支持 | 工作流+代码节点 |
| AgentScope | 研究实验、非标准协作 | 高 | 极高 | 支持 | 代码定义 |
| LangGraph | 生产级、复杂协作 | 高 | 极高 | 支持 | 图结构编排 |
| DeepSeek | 作为Agent推理核心 | 低 | 不适用 | 支持 | 模型层 |
这张表是我自己用下来的主观评分,不一定适合所有人。选型的核心原则是:先用最低成本验证流程可行性,再逐步迁移到更灵活的框架。我通常建议先用扣子搭原型,验证多Agent协作的逻辑跑得通,然后再用LangGraph重写生产版本。
3. 多智能体系统的架构设计要点
3.1 协作模式的选择:流水线、辩论还是层级
多智能体协作不是只有一种模式。根据任务特性,你需要选择不同的协作拓扑。
流水线模式是最常见的:Agent A的输出是Agent B的输入,B的输出给C,依次传递。适合有明确先后依赖的任务,比如“检索 → 分析 → 撰写 → 核查”。这种模式实现简单,调试容易,但容错性差——中间任何一个环节出错,后面全崩。
辩论模式:多个Agent对同一问题给出不同答案,然后通过投票或者裁判Agent来裁决。适合需要多角度分析的场景,比如“风险评估”可以让三个Agent分别从技术、市场、合规角度分析,最后汇总。这种模式能提高准确性,但成本翻倍。
层级模式:有一个“管理者Agent”负责拆解任务、分配给“ worker Agent”,最后汇总结果。适合任务复杂且需要动态规划的场景。管理者Agent可以根据中间结果决定下一步调用哪个worker,灵活性最高,但管理者Agent的Prompt设计难度很大。
我的经验是:80%的场景用流水线就够了。不要一上来就搞层级模式,管理者Agent的决策逻辑很难调,容易变成整个系统的瓶颈。先用流水线跑通,遇到“需要动态决策”的环节再引入管理者。
3.2 状态管理与消息传递的设计
多智能体系统最容易出问题的地方就是状态管理。Agent之间传递什么?传递多少?怎么保证不丢消息?
在LangGraph里,状态是一个共享的字典结构,每个节点读取状态、修改状态、返回更新。这种设计很清晰,但要注意:状态不能无限膨胀。如果每个Agent的输出都往状态里塞,很快上下文就爆了。我的做法是:只保留每个Agent的“结论性输出”,中间过程日志单独存储,不进入主状态。
在扣子或Dify里,状态通过变量传递。这里有个坑:变量类型要严格匹配。我遇到过很多次因为上游输出是字符串、下游期望是JSON对象,导致整个流程卡死。解决办法是在关键节点加“格式校验”步骤,用代码节点把输出标准化后再传给下游。
消息传递还有一个关键决策:同步还是异步。同步模式下,上游Agent必须等下游Agent处理完才能继续,延迟高但逻辑简单。异步模式下,Agent可以并行处理,但需要处理消息顺序和冲突。我的建议是:没有依赖关系的Agent尽量并行,有依赖关系的必须同步。
3.3 工具集与权限的隔离
每个Agent应该有自己的工具集,而不是所有Agent共享所有工具。这不仅是安全考虑,也是效果考虑。
举个例子:在一个“自动客服”系统里,“知识检索Agent”需要访问知识库API,“订单查询Agent”需要访问订单数据库,“退款处理Agent”需要调用退款接口。如果你把这三个工具都给同一个Agent,它可能会在需要查知识库的时候去调退款接口,造成灾难性后果。
在扣子里,你可以给每个Bot单独配置插件。在LangGraph里,每个节点函数里只绑定该Agent需要的工具。在Dify里,通过工具节点的分配来实现隔离。
注意:工具权限隔离不仅是技术问题,更是安全问题。涉及写操作(下单、退款、发邮件)的工具,一定要加人工确认节点,不要让Agent自主决定。
3.4 错误处理与降级策略
多智能体系统里,错误是常态。API超时、模型输出格式错误、工具调用失败、上下文超长,每一种都可能发生。如果没有完善的错误处理,系统跑不了几轮就崩了。
我的错误处理策略分三层。第一层:重试。对于API超时这种瞬时错误,自动重试2-3次,每次间隔递增。第二层:降级。如果某个Agent连续失败,切换到备用模型或者简化流程。比如“深度分析Agent”挂了,降级到“基础分析Agent”,虽然质量下降但流程能继续。第三层:人工介入。关键节点失败且无法自动恢复时,暂停流程,通知人工处理。
在LangGraph里,你可以用条件边来实现错误路由:如果某个节点返回错误状态,路由到“错误处理节点”。在扣子里,可以用条件分支判断变量是否为空或包含错误码。
4. 从零搭建一个多智能体协作系统的实操记录
4.1 需求定义与任务拆解
我拿一个实际做过的项目来演示:自动化行业周报生成系统。需求是:每周一自动抓取过去一周的行业新闻,分析趋势,生成一份带图表的周报,推送到企业微信群。
任务拆解如下:
- 新闻抓取Agent:从指定RSS源和API抓取新闻,去重,存入数据库
- 内容筛选Agent:从抓取的新闻中筛选出与目标行业相关的,按重要性排序
- 趋势分析Agent:对筛选后的新闻进行聚类和趋势提取
- 图表生成Agent:根据趋势数据生成图表
- 报告撰写Agent:整合分析结果和图表,生成周报文本
- 质量核查Agent:检查报告的事实准确性和格式规范
- 推送Agent:将最终报告推送到企业微信
这七个Agent中,1和2可以并行,3依赖2的输出,4和5可以并行(都依赖3),6依赖5,7依赖6。整体是一个有并行分支的流水线。
4.2 用扣子快速搭建原型
第一步,在扣子里创建一个工作流。添加“开始节点”,定义输入变量:week_start(周起始日期)、week_end(周结束日期)。
第二步,添加“新闻抓取”节点。用扣子的“HTTP请求”插件调用新闻API,或者用“RSS”插件读取订阅源。输出变量命名为raw_news,类型为数组。
第三步,添加“内容筛选”节点。这里我用了一个LLM节点,Prompt写:“你是一个行业新闻筛选助手。以下是过去一周的新闻列表:{{raw_news}}。请筛选出与[目标行业]相关的新闻,按重要性从高到低排序,输出JSON数组,每个元素包含title、summary、source、importance_score。”
第四步,添加“趋势分析”节点。同样用LLM节点,输入是筛选后的新闻,Prompt要求输出趋势关键词和简要分析。
第五步,添加“报告撰写”节点。输入趋势分析结果,Prompt要求生成周报正文,包含标题、概述、趋势分析、重点新闻解读、下周关注。
第六步,添加“质量核查”节点。用LLM节点检查报告的事实一致性和格式,输出修正后的报告。
第七步,添加“推送”节点。用扣子的“企业微信”插件发送消息。
整个工作流搭下来大概花了40分钟。跑第一遍的时候,在“内容筛选”节点报了格式错误——LLM输出的JSON里有多余的换行符,导致下游解析失败。解决办法是在LLM节点后面加一个“代码”节点,用JavaScript做JSON清洗:
const raw = inputs.llm_output; const cleaned = raw.replace(/```json/g, '').replace(/```/g, '').trim(); const parsed = JSON.parse(cleaned); return { news_list: parsed };这个坑很典型:LLM输出的JSON经常带Markdown代码块标记,直接解析必挂。加一层清洗是标配操作。
4.3 用LangGraph重写生产版本
扣子原型跑通后,我发现几个问题:并行分支支持不好、错误处理不够灵活、无法接入自定义的图表生成库。于是我用LangGraph重写了生产版本。
首先定义State:
from typing import TypedDict, List, Optional class WeeklyReportState(TypedDict): week_start: str week_end: str raw_news: List[dict] filtered_news: List[dict] trend_analysis: Optional[dict] chart_path: Optional[str] report_draft: Optional[str] final_report: Optional[str] error: Optional[str]然后定义各个节点函数。以“新闻抓取”为例:
def fetch_news(state: WeeklyReportState) -> dict: try: news = news_api.fetch(state["week_start"], state["week_end"]) return {"raw_news": news} except Exception as e: return {"error": f"fetch_news failed: {str(e)}"}“内容筛选”节点调用DeepSeek:
def filter_news(state: WeeklyReportState) -> dict: prompt = f"""筛选以下新闻中与目标行业相关的,按重要性排序: {state['raw_news']} 输出JSON数组,每个元素包含title, summary, source, importance_score。""" response = deepseek_client.chat(prompt) filtered = parse_json_safely(response) return {"filtered_news": filtered}构建图:
from langgraph.graph import StateGraph, END graph = StateGraph(WeeklyReportState) graph.add_node("fetch", fetch_news) graph.add_node("filter", filter_news) graph.add_node("analyze", analyze_trend) graph.add_node("chart", generate_chart) graph.add_node("write", write_report) graph.add_node("check", check_quality) graph.add_node("push", push_report) graph.set_entry_point("fetch") graph.add_edge("fetch", "filter") graph.add_edge("filter", "analyze") graph.add_edge("analyze", "chart") graph.add_edge("chart", "write") graph.add_edge("write", "check") graph.add_edge("check", "push") graph.add_edge("push", END) app = graph.compile()这里我简化了并行分支,实际生产版本里“chart”和“write”是并行的,用LangGraph的并行边实现。另外加了条件边处理错误:如果任何节点返回error,路由到“错误处理节点”。
4.4 关键参数配置与调优
多智能体系统里,参数配置直接影响效果和成本。我列几个关键参数和我的经验值。
温度(Temperature):不同Agent用不同温度。筛选和核查类Agent用0.1-0.3,保证稳定性和准确性。撰写和创意类Agent用0.6-0.8,增加多样性。趋势分析用0.3-0.5,平衡准确性和洞察力。
最大Token数:每个Agent的输出长度要限制。筛选Agent输出控制在2000 token以内,分析Agent 3000以内,撰写Agent 4000以内。超过限制会导致下游处理困难,也浪费成本。
超时时间:API调用超时设置15-30秒。超过30秒还没返回,大概率是网络问题或者模型过载,直接重试比干等更高效。
重试次数:瞬时错误重试2次,间隔1秒和3秒。连续失败3次以上,触发降级逻辑。
上下文窗口管理:多Agent协作时,消息历史会累积。我的做法是每个Agent只接收“必要的前置输出”,不传完整历史。比如撰写Agent只需要趋势分析结果和图表路径,不需要原始新闻列表。
4.5 实测效果与性能数据
这套系统跑了一个月,每周生成一份周报。几个关键数据:
- 端到端耗时:平均4分30秒(从触发到推送完成)
- API调用次数:约12次(7个Agent,部分Agent多次调用)
- 单次成本:约0.15元(主要消耗在DeepSeek API)
- 人工干预率:约15%(主要是图表生成失败和格式问题)
- 报告可用率:约85%(人工简单修改后可直接使用)
对比之前人工写周报,每周节省约3小时。但前期搭建和调试花了大约20小时,所以回本周期在两个月左右。
5. 常见问题与排查技巧实录
5.1 Agent输出格式不稳定怎么办
这是最高频的问题。LLM输出的JSON经常带多余字符、缺少引号、嵌套错误。我的解决方案分三步。
第一步,在Prompt里明确格式要求,并给出示例。不要只说“输出JSON”,要说“输出严格的JSON数组,不要包含任何Markdown标记,不要有注释”。
第二步,加格式校验节点。用代码节点尝试解析,如果失败,自动触发“格式修复”子流程——把错误输出和格式要求一起发给LLM,让它重新输出。
第三步,设置兜底逻辑。如果修复两次仍然失败,使用默认值或者跳过该节点,记录错误日志。
def parse_json_safely(text): # 尝试直接解析 try: return json.loads(text) except: pass # 尝试提取代码块 import re match = re.search(r'```(?:json)?\s*([\s\S]*?)```', text) if match: try: return json.loads(match.group(1)) except: pass # 尝试修复常见错误 text = text.replace("'", '"').replace("None", "null").replace("True", "true") try: return json.loads(text) except: return None5.2 Agent之间消息丢失或错乱
多Agent系统里,消息传递出错很常见。表现是:下游Agent收到的输入是空的,或者收到了错误的数据。
排查思路:先看日志,再看状态,最后看路由。在LangGraph里,每个节点的输入输出都有日志,直接定位是哪个节点没产出数据。在扣子里,检查变量引用是否正确——经常是变量名写错了,或者上游节点没有正确设置输出变量。
一个隐蔽的坑:并行分支的变量覆盖。如果两个并行节点都往同一个变量写数据,后完成的会覆盖先完成的。解决办法是给每个并行节点的输出用不同的变量名,在汇聚节点里合并。
5.3 成本失控怎么控制
多Agent系统很容易成本失控,因为Agent数量多、调用次数多。控制成本的核心是:让便宜的模型做简单的事,让贵的模型做关键的事。
具体策略:
- 分类、筛选、格式校验类Agent用轻量模型(如DeepSeek的轻量版本)
- 分析、撰写、决策类Agent用强模型
- 设置每个Agent的Token上限
- 缓存重复调用的结果(比如同一批新闻的筛选结果可以缓存)
- 监控每日API消耗,设置告警阈值
我实测下来,通过模型分级和缓存,成本能降低60%以上。
5.4 排查速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 下游Agent收到空输入 | 上游节点未正确设置输出变量 | 检查上游节点的输出变量名 | 修正变量名,确保类型匹配 |
| JSON解析失败 | LLM输出带Markdown标记 | 打印原始输出 | 加格式清洗节点 |
| 流程卡死无响应 | API超时或死循环 | 查看节点执行日志 | 设置超时和最大循环次数 |
| 并行分支结果错乱 | 变量覆盖 | 检查并行节点的输出变量 | 使用独立变量名,汇聚时合并 |
| 成本异常升高 | 某Agent频繁重试 | 查看API调用日志 | 优化Prompt,减少重试 |
| 报告质量下降 | 上下文超长导致遗忘 | 检查输入Token数 | 精简上下文,只传必要信息 |
5.5 几个我踩过的坑
坑一:在扣子里用“多Agent模式”做复杂路由。扣子的多Agent模式适合对话场景,不适合复杂的工作流路由。我试过用多Agent模式做“根据用户意图路由到不同处理流程”,结果发现意图识别的准确率很低,而且路由逻辑很难调试。后来改用工作流模式,用条件分支做路由,问题解决。
坑二:所有Agent共用一个System Prompt模板。一开始我图省事,所有Agent的Prompt都是“你是一个AI助手,请完成以下任务...”。结果Agent之间职责不清,输出质量很差。后来给每个Agent写了专门的System Prompt,明确定义角色、能力边界、输出格式,效果立竿见影。
坑三:忽略人工介入节点。生产环境里,有些决策不能让Agent自主做。比如“是否推送这份报告”,如果Agent判断错误,可能把半成品推送给全公司。后来我在关键节点加了人工确认,虽然增加了操作步骤,但避免了多次尴尬事故。
坑四:没有版本管理。多Agent系统的Prompt和流程经常需要调整,如果没有版本管理,改出问题后无法回滚。我现在用Git管理LangGraph的代码,用扣子的“版本历史”功能管理Prompt变更,每次调整都记录变更原因和效果对比。
5.6 性能优化的几个实用技巧
技巧一:预热常用Agent。如果某个Agent的System Prompt很长,可以在系统启动时先发一次空请求,让模型加载Prompt,后续调用会快一些。
技巧二:批量处理。如果多个新闻需要筛选,不要一条一条调用LLM,而是批量打包成一次请求。我实测批量处理比单条处理快3-5倍,成本也更低。
技巧三:异步并行。没有依赖关系的Agent用异步调用,比如“图表生成”和“报告撰写”可以同时跑。在LangGraph里用并行边,在扣子里用并行分支。
技巧四:结果缓存。对于重复性任务(比如每周抓取同样的RSS源),缓存抓取结果和筛选结果,避免重复调用。
技巧五:精简Prompt。Prompt越长,推理越慢,成本越高。定期审查每个Agent的Prompt,删除冗余指令,合并重复要求。
这套多智能体系统我到现在还在持续迭代,每周根据运行日志调整Prompt和流程。最近在尝试把“趋势分析Agent”拆成两个——一个做数据聚类,一个做洞察提取,看看能不能提升分析深度。多智能体协作这件事,工具选型只是起点,真正的功夫在架构设计和持续调优上。