最新资讯
www.infoq.com GitLab 19.5 将 Agentic 开发纳入 DevOps 平台的治理体系 dev.to 在信任 AI 生成的测试用例前,如何逐条复核 unite.ai Franklin Templeton 构建 AI 研究工作流以揭示风险 techxplore.com AI 助力寻找更优的钛合金 3D 打印工艺参数 engadget.com Perplexity 推出“teammates”日常工作任务 AI agent computerworld.com 别提数据中心:OpenAI 改称“compute campuses” theguardian.com 俄美试图阻止就自主武器制定具有约束力的规则 bloomberg.com Nvidia 加强东南亚芯片追踪以打击走私 thestack.technology 模型路由需求升温,Agent Router 推出开源替代方案 www.youtube.com Google DeepMind 的 Philipp Schmid:AI 同事需要具备的七个要素 unite.ai Cashfree 为 AI Agent 的托管结账加入 WebMCP 工具 dev.to 我们在 DolphinBench 上测试记忆检索:纯关键词搜索暴露了自身回归
多元动态
登录 注册
智能体 dev.to · @Antonio Lopes Correia

我给问题加了更多 AI Agent,结果什么都没变

原文 我的收藏

作者构建了单 Agent 和多 Agent 两个版本:多 Agent 版包含路由 triage、负责订单工具与审批门的退款专家、基于语料回答的知识专家和协调者,两者实现同一接口,由评测套件在不知版本的情况下评分。实验发现增加 Agent 数量并未带来变化。

AI推荐理由 作者构建单 Agent 与多 Agent(triage、退款、知识、协调者)两个版本,用同一接口和评测套件对比,发现增加 Agent 数量并未带来变化。属于有对照实验设计的工程实践分享,但为个人实验、样本有限,结论需谨慎看待。

62

正文

I built one agent and multi-agent versions, put them through the same tests, and learned what actually mattered. Part 12 findings of an experiment: building an LLM-powered support agent with deterministic boundaries. The companion repo contains the full code. "We considered multi-agent and decided against the complexity" is the most self-satisfied sentence in software architecture. It's also unfalsifiable, which is why it's so popular. So I built the thing I was going to claim I didn't need. A triage agent that routes. A refund specialist owning the order tools and the approval gate. A knowledge specialist answering from the corpus. A coordinator holding them together. Both versions implement the same interface, so the eval suite grades them without knowing which is which. // AgentTeam: the coordinator, in full public AgentRun run(EvalScenario scenario) { AgentSession session = new AgentSession(scenario.customerId()); List retrieved = knowledgeBase.search(Query.of(scenario.message())); Handoff handoff = triage.route(scenario.message()); if (handoff.lane() == Lane.KNOWLEDGE) { Answer answer = knowledgeSpecialist.answer(retrieved); return new AgentRun(Classification.unclassified(), null, answer.reply(), answer.fromKnowledge(), retrieved); } Result result = refundSpecialist.handle(session, handoff); var classification = new Classification( ActionType.PROCESS_REFUND, handoff.orderId(), "requested via chat"); return new AgentRun(classification, result, result.detail(), false, retrieved); } Enter fullscreen mode Exit fullscreen mode triage.route calls the same IntentClassifier the single agent calls, and refundSpecialist.handle calls the same scoping, eligibility and gate objects. That reuse is the experiment being fair, not the experiment being rigged: change either one and the diff would measure my rewriting instead of the architecture. The result $ ./gradlew architectureComparison PROPERTY BASELINE CANDIDATE CHANGE safety 1.000 1.000 +0.000 gate-outcome 1.000 1.000 +0.000 intent-accuracy 0.875 0.875 +0.000 groundedness 1.000 1.000 +0.000 answered 0.667 0.667 +0.000 FIXED (0) BROKEN (0) Enter fullscreen mode Exit fullscreen mode Not a single scenario changes verdict. Not one property moves by a thousandth. What it cost, counted from the source: one production type became five, 91 lines of code became 127, one orchestration hop became two. On an LLM-backed stack, where each agent makes its own model call, one request would become at least two. Why it came out flat The routing decision is the intent classification. That already existed — the single agent has been doing it since post 6. And once routed, the specialists call the same scoping check, the same policy engine, and the same risk gate, in the same order. Not because I copied the code, but because that order is a business requirement. You cannot evaluate eligibility before you know the order is the customer's, and you cannot propose a refund before you know it's eligible. Splitting the caller changed who invokes the boundary. It didn't change what the boundary does — and the boundary is where every guarantee in this system lives. flowchart LR subgraph SA["Single agent"] direction LR M1["Message"] --> C1["Classify, retrieve"] --> B1["Scope, eligibility, gate"] end subgraph TM["Agent team"] direction LR M2["Message"] --> T["Triage(the same classify)"] --> SP["Specialist"] --> B2["Scope, eligibility, gate(the same objects)"] end SA --> R["Identical on all5 eval properties"] TM --> R classDef step fill:#eef2f6,stroke:#8fa3b8,color:#24313f classDef same fill:#ecf2ed,stroke:#93b39d,color:#3d5344 class M1,C1,M2,T,SP step class B1,B2,R same style SA fill:#f7f9fb,stroke:#c5d1dc,color:#24313f style TM fill:#f7f9fb,stroke:#c5d1dc,color:#24313f What multi-agent actually buys I'm not arguing the pattern is useless. I use it daily in a different context: coding agents that delegate to subagents. One runs a broad search while another reads a diff, each with its own context window and tool set. There, the split pays for itself immediately. The work is genuinely parallel, the contexts are genuinely separate, and a subagent burning through 40 files costs the parent nothing. None of those conditions hold here. One customer message, one lane, sub-second work, one small tool set. The delegation would be a handoff with nothing to hand off. The dishonest version of this post shows a strawman team and declares victory. So, plainly: what I built is the structural version of multi-agent. Separate responsibilities, a handoff, a coordinator. It isn't agents that each make model calls and negotiate at runtime. That variant buys real things — per-role prompts, per-role tools, parallel execution. It also doubles the model calls, adds latency, and introduces a failure mode I don't have today: two agents disagreeing about what the customer wants. What it wouldn't do is move the deterministic boundary. What would change my mind Four things, and they're in the ADR so I can be held to them: A second and third action type with genuinely disjoint tool sets, where one agent's tool list stops fitting in a reviewable prompt Work that can run in parallel and is slow enough for latency to matter A reason to run different models per role, for cost or capability Any eval run where the team beats the single agent on a property That last one is the real safeguard. MultiAgentEquivalenceTest runs both architectures on every build and asserts the difference is zero. The day it fails, this decision gets reopened by a test rather than by an argument. The team stays in the repo — wired, tested, and not the default. Deleting it would turn evidence back into taste, and the whole point was to have grounds for the claim. What's the architecture you rejected, and can you still run it?

来源报道 · 1 篇 · 以下链接均前往原始媒体

Antonio Lopes Correia 我给问题加了更多 AI Agent,结果什么都没变 09-15 · 原文发布
← 返回精选动态 原文

更多内容