<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>MCP on Hypho - AI Agent 技术博客</title><link>https://blog.hypho.cn/tags/mcp/</link><description>Recent content in MCP on Hypho - AI Agent 技术博客</description><image><title>Hypho - AI Agent 技术博客</title><url>https://blog.hypho.cn/papermod-cover.png</url><link>https://blog.hypho.cn/papermod-cover.png</link></image><generator>Hugo -- 0.148.2</generator><language>zh-cn</language><lastBuildDate>Mon, 18 May 2026 10:04:30 +0800</lastBuildDate><atom:link href="https://blog.hypho.cn/tags/mcp/index.xml" rel="self" type="application/rss+xml"/><item><title>Semble 代码搜索：给编程 Agent 用的检索工具，真比 grep 更适合生产吗？</title><link>https://blog.hypho.cn/posts/semble-code-search-for-agents/</link><pubDate>Mon, 18 May 2026 10:04:30 +0800</pubDate><guid>https://blog.hypho.cn/posts/semble-code-search-for-agents/</guid><description>Semble 是一个面向编程 Agent 的本地代码搜索工具，声称比 grep+read 少用约 98% token。本文从 MCP 集成、BM25+静态向量混合检索、索引延迟、上下文噪声和生产落地边界出发，分析它适合哪些 AI 编程工作流，什么时候能提升代码理解效率，以及什么时候仍然应该保留传统 grep、完整阅读和人工代码审查。</description><content:encoded><![CDATA[<p>我对“给 Agent 做代码搜索”这类工具一直有点警惕。</p>
<p>原因很简单：很多产品把问题讲成“grep 太笨，向量检索更聪明”，最后落地却变成另一个黑盒。Agent 找不到符号定义时，开发者至少还能看见它 grep 了什么；如果换成一个语义搜索服务，结果看起来更像魔法，但错的时候也更难排查。</p>
<p>所以看到 HN 上的 <a href="https://github.com/MinishLab/semble">Semble</a> 时，我第一反应不是“又一个代码 RAG”，而是问一个更工程化的问题：<strong>编程 Agent 到底需要什么样的代码搜索？</strong></p>
<p>Semble 的答案挺明确：它不是给人做 IDE 搜索，也不是给企业做大规模代码知识库，而是给 Claude Code、Codex、Cursor、OpenCode 这类编程 Agent 提供一个本地、低延迟、少 token 的代码检索层。HN 原帖标题也很直接：<a href="https://news.ycombinator.com/item?id=48169874">Show HN: Semble – Code search for agents that uses 98% fewer tokens than grep</a>。截至我写这篇时，项目在 GitHub 上已经超过 1000 stars，最近提交也在 2026 年 5 月，至少不是一个空 README 项目。</p>
<h2 id="为什么-grep-对-agent-不够友好">为什么 grep 对 Agent 不够友好</h2>
<p>人用 grep，其实会做很多隐性判断。</p>
<p>你搜 <code>auth</code>，看到 30 个文件，会快速扫目录名、测试文件、legacy 文件，再决定先打开哪个。你会知道 <code>auth_test.py</code> 不是主实现，<code>compat/</code> 里可能只是兼容层，<code>AuthProvider</code> 的定义比调用点更重要。</p>
<p>Agent 就没这么省。</p>
<p>它通常会先 grep，一个关键词命中几十个文件，然后 read 一堆文件。每多读一个文件，就多消耗上下文窗口、多花钱、多增加模型注意力噪声。更麻烦的是，Agent 经常会被“看起来相关”的调用代码带偏，最后改了外围逻辑，真正的核心函数反而没碰。</p>
<p>用人话说：grep 的问题不是搜不到，而是<strong>搜出来之后太需要人类判断</strong>。</p>
<p>这也是 Semble 这个选题值得写的地方。它服务的搜索意图很清楚：如果你在搭建 AI 编程工作流，是否应该给 Agent 加一个专门的代码检索层，而不是继续让它 grep/read 暴力翻仓库？</p>
<h2 id="semble-的技术路线不是纯向量搜索而是混合检索">Semble 的技术路线：不是纯向量搜索，而是混合检索</h2>
<p>从 README 看，Semble 的实现没有走“把整个仓库丢进大 embedding 模型”的路线。它先用 <a href="https://github.com/chonkie-inc/chonkie">Chonkie</a> 做代码感知切块，然后同时跑两套检索：</p>
<ul>
<li>基于 <a href="https://github.com/MinishLab/model2vec">Model2Vec</a> 的静态 embedding，默认用代码专用的 <a href="https://huggingface.co/minishlab/potion-code-16M">potion-code-16M</a> 做语义相似度；</li>
<li>基于 <a href="https://github.com/xhluca/bm25s">bm25s</a> 的 BM25，负责精确词、符号名、API 名称等词法匹配。</li>
</ul>
<p>两路结果再用 Reciprocal Rank Fusion 融合，并叠加一些代码场景的 rerank 信号：符号查询提高词法权重、定义位置加权、identifier stem 匹配、同文件多 chunk 命中加权、测试和 legacy 文件降权等。</p>
<p>这个设计我比较认可。</p>
<p>因为代码搜索和普通文档 RAG 不一样。你搜“where is authentication handled”时，语义检索有用；但你搜 <code>save_pretrained</code>、<code>Foo::bar</code>、<code>config_parser</code> 时，语义模型再聪明也不能把精确符号匹配丢掉。纯向量搜索在代码库里最容易犯的错，就是把“意思相近”排到“真正定义”前面。</p>
<p>Semble 的混合路线本质上是在承认一件事：<strong>代码检索不是语义理解比赛，而是语义、符号和工程上下文的排序问题。</strong></p>
<p>这和我之前写 RAG 重排时的判断是一致的：向量召回只解决“可能相关”，真正影响可用性的往往是第二阶段排序。相关讨论可以看这篇：<a href="https://blog.hypho.cn/posts/rerank-bi-encoder-cross-encoder/">向量数据库已经很快了，为什么还要重排？</a>。Semble 把这个思路压缩到本地代码搜索里，算是一个很实用的工程版本。</p>
<h2 id="它为什么强调少用-98-token">它为什么强调“少用 98% token”</h2>
<p>Semble README 里反复强调 token 节省：相对 grep+read，返回更小的相关代码片段，声称可以少用约 98% token。它的 <code>semble savings</code> 统计也比较朴素：把“命中文件全文字符数”和“实际返回片段字符数”做差，再按 4 字符约等于 1 token 估算。</p>
<p>这个口径不完美，但方向对。</p>
<p>对编程 Agent 来说，token 成本不是唯一问题。更关键的是上下文污染：模型读了太多不相关文件，就会开始“合理化”错误线索。你以为只是多花几分钱，实际可能是让 Agent 在错误文件里自信地改代码。</p>
<p>我更愿意把 Semble 的价值理解成：它不是单纯省钱，而是在帮 Agent 缩小可操作空间。</p>
<p>比如一个 Agent 要找“配置加载后如何合并环境变量”，传统 grep 可能先命中一堆文档、测试、旧兼容代码。Semble 这种混合检索如果能把定义、主实现和同文件上下文排到前面，Agent 后续 read 的内容就更接近真正需要改的地方。</p>
<p>说白了就是：少读错代码，比少读代码更重要。</p>
<h2 id="mcp-很方便但生产里我更建议保留-bash-入口">MCP 很方便，但生产里我更建议保留 Bash 入口</h2>
<p>Semble 支持 MCP Server，可以通过 <code>uvx --from &quot;semble[mcp]&quot; semble</code> 接进 Claude Code、Codex、OpenCode、Cursor 等工具；也支持 CLI 和 Python API。README 里还特别提到，对 Claude Code 或 Codex CLI 的 sub-agent，Bash integration 可能比 MCP 更实用，因为有些 sub-agent 不会直接拿到顶层 MCP schema。</p>
<p>这个细节挺真实。</p>
<p>很多 Agent 工具链在 demo 里 MCP 很顺，但一到多 Agent、子任务、CI、沙箱环境，MCP 工具的可见性、权限和生命周期就会变复杂。相比之下，一个 <code>semble search &quot;authentication flow&quot; ./repo</code> 的 CLI 命令更笨，但更容易写进 <code>AGENTS.md</code>、CI 脚本和审计日志。</p>
<p>我的建议是：</p>
<ul>
<li>个人开发或轻量项目，可以先用 MCP，体验自然语言代码搜索；</li>
<li>团队级工作流，最好同时配置 CLI/Bash 入口，让 Agent 的搜索行为可复现；</li>
<li>对关键仓库，不要让搜索工具自动替代人工审查，至少要保留“搜索结果来自哪些文件、哪些行”的可追踪信息。</li>
</ul>
<p>这和我之前写 <a href="https://blog.hypho.cn/posts/claude-code-routines/">Claude Code routines</a> 时的观点类似：真正可靠的 Agent 工作流，不是给模型更多自由，而是把常用动作沉淀成可重复、可观察的例程。</p>
<h2 id="semble-适合什么场景">Semble 适合什么场景</h2>
<p>我会把 Semble 放在“中小型代码库 + 高频 Agent 修改”的位置上，而不是一上来就当企业代码搜索平台。</p>
<p>它最适合的场景大概有三类。</p>
<p>第一，Agent 经常需要理解陌生模块。比如让 Codex 修一个 bug，它需要先知道认证逻辑、缓存逻辑、数据模型在哪里。Semble 能把“自然语言问题”映射到代码片段，比单纯 grep 一个关键词更贴近 Agent 的提问方式。</p>
<p>第二，仓库不大但语言混杂。Semble 的 benchmark 覆盖 63 个仓库、19 种语言，README 宣称平均仓库索引用时约 263ms、查询 p50 约 1.5ms，且 CPU 本地运行。即便实际项目里会慢一些，这个量级也意味着它可以放进交互式 Agent 循环，而不是只能做离线索引。</p>
<p>第三，团队已经开始关心 Agent token 和上下文质量。尤其是用 Claude Code、Cursor、Codex 做大仓库修改时，传统 grep/read 会让模型吞掉大量文件。Semble 至少给了一个更精细的入口。</p>
<p>但它不适合所有情况。</p>
<p>如果你的仓库强依赖跨服务调用、运行时配置、数据库 schema、RPC IDL，单纯代码检索不够。Agent 需要的不只是“哪段代码相关”，还包括“这段代码在生产里如何被调用”。这类场景更像系统级知识图谱或内部开发者平台问题，Semble 只能解决其中的局部搜索。</p>
<p>另外，Semble 目前仍是新项目。虽然 GitHub stars 和提交活跃度不错，也有 <code>src/</code>、<code>tests/</code>、PyPI 包和 benchmark，但生产落地仍要验证版本稳定性、索引缓存策略、大仓库内存占用、私有代码安全审计等问题。它不是白皮书阶段，不过也还没到“闭眼上全公司”的成熟度。</p>
<h2 id="我会怎么接入">我会怎么接入</h2>
<p>如果让我在团队里试 Semble，我不会一开始就替换 grep。</p>
<p>我会先把它作为 Agent 的“第一查询工具”：当任务是理解业务逻辑、找实现位置、找相似代码时，优先用 <code>semble search</code>；当任务是精确确认字符串、配置项、错误码、迁移脚本时，仍然用 grep 或 ripgrep。两者并不冲突。</p>
<p>一个比较稳的 <code>AGENTS.md</code> 规则可以是：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">当你需要理解某个功能在哪里实现时，先使用 semble search；
</span></span><span class="line"><span class="cl">当你需要确认具体符号、错误信息、配置 key 是否存在时，再使用 rg/grep 做精确验证；
</span></span><span class="line"><span class="cl">修改代码前必须 read 目标文件的完整相关上下文，不得只依赖搜索片段。
</span></span></code></pre></div><p>最后一句很重要。</p>
<p>搜索结果只能帮 Agent 找入口，不能替代阅读上下文。尤其是代码修改任务，chunk 级结果可能漏掉初始化、副作用、类型约束和调用顺序。如果 Agent 只看一个片段就动手，Semble 再准也救不了它。</p>
<p>这也是我对“Agent 工具化”的基本态度：工具应该让模型少走弯路，而不是让模型少承担验证责任。像 <a href="https://blog.hypho.cn/posts/statewright-state-machine-agent-guardrails/">Statewright 用状态机给编程 Agent 加护栏</a> 这类项目关注的是执行过程约束，Semble 关注的是上下文获取质量。两个方向其实可以叠加：先让 Agent 找对代码，再用状态机限制它怎么改。</p>
<h2 id="结论值得试但不要神化">结论：值得试，但不要神化</h2>
<p>Semble 最打动我的地方，不是“98% token saving”这个数字，而是它把编程 Agent 的一个高频痛点讲清楚了：Agent 不缺搜索命令，缺的是低噪声、低延迟、可落地的代码上下文入口。</p>
<p>它的混合检索路线也比“全靠 embedding”的方案更接地气。BM25 负责符号和关键词，静态代码 embedding 负责自然语言意图，rerank 负责把定义、主实现、文件上下文排上来。这个组合不性感，但工程上合理。</p>
<p>我的判断是：如果你已经在用 Claude Code、Codex 或 Cursor 做真实代码修改，Semble 值得作为辅助检索层试一轮；如果你还没有稳定的 Agent 工作流，先别急着引入更多工具，先把任务拆分、测试、审查和回滚做好。</p>
<p>搜索只是第一步。</p>
<p>真正的生产级 AI 编程，靠的是“找得准、改得小、测得全、回得去”。Semble 解决的是第一项，而且解决得还挺有意思。</p>
]]></content:encoded></item><item><title>Statewright：用状态机给 AI 编程 Agent 加护栏，真的比长提示词更靠谱吗？</title><link>https://blog.hypho.cn/posts/statewright-state-machine-agent-guardrails/</link><pubDate>Fri, 15 May 2026 10:04:27 +0800</pubDate><guid>https://blog.hypho.cn/posts/statewright-state-machine-agent-guardrails/</guid><description>Statewright 是一个用确定性状态机约束 AI 编程 Agent 的开源项目，核心思路不是继续加长系统提示词，而是按阶段限制工具、命令、编辑范围和人工审批。本文从 Claude Code、Codex 与本地模型场景出发，分析它对 Agent 可靠性、安全边界和生产落地的真实价值。</description><content:encoded><![CDATA[<p>如果你用过 Claude Code、Codex CLI 或 Cursor 这类编程 Agent，大概率见过一种很烦人的失败模式：它明明已经读完文件，却又回头读一遍；明明应该先写测试，却开始大面积重构；明明只是修一个 20 行 bug，却顺手动了 6 个模块。最后 token 花了，diff 也出来了，但你不敢合并。</p>
<p>我越来越觉得，这不是“模型不够聪明”一个问题。</p>
<p>更准确地说，是我们把 Agent 放进了一个没有交通规则的城市：Read、Grep、Edit、Bash、Web、MCP 工具全都摊在它面前，然后指望一段系统提示词告诉它“请谨慎驾驶”。提示词当然有用，但它不是刹车，也不是红绿灯。</p>
<p>这也是 <a href="https://github.com/statewright/statewright">Statewright</a> 最近在 HN 上引起我注意的原因。它的口号很硬：<strong>Agents are suggestions, states are laws.</strong> 用人话翻译：不要只靠模型“自觉”，把工作流拆成确定状态，在每个状态里只开放它该用的工具。</p>
<h2 id="状态机不是新概念但放在-agent-上刚好戳中痛点">状态机不是新概念，但放在 Agent 上刚好戳中痛点</h2>
<p>Statewright 做的事情并不神秘。它让你定义一个工作流，例如 <code>planning → implementing → testing → completed</code>。在 planning 状态里，Agent 只能读文件、搜索代码；进入 implementing 以后才允许 Edit/Write；到 testing 状态，Bash 可以用，但只能跑 <code>pytest</code>、<code>cargo test</code>、<code>npm test</code> 这类白名单命令。</p>
<p>项目 README 里的示例很直观：planning 只给 <code>Read/Grep/Glob</code>，implementing 允许 <code>Read/Edit/Write</code> 且限制 <code>max_edit_lines</code>、<code>max_files_per_state</code>，testing 才给 <code>Bash</code>，并且通过 guard 判断测试是否通过。官方的 <a href="https://statewright.ai/workflow-schema.json">workflow schema</a> 也把这些字段明确写成结构化配置，而不是自然语言建议。</p>
<p>这点很关键。</p>
<p>自然语言提示词的问题是，它最终还是要被模型“理解”和“遵守”。状态机的问题是，工具调用在执行层被拦住。模型想在 planning 阶段写文件？调用会被拒绝。模型想在测试阶段跑一个不在白名单里的 shell 命令？也会被拒绝。技术描述听起来有点抽象，人话就是：<strong>把“你最好不要这样做”改成“你做不到”。</strong></p>
<p>Statewright 的实现也不是纯概念。仓库主体是 Rust、Python、Shell 和 TypeScript，GitHub API 显示最近提交在 2026-05-14，仓库约 279 stars；目录里有 <code>crates</code>、<code>plugins</code>、<code>templates</code> 等实际代码。它通过 MCP/插件层接入 Claude Code、Codex、Cursor、opencode 等编码工具，核心 Rust engine 负责评估状态、转移、guard 和工具限制。换句话说，它不是又一个“Agent 最佳实践文档”，而是试图把最佳实践编译成运行时约束。</p>
<h2 id="为什么这比写更长的-system-prompt更像工程方案">为什么这比“写更长的 system prompt”更像工程方案</h2>
<p>我以前也习惯用长提示词管 Agent：先分析，不要急着改；每次只改小 diff；先跑测试；不要删除用户文件；遇到不确定先询问。问题是，提示词越长，越像团队的 Confluence 规范——看起来很完整，真出事时不一定拦得住。</p>
<p>Statewright 的优势是把约束分层了。</p>
<p>第一层是工具可见性。Agent 在某个状态下看到的工具变少，决策空间也变小。对大模型来说，这减少了乱试；对本地小模型来说，意义更大，因为它们本来就不擅长在 30 个工具里稳定选择。Statewright README 声称，在一个 5 题 SWE-bench 子集上，13.8GB 和 19.9GB 的本地模型在加入约束后从 2/10 提升到 10/10。这个结果当然不能等同于完整 SWE-bench——项目自己也注明只是 5 个任务的小样本——但方向是可信的：小模型最怕开放式任务，状态机把开放题改成了分步题。</p>
<p>第二层是命令与编辑限制。<code>allowed_commands</code>、<code>max_edit_lines</code>、<code>max_files_per_state</code> 这些字段看起来朴素，却是生产环境里最需要的东西。比如你可以允许 Agent 在 testing 阶段跑 <code>pytest</code>，但不允许它执行任意 <code>curl | bash</code>；允许它修 20 行，但不允许它顺手重写半个服务。很多 Agent 安全讨论会停留在“防 prompt injection”，但工程事故更多时候来自越权修改、过大 diff、错误 shell 命令和状态漂移。</p>
<p>第三层是显式转移。Agent 必须从 planning 转到 implementing，再到 testing。它不是在一个无限上下文里“凭感觉继续”，而是在被迫回答：现在是什么阶段？我为什么可以进入下一阶段？guard 是否满足？这会打断一种常见死循环：模型不断 reread 文件，却迟迟不编辑，或者测试失败后盲目继续改。</p>
<p>说白了，Statewright 不是让 Agent 更聪明，而是让任务环境更笨、更窄、更可控。很多时候，这反而是可靠性的来源。</p>
<h2 id="但我不会把它直接神化成agent-可靠性终局">但我不会把它直接神化成“Agent 可靠性终局”</h2>
<p>它也有明显代价。</p>
<p>最直接的是工作流设计成本。你必须知道一个任务应该拆成哪些状态，每个状态开放哪些工具，哪些命令能跑，什么时候需要人工审批。如果工作流太松，护栏没意义；太紧，Agent 会卡在状态里。Statewright README 也提到，限制过强时需要 <code>statewright_deactivate</code> 作为逃生门。</p>
<p>第二个问题是，它更适合“流程明确”的任务，而不是探索性任务。修 bug、补测试、生成迁移脚本、执行 release checklist，这些都适合状态机；但如果你让 Agent 研究一个完全陌生的代码库、做架构探索、评估多种方案，过早限制工具可能会让它变笨。我的判断是：Statewright 应该放在从“探索”进入“执行”之后，而不是替代所有自由推理。</p>
<p>第三个问题是生态绑定。它现在对 Claude Code 的 quickstart 最成熟，也在文档里提到 Codex、Cursor、opencode 等集成方向。但不同工具的 hook 能力并不一致：有的能拦截 tool call，有的只能在 shell 层做包装，有的对 MCP 支持还不稳定。也就是说，Statewright 的思路可以迁移，但落地体验会高度依赖你用的 Agent harness。</p>
<p>还有一个小但真实的风险：状态机配置本身会变成新的复杂度来源。以前你 debug prompt，现在你还要 debug workflow。比如某个 guard 写错了，Agent 永远进不了 testing；某个命令白名单漏了参数，测试跑不起来；某个编辑行数限制太小，导致模型反复拆 patch。工程上没有免费的午餐，只是把不确定性从模型输出转移到了可审查的配置里。</p>
<p>我个人愿意接受这个转移。因为配置至少能 diff、review、版本化；模型的“自觉”不能。</p>
<h2 id="它和-openclawagentarmor-其实在解决同一个底层问题">它和 OpenClaw、AgentArmor 其实在解决同一个底层问题</h2>
<p>Hypho Blog 之前写过 <a href="https://blog.hypho.cn/posts/openclaw-state-machine/">OpenClaw 的离散状态机架构</a>：长时间运行的 AI 工作流，不能只靠一次 prompt 维持状态，必须把任务进度、失败恢复和执行阶段落到外部状态上。Statewright 更聚焦在编码 Agent，但哲学很像：LLM 负责生成建议，状态系统负责维持边界。</p>
<p>另一个相关方向是 <a href="https://blog.hypho.cn/posts/agentarmor-8-layer-security-framework/">AgentArmor 的多层安全框架</a>。AgentArmor 更像安全防线清单：身份、权限、监控、隔离、审计；Statewright 则更像一套具体执行器：在每个状态拦工具、拦命令、拦大 diff。前者告诉你 Agent 系统应该有哪些安全层，后者把其中一部分变成了开发工作流里的硬约束。</p>
<p>这两个思路合在一起，才比较接近生产环境需要的样子：既要有宏观安全模型，也要有执行时的确定性控制。</p>
<h2 id="我会怎么用它">我会怎么用它</h2>
<p>如果是个人项目，我不会一上来就给所有任务套复杂状态机。那会把开发体验搞得很重。我会从三个高风险场景开始：</p>
<p>第一，自动修 bug。流程固定为 read-only 诊断、最小 diff 修复、指定测试、失败回滚或二次修改。这里状态机非常合适，因为“先读后改再测”本来就是人类工程师也该遵守的流程。</p>
<p>第二，依赖升级和迁移。比如升级框架、改数据库 schema、批量替换 API。Agent 很容易在这类任务里越改越大，所以 <code>max_files_per_state</code>、审批门和命令白名单很有价值。</p>
<p>第三，CI 失败自动修复。CI 环境最怕 Agent 执行任意命令，也最适合白名单：只允许读取日志、改特定目录、跑指定测试。状态机能把“自动修 CI”从危险实验变成可控流水线。</p>
<p>如果是团队项目，我会把 workflow 配置当成代码审查对象。谁能改状态机？哪些状态允许 Bash？哪些命令进入白名单？哪些 transition 需要人工审批？这些问题应该进入 repo，而不是藏在某个人的 Claude Code 配置里。</p>
<h2 id="结论agent-可靠性不会只靠更强模型解决">结论：Agent 可靠性不会只靠更强模型解决</h2>
<p>我对 Statewright 的判断是：它不是所有 Agent 问题的答案，但它抓住了一个正确方向——<strong>把 Agent 从“会聊天的工具使用者”改造成“在流程约束下工作的执行者”。</strong></p>
<p>这件事对未来一年会越来越重要。模型能力继续变强，Agent 能调用的工具也会越来越多；工具越多，自由度越高，事故半径也越大。继续往 prompt 里加“请小心”不够了。我们需要可执行、可审计、可版本化的边界。</p>
<p>状态机听起来老派，甚至有点不性感。但工程里很多可靠系统，最后靠的就是这些不性感的东西：有限状态、白名单、审批门、最小权限、失败回路。</p>
<p>Agent 也是系统。既然是系统，就别只给它写鸡汤，给它装刹车。</p>
<h2 id="参考链接">参考链接</h2>
<ul>
<li><a href="https://github.com/statewright/statewright">Statewright GitHub 仓库</a></li>
<li><a href="https://docs.statewright.ai">Statewright 官方文档</a></li>
<li><a href="https://statewright.ai/workflow-schema.json">Statewright workflow schema</a></li>
<li><a href="https://docs.statewright.ai/tools/reference/">Statewright MCP tool reference</a></li>
<li><a href="https://news.ycombinator.com/item?id=48108778">HN 讨论：Show HN: Statewright – Visual state machines that make AI agents reliable</a></li>
</ul>
]]></content:encoded></item><item><title>每个 AI Agent 都在重复昨天的自己：一个开源记忆层想要改变这个</title><link>https://blog.hypho.cn/posts/stash-open-source-ai-memory-layer/</link><pubDate>Mon, 27 Apr 2026 10:11:06 +0800</pubDate><guid>https://blog.hypho.cn/posts/stash-open-source-ai-memory-layer/</guid><description>每个 LLM 对话都是从零开始——你反复解释你是谁、项目背景是什么、之前踩过什么坑。下一次对话，AI 还是同样犯错。Stash 是一个开源的记忆基础设施，通过 8 阶段认知管道把 AI 的每一次对话经验转化为结构化知识，形成知识图谱和自我模型，让 Agent 在多轮对话中真正&amp;#34;记住&amp;#34;并学习。</description><content:encoded><![CDATA[<p>你有没有这种感觉：每天早上醒来，前一天学的东西大部分都忘了？</p>
<p>LLM 就是这样工作的。</p>
<p>每个对话 session，模型都是从零开始。它不记得你是谁，不记得你上次做了什么决定，更不记得那个方案三个月前就试过并且失败了。你花 20 分钟解释背景，下一个 session 又得重来一遍。</p>
<p>这不是 AI 的 bug——这是架构限制。大多数 Agent 的&quot;记忆&quot;，就是把整段对话历史塞进 prompt，靠上下文窗口撑着。贵、慢，而且换一个新 session 照样失忆。</p>
<p><strong>Stash</strong> 想要解决这个问题。它的 slogan 很直接：<strong>Your AI has amnesia. We fixed it.</strong></p>
<h2 id="这个项目是做什么的">这个项目是做什么的</h2>
<p><a href="https://github.com/alash3al/stash">Stash</a> 是一个开源的持久化记忆层，专门给 AI Agent 用。它不是一个聊天机器人，而是一个基础设施——在 Agent 和外部世界之间加了一层认知处理管道。</p>
<p>核心思路：<strong>Episodes become facts. Facts become patterns. Patterns become wisdom.</strong></p>
<p>AI 的每一次对话、每一个决定、每一次成功和失败，都被记录下来，经过一个 8 阶段的管道，转化成结构化的知识。事实与事实之间建立关联，关联形成模式，模式沉淀为真正的理解。</p>
<pre tabindex="0"><code>原始对话
    ↓
Episode 记录（原始事件）
    ↓
Fact 提取（去掉了时间戳和情绪的事实）
    ↓
Relationship 建立（事实之间的连接）
    ↓
Pattern 检测（反复出现的模式）
    ↓
Goal Tracking（目标状态）
    ↓
Failure Pattern（失败教训）
    ↓
Hypothesis &amp; Confidence（假设与置信度衰减）
    ↓
Wisdom（长期知识）
</code></pre><p>这个管道是<strong>增量</strong>的——每次运行只处理新数据，不会重复劳动。</p>
<h2 id="它跟-rag-不一样">它跟 RAG 不一样</h2>
<p>你可能听说过 RAG（Retrieval Augmented Generation）。Stash 官方文档里有一段话说得很清楚：</p>
<blockquote>
<p>RAG 是一个聪明的搜索算法，但它不是记忆。它不记得你的对话，不学习，不了解你。每次问答都是从零开始——只是一个更高级的文件搜索引擎。</p></blockquote>
<p>Stash 学的是你 Agent 经历过的一切：对话、决定、成败。它不需要你写任何东西，它自己从经验里推断出来。</p>
<p>本质上，RAG 是<strong>搜索过去的文档</strong>，Stash 是<strong>记住过去的经历</strong>。一个是图书馆，一个是经验。</p>
<h2 id="mcp-原生支持">MCP 原生支持</h2>
<p>Stash 通过 <a href="https://modelcontextprotocol.github.io/introduction">MCP（Model Context Protocol）</a> 提供服务，任何支持 MCP 的 Agent 都可以直接接入。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Docker 一键启动</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/alash3al/stash.git
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> stash
</span></span><span class="line"><span class="cl">cp .env.example .env   <span class="c1"># 填入你的 API key 和模型</span>
</span></span><span class="line"><span class="cl">docker compose up
</span></span></code></pre></div><p>支持的 Agent 包括：Claude Desktop、Cursor、Windsurf、Cline、Continue、OpenAI Agents、Ollama、OpenRouter——只要支持 MCP 就能用。</p>
<p>它提供 <strong>28 个工具</strong>，覆盖从最基础的 <code>remember</code>（记住）和 <code>recall</code>（回忆）到高级的因果链推理、矛盾检测、假设管理。</p>
<h2 id="namespace-层级记忆">Namespace 层级记忆</h2>
<p>最有意思的设计是 <strong>Namespace 层次结构</strong>。</p>
<p>每个 Agent 可以有多个命名空间，比如 <code>/self</code>（自我认知）、<code>/projects/stash</code>（某个项目的上下文）、<code>/projects/cartona</code>。读取 <code>/projects</code> 会自动包含下面所有子路径的记忆。</p>
<p>配合 <code>init</code> 命令，Stash 会自动创建 <code>/self</code> 命名空间，Agent 用自己的记忆层来构建自身能力、局限和偏好的模型——<strong>Agent 知道自己知道什么，也知道自己不知道什么</strong>。</p>
<h2 id="实际效果">实际效果</h2>
<p>根据项目在 <a href="https://github.com/snap-research/locomo">LoCoMo-10</a> 基准上的测试（1534 个 QA 对，10 个多轮对话），Stash 实现了 <strong>59% 的 Recall@5</strong>，比 Zep Cloud 的 28% 高出一倍多。</p>
<p>当然，这个数字只是一个基准。真正有价值的是：你的 Agent 不会再在同一个地方摔倒两次。</p>
<h2 id="选型建议">选型建议</h2>
<p>如果你在搭建需要多轮协作的 Agent 系统，比如：</p>
<ul>
<li>需要跨 session 保持上下文的技术助手</li>
<li>研究 Agent（需要积累文献阅读记忆）</li>
<li>代码生成 Agent（需要记住项目规范和历史决策）</li>
</ul>
<p>Stash 值得一试。它的核心优势是：<strong>不需要改动 Agent 本身的代码，只需要加一层 MCP 集成</strong>。</p>
<p>对于需要完全私有化的场景，它支持 Ollama 本地模型 + PostgreSQL + pgvector，完全离线可用。</p>
<p>但需要注意：Stash 目前还很新（2026-04-24 创建，287 stars），8 阶段管道的实际效果需要你在真实项目中验证。如果你的 Agent 场景比较简单，可能不需要这么重的记忆基础设施。</p>
<hr>
<p><strong>信源：</strong></p>
<ul>
<li>Stash GitHub: <a href="https://github.com/alash3al/stash">https://github.com/alash3al/stash</a></li>
<li>Stash 官网: <a href="https://alash3al.github.io/stash/">https://alash3al.github.io/stash/</a></li>
<li>HN 讨论: <a href="https://news.ycombinator.com/item?id=44133706">https://news.ycombinator.com/item?id=44133706</a></li>
<li>LoCoMo-10 基准: <a href="https://github.com/snap-research/locomo">https://github.com/snap-research/locomo</a></li>
</ul>
]]></content:encoded></item><item><title>多 AI 协作的熵增困境：Forge 编排层设计复盘</title><link>https://blog.hypho.cn/posts/multi-agent-entropy-orchestration/</link><pubDate>Sat, 11 Apr 2026 09:00:00 +0800</pubDate><guid>https://blog.hypho.cn/posts/multi-agent-entropy-orchestration/</guid><description>当 Claude Code、Codex CLI 和 Gemini CLI 同时编辑同一个代码库时，merge 冲突、知识蒸发和架构漂移是三种必然出现的熵增现象。本文以 Forge 的白皮书为锚点，用信息熵框架分析多 AI 协作的系统性困境，以及文件锁、知识飞轮、漂移检测三个核心机制如何构成逆向熵增的工程系统。</description><content:encoded><![CDATA[<h2 id="引言当多-ai-并行成为默认">引言：当多 AI 并行成为默认</h2>
<p>2023 到 2025 年间，AI 编程工具完成了从自动补全引擎到自主 Agent 的进化。Claude Code 能阅读整个代码库、推理架构约束并实现多文件功能。Codex CLI 可以执行 Shell 命令、运行测试并根据失败信息迭代。Gemini CLI 能分析大型代码库并生成全面的重构计划。</p>
<p>每个工具单独使用都足够强大。但当两个或更多工具并发运行时——这在工程团队尝试跨特性分支并行化 AI 辅助开发时越来越常见——问题出现了：<strong>瓶颈从「AI 能否写代码」转移到了「多个 AI 能否在同一代码库上协同工作而不互相摧毁」</strong>。</p>
<p>答案在大多数团队中是「不能」。</p>
<p>本文以 NXTG.AI 开源的 <strong>Forge</strong> 项目<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>为锚点，用<strong>熵增理论</strong>框架分析多 AI 协作的系统性困境：为什么三个 Agent 并发编辑同一个仓库会产生 merge 冲突、知识蒸发和架构漂移这三种必然的熵增现象，以及 Forge 的文件锁、知识飞轮和漂移检测三个核心机制如何构成一个逆向熵增的工程系统。</p>
<hr>
<h2 id="1-多-ai-协作的三种熵增现象">1. 多 AI 协作的三种熵增现象</h2>
<p>热力学第二定律告诉我们：孤立系统的熵永不自发减少。多 AI 协作系统在并发运行时就是一个典型的孤立系统——多个自主 Agent 在没有协调层的情况下操作同一个共享资源（代码库），信息熵自发增大，表现为三种具体的系统故障。</p>
<h3 id="11-merge-冲突信息位叠加的不可逆损耗">1.1 Merge 冲突：信息位叠加的不可逆损耗</h3>
<p>两个 Agent 同时编辑同一个文件，各自产出了一系列修改。当这些修改最终汇聚到 Git 时，产生了<strong>不可调和的冲突节点</strong>。这不是 Git 的缺陷，而是两个独立信息流在同一个时空中叠加后产生的熵——两个 Agent 在各自的上下文中做出了局部最优决策，这些决策在更高层次上却是互斥的。</p>
<p>从信息论角度，每个 Agent 的编辑可以看作一次信息压缩操作。在单 Agent 场景下，上下文窗口提供了足够的历史信息来保证压缩的一致性。在并发场景下，上下文窗口相互独立，信息压缩失去了共享参考系，熵增体现在<strong>合并时的信息损耗</strong>——必须丢弃一个 Agent 的部分或全部工作。</p>
<h3 id="12-知识蒸发跨会话信息的热力学逃逸">1.2 知识蒸发：跨会话信息的热力学逃逸</h3>
<p>Agent A 在一次会话中发现了数据库迁移必须在 API 服务器启动前运行的约束条件。Agent B 运行在完全独立的上下文窗口中，对 Agent A 的发现毫无感知，按错误顺序部署了 API 服务器并花费 20 分钟调试由此产生的问题。</p>
<p>这对应热力学中的<strong>能量逃逸</strong>。在人类团队中，这个问题通过沟通机制解决：站会、Slack 频道、共享文档。在多 Agent 系统中，每个 Agent 的上下文是一个封闭系统，会话结束即系统「热寂」——所有积累的知识随上下文窗口销毁而消失。熵增体现在<strong>跨会话信息传递的失效</strong>。</p>
<h3 id="13-架构漂移局部最优导致的全局混沌">1.3 架构漂移：局部最优导致的全局混沌</h3>
<p>没有统一规划的情况下，每个 Agent 都在做局部优化。Agent A 重构了认证模块使用新设计模式。Agent B 对此毫不知情，用旧模式实现了新功能。Agent C 引入了它从训练数据中学到的第三种模式。代码库在无人察觉的情况下逐渐偏离预定架构，每次并发会话都在累积隐性的技术债务。</p>
<p>这类似于热力学中<strong>湍流</strong>的产生：系统各部分遵循局部规则运行，但由于缺乏全局协调，产生了宏观层面的无序结构。架构漂移的可怕之处在于它的<strong>渐进隐蔽性</strong>——每个 Agent 的行为单独看都合理，累积效果却是系统性的混乱。</p>
<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">graph TD
    A[&#34;多 Agent 并发运行&lt;br/&gt;共享代码库&#34;] --&gt; B[&#34;Merge 冲突&lt;br/&gt;信息位叠加损耗&#34;]
    A --&gt; C[&#34;知识蒸发&lt;br/&gt;跨会话信息逃逸&#34;]
    A --&gt; D[&#34;架构漂移&lt;br/&gt;局部最优 ≠ 全局有序&#34;]
    
    B --&gt; E[&#34;系统熵增&lt;br/&gt;协作效率降低&#34;]
    C --&gt; E
    D --&gt; E
    
    style B fill:#ff6b6b,color:#fff
    style C fill:#ffa94d,color:#fff
    style D fill:#ffd43b,color:#333
    style E fill:#e64980,color:#fff
</code></pre><hr>
<h2 id="2-forge-的逆向熵增工程系统">2. Forge 的逆向熵增工程系统</h2>
<p>Forge 是一个用 Rust 编写的编排层（3MB 单二进制文件，零运行时依赖），通过 MCP（Model Context Protocol）协议协调 Claude Code、Codex CLI 和 Gemini CLI<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。它提供了三个核心机制来对抗上文分析的三种熵增现象，构成一个逆向熵增的闭环工程系统。</p>
<h3 id="21-文件级锁解决-merge-冲突的结构性屏障">2.1 文件级锁：解决 merge 冲突的结构性屏障</h3>
<p>Forge 在 <code>state.json</code> 中维护一个 <code>active_locks</code> 表。当 Agent 通过 MCP 接口声称一个任务时，Forge 会检查目标文件是否已被其他任务锁定。如果存在锁冲突，任务声称被<strong>拒绝</strong>，并返回清晰的锁定信息（哪个 Agent 持有锁、在做哪个任务）。</p>
<p>这相当于在热力学系统中引入了一个<strong>麦克斯韦妖</strong>——在并发写入发生之前就进行仲裁，而不是事后检测冲突。从熵的角度，锁机制将原本不可控的信息叠加过程转化为一个有序的序列化过程，每次只有一个 Agent 能写入特定文件，系统的信息熵保持在受控范围内。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;active_locks&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;src/auth/login.ts&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;agent&#34;</span><span class="p">:</span> <span class="s2">&#34;claude-code-1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;task_id&#34;</span><span class="p">:</span> <span class="s2">&#34;task-003&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;acquired_at&#34;</span><span class="p">:</span> <span class="s2">&#34;2026-02-08T14:30:00Z&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;src/auth/register.ts&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;agent&#34;</span><span class="p">:</span> <span class="s2">&#34;claude-code-1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;task_id&#34;</span><span class="p">:</span> <span class="s2">&#34;task-003&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;acquired_at&#34;</span><span class="p">:</span> <span class="s2">&#34;2026-02-08T14:30:00Z&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Agent 通过 <code>forge_claim_task</code> MCP 工具获取任务同时获得文件锁，完成后通过 <code>forge_complete_task</code> 释放锁。这是** cooperative lock**（合作锁）——绕过 MCP 接口的 Agent 仍可直写文件，但对于所有通过标准工具运行的 Agent，冲突在结构上已不可能发生。</p>
<h3 id="22-知识飞轮跨会话信息的持久化存储">2.2 知识飞轮：跨会话信息的持久化存储</h3>
<p>Forge 在 <code>.forge/knowledge/</code> 目录下维护一个结构化的知识语料库，存储决策、模式、踩坑记录和经验教训。任何 Agent 在任何会话中都可以调用 <code>forge_capture_knowledge</code> 存储新知识，调用 <code>forge_get_knowledge</code> 在做决策前查询历史积累。</p>
<p>这个机制对应热力学中的<strong>能量存储与转换</strong>。知识飞轮将原本在会话结束时「热寂」的信息保存到持久化存储中，使下一次会话能够从上一次会话的终点继续，而非从零开始。每次知识捕获都减少了未来会话的探索空间（降低不确定性），对应系统熵的主动降低。</p>
<p>知识飞轮的关键设计是<strong>跨 Agent 普适性</strong>——Claude Code 捕获的知识可以被 Codex CLI 查询使用。这意味着组织学习不再依赖个体（单个 Agent），而是沉淀为共享基础设施。</p>
<h3 id="23-漂移检测架构层的一致性监控">2.3 漂移检测：架构层的一致性监控</h3>
<p>Forge 的 <code>forge_check_drift</code> 工具将当前代码变更和项目规范发送给配置的大脑引擎（支持免费的启发式 RuleBasedBrain 或 LLM 驱动的 OpenAIBrain），进行对齐评分。这个检查可以在任何时刻由 Agent 或人类调用，返回五维治理评分：测试覆盖、安全、文档、架构对齐和 Git 卫生。</p>
<p>漂移检测是一个<strong>负反馈控制器</strong>。当系统熵增导致架构漂移时，检测机制主动识别偏差并报告给操作者。在自动化场景下，这相当于给系统安装了一个「温度计」——熵增可测量、可报警、可干预。</p>
<p>配合五维健康检查（<code>forge_get_health</code>），Forge 提供了持续监控 + 主动检测的双重保障，使多 Agent 系统的架构熵始终处于可观测状态。</p>
<hr>
<h2 id="3-三个机制的系统论视角">3. 三个机制的系统论视角</h2>
<p>将 Forge 的三个核心机制放在一起看，它们构成了一个完整的逆向熵增系统：</p>
<pre tabindex="0"><code class="language-mermaid" data-lang="mermaid">graph LR
    subgraph 熵增源
        L1[&#34;并发写入&lt;br/&gt;文件冲突&#34;]
        L2[&#34;会话结束&lt;br/&gt;知识蒸发&#34;]
        L3[&#34;局部优化&lt;br/&gt;架构漂移&#34;]
    end
    
    subgraph Forge对策
        F1[&#34;文件锁&lt;br/&gt;序列化写入&#34;]
        F2[&#34;知识飞轮&lt;br/&gt;持久化存储&#34;]
        F3[&#34;漂移检测&lt;br/&gt;负反馈控制&#34;]
    end
    
    L1 --&gt;|&#34;结构性预防&#34;| F1
    L2 --&gt;|&#34;信息持久化&#34;| F2
    L3 --&gt;|&#34;主动监控&#34;| F3
    
    F1 --&gt; O[&#34;多 Agent 协作&lt;br/&gt;信息熵受控&#34;]
    F2 --&gt; O
    F3 --&gt; O
    
    style L1 fill:#ff6b6b,color:#fff
    style L2 fill:#ffa94d,color:#fff
    style L3 fill:#ffd43b,color:#333
    style F1 fill:#69db7c,color:#fff
    style F2 fill:#69db7c,color:#fff
    style F3 fill:#69db7c,color:#fff
    style O fill:#4dabf7,color:#fff
</code></pre><p>值得注意的是，Forge 的状态存储在 <code>.forge/</code> 目录下的单个 JSON 文件中——人类可读、Git 可追踪、无运维开销。这意味着<strong>协调状态本身成为了项目知识的一部分</strong>，可以随代码库一起版本化、回滚和审查。</p>
<hr>
<h2 id="4-对-ai-工程实践的启示">4. 对 AI 工程实践的启示</h2>
<p>Forge 白皮书的核心命题值得所有正在引入 AI 辅助编程的团队思考：当 AI 从工具变成协作者时，工程系统的复杂度从「如何用 AI」变成了「如何让多个 AI 协同工作」。</p>
<p><strong>文件锁机制</strong>提醒我们：在多 Agent 环境中，<strong>冲突预防优于冲突解决</strong>。Git 的 merge 冲突检测是事后补救，文件锁是事前预防。对于高频并发的 AI 工作流，这个优先级翻转是架构设计的关键。</p>
<p><strong>知识飞轮机制</strong>揭示了一个更深层的转变：AI 编程的下一阶段不是更强大的单体 Agent，而是<strong>能够积累组织知识的 Agent 协作网络</strong>。单体 Agent 的上下文窗口是有限的，但跨 Agent 的知识持久化使学习能够复合增长。</p>
<p><strong>漂移检测机制</strong>则将 AI 编程中的架构治理从隐性实践变成了显式工程：测试覆盖、安全扫描、文档完整性这些传统 DevOps 指标，现在需要与架构对齐一起纳入 AI 感知的治理框架。</p>
<p>这三个方向——冲突预防优先、知识复合积累、架构治理显式化——代表了 AI 工程化走向成熟的三个关键节点。</p>
<hr>
<h2 id="结语">结语</h2>
<p>多 AI 并发协作的困境，本质是一个信息热力学问题：多个自主信息处理单元在无协调的情况下操作共享资源时，系统熵必然自发增大。Forge 的贡献在于，它没有试图让每个 Agent 更聪明（这是模型厂商的工作），而是在 Agent 之上构建了一个<strong>协调基础设施</strong>，用文件锁、知识持久化和漂移检测三个工程机制对抗熵增的自然趋势。</p>
<p>开源地址：https://github.com/nxtg-ai/forge-orchestrator</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>NXTG.AI, &ldquo;The Forge Whitepaper: Multi-AI Orchestration for Software Development&rdquo;, 2026-02-10. <a href="https://nxtg.ai/insights/forge-whitepaper">https://nxtg.ai/insights/forge-whitepaper</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item></channel></rss>