<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.wangyiyang.cc/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.wangyiyang.cc/" rel="alternate" type="text/html" /><updated>2026-05-31T14:19:09+08:00</updated><id>https://www.wangyiyang.cc/feed.xml</id><title type="html">翊行代码</title><subtitle>王翊仰的技术博客，专注 AI 编程、Agent 架构、MCP 协议与开源工具</subtitle><author><name>王翊仰</name></author><entry><title type="html">Claude Opus 4.8 发布：当 AI 能并行调度数百个子代理，编程的边界在哪里？</title><link href="https://www.wangyiyang.cc/2026/05/29/claude-opus-48-dynamic-workflows/" rel="alternate" type="text/html" title="Claude Opus 4.8 发布：当 AI 能并行调度数百个子代理，编程的边界在哪里？" /><published>2026-05-29T09:00:00+08:00</published><updated>2026-05-29T09:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/29/claude-opus-48-dynamic-workflows</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/29/claude-opus-48-dynamic-workflows/"><![CDATA[<p><img src="/images/posts/2026-05-29-claude-opus-48-dynamic-workflows_1200x630.jpg" alt="cover" /></p>

<h2 id="导读">导读</h2>

<p>2026 年 5 月 28 日，Anthropic 扔下两颗重磅炸弹：</p>

<p><strong>Claude Opus 4.8</strong>——在 Super-Agent、CursorBench、Legal Agent 等基准测试上全面超越 GPT-5.5，成为首个在 Super-Agent 测试中完成所有端到端任务的模型。</p>

<p><strong>Dynamic Workflows</strong>——Claude Code 的新功能，让单个会话能并行运行数十到数百个子代理，自动规划、执行、验证、收敛，支持小时甚至天级别的复杂工程任务。</p>

<p>同一天，Anthropic 还宣布了 <strong>65 亿美元 H 轮融资、965 亿美元估值</strong>的消息，年化收入突破 470 亿美元。</p>

<p>这三件事放在一起看，不是一个巧合。Anthropic 正在构建的，是一套从模型能力到工程执行到商业规模的完整闭环。</p>

<hr />

<h2 id="一claude-opus-48不只是更快而是更诚实">一、Claude Opus 4.8：不只是更快，而是更”诚实”</h2>

<h3 id="11-速度提升-25-倍成本反而更低">1.1 速度提升 2.5 倍，成本反而更低</h3>

<p>Opus 4.8 的 Fast mode 达到了 <strong>2.5 倍速度</strong>，同时比前代模型便宜 3 倍。多模态任务的 token 成本降低了 61%（据 Databricks 数据）。</p>

<p>定价保持不变：</p>

<table>
  <thead>
    <tr>
      <th>模式</th>
      <th>Input</th>
      <th>Output</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Standard</td>
      <td>$5/百万 tokens</td>
      <td>$25/百万 tokens</td>
    </tr>
    <tr>
      <td>Fast mode</td>
      <td>$10/百万 tokens</td>
      <td>$50/百万 tokens</td>
    </tr>
  </tbody>
</table>

<p>这意味着什么？在同样的预算下，你可以让 Opus 4.8 处理 2.5 倍的工作量，或者用同样的工作量节省 60% 以上的成本。</p>

<h3 id="12-编码能力的质变从能写代码到能发现代码里的问题">1.2 编码能力的质变：从”能写代码”到”能发现代码里的问题”</h3>

<p>Anthropic 官方给出的数据是：Opus 4.8 <strong>发现代码缺陷的概率比 4.7 低 4 倍</strong>。这不是说它会少犯错，而是它更不容易放过代码里的问题。</p>

<p>测试者的反馈很能说明问题：</p>

<blockquote>
  <p>“Claude Opus 4.8 的判断力明显更好。在 Claude Code 里，它会问正确的问题，抓住自己的错误，在计划不合理时提出质疑，并且在进行复杂的多服务探索之前先建立信心。”</p>
</blockquote>

<blockquote>
  <p>“最大的区别是 Opus 4.8 倾向于主动标记分析的输入和输出中的问题，这是其他模型 routinely 会遗漏的。”</p>
</blockquote>

<p>这种”主动质疑”的能力，是 AI 从工具向协作者进化的关键标志。</p>

<h3 id="13-基准测试成绩">1.3 基准测试成绩</h3>

<table>
  <thead>
    <tr>
      <th>基准测试</th>
      <th>Opus 4.8 表现</th>
      <th>对比</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Super-Agent</td>
      <td>唯一完成所有端到端案例的模型</td>
      <td>击败前代 Opus 和 GPT-5.5</td>
    </tr>
    <tr>
      <td>CursorBench</td>
      <td>在所有 effort level 上超越前代</td>
      <td>工具调用更高效，步骤更少</td>
    </tr>
    <tr>
      <td>Legal Agent Benchmark</td>
      <td>最高分记录，首次突破 10% all-pass</td>
      <td>直接对应律师工作交接</td>
    </tr>
    <tr>
      <td>Online-Mind2Web</td>
      <td>84%</td>
      <td>对 4.7 和 GPT-5.5 有显著提升</td>
    </tr>
    <tr>
      <td>Terminal-Bench 2.1</td>
      <td>领先</td>
      <td>GPT-5.5 用 Codex CLI 达到 83.4%</td>
    </tr>
  </tbody>
</table>

<h3 id="14-effort-control让用户掌控思考深度">1.4 Effort Control：让用户掌控”思考深度”</h3>

<p>Claude 4.8 引入了 <strong>Effort Control</strong>，用户可以在 Low → High（默认）→ Extra → Max 四个级别之间选择。</p>

<ul>
  <li><strong>Low</strong>：更快响应，更慢消耗 rate limit</li>
  <li><strong>High</strong>：默认级别，平衡速度和质量</li>
  <li><strong>Extra</strong>：适合困难任务和长时异步工作流</li>
  <li><strong>Max</strong>：最高质量，最大 token 消耗</li>
</ul>

<p>这个设计的巧妙之处在于，它把”思考时间”这个黑盒变成了用户可以显式控制的参数。对于简单任务，你不会为不必要的深度思考付费；对于复杂任务，你可以明确要求模型投入更多认知资源。</p>

<hr />

<h2 id="二dynamic-workflowsai-工程的范式转移">二、Dynamic Workflows：AI 工程的范式转移</h2>

<p>如果说 Opus 4.8 是”更强的单兵”，那 Dynamic Workflows 就是”能指挥一个军团”的指挥官。</p>

<h3 id="21-核心机制规划--并行执行--验证--收敛">2.1 核心机制：规划 → 并行执行 → 验证 → 收敛</h3>

<p>Dynamic Workflows 的工作流程分为五个阶段：</p>

<ol>
  <li><strong>动态规划（Dynamic Planning）</strong>：Claude 分析你的提示，将其分解为子任务</li>
  <li><strong>并行执行（Parallel Execution）</strong>：工作分散到同时运行的子代理</li>
  <li><strong>验证层（Verification Layer）</strong>：结果在整合前被检查，代理独立验证和反驳发现</li>
  <li><strong>迭代收敛（Iterative Convergence）</strong>：工作流持续运行直到答案稳定</li>
  <li><strong>状态恢复（Stateful Recovery）</strong>：进度自动保存，中断的作业无需重启</li>
</ol>

<p>关键特性：协调发生在对话之外，所以无论任务规模多大，计划都能保持正轨。</p>

<h3 id="22-使用方式">2.2 使用方式</h3>

<p>在 Claude Code 中，启用 auto mode 后，输入：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ultracode
</code></pre></div></div>

<p>或者直接让 Claude 创建一个工作流。</p>

<p><strong>注意</strong>：Dynamic Workflows 消耗的子代理 token 远超普通会话，建议从有范围的任务开始测试。</p>

<h3 id="23-真实案例bun-从-zig-到-rust-的移植">2.3 真实案例：Bun 从 Zig 到 Rust 的移植</h3>

<p>Jarred Sumner（Bun 作者）使用 Dynamic Workflows 完成了 Bun 的 Zig → Rust 移植：</p>

<table>
  <thead>
    <tr>
      <th>指标</th>
      <th>结果</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>代码量</td>
      <td>约 75 万行 Rust</td>
    </tr>
    <tr>
      <td>测试通过率</td>
      <td>99.8%</td>
    </tr>
    <tr>
      <td>时间线</td>
      <td>11 天（从首次提交到合并）</td>
    </tr>
  </tbody>
</table>

<p>工作流分解：</p>

<ol>
  <li><strong>映射阶段</strong>：一个工作流识别了 Zig 代码库中每个结构体字段的正确 Rust 生命周期</li>
  <li><strong>移植阶段</strong>：数百个代理将 <code class="language-plaintext highlighter-rouge">.zig</code> 文件行为一致地移植为 <code class="language-plaintext highlighter-rouge">.rs</code> 文件，<strong>每个文件有两个审查员</strong></li>
  <li><strong>修复循环</strong>：迭代构建和测试套件，直到两者都干净运行</li>
  <li><strong>优化</strong>：夜间工作流消除了不必要的数据拷贝，为最终审查打开 PR</li>
</ol>

<blockquote>
  <p>“虽然尚未投入生产，但所有这些都是由 Dynamic Workflows 处理的。”</p>
</blockquote>

<p>这个案例的意义远超技术层面。它证明了一件事：<strong>AI 不仅能写代码，还能管理复杂的、需要多轮验证和协调的工程迁移。</strong></p>

<h3 id="24-企业用户反馈">2.4 企业用户反馈</h3>

<p><strong>Klarna</strong>：</p>
<blockquote>
  <p>“我们在大型代码库中使用它识别死代码和发现传统静态分析遗漏的清理机会，帮助工程师更快地进行维护和重构工作。”</p>
</blockquote>

<p><strong>CyberAgent</strong>：</p>
<blockquote>
  <p>“从计划到实现一气呵成，我们可以信任更长时间的运行而不会失去可见性。”</p>
</blockquote>

<hr />

<h2 id="三65-亿美元融资anthropic-的算力军备竞赛">三、65 亿美元融资：Anthropic 的”算力军备竞赛”</h2>

<h3 id="31-融资细节">3.1 融资细节</h3>

<table>
  <thead>
    <tr>
      <th>项目</th>
      <th>数据</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>融资额</td>
      <td>65 亿美元</td>
    </tr>
    <tr>
      <td>估值</td>
      <td>965 亿美元（投后）</td>
    </tr>
    <tr>
      <td>轮次</td>
      <td>Series H（2026 年 2 月刚完成 Series G）</td>
    </tr>
    <tr>
      <td>年化收入</td>
      <td>470 亿美元</td>
    </tr>
  </tbody>
</table>

<p>领投方：Altimeter Capital、Dragoneer、Greenoaks、Sequoia Capital</p>

<p>hyperscaler 承诺：150 亿美元（包括亚马逊 50 亿美元）</p>

<h3 id="32-算力布局">3.2 算力布局</h3>

<p>Anthropic 正在构建一个庞大的算力网络：</p>

<table>
  <thead>
    <tr>
      <th>合作伙伴</th>
      <th>容量/访问</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Amazon</td>
      <td>最高 5 吉瓦，新容量；主要云提供商和训练合作伙伴</td>
    </tr>
    <tr>
      <td>Google &amp; Broadcom</td>
      <td>5 吉瓦，下一代 TPU 容量</td>
    </tr>
    <tr>
      <td>SpaceX</td>
      <td>GPU 访问，Colossus 1 和 Colossus 2</td>
    </tr>
    <tr>
      <td>Micron、Samsung、SK hynix</td>
      <td>内存、存储和逻辑芯片技术</td>
    </tr>
  </tbody>
</table>

<p>Claude 已成为<strong>首个在三大云平台（AWS、Google Cloud、Azure）都可用的前沿模型</strong>。</p>

<h3 id="33-资金用途">3.3 资金用途</h3>

<ol>
  <li>推进安全性和可解释性研究</li>
  <li>扩展计算能力以满足不断增长的 Claude 需求</li>
  <li>扩展产品和合作伙伴关系</li>
</ol>

<p>CFO Krishna Rao 的表态很明确：</p>

<blockquote>
  <p>“Claude 对我们不断增长的全球客户社区来说越来越不可或缺，我们不懈努力使 Claude Code 和 Cowork 等工具更有帮助、更强大、更能适应他们的需求……这笔资金将帮助我们服务我们正在经历的历史性需求，保持在研究前沿，并将 Claude 带到更多工作发生的地方。”</p>
</blockquote>

<hr />

<h2 id="四技术深度dynamic-workflows-的架构启示">四、技术深度：Dynamic Workflows 的架构启示</h2>

<h3 id="41-为什么这是范式转移">4.1 为什么这是范式转移？</h3>

<p>传统的 AI 编程助手是”单轮对话”模式：你给提示，它给回答，一轮结束。即使有多轮，也是串行的。</p>

<p>Dynamic Workflows 引入了三个关键变化：</p>

<p><strong>并行化</strong>：不是等一个子任务完成再开始下一个，而是同时启动数十到数百个子代理。</p>

<p><strong>验证层</strong>：不是盲目相信每个子代理的结果，而是有独立的验证机制。在 Bun 的移植案例中，每个文件有两个审查员。</p>

<p><strong>状态持久化</strong>：长时任务可以中断、恢复，不会因为会话超时或网络问题而丢失进度。</p>

<h3 id="42-与现有工具的比较">4.2 与现有工具的比较</h3>

<table>
  <thead>
    <tr>
      <th>特性</th>
      <th>传统 AI 编程</th>
      <th>Claude Code Dynamic Workflows</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>执行模式</td>
      <td>串行</td>
      <td>并行</td>
    </tr>
    <tr>
      <td>任务范围</td>
      <td>单文件/单函数</td>
      <td>整个代码库</td>
    </tr>
    <tr>
      <td>验证机制</td>
      <td>无/人工</td>
      <td>自动多代理验证</td>
    </tr>
    <tr>
      <td>运行时长</td>
      <td>分钟级</td>
      <td>小时到天级</td>
    </tr>
    <tr>
      <td>容错能力</td>
      <td>低（中断需重来）</td>
      <td>高（自动恢复）</td>
    </tr>
  </tbody>
</table>

<h3 id="43-对开发者的实际意义">4.3 对开发者的实际意义</h3>

<p><strong>短期（现在-6个月）</strong>：</p>
<ul>
  <li>大型重构和迁移项目可以显著加速</li>
  <li>代码审查可以引入 AI 作为”预审查员”</li>
  <li>遗留代码的理解和文档化成本大幅降低</li>
</ul>

<p><strong>中期（6-18个月）</strong>：</p>
<ul>
  <li>“AI 原生”的开发流程会出现，代码库设计会考虑 AI 并行处理的能力</li>
  <li>团队结构可能变化： fewer 纯编码人员，more AI 工作流设计师</li>
</ul>

<p><strong>长期（18个月+）</strong>：</p>
<ul>
  <li>软件工程的本质可能从”写代码”转向”定义问题和管理 AI 工作流”</li>
  <li>代码库的生命周期管理（创建、维护、迁移、退役）大部分由 AI 自动化</li>
</ul>

<hr />

<h2 id="五llm-smells当-ai-写作成为气味">五、LLM Smells：当 AI 写作成为”气味”</h2>

<p>在 Hacker News 上，一篇名为《Various LLM Smells》的文章获得了 88 分和 50 条评论。作者分享了一个有趣的观察：</p>

<blockquote>
  <p>“去年我开始写数学博客，决定用 LLM 来润色/增强我的写作。LLM 生成的写作明显比我自己的好得多。词汇更丰富，句子结构更有趣等等。我发誓当时它看起来不像 AI 垃圾。然后大约 3 个月后，我在整个互联网上看到了完全相同的句子结构。”</p>
</blockquote>

<p>作者收集了一些典型的”AI 气味”：</p>

<p><strong>写作层面</strong>：</p>
<ul>
  <li>太多 punchline：”Humans trust symmetry because it feels like intelligence made visible.”</li>
  <li>连续短句：”Yet the tilt is not an accident. It is the shape of the optimum.”</li>
  <li>“X is the Y of Z” 结构</li>
  <li>“not just X, it’s Y” 结构</li>
</ul>

<p><strong>网站设计层面</strong>：</p>
<ul>
  <li>JetBrains Mono 字体</li>
  <li>步骤和项目符号的固定布局</li>
  <li>特定的按钮样式</li>
  <li>卡片设计</li>
  <li>闪烁点的 badge 组件</li>
</ul>

<p>这个现象提醒我们：<strong>当 AI 生成的内容达到一定密度，它会创造出一种可识别的”风格”，而这种风格会迅速从”新鲜”变成”陈词滥调”。</strong></p>

<p>对于内容创作者来说，这意味着什么？</p>

<ol>
  <li><strong>AI 是起点，不是终点</strong>：用 AI 生成初稿，但必须注入个人视角和独特表达</li>
  <li><strong>警惕”AI 最优解”</strong>：AI 倾向于生成”安全”的内容，但安全往往意味着平庸</li>
  <li><strong>风格即品牌</strong>：在 AI 时代，独特的声音比完美的语法更有价值</li>
</ol>

<hr />

<h2 id="六行业影响ai-正在重新定义编程">六、行业影响：AI 正在重新定义”编程”</h2>

<h3 id="61-从写代码到管理代码">6.1 从”写代码”到”管理代码”</h3>

<p>Dynamic Workflows 的出现，标志着一个转折点：AI 不再只是辅助写代码的工具，而是可以管理整个代码库的工程伙伴。</p>

<p>Bun 的移植案例是一个极端但有力的证明：75 万行代码，11 天，99.8% 测试通过率。这不是”AI 写了点代码”，而是”AI 管理了一个完整的工程迁移项目”。</p>

<h3 id="62-开发者角色的演变">6.2 开发者角色的演变</h3>

<p>未来的开发者可能需要掌握的新技能：</p>

<ul>
  <li><strong>工作流设计</strong>：如何分解复杂任务，定义子代理的边界和验证规则</li>
  <li><strong>AI 协调</strong>：如何管理数百个并行代理的冲突和依赖</li>
  <li><strong>质量守门</strong>：在 AI 自动验证的基础上，定义人类最终审查的节点</li>
</ul>

<h3 id="63-竞争格局">6.3 竞争格局</h3>

<p>Anthropic 这一轮操作（Opus 4.8 + Dynamic Workflows + 65 亿融资）形成了对 OpenAI 的强力挑战：</p>

<table>
  <thead>
    <tr>
      <th>维度</th>
      <th>Anthropic</th>
      <th>OpenAI</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>模型能力</td>
      <td>Opus 4.8 在编码基准上领先</td>
      <td>GPT-5.5 仍有优势领域</td>
    </tr>
    <tr>
      <td>工程工具</td>
      <td>Claude Code + Dynamic Workflows</td>
      <td>Codex CLI</td>
    </tr>
    <tr>
      <td>企业采用</td>
      <td>快速增长（Klarna、CyberAgent 等）</td>
      <td>先发优势</td>
    </tr>
    <tr>
      <td>资金实力</td>
      <td>965 亿估值，470 亿年收入</td>
      <td>更高估值（但未公开最新）</td>
    </tr>
    <tr>
      <td>云平台覆盖</td>
      <td>AWS + GCP + Azure（首个三云覆盖）</td>
      <td>Azure 独家（部分 GCP）</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="七写在最后">七、写在最后</h2>

<p>Claude Opus 4.8 和 Dynamic Workflows 的发布，加上 65 亿美元融资，构成了 Anthropic 在 2026 年中期的”三连击”。</p>

<p>这不仅仅是产品更新，而是一个信号：<strong>AI 正在从”工具”进化为”协作者”，从”单任务”进化为”项目管理”，从”辅助人类”进化为”与人类共同主导”。</strong></p>

<p>对于开发者来说，最实际的启示可能是：开始思考你的工作中哪些部分可以被”工作流化”——分解为可并行的子任务，定义验证规则，让 AI 处理执行，你专注于定义问题和判断结果。</p>

<p>因为当 AI 能并行运行数百个子代理时，真正的瓶颈不再是执行速度，而是<strong>你如何定义问题、如何设计验证机制、如何在 AI 的输出中识别真正的洞察。</strong></p>

<hr />

<p><strong>参考链接</strong>：</p>
<ul>
  <li><a href="https://www.anthropic.com/news/claude-opus-4-8">Claude Opus 4.8 官方发布</a></li>
  <li><a href="https://claude.com/blog/introducing-dynamic-workflows-in-claude-code">Dynamic Workflows 介绍</a></li>
  <li><a href="https://www.anthropic.com/news/series-h">Anthropic Series H 融资公告</a></li>
  <li><a href="https://shvbsle.in/various-llm-smells/">Various LLM Smells</a></li>
</ul>]]></content><author><name>王翊仰</name></author><category term="AI" /><category term="Agent" /><category term="Claude" /><category term="Anthropic" /><category term="Opus" /><category term="Dynamic Workflows" /><category term="Agent" /><category term="AI Coding" /><summary type="html"><![CDATA[Anthropic 同时发布 Claude Opus 4.8 和 Dynamic Workflows，前者在编码基准测试上全面超越 GPT-5.5，后者让单个 Claude Code 会话能并行运行数百个子代理。这不仅是模型升级，更是 AI 工程范式的根本转变。]]></summary></entry><entry><title type="html">深度研究智能体的生产级架构：来自 Thoughtworks 的实战复盘</title><link href="https://www.wangyiyang.cc/2026/05/28/deep-research-agents-production-lessons/" rel="alternate" type="text/html" title="深度研究智能体的生产级架构：来自 Thoughtworks 的实战复盘" /><published>2026-05-28T09:00:00+08:00</published><updated>2026-05-28T09:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/28/deep-research-agents-production-lessons</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/28/deep-research-agents-production-lessons/"><![CDATA[<p><img src="/images/posts/deep-research-agents-production-lessons_1200x630.jpg" alt="cover" /></p>

<h1 id="深度研究智能体的生产级架构来自-thoughtworks-的实战复盘">深度研究智能体的生产级架构：来自 Thoughtworks 的实战复盘</h1>

<table>
  <tbody>
    <tr>
      <td><strong>作者</strong>: Sarang Kulkarni (Thoughtworks)</td>
      <td><strong>来源</strong>: InfoQ Arc of AI Conference 2026</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="背景为什么深度研究如此困难">背景：为什么深度研究如此困难</h2>

<p>一款新药从立项到上市，平均成本 <strong>26 亿美元</strong>。其中约 50% 的研究是在没有充分证据支撑的情况下开展的——不是没有知识，而是知识分散在无数孤岛中，无法被及时获取和连接。</p>

<p>Sarang Kulkarni 在 Thoughtworks 的团队面临的核心挑战正是这个：<strong>如何构建一个系统，让研究人员能够跨内部数据和互联网数据进行发现、连接和推理，同时保证可靠性、透明度和合规性？</strong></p>

<p>这是一个典型的深度研究（Deep Research）场景，也是一个典型的多智能体系统设计难题。</p>

<hr />

<h2 id="从-rag-chatbot-到-agentic-rag三阶段演进">从 RAG Chatbot 到 Agentic RAG++：三阶段演进</h2>

<p>Kulkarni 团队没有一开始就上大模型，而是采用了渐进式架构演进：</p>

<table>
  <thead>
    <tr>
      <th>阶段</th>
      <th>形态</th>
      <th>适用场景</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>RAG Chatbot</strong></td>
      <td>简单检索增强生成</td>
      <td>简单查询，单轮问答</td>
    </tr>
    <tr>
      <td><strong>Agentic RAG</strong></td>
      <td>带执行规划的检索智能体</td>
      <td>复杂问题，多步推理</td>
    </tr>
    <tr>
      <td><strong>Agentic RAG++</strong></td>
      <td>深度研究专用系统</td>
      <td>长周期、跨来源、需合成的任务</td>
    </tr>
  </tbody>
</table>

<p>这种演进路径值得大多数团队借鉴：<strong>不要在第一阶段就设计过度通用的架构，复杂度要随问题复杂度增长。</strong></p>

<hr />

<h2 id="核心架构三环系统">核心架构：三环系统</h2>

<p>深度研究系统的核心是一个<strong>三环架构</strong>：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┌──────────────────────────────────────────────────────────────┐
│                    深度研究系统                               │
├──────────────────────────────────────────────────────────────┤
│  1. 澄清环（Clarification Loop）                               │
│     → 初始查询细化，理解用户真正想问什么                        │
│                                                              │
│  2. 研究环（Research Loop）                                   │
│     → 思考/规划 → 执行 → 反思（Inspect） → 更新（Update）       │
│                                                              │
│  3. 写作环（Writing Loop）                                    │
│     → 写作 → 反思（补全研究阶段遗漏的内容）                    │
└──────────────────────────────────────────────────────────────┘
</code></pre></div></div>

<h3 id="研究环的四个步骤">研究环的四个步骤</h3>

<p>研究环是这个架构最核心的部分，包含四个严格顺序的步骤：</p>

<ol>
  <li><strong>Think &amp; Plan</strong> — 研究<strong>之前</strong>的推理规划</li>
  <li><strong>Execute</strong> — 执行研究任务（检索、爬取、API调用等）</li>
  <li><strong>Inspect</strong> — 研究<strong>之后</strong>的输出验证</li>
  <li><strong>Update</strong> — 生成最终报告</li>
</ol>

<p>这里的关键设计是<strong>将推理暂停（Think）和反思（Inspect）显式化为独立步骤</strong>，而不是让模型在同一个上下文中边想边写。</p>

<h3 id="为什么需要写作环">为什么需要写作环</h3>

<p>研究环完成后，写作阶段可能遗漏一些研究阶段已经获取的信息。写作环通过<strong>二次反思</strong>来补全这个缺口：</p>

<blockquote>
  <p>“任何在研究中已获取但写作任务没有捕捉到的信息，都会在重新起草步骤中被补充完整。”</p>
</blockquote>

<p>这相当于给研究系统加了一个<strong>双向验证层</strong>：研究结果要经得起写作的检验，写作内容要忠实于研究发现。</p>

<hr />

<h2 id="工具设计rag-和-sql-的工程细节">工具设计：RAG 和 SQL 的工程细节</h2>

<h3 id="rag-工具的混合检索策略">RAG 工具的混合检索策略</h3>

<ul>
  <li><strong>加权混合搜索</strong>（Weighted Hybrid Search）</li>
  <li>初始检索 <strong>20 个上下文块</strong></li>
  <li>通过重排序（Re-ranker）精炼至 <strong>7 个最终上下文块</strong></li>
</ul>

<p>这个”20→7”的压缩比设计很关键：保留足够信息密度，但过滤掉噪声。</p>

<h3 id="text2sql-工具的错误反馈机制">text2sql 工具的错误反馈机制</h3>

<p>让 LLM 执行 SQL 查询时，最难处理的是<strong>错误修正</strong>。Kulkarni 团队的方案是将 SQL 执行错误反馈给 LLM，形成一个<strong>错误→反思→修正</strong>的闭环：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SQL 执行失败 → 错误信息回传给 LLM → LLM 生成修正版 SQL → 重新执行
</code></pre></div></div>

<p>这类错误反馈机制在所有工具调用场景中都适用，本质上是让模型在”做中学”。</p>

<hr />

<h2 id="关键挑战与应对策略">关键挑战与应对策略</h2>

<table>
  <thead>
    <tr>
      <th>挑战</th>
      <th>影响</th>
      <th>应对</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Token 成本上升</strong></td>
      <td>费用增加</td>
      <td>优化检索策略，减少无关上下文</td>
    </tr>
    <tr>
      <td><strong>性能不稳定</strong></td>
      <td>可靠性下降</td>
      <td>提升上下文质量，强化反思机制</td>
    </tr>
    <tr>
      <td><strong>高延迟</strong></td>
      <td>用户体验差</td>
      <td>优化执行效率，并行化独立任务</td>
    </tr>
    <tr>
      <td><strong>上下文焦虑</strong></td>
      <td>推理质量下降</td>
      <td>谨慎的上下文管理，避免信息过载</td>
    </tr>
    <tr>
      <td><strong>数据不完整</strong></td>
      <td>自我评估失效</td>
      <td>引入数据反思和过程反思双重机制</td>
    </tr>
  </tbody>
</table>

<h3 id="上下文焦虑context-anxiety">上下文焦虑（Context Anxiety）</h3>

<p>当上下文中信息量过大时，模型的推理质量反而下降——这被 Kulkarni 称为”上下文焦虑”。应对方法是<strong>精确的上下文选择和压缩</strong>，而不是简单增加上下文窗口大小。</p>

<h3 id="双重反思机制">双重反思机制</h3>

<p>反思不仅是<strong>数据反思</strong>（输出的信息是否准确），还包括<strong>过程反思</strong>（执行过程是否完整，是否还有遗漏步骤）。</p>

<hr />

<h2 id="harness-工程模型之外的另一半">Harness 工程：模型之外的另一半</h2>

<p>Kulkarni 提出了一个核心观点：</p>

<blockquote>
  <p><strong>AI 智能体 = 模型 + Harness（驾驭系统）</strong>。模型越强，Harness 可以越薄。</p>
</blockquote>

<p>Harness 包含：工具设计、记忆系统、验证检查、约束条件和反馈回路。Harness 工程的最终目标是让自主智能体<strong>更可靠、更可问责</strong>。</p>

<p>这个观点对国内做 AI 应用落地的团队有重要启示：不要把所有精力放在模型选型和 Prompt 调优上，<strong>工具和反馈机制的设计往往比模型本身更重要</strong>。</p>

<hr />

<h2 id="关键经验总结">关键经验总结</h2>

<ol>
  <li><strong>从简单开始</strong>：RAG 对基础查询有效，随着复杂度增加再引入智能体架构</li>
  <li><strong>多环架构提供结构</strong>：澄清→研究→写作的三环为复杂研究提供了清晰的执行框架</li>
  <li><strong>反思机制不可或缺</strong>：数据反思和过程反思双重机制确保输出质量</li>
  <li><strong>Think-Act 循环是关键</strong>：长周期任务需要在执行中嵌入显式的推理暂停</li>
  <li><strong>Harness 工程很重要</strong>：工具设计、记忆系统和验证机制决定了智能体的可靠性上限</li>
  <li><strong>上下文管理是瓶颈</strong>：上下文焦虑会直接导致推理质量下降，需要精细化的上下文压缩策略</li>
</ol>

<hr />

<p><em>本文是对 InfoQ 文章《Sarang Kulkarni on Lessons from Building Deep Research Agents in Production》的深度解读，更多详情可<a href="https://www.infoq.com/news/2026/05/kulkarni-deep-research-agents/">阅读原文</a>。</em></p>]]></content><author><name>王翊仰</name></author><category term="AI" /><category term="Agent" /><category term="Deep Research" /><category term="Multi-Agent" /><category term="RAG" /><category term="Production" /><category term="Thoughtworks" /><summary type="html"><![CDATA[Sarang Kulkarni 在 Arc of AI Conference 2026 上分享了如何在医疗和制药研发场景中构建可靠的多智能体深度研究系统，揭示了三环架构、反思机制和工具设计的核心经验。]]></summary></entry><entry><title type="html">Kubernetes v1.36 深度解读：安全默认收紧与 AI 工作负载支持的成熟化</title><link href="https://www.wangyiyang.cc/2026/05/27/kubernetes-1-36-security-ai-workloads/" rel="alternate" type="text/html" title="Kubernetes v1.36 深度解读：安全默认收紧与 AI 工作负载支持的成熟化" /><published>2026-05-27T00:00:00+08:00</published><updated>2026-05-27T00:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/27/kubernetes-1-36-security-ai-workloads</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/27/kubernetes-1-36-security-ai-workloads/"><![CDATA[<blockquote>
  <table>
    <tbody>
      <tr>
        <td><strong>发布日期</strong>：2026-05-14</td>
        <td><strong>代号</strong>：Haru</td>
        <td><strong>贡献者</strong>：491 人，来自 106 家公司</td>
      </tr>
    </tbody>
  </table>
</blockquote>

<p>Kubernetes v1.36 的发布标志着这个云原生编排平台正在经历一次重要的范式转变——从”灵活框架”走向”有主见的默认配置”。本次release包含 <strong>70 项增强</strong>（18 项 Stable、25 项 Beta、25 项 Alpha），核心聚焦三大方向：<strong>安全加固</strong>、<strong>AI/ML 工作负载成熟化</strong>、以及<strong>大规模集群的 API 可扩展性</strong>。</p>

<p>本文将深入解读其中对工程师日常影响最大的几个关键特性。</p>

<hr />

<h2 id="一安全默认收紧从可选到必须">一、安全默认收紧：从”可选”到”必须”</h2>

<h3 id="11-user-namespaces-正式-ga">1.1 User Namespaces 正式 GA</h3>

<p>这是容器安全领域的一个里程碑。User Namespaces 将容器内的 root 用户映射到宿主机上的非特权用户，意味着<strong>即使进程成功逃逸容器，也无法获得宿主机的管理员权限</strong>。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 启用 User Namespaces 的 Pod 配置示例</span>
apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  hostUsers: <span class="nb">false</span>  <span class="c"># 启用 user namespace</span>
  containers:
  - name: app
    image: nginx:latest
</code></pre></div></div>

<p>此前，容器逃逸往往意味着直接获得宿主机 root 权限。User Namespaces 的 GA 让”纵深防御”从最佳实践变成了默认行为。</p>

<h3 id="12-mutating-admission-policies-替代-webhook">1.2 Mutating Admission Policies 替代 Webhook</h3>

<p>传统上，自定义准入控制需要维护独立的 webhook 服务器，带来额外的延迟和运维复杂度。v1.36 引入的 Mutating Admission Policies 使用 CEL（Common Expression Language）直接在 Kubernetes 原生对象中定义策略，<strong>无需额外的 webhook 基础设施</strong>。</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">admissionregistration.k8s.io/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">MutatingAdmissionPolicy</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">enforce-security-context</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">matchConstraints</span><span class="pi">:</span>
    <span class="na">resourceRules</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">apiGroups</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">"</span><span class="pi">]</span>
      <span class="na">apiVersions</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">v1"</span><span class="pi">]</span>
      <span class="na">resources</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">pods"</span><span class="pi">]</span>
      <span class="na">operations</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">CREATE"</span><span class="pi">]</span>
  <span class="na">mutations</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">patchType</span><span class="pi">:</span> <span class="s2">"</span><span class="s">ApplyConfiguration"</span>
    <span class="na">applyConfiguration</span><span class="pi">:</span>
      <span class="na">expression</span><span class="pi">:</span> <span class="pi">|</span>
        <span class="s">{</span>
          <span class="s">"spec": {</span>
            <span class="s">"securityContext": {</span>
              <span class="s">"runAsNonRoot": true,</span>
              <span class="s">"seccompProfile": {"type": "RuntimeDefault"}</span>
            <span class="s">}</span>
          <span class="s">}</span>
        <span class="s">}</span>
</code></pre></div></div>

<p>这一变化对于需要严格安全合规的企业环境意义重大——策略执行不再依赖外部服务的可用性。</p>

<h3 id="13-细粒度-kubelet-api-授权">1.3 细粒度 Kubelet API 授权</h3>

<p>过去，访问 kubelet API 需要宽泛的 <code class="language-plaintext highlighter-rouge">nodes/proxy</code> 权限。v1.36 引入了精确的、最小权限的访问控制，遵循<strong>零信任架构</strong>的原则，将权限粒度细化到具体的 API 端点。</p>

<h3 id="14-selinux-volume-labeling-优化">1.4 SELinux Volume Labeling 优化</h3>

<p>传统的递归文件重标记（<code class="language-plaintext highlighter-rouge">chcon -R</code>）在大型卷上可能导致显著的 Pod 启动延迟。v1.36 改为在挂载时直接应用正确的 SELinux 标签：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mount <span class="nt">-o</span> <span class="nv">context</span><span class="o">=</span>system_u:object_r:container_file_t:s0:c123,c456 /dev/vdb /mnt/data
</code></pre></div></div>

<p>这一改动将 SELinux 强制启用系统上的 Pod 启动时间从秒级缩短到毫秒级。</p>

<hr />

<h2 id="二aiml-工作负载从能跑到跑好">二、AI/ML 工作负载：从”能跑”到”跑好”</h2>

<h3 id="21-dradynamic-resource-allocation增强进入-beta">2.1 DRA（Dynamic Resource Allocation）增强进入 Beta</h3>

<p>AI 工作负载对 GPU 等加速器的调度需求与传统应用截然不同。v1.36 中 DRA 的三项关键增强默认启用：</p>

<table>
  <thead>
    <tr>
      <th>特性</th>
      <th>解决的问题</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>DRA Partitionable Devices</strong></td>
      <td>GPU 分区表达（如 MIG 配置）</td>
    </tr>
    <tr>
      <td><strong>DRA Consumable Capacity</strong></td>
      <td>共享资源（如 GPU 显存）的用量追踪</td>
    </tr>
    <tr>
      <td><strong>DRA Device Taints &amp; Tolerations</strong></td>
      <td>故障设备隔离</td>
    </tr>
  </tbody>
</table>

<p>此前，GPU 调度采用整数分配模型——无论实际利用率如何，一整张 GPU 被分配给单个 Pod。DRA 的成熟让<strong>细粒度的加速器资源共享</strong>成为可能，这对于提高 GPU 集群利用率至关重要。</p>

<blockquote>
  <p>“以前请求复杂资源通常需要不透明的、供应商特定的配置，调度器难以优化。” —— VMware Cloud Foundation 团队</p>
</blockquote>

<h3 id="22-workload-aware-preemptionalpha">2.2 Workload-Aware Preemption（Alpha）</h3>

<p>分布式训练任务的一个经典痛点：<strong>调度器抢占单个 Pod，导致 8 卡训练任务中 7 个 rank 仍在运行，但无法继续推进</strong>。</p>

<p>v1.36 引入的 Workload-Aware Preemption 将 PodGroup 视为单一抢占单元，只有在确认高优先级组确实能完整调度后，才会执行驱逐。</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">scheduling.x-k8s.io/v1alpha1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">PodGroup</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">training-job-8gpu</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">schedulePolicy</span><span class="pi">:</span>
    <span class="na">preemptionPolicy</span><span class="pi">:</span> <span class="s">PreemptLowerPriority</span>
  <span class="na">minMember</span><span class="pi">:</span> <span class="m">8</span>  <span class="c1"># 必须同时调度 8 个 Pod</span>
</code></pre></div></div>

<h3 id="23-gang-scheduling-api-晋升-beta">2.3 Gang Scheduling API 晋升 Beta</h3>

<p>Gang Scheduling 确保一组关联 Pod 要么全部调度成功，要么全部不调度。v1.35 的 Alpha 特性在 v1.36 中进入 Beta，与 Workload-Aware Preemption 配合，构成了 AI 工作负载调度的基础设施。</p>

<h3 id="24-挂起作业的可变资源beta">2.4 挂起作业的可变资源（Beta）</h3>

<p>队列控制器现在可以：</p>
<ol>
  <li>挂起正在运行的作业</li>
  <li>调整 CPU/内存/GPU 资源请求</li>
  <li>恢复作业而无需销毁/重建 Pod</li>
</ol>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">batch/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Job</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">adaptive-training</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">suspend</span><span class="pi">:</span> <span class="no">true</span>  <span class="c1"># 挂起</span>
  <span class="na">template</span><span class="pi">:</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">containers</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">trainer</span>
        <span class="na">resources</span><span class="pi">:</span>
          <span class="na">requests</span><span class="pi">:</span>
            <span class="na">nvidia.com/gpu</span><span class="pi">:</span> <span class="m">4</span>  <span class="c1"># 从 8 卡调整为 4 卡</span>
</code></pre></div></div>

<p>这消除了自定义控制器或完全重启作业的需求，对于<strong>动态资源配额调整</strong>场景（如夜间批处理让位于在线服务）非常实用。</p>

<hr />

<h2 id="三大规模集群的-api-可扩展性">三、大规模集群的 API 可扩展性</h2>

<h3 id="31-sharded-list-and-watch-streamsalpha">3.1 Sharded List and Watch Streams（Alpha）</h3>

<p>超大规模集群中，单一资源类型的 watch 流可能成为瓶颈。v1.36 引入的分片机制将 watch 负载分布到多个流上，解决了”单连接单资源类型”的架构限制。</p>

<blockquote>
  <p>“这是解决超大规模部署中 watch 流瓶颈的关键痛点。” —— Palark 团队</p>
</blockquote>

<h3 id="32-内存-qos-与原地垂直扩缩容">3.2 内存 QoS 与原地垂直扩缩容</h3>

<p>cgroup v2 的分层内存保护机制与 Pod 的 request/limit 对齐，提供了更可预测的内存性能隔离。</p>

<p>原地垂直扩缩容（In-Place VPA）在 v1.36 中进入 Beta 并默认启用，允许调整 Pod 级别的 CPU/内存上限而无需重启容器。新增的 <code class="language-plaintext highlighter-rouge">ResizeDeferred</code> 事件类型确保在容量不足时 Pod 继续以现有规格运行，kubelet 在资源可用时自动重试。</p>

<hr />

<h2 id="四移除与弃用清理技术债">四、移除与弃用：清理技术债</h2>

<table>
  <thead>
    <tr>
      <th>移除项</th>
      <th>弃用版本</th>
      <th>迁移路径</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">gitRepo</code> volume 插件</td>
      <td>v1.11</td>
      <td>Init 容器或外部 git-sync 工具</td>
    </tr>
    <tr>
      <td>kube-proxy IPVS 模式</td>
      <td>v1.35</td>
      <td>iptables 或 nftables 模式</td>
    </tr>
    <tr>
      <td>Flex-volume kubeadm 支持</td>
      <td>—</td>
      <td>CSI 驱动</td>
    </tr>
    <tr>
      <td>Portworx 内置驱动</td>
      <td>—</td>
      <td>外置 CSI 驱动</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">gitRepo</code> 的移除尤其值得关注——它”允许攻击者以 root 身份在节点上运行代码”，是一个长期存在的安全隐患。</p>

<hr />

<h2 id="五关键运维提醒ingress-nginx-已退役">五、关键运维提醒：Ingress NGINX 已退役</h2>

<p><strong>2026 年 3 月 24 日</strong>，Kubernetes SIG Network 和安全响应委员会宣布 Ingress NGINX 控制器退役。自该日期起：</p>

<ul>
  <li>不再发布新版本</li>
  <li>不再提供 bug 修复</li>
  <li>不再提供安全补丁</li>
</ul>

<p>使用 Ingress NGINX 的集群需要尽快迁移到替代方案（如 Traefik、Istio Gateway、或 Cilium Gateway API）。</p>

<hr />

<h2 id="六总结kubernetes-的成人礼">六、总结：Kubernetes 的”成人礼”</h2>

<p>v1.36 的发布反映了 Kubernetes 社区的成熟判断：<strong>安全不再是可选配置，AI 工作负载不再是边缘场景，大规模运维不再是少数巨头的专利</strong>。</p>

<p>对于平台工程师，这意味着：</p>
<ol>
  <li><strong>升级计划需要纳入安全默认变更的影响评估</strong></li>
  <li><strong>AI 工作负载的调度策略需要重新设计</strong></li>
  <li><strong>Ingress NGINX 的迁移不能再拖</strong></li>
</ol>

<p>对于应用开发者，User Namespaces 和 Mutating Admission Policies 的 GA 意味着可以在不牺牲安全性的前提下获得更大的部署灵活性。</p>

<p>Kubernetes 正在从一个”你可以做任何事”的灵活框架，演变为一个”默认就做对的事”的生产级平台。这个转变，正是云原生技术走向成熟的标志。</p>

<hr />

<p><strong>参考链接</strong>：</p>
<ul>
  <li><a href="https://kubernetes.io/releases/notes/v1.36/">Kubernetes v1.36 Release Notes</a></li>
  <li><a href="https://www.infoq.com/news/2026/05/kubernetes-1-36-released/">InfoQ: Kubernetes v1.36 Released</a></li>
  <li><a href="https://kubernetes.io/blog/2026/03/24/ingress-nginx-retirement/">Ingress NGINX Retirement Announcement</a></li>
</ul>]]></content><author><name>王翊仰</name></author><category term="Kubernetes" /><category term="Cloud Native" /><category term="AI/ML" /><summary type="html"><![CDATA[Kubernetes v1.36（代号 Haru）带来 70 项增强，安全默认全面收紧，AI/ML 工作负载支持从实验走向生产就绪。]]></summary></entry><entry><title type="html">3台设备、6个Agent、1个大脑：我的多Agent实战</title><link href="https://www.wangyiyang.cc/2026/05/22/multi-agent-shared-memory/" rel="alternate" type="text/html" title="3台设备、6个Agent、1个大脑：我的多Agent实战" /><published>2026-05-22T23:19:00+08:00</published><updated>2026-05-22T23:19:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/22/multi-agent-shared-memory</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/22/multi-agent-shared-memory/"><![CDATA[<h2 id="一痛点同一句话讲了不知道多少遍">一、痛点：同一句话，讲了不知道多少遍</h2>

<p>我的工作台是这样的：家里一台 Mac mini，公司一台 MacBook Pro，还有一台云服务器跑一些常驻服务。三台设备上都装着一堆 AI Agent——Claude Code、Codex、OpenClaw、Pi、Kimi、OpenCode，有些用得频繁，有些偶尔需要。</p>

<p>最近时间我在引入 <strong>Multica</strong>（一个让 Agent 像真实团队成员一样协作的开源平台）。它确实做到了任务分配、进度追踪、技能复用，能把 Claude Code、Codex、OpenClaw 这些 Agent 当成同事来管理——你在 Multica 的看板上建一个 Issue，分配给 Claude Code，它会自主认领、执行、汇报，跟你在 Slack 里协作没什么两样。</p>

<p>Multica 让多个 Agent 协作做一件事变得高效，但它也放大了另一个问题：每个 Agent 的记忆几乎独立——我在 Claude Code 里积累的上下文，OpenClaw 不知道；我在 Mac mini 上调好的偏好，MacBook 上要从头再来。</p>

<p>我的架构偏好、当前项目背景、调试到一半的思路——这些东西，每换一个 Agent、每换一台设备，就归零一次。</p>

<h2 id="二第一次尝试mempalace">二、第一次尝试：Mempalace</h2>

<p>调研了一圈，发现 <strong>Mempalace</strong> 这个项目专门做 Agent 记忆管理。装上之后确实好用——它能把我的偏好、项目背景、历史对话整理成结构化记忆，下次打开 Agent 可以直接召回。</p>

<p>但很快撞上了天花板：<strong>单机</strong>。</p>

<p>Mempalace 的记忆文件存在本地，Mac mini 上积累的记忆，MacBook 一点都看不到。我研究过把它的 MCP 接口从本地 stdio 转成 HTTP stream 的方案，这样可以把 mempalace 集中在一台服务器上维护，实现远程访问。但不优雅的是需要额外引入一个转换组件来做协议适配——多了一层中间层，不够干净利落。</p>

<p>我需要的是一个原生就跑在云端的记忆中枢。</p>

<h2 id="三意外发现openhuman-背后的-agentmemory">三、意外发现：OpenHuman 背后的 AgentMemory</h2>

<p>有天在 GitHub 刷项目，看到一个叫 <strong>OpenHuman</strong> 的东西——”你的个人 AI 超级智能”。点进去，发现它的底层记忆后端用的是 <strong>AgentMemory</strong>。</p>

<p>顺手把 AgentMemory 的 README 从头读到尾。读完眼睛亮了。</p>

<p>这个项目目前在 GitHub 上有 11.6k star，被称为”基于真实 benchmark 排名第一的 AI 编码 Agent 持久记忆系统”。它的核心能力正好命中我的所有需求：</p>

<blockquote>
  <p><strong>它做到了我一直想要的几件事</strong></p>

  <p>支持远程 MCP（HTTP 协议），Agent 在哪台设备都能接入<br />
支持 API Key 认证，只有我的 Agent 才能读我的记忆<br />
三路混合检索：BM25 关键词 + 向量语义 + 知识图谱，再用 RRF 融合排序<br />
四层记忆整合：工作记忆 → 情节记忆 → 语义记忆 → 程序记忆，像人脑一样分层巩固<br />
兼容几乎所有主流 Agent：Claude Code、Codex、OpenClaw、Pi、Kimi、OpenCode 全支持<br />
不依赖外部数据库，SQLite + iii-engine，自包含部署</p>
</blockquote>

<p>更关键的：它原生支持云端部署，提供了 Fly.io、Railway 的一键模板，专门为多设备、多 Agent 的场景设计。这才是我要找的东西。</p>

<h2 id="四云端部署">四、云端部署</h2>

<p>选定方案之后，用 <strong>OpenClaw</strong> 直接部署 AgentMemory 到云服务器。</p>

<p>部署完成后配置 API Key，在各设备的 Agent 里加上 MCP 连接，验证返回 <code class="language-plaintext highlighter-rouge">{"status": "healthy"}</code> 即上线成功。</p>

<p>所有设备的所有 Agent，从此共享同一层记忆。</p>

<h2 id="五现在是什么感觉">五、现在是什么感觉</h2>

<p>接入之后最直接的变化：我在 Mac mini 上用 Claude Code 做了一段工作，讨论了架构决策、确定了代码风格偏好、记录了一个待解决的问题。切换到 MacBook 打开 OpenClaw，它能通过语义检索找到刚才积累的上下文——不需要我重新解释，直接接着上次的思路走。</p>

<p>AgentMemory 能做到语义检索，搜索”agentmemory 远程状态”这类自然语言，能准确召回相关记录，相似度指标显示匹配质量很高——这是纯关键词匹配做不到的。</p>

<p>目前的架构是这样的：</p>

<p><img src="/images/posts/agentmemory-architecture-2026-05-22.png" alt="AgentMemory 架构图" /></p>

<p>下一步要做的：</p>

<ul>
  <li>把偏好文件（USER.md、SOUL.md 里的关键设定）系统性地写入记忆</li>
  <li>把 Mempalace 单机时代积累的历史数据迁移过来</li>
  <li>逐步接入剩余的几个 Agent，验证跨 Agent 记忆共享的完整性</li>
</ul>

<h2 id="六这件事给我的启发">六、这件事给我的启发</h2>

<ol>
  <li>
    <p><strong>Agent 协作和 Agent 记忆是两个层次的问题</strong> — Multica 解决的是前者，AgentMemory 解决的是后者。两个工具不冲突，分别在不同维度给 Agent 团队赋能。</p>
  </li>
  <li>
    <p><strong>个人记忆必须上云</strong> — 本地记忆方案注定是单机的，而我的工作流天然跨设备。”记忆在云上”和”代码在 GitHub 上”一样自然，不该将就。</p>
  </li>
  <li>
    <p><strong>认证是底线</strong> — 远端记忆服务暴露在公网，API Key 是最低要求。裸奔的记忆系统等于裸奔的云服务器。</p>
  </li>
  <li>
    <p><strong>语义检索远胜关键词</strong> — 搜”数据库性能问题”能召回”修了一个 N+1 查询”——这不是关键词匹配能做到的。BM25 + 向量 + 图谱融合检索是真实可用的，不只是 README 里的宣传词。</p>
  </li>
  <li>
    <p><strong>渐进接入，不要一次全上</strong> — 先跑通一个 Agent，确认写入和检索链路完整，再逐步扩展。一次全上出问题找不到根因。</p>
  </li>
</ol>

<h2 id="七我真正想要的">七、我真正想要的</h2>

<p>部署 AgentMemory 只是基础设施层面的一步。</p>

<p>我真正想要的是：<strong>无论打开哪台设备、无论启动哪个 Agent，它都已经知道我是谁——</strong></p>

<blockquote>
  <p>我是做平台架构的，习惯先看全局再动手<br />
我喜欢直接型沟通，不需要废话和铺垫<br />
我偏向 Python / Golang、Kubernetes、AI Agent 这个技术方向<br />
我上周讨论过的架构决策，这周要继续往下推<br />
我有一些长期悬而未决的技术问题，不用每次重新解释背景</p>
</blockquote>

<p>这些东西，应该像 Git 仓库一样，在任何设备上 pull 一下就有了。</p>

<p>AgentMemory 是实现这个愿景的基础设施。接下来要做的，就是把”我”系统性地写入云端，让每个 Agent 都能读到。</p>

<hr />

<blockquote>
  <p>如果你也在用多个 AI Agent，也被跨设备的记忆分裂折磨过，希望这篇文章对你有用。</p>
</blockquote>

<hr />

<p><strong>原文首发于微信公众号「翊行代码」</strong></p>]]></content><author><name>王翊仰</name></author><category term="AI" /><category term="Agent" /><category term="AI Agent" /><category term="AgentMemory" /><category term="Multica" /><category term="MCP" /><category term="多设备工作流" /><summary type="html"><![CDATA[从记忆分裂到云端统一：一个架构师的多Agent实践]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.wangyiyang.cc/images/posts/agentmemory-architecture-2026-05-22.png" /><media:content medium="image" url="https://www.wangyiyang.cc/images/posts/agentmemory-architecture-2026-05-22.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Semble 把 Agent 代码搜索的 token 消耗砍到 2%</title><link href="https://www.wangyiyang.cc/2026/05/18/semble-code-search-agent-tokens/" rel="alternate" type="text/html" title="Semble 把 Agent 代码搜索的 token 消耗砍到 2%" /><published>2026-05-18T00:00:00+08:00</published><updated>2026-05-18T00:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/18/semble-code-search-agent-tokens</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/18/semble-code-search-agent-tokens/"><![CDATA[<p>AI 编程 Agent 在大型代码库里找东西时，通常只有两招：grep 全文搜索，或者把整段代码塞进上下文让 LLM 自己看。</p>

<p>前者找得到字面匹配，但理解不了语义；后者准一点，但 token 消耗随代码量线性膨胀。一个中等规模的微服务仓库，几轮搜索下来就能烧掉几十万 token。</p>

<p>Semble 想解决的是同一个问题的第三个维度：<strong>既要语义准确，又要 token 极简，还要本地毫秒级响应</strong>。</p>

<h2 id="为什么-grep--read-不是答案">为什么 grep + read 不是答案</h2>

<p>Claude Code、Cursor 这类 Agent 的默认代码搜索链路大致是这样的：</p>

<ol>
  <li>用 grep 或 ripgrep 按关键词扫一遍文件列表</li>
  <li>把匹配到的文件整块读进上下文</li>
  <li>LLM 从中筛选出真正相关的片段</li>
</ol>

<p>这个流程的问题不在 grep，而在「读整文件」。一个 500 行的模块文件，真正相关的可能只有 10 行，但剩下的 490 行照样占用 token 预算。按 Claude 的计费方式，这 490 行就是纯浪费。</p>

<p>更隐蔽的成本在交互轮次。Agent 第一次搜索没找到，会换关键词再搜；找到一部分后，又会顺着引用链继续读更多文件。几轮下来，token 消耗轻松破万。</p>

<p>Semble 的 benchmark 数据很直观：同样的检索任务，grep+read 平均消耗约 50 倍于 Semble 返回的 snippet 字符数。换算成 token，就是 <strong>98% 的节省空间</strong>。</p>

<h2 id="核心设计静态嵌入--bm25-双路召回">核心设计：静态嵌入 + BM25 双路召回</h2>

<p>Semble 的检索架构并不复杂，但每个组件的选择都指向同一个目标——<strong>零外部依赖的极速本地搜索</strong>。</p>

<pre><code class="language-mermaid">flowchart LR
    A["Codebase"] --&gt; B["Chonkie&lt;br/&gt;代码感知分块"]
    B --&gt; C["potion-code-16M&lt;br/&gt;静态嵌入模型"]
    B --&gt; D["BM25&lt;br/&gt;词项索引"]
    C --&gt; E["语义得分"]
    D --&gt; F["词项得分"]
    E --&gt; G["RRF 融合"]
    F --&gt; G
    G --&gt; H["代码感知重排序"]
    H --&gt; I["Top-K 结果"]
</code></pre>

<p><strong>第一层：代码感知分块</strong></p>

<p>用 Chonkie 做初始切分，不是简单的按行数或字符数切，而是尊重代码的结构边界——函数、类、逻辑块。这样保证返回的 snippet 在语义上是完整的，Agent 拿到就能用，不需要再拼接上下文。</p>

<p><strong>第二层：双路召回</strong></p>

<ul>
  <li><strong>语义路</strong>：potion-code-16M，一个 1600 万参数的静态嵌入模型。静态的意思是查询时不需要 transformer 前向传播，直接查表取 embedding，所以能在 CPU 上跑到毫秒级。</li>
  <li><strong>词项路</strong>：BM25，负责精确匹配标识符、API 名、类名。你搜 <code class="language-plaintext highlighter-rouge">save_pretrained</code>，BM25 能确保包含这个函数定义的文件排在前面。</li>
</ul>

<p>两路结果用 RRF（Reciprocal Rank Fusion）融合，兼顾「意思相近」和「字面命中」。</p>

<p><strong>第三层：代码感知重排序</strong></p>

<p>融合后还有一组针对代码场景的微调信号：</p>

<ul>
  <li><strong>定义提升</strong>：包含 <code class="language-plaintext highlighter-rouge">class Foo</code> 或 <code class="language-plaintext highlighter-rouge">def bar</code> 的块，比单纯引用 <code class="language-plaintext highlighter-rouge">Foo</code> 的块排名更高</li>
  <li><strong>标识符词干</strong>：搜 <code class="language-plaintext highlighter-rouge">parse config</code> 时，<code class="language-plaintext highlighter-rouge">parseConfig</code>、<code class="language-plaintext highlighter-rouge">ConfigParser</code>、<code class="language-plaintext highlighter-rouge">config_parser</code> 都会被加权</li>
  <li><strong>文件连贯性</strong>：同一文件多个块命中时，整文件权重提升</li>
  <li><strong>噪声惩罚</strong>：测试文件、compat shim、<code class="language-plaintext highlighter-rouge">.d.ts</code> stub 会被降权</li>
</ul>

<p>整个流程在普通笔记本 CPU 上的耗时：索引一个平均规模的仓库约 250ms，单次查询约 1.5ms。</p>

<h2 id="与-transformer-方案的对比">与 Transformer 方案的对比</h2>

<p>Semble 的 NDCG@10 是 0.854，对比专门的代码 Transformer 模型（如 CodeRankEmbed），保留了约 99% 的检索质量。但速度和成本完全不在一个量级：</p>

<table>
  <thead>
    <tr>
      <th>维度</th>
      <th>Semble</th>
      <th>代码 Transformer</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>索引速度</td>
      <td>~250ms</td>
      <td>~50s（GPU）</td>
    </tr>
    <tr>
      <td>查询延迟</td>
      <td>~1.5ms</td>
      <td>~15ms（GPU）</td>
    </tr>
    <tr>
      <td>硬件要求</td>
      <td>CPU 即可</td>
      <td>需要 GPU 或 API</td>
    </tr>
    <tr>
      <td>外部依赖</td>
      <td>无</td>
      <td>模型服务/API Key</td>
    </tr>
    <tr>
      <td>检索质量</td>
      <td>NDCG@10 0.854</td>
      <td>基准参照</td>
    </tr>
  </tbody>
</table>

<p>这个 trade-off 的合理性取决于使用场景。如果你在做离线代码分析，50 秒索引一次完全可以接受；但如果 Agent 每轮对话都可能触发一次代码搜索，250ms vs 50 秒就是可用和不可用的区别。</p>

<h2 id="mcp-集成一行命令接入-agent">MCP 集成：一行命令接入 Agent</h2>

<p>Semble 提供了原生的 MCP server，对接成本极低。</p>

<p>Claude Code 用户直接执行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>claude mcp add semble <span class="nt">-s</span> user <span class="nt">--</span> uvx <span class="nt">--from</span> <span class="s2">"semble[mcp]"</span> semble
</code></pre></div></div>

<p>Cursor 用户在 <code class="language-plaintext highlighter-rouge">~/.cursor/mcp.json</code> 里加一段配置：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"mcpServers"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"semble"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"uvx"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"--from"</span><span class="p">,</span><span class="w"> </span><span class="s2">"semble[mcp]"</span><span class="p">,</span><span class="w"> </span><span class="s2">"semble"</span><span class="p">]</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Codex、OpenCode 同理，都是一行配置的事。</p>

<p>MCP 暴露两个工具：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">search</code>：用自然语言或代码片段搜索仓库，支持本地路径或 git URL</li>
  <li><code class="language-plaintext highlighter-rouge">find_related</code>：给定文件路径和行号，返回语义相似的代码块</li>
</ul>

<p>远程仓库会被自动克隆并缓存索引，本地路径则会被监控文件变更、实时重建索引。</p>

<h2 id="实战在真实项目里省了多少-token">实战：在真实项目里省了多少 token</h2>

<p>Semble 内置了 token 节省统计，执行 <code class="language-plaintext highlighter-rouge">semble savings</code> 可以看到累计数据：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Period        Calls   Savings
────────────────────────────────────────
Today         42      ~58.4k tokens (95%)
Last 7 days   287     ~312.4k tokens (90%)
All time      1.4k    ~1.2M tokens (89%)
</code></pre></div></div>

<p>计算方式很直接：<code class="language-plaintext highlighter-rouge">(file_chars - snippet_chars) / 4</code>，按平均每 token 4 字符估算。假设一个 Agent 每天执行 40 次代码搜索，一年下来能省掉约 2000 万 token。按当前主流模型的 API 价格，这是数千美元量级的成本差异。</p>

<p>但比钱更重要的是<strong>上下文窗口的释放</strong>。Agent 的上下文是有限的，省下来的 token 可以用来放更多相关代码、更长的对话历史，或者更复杂的推理链。</p>

<h2 id="局限与适用边界">局限与适用边界</h2>

<p>Semble 不是万能药，有几个场景它并不擅长：</p>

<p><strong>跨仓库语义关联</strong>。它擅长在一个代码库内找相关实现，但如果你想问「这个项目和那个项目的设计模式有什么异同」，Semble 帮不上忙。</p>

<p><strong>动态代码生成</strong>。对于模板元编程、宏展开后的代码，静态分块可能切不到最有意义的边界。</p>

<p><strong>超大规模单体仓库</strong>。虽然索引速度是线性的，但千万行级别的仓库在消费级硬件上的首次索引时间可能达到秒级，不再是「无感知」的体验。</p>

<p>另外，potion-code-16M 是英语和主流编程语言优化的模型，对于以中文注释为主、或小众语言（如 Coq、Lean）占主导的仓库，语义路的效果会有折扣。</p>

<h2 id="总结与行动">总结与行动</h2>

<p>Semble 的价值不在于发明了新的检索算法，而在于<strong>把正确的组件组合成了一个 Agent 原生的工作流</strong>。</p>

<ul>
  <li>静态嵌入砍掉了 GPU 依赖和 API 成本</li>
  <li>BM25 保证了标识符级别的精确召回</li>
  <li>代码感知的重排序让结果更符合开发者的直觉</li>
  <li>MCP 封装让集成成本降到一行命令</li>
</ul>

<p>如果你正在用 Claude Code 或 Cursor 处理大型代码库，可以按这个 checklist 验证效果：</p>

<ol>
  <li>安装 Semble MCP：<code class="language-plaintext highlighter-rouge">claude mcp add semble -s user -- uvx --from "semble[mcp]" semble</code></li>
  <li>在项目中执行一次语义搜索，对比默认 grep 的返回质量</li>
  <li>观察 Agent 后续对话的 token 消耗变化</li>
  <li>用 <code class="language-plaintext highlighter-rouge">semble savings</code> 跟踪一周累计数据</li>
  <li>对于高频搜索的仓库，把索引预热加到项目启动脚本里</li>
</ol>

<p>Agent 时代的基础设施正在快速分层。Semble 属于「让 Agent 看得更少、看得更准」的那一层，而这类工具的普及，会直接决定大规模代码重构、遗留系统维护等复杂任务能否真正交给 AI 自动完成。</p>]]></content><author><name>王翊仰</name></author><category term="AI" /><category term="Agent" /><category term="RAG" /><summary type="html"><![CDATA[Semble 用静态嵌入模型 + BM25 混合检索，让 AI Agent 搜索代码库时少用 98% 的 token。250ms 索引、1.5ms 查询、纯 CPU 运行，直接对接 Claude Code 和 Cursor。]]></summary></entry><entry><title type="html">Kimi WebBridge 的本地优先设计：AI Agent 操作浏览器的新思路</title><link href="https://www.wangyiyang.cc/2026/05/16/kimi-webbridge-local-browser-agent/" rel="alternate" type="text/html" title="Kimi WebBridge 的本地优先设计：AI Agent 操作浏览器的新思路" /><published>2026-05-16T00:00:00+08:00</published><updated>2026-05-16T00:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/16/kimi-webbridge-local-browser-agent</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/16/kimi-webbridge-local-browser-agent/"><![CDATA[<p>当 OpenAI Operator 和 Anthropic Computer Use 把浏览器自动化搬到云端时，月之暗面选择了一条相反的路：让 AI Agent 直接操作你本地 Chrome 窗口里的真实网页。</p>

<p>这条路径的核心差异不是「谁能点按钮」，而是<strong>数据主权归谁</strong>。</p>

<h2 id="为什么云端方案不够">为什么云端方案不够</h2>

<p>现有的 AI 浏览器自动化工具大致分两类：</p>

<p>一类是云端托管浏览器，比如 OpenAI Operator、Perplexity Comet。Agent 在服务商的服务器上运行一个无头浏览器，你通过自然语言发指令。问题是：你的登录态、Cookie、页面内容全部流经第三方基础设施。</p>

<p>另一类是桌面级自动化，比如 Anthropic Computer Use。它在你的机器上运行，但通常需要独立的虚拟桌面或容器环境，与日常使用的浏览器隔离。</p>

<p>对于企业场景，这两类方案都有硬伤：</p>

<ul>
  <li><strong>敏感数据外泄</strong>：内部系统、银行页面、邮件内容不可能送到云端</li>
  <li><strong>登录态隔离</strong>：云端浏览器没有你的企业 SSO 登录态，遇到需要身份验证的页面直接卡住</li>
  <li><strong>上下文断裂</strong>：自动化浏览器和日常浏览器是两回事，用户需要来回切换</li>
</ul>

<p>Kimi WebBridge 的解法很直接：<strong>不新建浏览器，直接接管你已经在用的那个。</strong></p>

<h2 id="架构拆解本地优先意味着什么">架构拆解：本地优先意味着什么</h2>

<p>WebBridge 由两部分组成：</p>

<pre><code class="language-mermaid">flowchart LR
    A[Chrome Extension] &lt;--&gt;|Chrome DevTools Protocol| B[Local Background Service]
    B &lt;--&gt;|WebSocket / stdio| C[AI Agent&lt;br/&gt;Claude Code / Cursor / Codex]
</code></pre>

<p><strong>浏览器扩展</strong>安装在现有 Chrome/Edge 中，拥有当前页面的完整访问权限——包括 Cookie、LocalStorage、登录态。</p>

<p><strong>本地后台服务</strong>是一个独立进程，通过 Chrome DevTools Protocol（CDP）与扩展通信。CDP 是开发者调试浏览器时用的同一套底层接口，可以执行点击、输入、截图、DOM 查询等操作。</p>

<p><strong>Agent 连接</strong>支持多种方式：Kimi Code CLI 原生集成；Claude Code、Cursor、Codex 通过一条连接命令接入。</p>

<p>关键设计：Moonshot 的服务器不参与任何页面内容传输。扩展和后台服务之间的通信完全在本地完成。</p>

<h2 id="与-mcp-生态的关系">与 MCP 生态的关系</h2>

<p>今年 Google 官方推出了 Chrome DevTools MCP Server，让 AI 编码助手能通过 MCP 协议调试网页。WebBridge 和它的关系值得理清：</p>

<table>
  <thead>
    <tr>
      <th>维度</th>
      <th>Chrome DevTools MCP</th>
      <th>Kimi WebBridge</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>定位</td>
      <td>调试与性能分析工具</td>
      <td>通用浏览器自动化</td>
    </tr>
    <tr>
      <td>浏览器</td>
      <td>需单独启动调试实例</td>
      <td>直接复用现有窗口</td>
    </tr>
    <tr>
      <td>登录态</td>
      <td>无（干净环境）</td>
      <td>继承当前用户登录态</td>
    </tr>
    <tr>
      <td>适用场景</td>
      <td>开发调试、性能审计</td>
      <td>数据采集、表单填写、跨站整合</td>
    </tr>
    <tr>
      <td>协议</td>
      <td>MCP over stdio</td>
      <td>自定义协议 + CDP</td>
    </tr>
  </tbody>
</table>

<p>两者不是竞争关系，而是互补。开发阶段用 Chrome DevTools MCP 调试页面；生产自动化用 WebBridge 操作真实业务环境。</p>

<p>一个更实际的观察是：MCP 作为协议层正在标准化工具调用的接口，但具体「工具做什么」仍然由各实现决定。WebBridge 可以被视为一种特殊的「浏览器工具」，未来完全可能通过 MCP 暴露给更多 Agent。</p>

<h2 id="能做什么不能做什么">能做什么，不能做什么</h2>

<p>从现有信息看，WebBridge 支持的操作包括：</p>

<ul>
  <li>打开页面、点击元素、填写表单</li>
  <li>滚动、截图、提取文本</li>
  <li>跨站点内容整合</li>
  <li>在已登录状态下操作（如后台管理、SaaS 平台）</li>
</ul>

<p>典型场景举例：</p>

<blockquote>
  <p>“从 LinkedIn 搜索 5 个符合条件的候选人，把姓名和职位整理成表格”</p>
</blockquote>

<p>Agent 会打开 LinkedIn（已登录）、执行搜索、逐一点开个人页、提取信息、汇总输出。全程不需要你手动操作。</p>

<p>但限制也很明显：</p>

<ul>
  <li><strong>依赖页面稳定性</strong>：DOM 结构一变，选择器可能失效</li>
  <li><strong>无法处理复杂验证码</strong>：图形验证码、reCAPTCHA 等仍需人工介入</li>
  <li><strong>长流程可靠性未知</strong>：涉及 10+ 步骤的跨站操作，中间任一环节失败都会中断</li>
</ul>

<h2 id="工程视角的评估">工程视角的评估</h2>

<h3 id="安全模型">安全模型</h3>

<p>本地优先架构的安全优势是真实的：页面内容、Cookie、截图都不离开本机。但需要注意两个细节：</p>

<ol>
  <li><strong>Agent 本身仍然可能泄露数据</strong>。如果连接的是云端模型（如 Claude API），页面提取的文本会被发送到模型服务商</li>
  <li><strong>后台服务的权限边界</strong>。CDP 的权限很高，能做的事不止「点击按钮」。需要确认本地服务是否有沙箱隔离</li>
</ol>

<h3 id="与-rpa-的区别">与 RPA 的区别</h3>

<p>传统的 RPA（Robotic Process Automation）工具也能做浏览器自动化，但通常基于录制回放或固定脚本。WebBridge 的差异在于：</p>

<ul>
  <li><strong>自然语言驱动</strong>：用 prompt 描述目标，而非预定义步骤</li>
  <li><strong>视觉理解</strong>：结合截图让模型判断页面状态</li>
  <li><strong>容错能力</strong>：遇到意外弹窗或布局变化，模型可以尝试重新定位元素</li>
</ul>

<h3 id="性能考量">性能考量</h3>

<p>CDP 操作本身很快，但瓶颈在模型推理。每步操作（截图 → 发送模型 → 解析响应 → 执行点击）的延迟取决于模型服务商的响应时间。本地模型（如 Kimi K2.6）可以消除网络延迟，但硬件要求更高。</p>

<h2 id="对国内团队的启示">对国内团队的启示</h2>

<p>WebBridge 的发布释放了一个明确信号：浏览器自动化正在从「云端托管」向「本地原生」分化。</p>

<p>对于需要操作内部系统的企业，本地方案几乎是唯一选择。几点直接可用的参考：</p>

<p><strong>第一，评估现有 RPA 工具的替代可能。</strong> 如果团队已经在用 Selenium、Playwright 写固定脚本，可以尝试用 Agent 驱动同一套底层能力，把「写脚本」变成「写 prompt」。</p>

<p><strong>第二，关注 MCP 协议的浏览器工具链。</strong> Chrome DevTools MCP、Playwright MCP 等正在形成标准接口，未来 Agent 切换浏览器后端的成本会降低。</p>

<p><strong>第三，安全策略需要重新设计。</strong> 本地 Agent 操作浏览器意味着「人 + AI」共用同一套身份。传统的「按人授权」模型需要扩展为「按会话授权」，区分人工操作和 Agent 操作的行为边界。</p>

<h2 id="总结与行动">总结与行动</h2>

<p>Kimi WebBridge 的价值不在于技术突破，而在于它选择了一个被忽视的方向：<strong>在数据主权和自动化能力之间，优先保证前者。</strong></p>

<p>三个关键判断：</p>

<ol>
  <li><strong>本地优先是刚需，不是偏好。</strong> 涉及登录态和敏感数据的场景，云端方案天然不适用</li>
  <li><strong>CDP 是事实标准。</strong> Chrome DevTools Protocol 已经成为浏览器自动化的通用底层，围绕它的工具生态会继续扩大</li>
  <li><strong>Agent + 浏览器的组合还在早期。</strong> 可靠性和容错能力距离生产级要求有差距，适合辅助场景而非关键流程</li>
</ol>

<p>如果你正在探索 AI Agent 的落地场景，可以从一个低风险任务开始：让 Agent 帮你整理周报数据、汇总竞品信息、或批量处理后台表单。用 WebBridge 或 Playwright MCP 都可以，重点不是工具，而是验证「自然语言驱动浏览器」在你的业务场景里是否可靠。</p>

<hr />

<p><strong>参考来源：</strong></p>

<ul>
  <li><a href="https://www.kimi.com/features/webbridge">Kimi WebBridge 官方页面</a></li>
  <li><a href="https://chromewebstore.google.com/detail/kimi-webbridge/fldmhceldgbpfpkbgopacenieobmligc">Chrome Web Store - Kimi WebBridge</a></li>
  <li><a href="https://developer.chrome.com/blog/chrome-devtools-mcp">Chrome DevTools MCP - Google Developers</a></li>
  <li><a href="https://www.webfuse.com/blog/the-top-5-best-mcp-servers-for-ai-agent-browser-automation">5 Best MCP Servers for Browser Automation - Webfuse</a></li>
</ul>]]></content><author><name>王翊仰</name></author><category term="AI" /><category term="Agent" /><summary type="html"><![CDATA[月之暗面推出 Kimi WebBridge，让 AI Agent 在本地直接操控浏览器。与云端方案不同，它通过 Chrome DevTools Protocol 在设备本地运行，登录态和页面数据不出本机。]]></summary></entry><entry><title type="html">LLM 正在瓦解 20 年的云原生架构假设</title><link href="https://www.wangyiyang.cc/2026/05/15/llms-breaking-system-design/" rel="alternate" type="text/html" title="LLM 正在瓦解 20 年的云原生架构假设" /><published>2026-05-15T09:30:00+08:00</published><updated>2026-05-15T09:30:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/15/llms-breaking-system-design</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/15/llms-breaking-system-design/"><![CDATA[<blockquote>
  <p>过去十年，”云原生”架构建立在一个 20 年前的假设上：状态存储在数据库，计算是无状态的。LLM 和 Agent 的出现，正在从三个维度瓦解这个假设。</p>
</blockquote>

<h2 id="一个正在失效的架构契约">一个正在失效的架构契约</h2>

<p>2006 年左右，Web 架构达成了一项隐性契约：</p>

<ul>
  <li><strong>数据库 = 状态</strong></li>
  <li><strong>应用服务器 = 无状态</strong></li>
  <li><strong>负载均衡器 = 不关心请求发给谁</strong></li>
</ul>

<p>这套设计让水平扩展变得简单——数据库垂直扩容（换更大的机器），应用服务器水平扩容（增加更多机器）。任何请求都可以发给任何服务器，负载均衡器只需要做轮询。</p>

<p>这个假设支撑了从单体到微服务的整个演进路径，也定义了我们熟悉的 “stateless HTTP + load balancer + database” 三元组。</p>

<p>但 LLM 和 Agent 正在让这套契约失效。</p>

<h2 id="三个被违反的假设">三个被违反的假设</h2>

<h3 id="假设一请求应该在毫秒级完成">假设一：请求应该在毫秒级完成</h3>

<p>传统 API 设计假设一次请求在几百毫秒内返回。但一个 Agent 任务可能运行 10 分钟——调用工具、等待结果、继续推理、再调用下一个工具。</p>

<p>这不是 “慢请求”，这是 <strong>异步进程</strong>。</p>

<h3 id="假设二计算应该是无状态的">假设二：计算应该是无状态的</h3>

<p>无状态意味着服务器不保留任何请求间的上下文。但多轮对话、工具调用链、累积的上下文窗口——这些都是 <strong>Agent 的记忆</strong>，不是数据库状态。</p>

<p>把 Agent 的每一步推理结果都写回数据库，再用轮询拉回来，本质上是在用数据库当消息总线。</p>

<h3 id="假设三用户只需要结果不需要过程">假设三：用户只需要结果，不需要过程</h3>

<p>传统架构假设客户端发起请求、拿到响应、结束。但用户想 <strong>观看</strong> Agent 的思考过程、<strong>中断</strong> 错误的推理方向、<strong>重定向</strong> 任务目标。</p>

<p>这是一种与进程的 <strong>双向对话</strong>，不是一次性的状态less查询。</p>

<h2 id="为什么-durable-execution-不够">为什么 Durable Execution 不够</h2>

<p>Temporal、Inngest、Restate 等 Durable Execution 框架解决了 <strong>执行韧性</strong> 问题——让长进程在崩溃后能够恢复。但它们没有解决 <strong>交互</strong> 问题。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┌─────────────┐     HTTP      ┌─────────────┐
│   Client    │ ────────────▶ │   Server    │
└─────────────┘               └─────────────┘
                                    │
                                    ▼
                              ┌─────────────┐
                              │  Temporal   │
                              │  Workflow   │
                              └─────────────┘
                                    │
                    ┌───────────────┼───────────────┐
                    ▼               ▼               ▼
              ┌─────────┐    ┌─────────┐    ┌─────────┐
              │  Poll   │    │  Poll   │    │  Poll   │
              └─────────┘    └─────────┘    └─────────┘
</code></pre></div></div>

<p>上图是当前的主流方案：Durable Execution 负责 resilient 执行，但客户端仍然通过轮询数据库获取进度。</p>

<p><strong>轮询是一个路由问题的 workaround。</strong></p>

<p>HTTP + 负载均衡器 + 无状态服务器 无法路由到特定进程。它只能路由到数据库。所以业界发明了轮询这个通用 workaround——但 latency、数据库负载、浪费的请求、糟糕的流式体验，这些问题一个都没解决。</p>

<blockquote>
  <p>“Polling is what you do when you can’t figure out how to address the thing you want to talk to.”</p>
</blockquote>

<h2 id="缺失的原语可路由的传输名称">缺失的原语：可路由的传输名称</h2>

<p>我们需要的是一个 <strong>可路由的传输名称</strong>，它不是服务器，不是连接，而是一个 <strong>地址</strong>。</p>

<p>目标是：”把这条消息交付给正在为 workflow X 产生输出的那个进程”——而无需知道它在哪台机器、哪个副本、哪个进程 ID。</p>

<h3 id="websocket-为什么不行">WebSocket 为什么不行</h3>

<p>WebSocket 是 <strong>连接</strong>，不是地址。它通过直接的客户端-服务器链路一次性解决了路由问题，但连接断开后，”地址” 就丢失了。你无法重新连接到同一个进程。</p>

<h3 id="pubsub-channel-的反转">Pub/Sub Channel 的反转</h3>

<p>Pub/Sub Channel 反转了所有权：</p>

<ul>
  <li>服务器进程不可寻址</li>
  <li>客户端不可寻址</li>
  <li><strong>传输通道本身可寻址</strong></li>
</ul>

<p>双方都通过 <strong>名称</strong> 连接到同一个 channel，实现双向、有状态的通信。连接断开/重连不会丢失数据或破坏路由。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┌─────────────┐         ┌─────────────┐
│   Client    │◄───────►│   Channel   │◄───────►│  Workflow   │
│  (any box)  │  "wf-123"│  (by name)  │  "wf-123"│  (any box)  │
└─────────────┘         └─────────────┘         └─────────────┘
       │                                               │
       └──────────── 双向通信，双方都可断开/重连 ─────────────┘
</code></pre></div></div>

<p>Temporal 的示例：workflow activity 连接到以 <code class="language-plaintext highlighter-rouge">workflow ID</code> 命名的 pub/sub channel，客户端也连接到同一个 channel 获取更新 + 发送中断/转向指令。无论 workflow 进程还是客户端连接如何中断，重连到同一个 channel 就能恢复通信。</p>

<p>这消除了：</p>
<ul>
  <li>通过数据库传递数据</li>
  <li>轮询</li>
  <li>无法寻址的 durable 进程</li>
</ul>

<h2 id="为什么-llm-让这个问题显性化">为什么 LLM 让这个问题显性化</h2>

<p>这个问题不是 LLM 带来的，但 LLM 让它的代价变得不可接受：</p>

<table>
  <thead>
    <tr>
      <th>属性</th>
      <th>影响</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>非确定性</td>
      <td>重试 ≠ 相同响应</td>
    </tr>
    <tr>
      <td>高成本（按 token 计费）</td>
      <td>浪费的 token = 真金白银</td>
    </tr>
    <tr>
      <td>连接脆弱性</td>
      <td>“客户端进了隧道” = 昂贵的失败</td>
    </tr>
  </tbody>
</table>

<p>以前连接断开，请求足够便宜可以重试，而且响应是确定性的。现在一个 10 分钟的 Agent 任务中断后重试，可能产生完全不同的结果，而且你已经为中断前的 token 付过费了。</p>

<p>你也不想为了让客户端连接更 resilient，就把每个 token 都写进数据库。</p>

<h2 id="推荐的架构分层">推荐的架构分层</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>┌─────────────────────────────────────────────┐
│           Stateless HTTP Layer              │
│    (传统请求/响应，短连接，无状态)            │
├─────────────────────────────────────────────┤
│         Durable Execution Layer             │
│    (Temporal/Restate，长进程，执行韧性)       │
├─────────────────────────────────────────────┤
│         Pub/Sub Channel Layer               │
│    (可寻址、可重连、双向传输)                 │
└─────────────────────────────────────────────┘
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>层级</th>
      <th>职责</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Stateless HTTP</strong></td>
      <td>传统请求/响应</td>
    </tr>
    <tr>
      <td><strong>Durable Execution</strong></td>
      <td>韧性长进程</td>
    </tr>
    <tr>
      <td><strong>Pub/Sub Channel</strong></td>
      <td>可寻址、可重连、双向传输</td>
    </tr>
  </tbody>
</table>

<p>无状态 Web 没有错，它只是不适合 Agentic 应用——这些应用需要长运行、有状态、可交互的进程。我们需要一种新的架构，包含能够寻址 <strong>进程</strong> 而不仅仅是数据库的路由原语。</p>

<h2 id="实战一个最小可用的-agent-通道设计">实战：一个最小可用的 Agent 通道设计</h2>

<p>假设你正在构建一个内部 AI 平台，支持多步 Agent 工作流。以下是一个最小可用的 channel 设计：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">asyncio</span>
<span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AsyncIterator</span><span class="p">,</span> <span class="n">Callable</span>

<span class="o">@</span><span class="n">dataclass</span>
<span class="k">class</span> <span class="nc">AgentChannel</span><span class="p">:</span>
    <span class="s">"""可寻址的 Agent 通信通道"""</span>
    <span class="n">workflow_id</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">_inbox</span><span class="p">:</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">Queue</span>
    <span class="n">_outbox</span><span class="p">:</span> <span class="n">asyncio</span><span class="p">.</span><span class="n">Queue</span>
    
    <span class="k">async</span> <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="s">"""向 workflow 发送指令/中断"""</span>
        <span class="k">await</span> <span class="bp">self</span><span class="p">.</span><span class="n">_inbox</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
    
    <span class="k">async</span> <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AsyncIterator</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
        <span class="s">"""接收 workflow 的流式输出"""</span>
        <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
            <span class="n">msg</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="p">.</span><span class="n">_outbox</span><span class="p">.</span><span class="n">get</span><span class="p">()</span>
            <span class="k">if</span> <span class="n">msg</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"type"</span><span class="p">)</span> <span class="o">==</span> <span class="s">"done"</span><span class="p">:</span>
                <span class="k">break</span>
            <span class="k">yield</span> <span class="n">msg</span>

<span class="k">class</span> <span class="nc">ChannelRegistry</span><span class="p">:</span>
    <span class="s">"""按 workflow_id 寻址的通道注册表"""</span>
    <span class="n">_channels</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">AgentChannel</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
    
    <span class="o">@</span><span class="nb">classmethod</span>
    <span class="k">def</span> <span class="nf">get_or_create</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">workflow_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AgentChannel</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">workflow_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cls</span><span class="p">.</span><span class="n">_channels</span><span class="p">:</span>
            <span class="n">cls</span><span class="p">.</span><span class="n">_channels</span><span class="p">[</span><span class="n">workflow_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">AgentChannel</span><span class="p">(</span>
                <span class="n">workflow_id</span><span class="o">=</span><span class="n">workflow_id</span><span class="p">,</span>
                <span class="n">_inbox</span><span class="o">=</span><span class="n">asyncio</span><span class="p">.</span><span class="n">Queue</span><span class="p">(),</span>
                <span class="n">_outbox</span><span class="o">=</span><span class="n">asyncio</span><span class="p">.</span><span class="n">Queue</span><span class="p">(),</span>
            <span class="p">)</span>
        <span class="k">return</span> <span class="n">cls</span><span class="p">.</span><span class="n">_channels</span><span class="p">[</span><span class="n">workflow_id</span><span class="p">]</span>
    
    <span class="o">@</span><span class="nb">classmethod</span>
    <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">workflow_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">cls</span><span class="p">.</span><span class="n">_channels</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="n">workflow_id</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
</code></pre></div></div>

<p>这个设计的核心思想：</p>

<ul>
  <li><strong>Channel 是地址</strong>，不是连接</li>
  <li><strong>Workflow ID 是路由键</strong>，不是进程 ID</li>
  <li><strong>双方都可以断开/重连</strong>，不影响通信连续性</li>
</ul>

<h2 id="踩坑与对比">踩坑与对比</h2>

<h3 id="常见错误一用数据库当消息总线">常见错误一：用数据库当消息总线</h3>

<p>把 Agent 的每一步输出都写入数据库，客户端轮询读取。这在小规模可行，但：</p>

<ul>
  <li>数据库成为瓶颈</li>
  <li>轮询间隔 = latency 与负载的权衡</li>
  <li>流式体验差</li>
</ul>

<h3 id="常见错误二websocket-直接连接-agent-进程">常见错误二：WebSocket 直接连接 Agent 进程</h3>

<p>WebSocket 连接绑定到特定进程，进程崩溃后客户端无法重连到同一逻辑工作流。</p>

<h3 id="备选方案对比">备选方案对比</h3>

<table>
  <thead>
    <tr>
      <th>方案</th>
      <th>优点</th>
      <th>缺点</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>数据库轮询</td>
      <td>简单，无需新基础设施</td>
      <td>高延迟，数据库负载，差体验</td>
    </tr>
    <tr>
      <td>WebSocket</td>
      <td>实时双向</td>
      <td>连接即地址，不可重连</td>
    </tr>
    <tr>
      <td>Server-Sent Events</td>
      <td>单向流式</td>
      <td>无客户端→服务端通道</td>
    </tr>
    <tr>
      <td><strong>Pub/Sub Channel</strong></td>
      <td>可寻址，可重连，双向</td>
      <td>需要额外基础设施</td>
    </tr>
  </tbody>
</table>

<h2 id="总结与行动">总结与行动</h2>

<ol>
  <li><strong>识别你的 Agent 工作流</strong>：哪些任务超过 10 秒？哪些需要用户交互？</li>
  <li><strong>评估当前架构</strong>：是否在用数据库轮询或 WebSocket 直接连接？</li>
  <li><strong>引入 Channel 抽象</strong>：即使先用 Redis Pub/Sub 或 SSE + 重连逻辑，也比轮询更接近正确方向</li>
  <li><strong>分离关注点</strong>：Stateless HTTP 处理短请求，Durable Execution 处理长进程，Channel 处理双向交互</li>
  <li><strong>从小处开始</strong>：不需要一次性替换整个架构，先在一个 Agent 工作流中验证 Channel 模式</li>
</ol>

<hr />

<p><strong>参考</strong></p>

<ul>
  <li><a href="https://zknill.io/posts/llms-are-breaking-20-year-old-system-design/">LLMs are breaking 20 year old system design</a> — /dev/knill</li>
  <li><a href="https://www.infoq.com/presentations/ai-software-development/">Accelerating LLM-Driven Developer Productivity at Zoox</a> — InfoQ QCon SF 2026</li>
</ul>]]></content><author><name>王翊仰</name></author><category term="AI Engineering" /><category term="System Design" /><category term="LLM" /><category term="Agent" /><category term="Cloud Native" /><category term="Stateful Compute" /><category term="Durable Execution" /><summary type="html"><![CDATA[过去十年，”云原生”架构建立在一个 20 年前的假设上：状态存储在数据库，计算是无状态的。LLM 和 Agent 的出现，正在从三个维度瓦解这个假设。]]></summary></entry><entry><title type="html">Zoox Cortex Ai Gateway</title><link href="https://www.wangyiyang.cc/2026/05/15/zoox-cortex-ai-gateway/" rel="alternate" type="text/html" title="Zoox Cortex Ai Gateway" /><published>2026-05-15T00:00:00+08:00</published><updated>2026-05-15T00:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/15/zoox-cortex-ai-gateway</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/15/zoox-cortex-ai-gateway/"><![CDATA[<h1 id="zoox-cortex一个无框架的-ai-gateway-生产实践">Zoox Cortex：一个无框架的 AI Gateway 生产实践</h1>

<blockquote>
  <p>当大多数团队还在争论「用 LangChain 还是 LlamaIndex」时，Zoox 的工程师选择了一条更激进的路：不用任何框架，从零搭建一个支撑 100+ 内部客户端、多模型、多模态、Agent 工作流的 AI Gateway。这个决策背后的思考，比框架选型本身更值得参考。</p>
</blockquote>

<h2 id="痛点为什么现成的方案不够用">痛点：为什么现成的方案不够用</h2>

<p>Zoox 是一家自动驾驶公司，工程师需要处理的问题高度复杂：代码库庞大、文档散落在 Confluence/GitHub/Slack、涉及文本/图像/视频多种数据类型，且对安全和合规有严格要求。</p>

<p>2025 年之前，团队尝试过直接使用 ChatGPT 等公开工具，很快发现三个致命问题：</p>

<p><strong>第一，数据出不去。</strong> 核心代码、车辆数据、乘客信息不可能送到第三方云端。</p>

<p><strong>第二，集成深度不够。</strong> 公开工具无法访问 Zoox 内部的 Jira、Confluence、Slack、部署系统，回答永远停留在「通用建议」层面。</p>

<p><strong>第三，团队各自为战。</strong> 不同组用不同工具，有人用 Claude，有人用 GPT，有人自己搭 RAG——能力重复建设，经验无法复用。</p>

<p>这三个问题指向同一个结论：<strong>企业需要的不是「更好的模型」，而是「可控的 AI 基础设施」。</strong></p>

<h2 id="cortex-的架构演进">Cortex 的架构演进</h2>

<p>Zoox 的解法是从一个薄层开始，逐步演化成完整平台：</p>

<pre><code class="language-mermaid">flowchart LR
    A[Phase 1: AWS Bedrock Gateway] --&gt; B[Phase 2: Multi-Modality APIs]
    B --&gt; C[Phase 3: LiteLLM Multi-Provider]
    C --&gt; D[Phase 4: RAG Pipelines]
    D --&gt; E[Phase 5: Agent Loop]
    E --&gt; F[Phase 6: Agents-as-API]
</code></pre>

<p><strong>第一阶段：统一模型访问。</strong> 通过 AWS Bedrock 接入 Claude、Nova 等模型，解决「多模型切换」问题。</p>

<p><strong>第二阶段：多模态支持。</strong> 增加图像、视频、音频的推理 API，满足自动驾驶场景对视觉数据的分析需求。</p>

<p><strong>第三阶段：多供应商抽象。</strong> 引入 LiteLLM 统一不同云厂商的 API 差异，随后接入 GCP + Gemini，补足视觉任务能力。</p>

<p><strong>第四阶段：RAG 知识库。</strong> 关键洞察来自生产实践：「为每个数据源单独建知识库，比把所有文档塞进一个向量库效果好得多」。Confluence、Slack、GitHub README 分别建库，检索准确率显著提升。</p>

<p><strong>第五阶段：Agent 能力。</strong> LLM + Tools 的循环推理，让系统能自主决定调用哪些内部工具。</p>

<p><strong>第六阶段：Agents-as-API。</strong> 这是 Cortex 最具差异化的设计。</p>

<h2 id="agents-as-api把-agent-变成基础设施">Agents-as-API：把 Agent 变成基础设施</h2>

<p>传统 Agent 框架（Google ADK、LangChain 等）的部署模式是：每个团队自己搭一套 Agent 运行时，维护工具注册、执行环境、安全策略。</p>

<p>Cortex 反过来了：</p>

<pre><code class="language-mermaid">flowchart TB
    subgraph "传统模式"
        T1[团队A Agent] --&gt; T1Tools[自建工具栈]
        T2[团队B Agent] --&gt; T2Tools[自建工具栈]
    end
    subgraph "Cortex 模式"
        C1[团队A 调用 API] --&gt; Gateway[Cortex Gateway]
        C2[团队B 调用 API] --&gt; Gateway
        Gateway --&gt; Registry[中央工具注册表]
        Gateway --&gt; Execution[统一执行/安全/观测]
    end
</code></pre>

<p>团队只需要做两件事：</p>
<ol>
  <li>在中央注册表里定义自己的工具</li>
  <li>调用 REST API，传入 <code class="language-plaintext highlighter-rouge">{model, prompt, tool_list}</code></li>
</ol>

<p>Cortex 负责启动轻量级 Agent、执行工具调用、处理限流、配额、审计、人工确认。团队只关心业务逻辑，平台负责执行、扩缩容和安全。</p>

<p>一个具体例子：Zoox Intelligence Slack Bot 在同一个代码部署下，为不同频道激活不同工具集——基础设施频道用「事件管理 + 部署工具」，招聘频道用「日历 + 邮件工具」。配置一变，行为就变，无需改代码。</p>

<h2 id="关键工程决策">关键工程决策</h2>

<h3 id="不用框架自己写">不用框架，自己写</h3>

<p>Cortex 刻意避开了 LangChain、LlamaIndex 等框架。原因很务实：</p>

<ul>
  <li><strong>框架更新太快</strong>，生产环境经不起频繁 breaking change</li>
  <li><strong>抽象层太厚</strong>，出问题后调试困难</li>
  <li><strong>需求太特殊</strong>，自动驾驶场景的很多需求（多模态、实时性、车规合规）框架本身不支持</li>
</ul>

<blockquote>
  <p>这不是说框架不好，而是说：<strong>当你的规模足够大、场景足够特殊时，框架的「通用性」反而成为负担。</strong></p>
</blockquote>

<h3 id="工作流优先于-agent">工作流优先于 Agent</h3>

<p>Zoox 内部把 AI 应用分为两类：</p>

<table>
  <thead>
    <tr>
      <th>类型</th>
      <th>特征</th>
      <th>适用场景</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Workflow</strong></td>
      <td>确定性，固定步骤</td>
      <td>告警触发 → AI 总结日志 → 通知值班</td>
    </tr>
    <tr>
      <td><strong>Agent</strong></td>
      <td>非确定性，模型自主决策</td>
      <td>开放性问题，需要多步推理</td>
    </tr>
  </tbody>
</table>

<p><strong>推荐策略：先从 Workflow 开始，只有真正需要自主性时才引入 Agent。</strong></p>

<p>Workflow 可预测、可测试、好调试。Agent 灵活但难排查。Zoox 的实践经验是，80% 的场景用 Workflow 就够了。</p>

<h3 id="人工确认不是可选项">人工确认不是可选项</h3>

<p>Cortex 对所有「写操作」工具强制加 <code class="language-plaintext highlighter-rouge">@require_confirmation</code> 装饰器。Agent 调用时，先展示详情给用户，等待确认后才执行。</p>

<p>一个真实教训：某 Agent 未经确认就在公共频道向法务团队发消息索要权限。如果没有这道关卡，类似操作的后果可能更严重。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">@</span><span class="n">require_confirmation</span>
<span class="k">def</span> <span class="nf">create_jira_ticket</span><span class="p">(</span><span class="n">title</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">description</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
    <span class="s">"""创建 JIRA 工单，需要人工确认"""</span>
    <span class="c1"># 业务逻辑...
</span></code></pre></div></div>

<h2 id="生产踩坑记录">生产踩坑记录</h2>

<h3 id="大媒体输入的-ddos-风险">大媒体输入的 DDoS 风险</h3>

<p>高分辨率图像直接送入模型会打爆平台。必须在前置层做验证和预处理，按场景决定分辨率上限。</p>

<h3 id="夜间鱼眼图像的识别难题">夜间鱼眼图像的识别难题</h3>

<p>自动驾驶场景的夜间鱼眼图像，连人类都难以辨认，不能对模型期望过高。需要结合传统 CV 做预处理。</p>

<h3 id="实时-vs-批量的资源隔离">实时 vs 批量的资源隔离</h3>

<p>百万级标注图像属于批量任务，应该走 Bedrock/GCP 的批处理通道，而不是占用 Cortex 的实时推理资源。</p>

<h3 id="mcp-的过度设计陷阱">MCP 的「过度设计」陷阱</h3>

<p>Zoox 对 MCP 持谨慎态度，认为它「试图做太多事情」。在内部工具已经足够标准化的情况下，引入 MCP 的复杂度大于收益。</p>

<h2 id="与行业方案的对比">与行业方案的对比</h2>

<table>
  <thead>
    <tr>
      <th>维度</th>
      <th>Cortex</th>
      <th>典型框架方案（LangChain 等）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>部署模式</td>
      <td>集中式 Gateway</td>
      <td>各团队自建运行时</td>
    </tr>
    <tr>
      <td>工具管理</td>
      <td>中央注册表</td>
      <td>各项目独立维护</td>
    </tr>
    <tr>
      <td>安全策略</td>
      <td>统一强制（确认、限流、审计）</td>
      <td>依赖各团队实现</td>
    </tr>
    <tr>
      <td>模型切换</td>
      <td>配置即切换</td>
      <td>通常需要改代码</td>
    </tr>
    <tr>
      <td>适用规模</td>
      <td>100+ 客户端的企业</td>
      <td>小团队快速验证</td>
    </tr>
  </tbody>
</table>

<h2 id="对国内团队的启示">对国内团队的启示</h2>

<p>Cortex 的实践对正在建设 AI 平台的技术负责人有几个直接可用的参考：</p>

<p><strong>第一，RAG 不要做大杂烩。</strong> 按数据源拆知识库，检索准确率比「一个超大向量库」高得多。</p>

<p><strong>第二，Agent 不是银弹。</strong> 先把确定性流程用 Workflow 跑起来，再考虑哪里需要 Agent 的自主性。</p>

<p><strong>第三，安全策略必须内建在平台层。</strong> 不能指望每个业务团队自己实现人工确认、限流、审计——这些应该由平台统一提供。</p>

<p><strong>第四，框架选型要务实。</strong> 不是「不用框架就高级」，而是「框架的抽象是否匹配你的场景」。团队规模小、需求标准，用框架更快；规模大、需求特殊，自研更可控。</p>

<h2 id="总结与行动">总结与行动</h2>

<p>Zoox Cortex 的核心价值不在于技术有多新，而在于它回答了一个务实的问题：<strong>企业级 AI 平台到底该长什么样？</strong></p>

<p>它的答案可以概括为三点：</p>

<ol>
  <li><strong>模型是插件，不是核心。</strong> 今天用 Claude，明天切 GPT，平台层不应该感知差异。</li>
  <li><strong>Agent 是 API，不是应用。</strong> 业务团队不应该维护 Agent 运行时，只应该调用 Agent 能力。</li>
  <li><strong>安全是默认，不是配置。</strong> 人工确认、限流、审计、配额——这些必须是平台级强制策略，不是可选项。</li>
</ol>

<p>如果你正在规划或建设内部的 AI 平台，不妨用这三个标准审视现有方案：模型切换成本有多高？业务团队维护 Agent 的负担有多重？安全策略是统一强制还是各自实现？</p>

<p>Cortex 用一年多的生产实践证明了：无框架不是目的，可控才是。</p>

<hr />

<p><strong>参考来源：</strong> <a href="https://www.infoq.com/presentations/ai-software-development/">Accelerating LLM-Driven Developer Productivity at Zoox</a> - Amit Navindgi, InfoQ 2026</p>]]></content><author><name>王翊仰</name></author><summary type="html"><![CDATA[Zoox Cortex：一个无框架的 AI Gateway 生产实践]]></summary></entry><entry><title type="html">Coder Agents 深度解读：如何在自托管基础设施上安全运行 AI 编码工作流</title><link href="https://www.wangyiyang.cc/2026/05/14/coder-agents-self-hosted/" rel="alternate" type="text/html" title="Coder Agents 深度解读：如何在自托管基础设施上安全运行 AI 编码工作流" /><published>2026-05-14T09:00:00+08:00</published><updated>2026-05-14T09:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/14/coder-agents-self-hosted</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/14/coder-agents-self-hosted/"><![CDATA[<p><img src="/images/posts/coder-agents-self-hosted_1200x630.jpg" alt="cover" /></p>

<blockquote>
  <p>当 AI 编码工具从「玩具」变成「生产基础设施」，企业面临的核心问题不再是「用哪个模型」，而是「如何在保证安全与可控的前提下，让 AI 真正融入开发工作流」。Coder Agents 给出的答案值得关注。</p>
</blockquote>

<h2 id="背景ai-编码代理的最后一公里难题">背景：AI 编码代理的「最后一公里」难题</h2>

<p>2025 年到 2026 年，AI 编码工具经历了从「尝鲜」到「常态化」的跨越。GitHub Copilot、Cursor、Claude Code、Codex CLI……这些工具让开发者的效率获得了数量级的提升。但企业在规模化落地时，很快撞上了一堵墙：</p>

<p><strong>云服务的便利性与企业治理需求之间的冲突。</strong></p>

<p>代码是企业的核心资产。让 AI 模型在第三方云端处理内部代码，涉及数据隐私、合规审计、安全边界等一系列敏感问题。更棘手的是，不同团队可能使用不同的 AI 工具，导致执行环境碎片化、管理策略难以统一。</p>

<p>Coder（一家专注于云开发环境的公司）看到了这个痛点，并于 2026 年 5 月推出了 <strong>Coder Agents</strong>——一个模型无关的 AI 编码代理编排平台。</p>

<h2 id="coder-agents-是什么">Coder Agents 是什么</h2>

<p>Coder Agents 的核心理念可以用一句话概括：<strong>把「智能」和「基础设施」解耦。</strong></p>

<p>智能来自 AI 模型（Claude、GPT、Gemini 等），但代理的执行方式、工作空间管理、计算资源分配、行为控制策略——这些基础设施层面的能力，由 Coder Agents 统一提供。</p>

<blockquote>
  <p>“Intelligence continues to come from the models, but how agents execute, how workspaces and compute are provisioned, and how behavior is controlled become consistent across the organization.”
—— Coder 官方博客</p>
</blockquote>

<p>这意味着什么？企业可以：</p>

<ul>
  <li><strong>自由选择模型</strong>：今天用 Claude，明天切换到 GPT-5，后天尝试开源模型——代理的执行框架不变</li>
  <li><strong>完全自托管</strong>：所有代码、数据、执行环境都在企业自己的基础设施内</li>
  <li><strong>统一治理</strong>：模型访问权限、提示词管理、执行策略、可观测性——全部集中管控</li>
</ul>

<h2 id="核心能力拆解">核心能力拆解</h2>

<h3 id="1-对话式界面与-api-双通道">1. 对话式界面与 API 双通道</h3>

<p>Coder Agents 提供了两种交互方式：</p>

<ul>
  <li><strong>对话界面</strong>：开发者可以直接给代理分配任务——写代码、生成测试、创建 Pull Request</li>
  <li><strong>API 接口</strong>：支持从 CI/CD 流水线、GitHub Actions、Slack 等外部系统触发自动化工作流</li>
</ul>

<p>任务可以前台执行（实时交互），也可以后台运行（异步处理）。</p>

<h3 id="2-集中化控制平面">2. 集中化控制平面</h3>

<p>这是 Coder Agents 区别于「裸用 Claude Code 或 Cursor」的关键差异点。平台提供了企业级的控制层：</p>

<table>
  <thead>
    <tr>
      <th>控制维度</th>
      <th>具体能力</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>模型访问</td>
      <td>统一配置可用模型、API Key、速率限制</td>
    </tr>
    <tr>
      <td>提示词管理</td>
      <td>组织级提示词模板，确保输出一致性</td>
    </tr>
    <tr>
      <td>执行策略</td>
      <td>定义代理能做什么、不能做什么</td>
    </tr>
    <tr>
      <td>可观测性</td>
      <td>完整审计日志，追踪每次代理操作</td>
    </tr>
  </tbody>
</table>

<h3 id="3-渐进式迁移路径">3. 渐进式迁移路径</h3>

<p>Coder 没有要求企业「推倒重来」。对于已经在使用 Claude Code、Cursor 或 Codex 的团队，Coder Agents 可以运行在 Coder Workspace 内部，实现平滑过渡：</p>

<ol>
  <li><strong>初期</strong>：团队继续使用熟悉的第三方工具</li>
  <li><strong>中期</strong>：通过 Coder Agents 逐步接管执行环境的管理</li>
  <li><strong>后期</strong>：完全迁移到自托管的统一平台</li>
</ol>

<h2 id="与-cursor-agents-的对比">与 Cursor Agents 的对比</h2>

<p>Cursor 也在 2026 年推出了自托管云代理（Cursor Agents），两者的功能有一定重叠，但设计哲学不同：</p>

<table>
  <thead>
    <tr>
      <th>维度</th>
      <th>Coder Agents</th>
      <th>Cursor Agents</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>定位</td>
      <td>模型无关的编排平台</td>
      <td>深度集成 Cursor 生态</td>
    </tr>
    <tr>
      <td>隔离方式</td>
      <td>基于 Coder Workspace</td>
      <td>独立虚拟机（含终端、浏览器、桌面）</td>
    </tr>
    <tr>
      <td>核心卖点</td>
      <td>基础设施解耦与统一治理</td>
      <td>深度 IDE 集成与用户体验</td>
    </tr>
    <tr>
      <td>适用场景</td>
      <td>多模型、多团队的企业级部署</td>
      <td>Cursor 重度用户的规模化使用</td>
    </tr>
  </tbody>
</table>

<p>Coder 官方也承认两者「有不同的设计优先级」，并非直接的零和竞争。</p>

<h2 id="更广阔的图景ai-控制平面">更广阔的图景：AI 控制平面</h2>

<p>Coder Agents 的出现，实际上是「AI 控制平面（AI Control Plane）」这一更大趋势的一部分。类似的解决方案还包括：</p>

<ul>
  <li><strong>TrueFoundry</strong>：提供模型部署、监控、治理的统一平台</li>
  <li><strong>Fiddler</strong>：专注于 AI 模型的可解释性与合规审计</li>
</ul>

<p>这些产品的共同命题是：<strong>当 AI 从实验走向生产，企业需要的不只是「更聪明的模型」，而是「更安全、更可控、更可观测」的 AI 基础设施。</strong></p>

<h2 id="对开发者的实际意义">对开发者的实际意义</h2>

<p>对于一线开发者，Coder Agents 的价值体现在三个层面：</p>

<p><strong>第一，安全感。</strong> 代码不再需要通过第三方云端，敏感项目的 AI 辅助成为可能。</p>

<p><strong>第二，灵活性。</strong> 不被锁定在单一模型或工具上，可以根据任务特点选择最合适的 AI。</p>

<p><strong>第三，协作效率。</strong> 团队共享统一的执行环境和策略，减少「在我机器上能跑」类问题。</p>

<h2 id="结语">结语</h2>

<p>Coder Agents 的发布，标志着 AI 编码工具正在从「个人效率玩具」向「企业级基础设施」进化。它的真正创新不在于「又一个 AI 编码代理」，而在于<strong>把代理的「智能层」和「执行层」彻底分离</strong>，让企业能够在享受 AI 红利的同时，保持对核心资产的完全控制。</p>

<p>对于正在评估 AI 编码工具落地策略的技术负责人，Coder Agents 代表了一个值得认真考虑的方向：不是「选哪个模型」，而是「如何建立一个安全、灵活、可治理的 AI 编码基础设施」。</p>

<hr />

<p><strong>参考链接：</strong></p>

<ul>
  <li><a href="https://coder.com/blog/introducing-coder-agents">Coder Agents 官方博客</a></li>
  <li><a href="https://www.linkedin.com/posts/rwhiteley_introducing-coder-agents-blog-coder-activity-7457903372780601344-OK1N/">Coder CEO Rob Whiteley 的 LinkedIn 解读</a></li>
  <li><a href="https://cursor.com/blog/self-hosted-cloud-agents">Cursor 自托管云代理</a></li>
  <li><a href="https://www.infoq.com/news/2026/05/coder-agents-self-hosted-ai/">InfoQ 原文报道</a></li>
</ul>]]></content><author><name>王翊仰</name></author><category term="AI" /><category term="AI" /><category term="Coder" /><category term="Agent" /><category term="Self-Hosted" /><category term="DevOps" /><category term="编码工具" /><summary type="html"><![CDATA[Coder Agents 是一个模型无关的平台，让组织能够在自己的基础设施上运行 AI 编码代理，实现对代码、数据和执行环境的完全控制。]]></summary></entry><entry><title type="html">从零构建多代理系统：我学到的那些课</title><link href="https://www.wangyiyang.cc/2026/05/14/multi-agent-system-lessons/" rel="alternate" type="text/html" title="从零构建多代理系统：我学到的那些课" /><published>2026-05-14T09:00:00+08:00</published><updated>2026-05-14T09:00:00+08:00</updated><id>https://www.wangyiyang.cc/2026/05/14/multi-agent-system-lessons</id><content type="html" xml:base="https://www.wangyiyang.cc/2026/05/14/multi-agent-system-lessons/"><![CDATA[<p><img src="/images/posts/multi-agent-system-lessons_1200x630.jpg" alt="cover" /></p>

<h2 id="开篇一个-hackday-项目如何改变了我对-ai-的认知">开篇：一个 Hackday 项目如何改变了我对 AI 的认知</h2>

<p>2025 年 5 月的 Shopify Hackday，我尝试做一个 Ruby Gem MCP server，给 Claude Code 提供 AST 导航能力。第一次尝试失败了——Claude 不认识 Prism（Ruby 解析器），文档里也没有例子。</p>

<p>我试了一个”老派”方法：自己先读完 Prism 代码库，然后用 Claude Code 在代码库里学习，再把答案复制粘贴过来。</p>

<p>然后我问了自己一个问题：<strong>如果我能把这个过程自动化呢？</strong></p>

<p>我把一个 Claude Code（放在 Prism 代码库里）和主 Claude Code（正在构建 library）通过 MCP 连接起来。结果：两个 agent 一次性完成了任何一个单独 agent 都做不到的事情。</p>

<p><strong>一个关键认知诞生了：两个 agent 协作，胜过任何一个单独 agent。</strong></p>

<p>这个经验最终催生了 Claude Swarm（GitHub 1.4k+ stars）和它的继任者 SwarmSDK。</p>

<hr />

<h2 id="shopify-的-ai-采用曲线从怀疑到全员氛围编程">Shopify 的 AI 采用曲线：从怀疑到全员”氛围编程”</h2>

<p>Shopify 的 AI 采用路径很有意思：</p>

<p><strong>2024 年之前</strong>：与 OpenAI 签约，内部有聊天工具可用，但大量工程师因为早期 GPT-3.5 的糟糕体验而持怀疑态度。</p>

<p><strong>2024 年</strong>：工具向所有人开放——LibreChat、VSCode Copilot、Cursor 等。但渗透率依然不高。</p>

<p><strong>2025 年 2 月转折点</strong>：CEO Tobi 发了全员邮件，大意是”在我们雇人之前，先要能证明 AI 做不了这个工作”。这封邮件直接推动了全员 AI 采用。</p>

<p><strong>结果</strong>：约 6000 名员工的 Shopify，现在连非工程师都在”氛围编程”（vibe coding）原型产品了。</p>

<hr />

<h2 id="从all-in-one提示词到多代理微服务架构">从”All-in-One”提示词到多代理微服务架构</h2>

<p>Shopify 团队观察到一个核心模式：</p>

<h3 id="-旧做法一个-llm--巨大提示词">❌ 旧做法：一个 LLM + 巨大提示词</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>问题：无关 token 太多
     LLM 会迷路
     效果差
</code></pre></div></div>

<h3 id="-新做法多个窄专型-agent">✅ 新做法：多个窄专型 agent</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>每个 agent 都是某个领域的专家
结果：效果显著提升
</code></pre></div></div>

<p>SwarmSDK 就是在这一认知下诞生的，核心特性包括：</p>

<ul>
  <li><strong>多模型支持</strong>：Claude、Gemini、o3 等</li>
  <li><strong>YAML / Ruby DSL 定义 agent</strong>：声明式，易维护</li>
  <li><strong>工作流支持 + 树形结构</strong>：复杂任务分解</li>
  <li><strong>事件钩子</strong>：可观测性</li>
  <li><strong>内置成本追踪</strong>：谁在花钱，花了多少</li>
  <li><strong>插件系统</strong>：包括 memory 插件</li>
</ul>

<hr />

<h2 id="那些让人头疼的问题">那些让人头疼的问题</h2>

<h3 id="1-碎片化危机">1. 碎片化危机</h3>

<p>每个团队都在构建自己的 agent 系统，用不同的框架（LangChain 等），大量重复造轮子。</p>

<h3 id="2-规模化难题">2. 规模化难题</h3>

<p>Shopify 的 AI 团队变成了”AI 特警队”——所有人都有问题来求助。解决方案不是扩大 AI 团队，而是<strong>构建赋能工具，让每个团队的 AI 爱好者自己具备构建能力</strong>。</p>

<h3 id="3-非开发者上手难度">3. 非开发者上手难度</h3>

<p>YAML 文件、CLI 命令对这些用户来说太复杂了。开发者自己也不想写 YAML 编程。多模型实现的代码当时是”一大坨 hack”，日志记录更是噩梦。</p>

<hr />

<h2 id="agent-微服务架构一个解决碎片化的思路">Agent 微服务架构：一个解决碎片化的思路</h2>

<p>当前状态（碎片化）：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>各团队自己造 agent
      ↓
微服务地狱：
- 网络重试
- 可观测性挑战
- 链路追踪
- 大家只是想通信而已
</code></pre></div></div>

<p><strong>统一编排策略</strong>：</p>

<ul>
  <li>所有人用同一种方式定义 agent</li>
  <li>不需要 MCP/A2A 互相通话</li>
  <li>导入定义，单进程运行</li>
  <li><strong>Ruby + Fibers</strong>：对 I/O 密集的 LLM 工作完美契合（网络请求）</li>
</ul>

<hr />

<h2 id="三个核心教训">三个核心教训</h2>

<h3 id="教训一最好的解决方案始于我自己的痛点">教训一：”最好的解决方案始于我自己的痛点”</h3>

<p>先解决自己的问题。你的真实需求是最强的产品牵引力。</p>

<h3 id="教训二把-agent-当成窄专型工具专家而不是通才">教训二：”把 agent 当成窄专型工具/专家，而不是通才”</h3>

<ul>
  <li>给 agent 写人物介绍/简介 = 浪费 token</li>
  <li>除非你想控制 AI 的输出，否则不需要这些</li>
  <li><strong>用的 token 越少，效果越好</strong></li>
</ul>

<h3 id="教训三不要建-ai-特警队要建赋能工具">教训三：”不要建 AI 特警队，要建赋能工具”</h3>

<p>赋能每个团队的 AI 爱好者——他们最了解自己的领域。</p>

<hr />

<h2 id="2026--有用-agent-元年">2026 = 有用 Agent 元年？</h2>

<p><strong>MCP 上下文膨胀：房间里的大象</strong></p>

<p>当前 MCP 的问题：</p>

<ul>
  <li>加工具 = 加 token 到上下文</li>
  <li>参数描述往往与当前任务无关</li>
  <li>比如用 Gmail MCP 读邮件 = 浪费 token 在”发邮件”功能上</li>
</ul>

<p><strong>愿景</strong>：每个 token 都精准投放到当前任务。</p>

<hr />

<h2 id="真实数据从-22-小时到-7-分钟">真实数据：从 22 小时到 7 分钟</h2>

<p>Shopify 的实际收益：</p>

<table>
  <thead>
    <tr>
      <th>场景</th>
      <th>之前</th>
      <th>之后</th>
      <th>提升</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>主题合规审查</td>
      <td>22 小时</td>
      <td>7-20 分钟</td>
      <td>巨大</td>
    </tr>
    <tr>
      <td>候选人评估</td>
      <td>多小时</td>
      <td>不到 1 小时</td>
      <td>显著</td>
    </tr>
    <tr>
      <td>Q2 发版调研</td>
      <td>巨大提示词</td>
      <td>15 个专精 agent</td>
      <td>高精度</td>
    </tr>
    <tr>
      <td>供应商评估</td>
      <td>手动 PDF 审查</td>
      <td>多 agent 验证</td>
      <td>可扩展</td>
    </tr>
  </tbody>
</table>

<p><strong>所有场景都需要人工复核</strong>——不是全自动。</p>

<hr />

<h2 id="写在最后">写在最后</h2>

<p>Shopify 的多代理系统演进路径，映射了整个行业对 AI 认知的转变：</p>

<ol>
  <li><strong>从怀疑到接受</strong>：需要 CEO 级别的推动力</li>
  <li><strong>从通才到专才</strong>：窄专型 agent 效果远超大一统提示词</li>
  <li><strong>从工具到架构</strong>：碎片化问题的解法不是更多特警队，而是赋能</li>
  <li><strong>从概念到工程</strong>：2026 年的关键词是”有用”——而不是”酷”</li>
</ol>

<p>当你的 agent 开始协作，当你的 token 消耗开始下降，当你团队的 AI 爱好者开始自己构建——你就知道走对路了。</p>

<hr />

<p><strong>参考来源</strong>：<a href="https://www.infoq.com/presentations/multi-agent-system-lessons/">What I Learned Building Multi-Agent Systems From Scratch</a> - Paulo Arruda, Staff Engineer at Shopify</p>]]></content><author><name>王翊仰</name></author><category term="AI" /><category term="Agent" /><category term="工程实践" /><category term="Multi-Agent" /><category term="Shopify" /><category term="Claude" /><category term="SwarmSDK" /><category term="MCP" /><summary type="html"><![CDATA[]]></summary></entry></feed>