技术参考

harness 如何运作,逐点讲清

Xihe 背后的机制,讲明白。每个部件是什么、为何存在、行为如何——讲概念与设计,不是可粘贴的内部实现。

编排 Harness

环绕模型的可靠系统——图、缓存、路由,以及驱动它们的角色。

编排 Harness

DAG 执行器

leaf要么全部后置条件满足,要么丢弃——失败限在图边界。

DAG 执行器是 harness 的故障边界原语。工作内容编译为一组原子 leaf 构成的有向无环图,executor 强制执行严格生命周期:每个单元要么全部成功断言后置条件,要么丢弃如从未运行。可靠性是图形结构与这一二元契约的函数,而非 leaf 内部运行的模型决定。

失败模式

缺少这一原子契约时,基于易错模型或服务的多步骤管线会遭受部分状态损坏。中途失败的 leaf 可能留下半写好的输出,下游 leaf 不知情地消费这些输出,无声地叠加错误。当多个 leaf 共享依赖却无明确的完成/未完成信号时,竞态条件出现,系统无法回答“此输入是否稳定”。重试逻辑变得模糊:若 leaf 部分变更了状态,重新执行可能导致效果重复应用或传播过时数据。conductor 无法区分干净失败与从未正确启动的 leaf,每次失败要么强行全图重跑代价高昂,要么手动梳理副作用。harness 将歧义泄露到每一次重试、跳过或路由重定向决策中,可靠性崩溃为每个 leaf 的防御性检查纠缠体。

工作原理

executor 为每个 leaf 强制执行严格的状态生命周期:

  • pending – 尚未评估就绪性。
  • ready – 所有上游依赖处于 doneskipped 状态;leaf 可被 dispatch。
  • running – leaf 正在其上分配模型或工具上执行。
  • done – 执行完成且 leaf 成功断言其后置条件。
  • failed – 执行完成但后置条件断言失败(或发生异常)。
  • paused / skipped – 外部控制状态(例如人工暂停或 conductor 指示跳过)。

一个 leaf 从 pending 转换到 ready 仅当每个上游 leaf 都达到终止状态(doneskipped)。没有部分就绪,没有尽力推测。这个拓扑门确保没有 leaf 会在不完整或未验证的输入上运行。

当 leaf 完成其负载后,executor 运行 leaf 的后置条件检查——一组必须成立的不变式(例如输出格式有效、必要字段存在)。若断言通过,leaf 转为 done;若失败,leaf 立即被丢弃:其状态转为 failed,其输出从 DAG 上下文中擦除,下游 leaf 永远不会看到它。失败限制在 leaf 边界内。conductor 随后可以决定重试该 leaf(以可能不同参数重新实例化)、跳过它(标记为 skipped 以便依赖项适应)或重新路由工作流——全都毫无歧义,因为没有部分状态逃出 leaf。

DAG executor 从不解释 leaf 逻辑。它只强制执行生命周期、依赖拓扑和后置条件门。它保证每个达到 done 的 leaf 都完全验证过,每个失败 leaf 在图内不留可见痕迹。

权衡与边界

  • 后置条件成本。 每个 leaf 必须定义并执行其自身不变式。廉价后置条件(类型检查、schema 验证)开销低,但重量级检查(例如重新评估模型输出)可能成为瓶颈。executor 不提供优化——leaf 作者负担该成本。
  • 无部分结果或流式输出。 二元契约禁止增量输出。失败 leaf 产生的任何部分工作都会丢失;leaf 是全有或全无的单元。需要渐进交付的工作负载必须拆分为更小的 leaf 或使用其他原语。
  • 副作用不会自动回滚。 “丢弃如从未运行”使 leaf 对下游消费者不可见,但任何预先提交的外部副作用(API 调用、写入)仍存在。契约依赖 leaf 作者设计幂等的 leaf、将不可逆效果延迟到后置条件成功之后,或通过外部管理补偿。
  • 仅限有向无环。 DAG 严格无环。循环工作流必须在 executor 外部处理,通常由 conductor 每次迭代重新规划新图。
  • 退化路径。 若后置条件过弱(总是通过),executor 退化为简单调度器,未验证输出传播,消除可靠性保证。若后置条件过严,健康输出被拒绝,导致过多假阴性失败。调整后置条件严格度是持续运维事项。
  • 粒度是设计选择,而非运行时调整。 粗粒度 leaf 在失败时丢弃大量工作;细粒度 leaf 增加图开销与调度复杂度。executor 无论如何都将每个 leaf 视为原子。

何时值得使用

DAG executor 在以下场景中发挥价值:任何多步骤工作流中,单一失败不能损坏整个管线。

  • 带验证的模型链: Leaf A 生成输出;leaf B 用后置条件验证它。若验证失败,仅 A 被重试,下游步骤不受污染。
  • 昂贵的混合模型管线: 廉价快速模型运行一个 leaf;后置条件 leaf 检查一致性。失败可触发仅该 leaf 在更强模型上重跑,节省成本。
  • 带依赖的并行扇出: 就绪规则确保下游 leaf 只看到来自所有上游 leaf 的稳定、验证过的输入,消除竞态条件。
  • 审计与调试: 每个 leaf 记录二元成功或失败及其后置条件结果,提供干净、原子追踪的执行历史。
  • 高可靠性工作流: 财务计算、合规检查或配置生成,其中半执行步骤会破坏下游状态。

一个 leaf 要么完成,要么从未发生过——图保证这一点。

编排 Harness

CAS 状态(比较并交换)

叶子级 CAS 消除双重认领与完成,并行图执行安全无全局锁。

比较并交换(CAS)状态是一个每叶子(per‑leaf)的原子状态机——pending → claimed → completed——保证在任何并发度下恰好有一个工作者可以认领并完成给定叶子。它建立在一个核心思想上:只有 compare‑and‑swap 指令成功的工作者才能转移状态;其他工作者看到不匹配,转而处理其他任务。结果是得到一个无锁框架(lock‑free harness),将并行叶子执行从竞态条件转变为确定性认领。

失败模式

没有 CAS,DAG 中每个就绪的叶子都会成为潜在的静默错误点。两个或更多工作者检查同一个叶子,都看到 pending,然后都决定执行。它们重复工作——浪费计算资源——然后都写入完成标记。下游依赖项收到两次本应只有一次的转换,破坏了它们的不变量。如果叶子产生副作用(文件写入、API 调用、数据库插入),这些操作会触发两次。基于单一完成语义的图依赖解析,会静默地变成无意义的混乱。脆弱性随并发度放大:更多工作者提高了碰撞概率,一个未保护的叶子就足以破坏整个计划。全局互斥锁可以阻止这种情况,但代价是所有叶子转换串行化,吞吐量归零。没有 CAS,可靠的并行执行是不可能的——框架变成一场彩票,而非一条流水线。

工作原理

每个叶子携带一个可原子访问的状态字。框架定义了恰好三种合法状态和两个受保护的转换:

  • 认领(Claiming):工作者读取叶子状态(预期 pending),并尝试原子 compare‑and‑swap 为 claimed。只有一个工作者的 CAS 成功;失败者看到不匹配——要么 claimed(其他工作者已获胜),要么 completed(已完成)。失败工作者不阻塞。它从分发队列中选取另一个叶子,或者只有在状态保持 pending 时(一个很快会解决的边缘情况)才重试同一个叶子。
  • 完成(Completing):执行完叶子任务后,获胜的工作者执行第二次 CAS,从 claimed 转换为 completed。这防止了重复完成:如果某个错误或过时的恢复尝试再次完成同一个叶子,CAS 会失败,因为状态已经是 completed。只有第一次成功完成才有效。
  • 失败处理:如果工作者在认领 CAS 之后、完成 CAS 之前崩溃,叶子状态停留在 claimed。CAS 本身无法超时或回滚该状态——它是一个纯粹的原子原语。恢复被委托给分发层,该层监控叶子状态并应用超时/重试策略(例如,在可配置的截止时间后将叶子重置为 pending)。这种分离使框架快速且最小化,同时由更高层组件处理活性。

CAS 原语始终开启,对模型不可见,由框架在每个状态转换上强制执行。不存在全局锁;工作者从不相互等待。

权衡与边界

CAS 是单状态原语。它不协调多叶子事务——它不能原子性地同时认领叶子 A 和叶子 B,也不能回滚已完成的叶子。这些责任属于 conductor(计划级编排)和 dispatch(拓扑排序、恢复)。

崩溃后卡在 claimed 状态的叶子需要外部超时;没有它,进度将停滞。分发层的重试策略必须根据工作负载调整,以平衡误报重置与长时间停顿。CAS 也不提供副作用幂等性:如果叶子写入外部数据库,然后工作者在完成 CAS 之前崩溃,框架可以在超时后重试叶子,但无法撤销该数据库写入。安全性保证是状态转换的完整性,而非外部补偿。

在极端竞争下——许多工作者争夺同一个叶子——CAS 失败会浪费少量 CPU 周期用于重试。实际中,分发层将工作分布到许多就绪叶子上,使竞争可忽略。一次成功 CAS 的成本是单个硬件原子指令(几个周期),远小于叶子内部的模型推理或 I/O。如果工作负载完全由微秒级任务组成,该开销可能变得可测量,但这对 agent 平台而言是不典型的用法。

CAS 不防止叶子产生错误结果(模型幻觉、错误的工具调用)。验证(verifier)——路线图上的一个独立组件——处理输出正确性。

何时发挥价值

任何时候多个工作者并发执行叶子时,CAS 都体现价值。对于任何吞吐量敏感的 Xihe 部署,这是默认设置。它在以下情况下尤为突出:

  • 叶子代价高昂(数秒的模型推理或 I/O),重复执行会浪费时间和外部配额。
  • 叶子产生副作用且不能触发两次——例如,速率受限的 API 调用、数据库插入、文件写入。
  • 工作者是异构或不可靠的(模型延迟变化不定,可能崩溃)。CAS 确保状态转换诚实,即使工作者来来去去。
  • DAG 包含数十到数千个叶子,且分发层同时馈送许多就绪叶子;全局锁会成为串行化瓶颈。

在这些场景中,CAS 将并行性从正确性隐患转变为安全、可预测的流水线。如果系统使用单一工作者运行,CAS 增加微不足道的开销且永远不会竞争;一旦并发度提高,它就静默地防止了开发者从不需要考虑的破坏。

CAS 将并发叶子执行从竞态条件转变为可预测的流水线:一个工作者,一次认领,一次完成。

编排 Harness

冻结前缀缓存与并发机制

冻结前缀缓存通过共享字节稳定前缀,将并发宽度与提示成本解耦。

Harness 将共享上下文——系统提示与任务框架——物化一次,并锁定为字节稳定的提示前缀。DAG 中的每个叶子都通过 provider 的提示缓存机制继承该前缀,从而消除冗余的 token 重算。其核心思想是:并行执行不应倍增共享上下文的成本;通过缓存该上下文,并发宽度仅受 provider 速率限制约束,而非 token 预算。

失败模式

若没有冻结前缀,宽 DAG 中的每个叶子都会独立传输并处理相同的系统提示与任务框架。这种冗余不仅是浪费——更会破坏性地叠加。每个叶子为前缀支付全额 token 生成成本,将 256 路扇出变成同一上下文的 256 倍 token 乘法。延迟膨胀,因为 provider 需反复为前缀计算 KV 缓存,耗尽自身资源并扼制吞吐量。并发在 token 预算与速率限制余量的重压下崩溃:本应快速的并行叶子执行变成序列化、成本爆炸的行军。

该故障是静默的——无报错、无崩溃。开发者可能用少量叶子测试,从未发现问题,直到 DAG 拓宽时撞墙。脆弱性在于并发与提示大小互相耦合;消除这一耦合是设计的核心任务。

工作原理

Harness 在任意叶子被派发前,将共享上下文物化一次,并锁定为确定性的不可变字节序列。后续叶子不再重新组装这一前缀;它们通过 provider 的提示缓存机制引用它。Provider 存储前缀的 KV 状态,并为每个提交相同字节精确前缀的叶子提供该状态,完全跳过重算。

  • 每个叶子的请求由缓存前缀(或对其的引用)加上叶子特有后缀组成。Provider 将前缀 token 视为缓存命中,按约 生成价格的 10% 计费。
  • 重算降为零;每个叶子仅剩轻量级缓存查找。
  • 结构共享使得宽并发变得可负担:在该方案下,DeepSeek 工作负载通常可在单个缓存前缀上实现 ~256 路扇出;MiMo 可扩展至 ~8 路。
  • 冻结前缀是一条 红线。任何编辑——哪怕一个 token 的改动——都会使所有下游叶子的缓存失效,迫使每个叶子对前缀的 KV 状态进行完全重算。因此,Harness 将前缀修改视为破坏模式的操作,仅允许在 conductor 显式重新规划的步骤中进行。

该设计 将并发宽度与提示大小成本解耦。并行性现在受限于 provider 的每秒请求数或每分钟 token 数限制,而非共享上下文的大小。

权衡与边界

冻结前缀强加了严格的刚性:DAG 中所有叶子的共享上下文必须完全相同。不存在混合“部分动态”机制——系统提示或任务框架中任何逐叶子的变化都将要求不同的前缀,从而破坏缓存收益。这些叶子特有需求必须放在后缀中,而后缀无法从缓存获益。

最大的代价是 红线惩罚。在运行中更改前缀会迫使后续每个叶子完全重算,导致 token 使用量和延迟飙升。这仅在重新规划很少发生时才可接受——conductor 的重新规划步骤被明确门控,以有意吸收这一代价,而非由叶子意外触发。

该机制依赖于 provider 支持提示缓存。若 provider 不提供缓存或在缓存命中时仍按全额 token 收费,则 token 节省作用消失,仅剩下结构上的简化。对于非常小的 DAG(少量叶子)或琐碎的共享上下文,管理冻结前缀的开销可能超过收益。

缓存命中经济学依赖于前缀在短时间窗口内被密集复用——这正是 Harness 保证的模式。然而,Harness 无法控制 provider 的缓存驱逐策略;它仅确保前缀字节稳定并统一传输。退化路径是每个叶子完全重算,Harness 将其视为昂贵的缓存未命中,但不会尝试重试或补偿。

何时发挥价值

每当大量静态共享上下文供给多个并发叶子时,冻结前缀就会带来收益。

  • 宽扇出 DAG,例如代码生成,其中单个规范派生出数百个独立函数实现。每个叶子继承相同的架构约束;前缀只支付一次,并行几乎免费。
  • 多智能体评估,其中相同的评分标准与系统提示被并行应用于数十个响应。
  • 批量提取或分类,具有固定的 schema 描述和格式化规则;每个叶子仅输入记录不同。
  • 成本敏感部署,其中 token 预算紧张,约 10% 的缓存命中定价将原本不可承受的扇出变成可控开销。
  • 延迟敏感的实时智能体,跳过 KV 预填为每个叶子节省数百毫秒。

该机制对于单叶子任务或共享上下文微不足道的 DAG(例如单行系统提示)而言过于笨重。它恰恰在以下场景中证明其价值:并行性因 token 成本而受限——且共享上下文足够大,使得节省决定性的。

冻结前缀将并发从 token 成本转变为速率限制游戏:为共享上下文支付一次,且仅一次。

编排 Harness

Best-of-N 嫁接

Best-of-N 嫁接以并行探索换取串行风险:前缀冻结,N次廉价,裁判择优。

Best-of-N 嫁接是一种针对高风险叶子节点的驾驭策略:conductor 并行启动 N 个独立尝试,它们共享相同的冻结前缀。可配置的裁判组根据成本、质量和延迟对每个尝试打分;仅将得分最高的尝试嫁接到主树上,其余丢弃。其核心思想在于冻结前缀意味着你为并发付费,而不是 N 倍的 token——成本仅适用于分叉的后缀部分。

失败模式

没有 Best-of-N,每个叶子就是单次模型调用。对于棘手的算法、设计决策或模糊的规格说明,那一次尝试本质上就是抛硬币。如果模型第一个样本是次优的——脆弱的实现、错误的设计选择、误解——错误会悄无声息地向下游传播。后续叶子建立在有缺陷的产物上,加剧损害。发现为时已晚,迫使进行昂贵的重新规划,回滚整棵或子树。即使是串行重试也是浪费:每次再次支付前缀的全部 token 成本,并且没有机制系统地比较候选者。计划的质量崩溃到其最弱叶子的可靠性,开发者只能把整棵树押注在单个猜测上。

工作方式

  • 冻结前缀。 所有 N 次尝试共享直到该叶子的相同上下文——相同的对话历史、相同的中间结果、相同的指令。分歧仅从叶子输入开始,因此 token 开销有界:你大致支付公共前缀一次加上 N 次后缀 token。并发取代了 token 乘法。
  • 并行执行。 conductor 标记该叶子为 Best-of-N 并同时启动 N 次独立调用。每次尝试在其自己的模型调用中运行,无共享可变状态。延迟是最慢尝试的挂钟时间,而非总和。
  • 裁判组。 每叶子评分函数评估每个完成的尝试沿三个轴——成本(消耗的 token)、质量(正确性、风格、约束遵守)和延迟——每个具有可配置权重(例如质量 0.7,成本 0.2,延迟 0.1)。裁判组可以是规则、schema 验证器或模型调用。只有得分最高的尝试被嫁接到树中;丢弃的 N‑1 次尝试是临时的,对下游不可见。
  • 质量门控。 如果每个尝试都低于最低质量阈值,则该叶子整体失败。不会有“最不差”的结果传播。conductor 必须重新规划或升级失败,防止无声退化。

权衡与边界

代价是什么。 并发开销是主要代价:N 次并行调用消耗速率限制余量、工作线程槽和内存。当一个计划中许多叶子同时使用 Best-of-N 时,系统可能饱和并使其他分支饥饿。延迟由最大尝试持续时间加上裁判评估界定,而不是平均值。丢弃的后缀浪费 token——如果后缀相对于前缀较长,token 节省减少。最后,裁判组本身增加延迟,并且如果它是模型调用,则额外增加 token 成本。

不适用的情况。 产生昂贵外部副作用的叶子——数据库写入、邮件发送、支付 API 调用——绝不能使用 Best-of-N。每次尝试都会触发其副作用,并且失败尝试没有事务性回滚。状态依赖的裁判逻辑也会破坏该模式:如果裁判的分数取决于可变的外部状态(例如每次尝试递增的计数器,或尝试完成的顺序),比较变得无效。裁判必须是尝试输出和叶子输入的纯函数。同样,输出无法独立评分的叶子(例如没有评分标准的主观创意文案)是糟糕的候选者;自动裁判会带来虚假的可靠性感。

退化路径。 如果所有尝试都未通过质量门控,则叶子干净地失败——这比一个无声的腐化输出要好。实践中,开发者可以在资源紧张时调低 N(较小的 N 仍然多样化风险),或在解空间特别大时增加 N。顶部尝试之间的分数差距作为信号:如果尝试得分相似,则额外的并发收益甚微;如果它们急剧分化,则嫁接正在起作用。

何时值得使用

  • 棘手的算法或重构,解空间宽广。 存在多个可行的实现;其中一个可能处理边缘情况不佳。Best-of-N 并发测试这个空间并选出最干净、最便宜的结果。
  • 存在几种合理方法的设计决策。 在事件驱动 vs 轮询架构,或工厂 vs 策略模式之间选择。每种尝试为不同方法辩护,裁判选出最佳权衡。
  • 模糊的规格说明,单次通过如同抛硬币。 当提示词留有解释空间时,N 次尝试采样解释空间;裁判选择最连贯或最保守的匹配。
  • 任何出了错后期发现代价高昂的叶子。 核心业务逻辑、数据模型 schema、安全边界——一个错误会级联到几十个下游节点。嫁接的并发成本是对更大返工的保险费用。

Best-of-N 嫁接以并发成本换取可靠性:冻结前缀保持 token 成本低廉,且只有胜者存活。

编排 Harness

Hashline 行哈希编辑

内容哈希自动定位纠正行偏移,解耦位置精度与模型质量

Hashline 是 harness 层的一个验证步骤,用于消除廉价 executor 模型的行偏移错误。其工作机制是:在编辑前后,对每个受影响的代码行及其上下文进行哈希,然后比对。如果目标行的内容在修改后的文件中唯一存在于其他地方,则自动纠正偏移;否则直接拒绝补丁。无需修改提示,不涉及模型,延迟可忽略不计。核心思想:用行自身的内容作为位置锚点,而非模型脆弱的行号猜测。

失败模式

一个廉价 executor 模型(为速度和成本刻意选择而来)常常将编辑位置偏移一行。本应修改第 42 行的指令,最终落在了第 41 或第 43 行。产生的 diff 看起来仍然合理——代码修改语法正确,文件能编译,静态检查通过。错误是不可见的。经过多轮迭代,这些逐行偏移错误会悄无声息地累积:保护条件漂移到错误分支,注释上移一行,函数调用进入不同作用域。代码仍可构建,测试或许仍能通过,但逻辑结构已经腐烂。只有当下游 bug 迫使人们跨轮次历史进行昂贵的溯源追踪时,问题才会暴露。调试那样的混乱局面,其成本远超使用廉价模型节省的计算量。根本原因在于,弱模型将行号当作文本坐标而非语义锚点——它们对 token 级别的空间推理是模糊的,每一次编辑都是一场关于位置精度的赌博。没有机械性的护栏,harness 只能相信模型报告的行号,而这种信任是脆弱的。

工作机制

Hashline 在补丁提交管道中插入一个基于内容的检查,完全在模型调用之外运行:

  • 派发前,harness 对编辑应该接触的每一行以及可配置数量的周边上下文行进行哈希。这捕获了每行内容的精确内容(包括空白),并存储行号到哈希的映射。
  • executor 返回补丁后,harness 将补丁应用到文件的本地拷贝,并重新哈希相同的逻辑行(按原始位置)。
  • 如果每个哈希都匹配,则编辑位置正确,补丁进入提交阶段。
  • 如果发生哈希不匹配,harness 会扫描邻域(通常为整个文件),寻找内容哈希与目标行编辑前哈希一致的行。如果恰好存在这样一个行,则自动纠正偏移——编辑被应用到该行。如果零个或多个行共享该哈希,则直接拒绝补丁。
  • 模型从未感知到这一步。没有提示修改,没有重训练,没有额外推理。检查在微秒内完成,比模型调用本身快数个数量级。

这一机制将位置精度与模型质量解耦。executor 只需为目标行产生正确的内容;harness 确保该内容落到文件中的正确行。可靠性在模型之外被工程化。

权衡与边界

Hashline 是一个位置护栏,而不是语义护栏。它验证的是编辑落在哪里,而不是编辑本身逻辑上是否正确。一个完美对齐但引入了 bug 的补丁仍然会通过。它补充而非替代其他验证阶段。

哈希唯一性要求。 自动纠正依赖于目标行在文件中具有唯一的内容哈希。如果该行为空、只包含空白,或者与相邻行重复(例如连续的 }) 行),harness 无法区分,会回退到拒绝。这是故意设计的:安全拒绝优于静默误用。实践中,具有独特标识符或注释的非平凡代码行很少发生碰撞,因此自动纠正大部分时间都在工作。对于重复性高的文件(自动生成的头文件、表格数据),拒绝率可能上升。

架构成本。 harness 必须维护一个编辑前的文件快照,以便在应用补丁后重新哈希——这是较小的内存开销,通常已存在于 conductor 的状态管理中。哈希每次编辑增加几微秒,相对于模型推理可忽略不计。

退化路径。 随着重复内容增加,拒绝变得更频繁。每次拒绝都需要重试(conductor 重新派发编辑,可能给更强的模型),但防止了静默损坏。用户可以调整上下文窗口大小;更宽的窗口可以提高唯一性,但也增加了合法编辑到某行上下文时触发虚假不匹配的几率,因此这是一个刻意的权衡。

适用范围。 Hashline 作用于单文件、基于行的编辑。它不适用于全文件重写(“受影响行”失去意义)或跨文件移动。插入和删除被隐式处理:搜索比较的是内容而非绝对位置,因此将目标行下推的插入不会破坏检查。

适用场景

当选择廉价 executor 模型是为了速度或成本而非位置精度时,Hashline 便物有所值。具体场景:

  • 迭代、多轮编辑循环——conductor 在一个会话中执行数十个小补丁。没有 Hashline,至少发生一次逐行偏移错误的概率接近确定;有了它,每个补丁都被固定在内容上,而非脆弱的行号。
  • 廉价 executor 农场——团队使用小型、快速模型(如 Llama 8B、Gemma、Claude Haiku)进行批量叶子编辑。这些模型成本效益高,但空间推理能力众所周知地弱。Hashline 让它们能够完成原本不可信任的、精确到行的外科手术式工作。
  • CI/CD 修复机器人或自动化重构——任何补丁必须正确落地且无需人工检查的流水线。拒绝会立即暴露出失败,而不是将其隐藏在后来才出问题的损坏文件中。
  • 混合层级系统——昂贵的 conductor 模型(如 Opus、GPT-4o)配合廉价 executor。如果 executor 放错行,规划者的昂贵推理就白白浪费了;Hashline 将两者解耦,保留了廉价工人的经济优势。

当 executor 模型已经具有近乎完美的位置精度(在短上下文上的顶级模型)或编辑只是重新生成整个文件时,Hashline 用处较小。但其开销如此之小,以至于通常默认保持开启——即使是强模型在极长文件中偶尔也会数错行。

永远不要相信模型数行——让内容哈希作为锚点。

编排 Harness

语言服务器集成

将编辑锚定在真实代码结构上,取代概率文本补全。

语言服务器集成通过语言服务器协议(LSP)向 executor 提供实时的、结构化的代码库视图。它将“猜测程序”的问题转化为“查询程序”的问题,将智能体的推理从概率文本补全转移到由驱动人类编辑器的同一工具链所提供的锚定符号表。

失效模式

没有 LSP 集成时,executor 基于原始文本操作。每一个符号引用、导入路径、方法签名都必须从周围 token 推断。模型可以生成看起来合理的代码——正确的缩进、熟悉的命名——却悄然破坏不变量。它可能重命名一个函数但遗漏其他文件中的调用点,生成对不存在方法的调用,或者导入从未安装过的模块。这就是“幻觉路径”失效模式:模型自信地构建了一个在代码库中毫无事实依据的现实,而由于文本看起来连贯,智能体内部没有警报。

浪费叠加。executor 可能将整个文件倾入上下文,希望模型能发现相关部分,从而在无关的函数体上烧掉令牌和注意力预算。它可能发出多轮澄清(“parseConfig 的返回类型是什么?”),而这些本可以瞬间回答。最糟糕的是无声的破坏——通过视觉审查但破坏构建或引入微妙语义不匹配的编辑。每一次这样的编辑都需要手动调试,违背自动化的初衷,且脆弱性随着模型参考的文件数量组合级数增长。

工作原理

executor 充当轻量级 LSP 客户端。它不是将文件作为自由文本请求,而是发送定向的、只读的查询,并接收结构化回复:

  • textDocument/documentSymbol 返回文件的符号树——名称、种类(函数、类、变量)以及位置范围。
  • textDocument/references 枚举整个项目中某符号的所有使用点。
  • textDocument/definition 将符号解析到其精确声明位置,包括文件、行和列。

每个查询返回的是 AST 级别的元数据,而不是原始文本。executor 完全基于这些响应构建其内部符号表。模型只能请求 LSP 报告的内容;它无法伪造不存在的定义或调用点。编辑变得锚定:在模型写出一个 token 之前,重命名一个符号就会揭示所有受影响的位置;添加一个函数调用时,目标签名会与实际代码图进行校验。executor 只读取 LSP 指向的文件和行范围——从来不指望通过加载整个文件来对齐上下文——从而大幅减少令牌消耗。

此集成在 LSP 端是只读的,且按语言区分。它从不发送如 textDocument/rename 这类变更操作;仅当相关文件类型有语言服务器运行时才激活。如果没有可用的服务器,executor 回退到基于文本的启发式方法——可靠性较低,但可用。当服务器存在时,结构化查询总是优先。

权衡与边界

语言服务器集成有诚实的边缘。每种语言需要一个运行的 LSP,在服务器索引项目时增加启动延迟。对于短生命周期的单文件任务,开销可能超过收益。回退到文本启发式方法噪音更大、精度更低,因此没有 LSP 的环境(某些动态语言、自定义 DSL)以较低的可靠性运行。

集成严格静态。它提供结构元数据——符号名、类型、引用——但不提供运行时类型、动态分发或元编程模式。一个编译通过但运行时抛异常的方法不会被捕获。模型仍需读取函数体和注释以理解语义;LSP 锚定的是推理的结构,而非其含义。

LSP 服务器本身有差异:有些落后于语言版本,有些省略某些符号种类,有些在大规模索引时崩溃。harness 必须优雅地处理这些情况——超时、重试、降级——绝不让计划无限阻塞。

何时物有所值

每当智能体需要导航包含多个模块的代码库,或生成要求结构精度的编辑时,LSP 集成就能发挥价值。具体触发条件:

  • 跨文件重构:重命名一个出现在数十个文件中的符号。引用查询提供受影响位置的明确列表,防止无声遗漏。
  • 类型感知代码生成:添加一个必须匹配另一文件签名的函数调用。定义查询揭示精确的参数类型和返回类型,消除猜测。
  • 导入管理:documentSymbol 列出模块的导出项,因此智能体无需手动扫描文件即可选择正确的导入路径。
  • 提交前验证编辑:后续的引用查询可以验证变更后是否残留悬挂引用。

对于具有简单模式的单文件任务(例如为已知签名生成单元测试),启动成本可能不值得。但只要智能体需要问“这个名称的定义是什么?”或“谁使用了这个变量?”,LSP 就能瞬间、确定地给出答案。

LSP 是静态程序结构的单一事实源——harness 从模型外部工程出可靠性。

编排 Harness

MCP 路由器

MCP路由:延迟schema、沙箱输出、消除无声毒化。

MCP 路由器是 Xihe harness 内部的单一入口点,所有模型‑上下文‑协议(Model‑Context‑Protocol)工具调用必须经过此处。它贯彻一个核心思想:将可用工具的目录与其 schema 及结果分离。Agent 看到的是轻量级菜单与紧凑指针;schema 与大型载荷按需获取或存储,从不预加载或倾倒入上下文。

故障模式

没有集中式路由器时,每个 agent 必须在每一轮提示中预加载完整的 MCP 工具 schema——这是一个随着工具目录增长而膨胀的固定成本。单个 schema 可能重达数百 token,十几个工具每轮就浪费 4–8K token 在未使用的元数据上,挤压任务指令与推理空间。这就是无声上下文毒化:不崩溃,只表现为提示词被无关结构填满后响应质量逐步退化。

第二个故障是输出倾泻。当工具返回大型载荷——文件内容、搜索结果、数据库行——它直接落入上下文窗口。上下文单调膨胀,引发延迟激增(模型必须重新消化整个膨胀的历史)、token 溢出和成本失控。由于每个 agent 自主管理工具调用,没有中心点来修剪、计量或审计发生了什么。添加工具让提示更重;执行工具让上下文更大。结果是脆弱的、规模负相关的集成:更强的能力意味着更差的性能,而且往往直到系统崩溃才能察觉。

工作原理

路由器位于 harness 侧,从不在 agent 侧。它通过三个元工具强制统一接口,用可控的按需存取替代原始的 schema 注入。

  • 驻留菜单。 启动时,harness 构建一个轻量级工具名称列表及一行描述。这个菜单每个工具只消耗几个 token,作为唯一的静态引用常驻在 agent 上下文中。没有 schema,没有参数——足够让 agent 发现可用工具。
  • 按需 schema 加载。 当 agent 决定调用某个工具时,它首先调用 describe(tool_name)。路由器只在此刻才获取该工具的完整 JSON schema,并且只获取这一个。除非 agent 显式请求,schema 永远不会出现在提示词中,因此每轮工具开销比预加载全部工具降低约 70%。
  • 三个元工具。 所有 MCP 交互通过 search(按能力发现工具)、describe(获取工具 schema)和 call(带参数执行)进行。路由器从不暴露原始工具注入;agent 无法绕过此接口。Harness 会拦截并拒绝任何直接的 MCP 流量。
  • 输出沙箱。 当工具返回大型结果时,路由器将完整载荷存储到外部,并返回一个紧凑指针——标识符加字节大小——替代原始输出。Agent 只看到指针,将大部分内容排除在上下文窗口之外。对于过大结果,这能节省约 98% 的上下文空间。
  • 审计边界。 每一次 searchdescribecall 都在路由器边界记录:agent ID、工具名称、输入大小、输出大小、延迟。Harness 维护单一结构化的审计流,用于计费、调试和治理。Conductor 和 dispatch 对输出体积完全无感;它们调度产生指针而非文档的叶子任务。

开发者体验简单:通过配置映射将 MCP 服务器注册到路由器。添加或移除工具时无需更改 agent 代码。路由器的菜单在 harness 初始化时自动更新。

权衡与边界

按需 schema 加载在第一次使用某个工具时会增加一次额外的 describe 往返。对于重复调用同一小工具集的 agent,此开销相比 LLM 推理时间很小,但并非零。极低延迟管线(每轮 <200 ms)可能感受到成本;其他所有情况下,token 节省都超过它。

路由器是单点故障。如果路由器进程宕机,没有 agent 能调用任何 MCP 工具。Harness 本身就已是关键组件,因此通常可以接受,但高可靠性部署应规划备用或优雅降级路径——例如回退到无沙箱的静态菜单。

输出沙箱依赖外部存储(内存、文件或对象存储)。如果该存储不可用,路由器无法返回有效指针。必须显式制定回退策略:要么让工具调用失败,要么允许内联输出并附带警告。约 98% 的节省仅适用于大型输出;结果本就低于沙箱阈值时直通传递,不产生节省。

路由器不强制工具认证或授权——那是 MCP 服务器的职责。它也不对工具排序或决定调用哪个工具;那是 agent 推理循环的决策。最后,路由器不能替代整体上下文窗口管理。重复调用同一工具且保留旧指针仍会导致上下文增长,因此 conductor 仍需要应用摘要或驱逐策略。

何时发挥价值

MCP 路由器一旦 agent 使用超过三个 MCP 工具,或任何工具经常返回数百 token 以上输出时,就能收回成本。它在以下场景不可或缺:

  • 多个 agent 共享一个不断增长的工具集(代码库搜索、文件 I/O、API 客户端),预加载所有 schema 会消耗 5–15% 的上下文窗口。
  • 工具产生可变且常为大型的结果——文件内容、数据库转储、搜索结果——单个过载载荷可能毒化整轮交互。
  • Token 预算紧张,无论是出于成本约束还是小模型上下文窗口的限制。
  • 每次工具调用都必须接受合规、成本分配或回放调试的审计。
  • 多个 agent 使用同一组 MCP 服务器;路由器提供单一的计量、沙箱化接口,并防止跨 agent 上下文污染。

相反,一个只有两个工具、输出小于 500 字节且无审计需求的原型只会看到额外开销。路由器的价值在规模下显现——恰恰在朴素 MCP 模式开始失效之时。

MCP 路由器将 MCP 从每轮固定开销转变为按次计费——在 harness 网关处计量、沙箱化、可审计。

编排 Harness

Context-mode(在代码中思考)

上下文模式将确定性任务从LLM转移到脚本,压缩上下文预算。

没有上下文模式时,每一个确定性子任务都迫使LLM摄入原始数据,在概率环境中执行算术、模式匹配或逻辑操作。这种做法的失败具体体现为三点。第一,令牌浪费和上下文膨胀:原始文件消耗了本应用于规划的预算,导致conductor随着上下文窗口被噪声填满而忘记早前的步骤。第二,静默数据幻觉:模型以高置信度错误计数、捏造数字或错位对齐列,而无验证性追踪,错误便不可见地传播到下游推理中。第三,不可重现的输出与审计性丢失:自然语言推理是不透明的;评审者无法重放计算以找出错误,而一个幻觉摘要看上去和真实摘要一样可信。框架将确定性工作交给了最不合适的组件,使得每项此类任务都成为可靠性地雷,在不触发崩溃的情况下毒化agent的输出。

工作机制

框架检查conductor生成的计划,并分类那些其结果仅依赖于已知数据上的确定性计算的叶子任务(如计数匹配、差异比较、列聚合、结构化输出格式化)。当查询足够明确时,框架将任务路由至沙箱化的executor——此决策可以是每个任务单独设置,也可以是全局设置,并且由dispatch层强制执行,dispatch层是确定性代码,而非LLM。

  • 脚本生成。agent编写一段短小、自包含的脚本,包含显式输入路径、内联注释、类型注解和断言。这些元素构成了推理过程中的痕迹:代码本身就是思考。
  • 沙箱执行。脚本在隔离环境中运行(无网络、只读文件系统、资源限制)。只有标准输出和退出码可以跨越边界。沙箱拒绝副作用并强制执行超时。
  • 结果压缩。框架捕获标准输出(通常是一个单一值、JSON或表格),并将其作为压缩后的事实转发给conductor。非零退出码或超时则变成显式、结构化的失败信号——绝不会是一个猜测性的摘要。
  • 完整审计追踪。脚本源代码、调用时间戳、退出码和输出都被记录在外部。任何开发者都可以在之后重放该确切计算,从而将推理从不透明的散文转化为可重现的制品。
  • 歧义时回退。当任务需要细微的语义判断、主观评估,或者agent的脚本不可恢复地失败时,框架会静默降级为标准上下文读取。降级对conductor透明,但记录在日志中,以额外的令牌开销换取正确性。

权衡与边界

上下文模式带来了真实的成本。延迟:沙箱启动和脚本生成对于琐碎查询(如“统计一行单词数”)可能显得不成比例。令牌开销:生成正确代码会消耗输出令牌——这是用前期的令牌支出来换取后期的正确性和可审计性。agent能力:小型或非编码模型可能生成有问题的脚本,被迫回退而浪费时间。安全性是强制性的:沙箱必须禁止写入、网络访问和无限循环;配置错误会将代码执行变成危险向量。不适合细微判断:该模式完全不能处理诸如语气分析或风格评判等开放型任务。如果强行使用,脚本只会返回空洞的机械答案(例如,因为只检查了字符串相等而返回“0处差异”)。红线是:当上下文模式激活时,原始文件内容绝不能进入上下文;框架必须拦截并剥离任何意外数据。降级路径显式失败:如果脚本出错,框架不会盲目重试,而是升级到标准读取,增加延迟但避免静默损坏。正确分类歧义仍然是一门工程艺术,而非解决了的算法——过于激进的分配会产生脆弱的失败,而过于保守的分配则浪费令牌。

适用场景

上下文模式在每一个针对结构化或半结构化数据的具体、可验证的问题中都值得使用。具体例子:在代码库中统计模式出现次数(PR评审)、比较两个配置文件或API响应的差异、将CSV格式化为嵌套JSON结构、聚合多个日志文件中的指标,或从值超过阈值的行中提取第三列。在多步DAG中,当中间计数、总和或约束检查必须在下一步骤之前精确完成时,它同样大放异彩——例如,计划重构的conductor首先需要已废弃API调用的精确计数。在审计关键的环境中,脚本是一个可重复的复现器,输出是一条单一的确定性行。这种模式消除了“幻觉数字”这类错误类别,这类错误在评审中看似合理,却会侵蚀对整个系统的信任。

上下文是用于压缩的预算,而不是扩展的对象——编写工具,而非文档;让代码承载精确性,把最擅长的事情留给模型。

编排 Harness

Conductor · Dispatch · Executor

指挥者规划,分发器路由,执行器运行叶子——失败回推理,绝不静默

该框架(harness)将智能体工作分解为三个硬边界层——Conductor、Dispatch、Executor——每一层都与具体模型解耦。其核心思想是:可靠性是控制流的一种工程属性,而非精心提示的副产品。通过强制将规划、路由和执行分离为不同角色,框架消除了使模型驱动管线脆弱的纠缠。

The failure mode

没有这三层分离,智能体循环就会坍缩为单体,同一个模型决定做什么何时做以及如何恢复。这种耦合滋生了一系列失败:

  • 共享状态上的竞态条件。 提示中看似独立的两个子任务可能在没有协调的情况下更新同一个可变上下文(文件句柄、进度计数器)。没有比较并交换(CAS)门控,它们会交织并损坏彼此的数据,产生看起来合理但逻辑不一致的输出。
  • 静默损坏。 一个leaf返回了错误但格式正确的结果。没有独立层验证它;错误向下游传播,开发者看到的是看似正确的最终答案。损伤不可见。
  • 浪费推理。 单一模型为一次leaf级别的失败重新规划整个任务,燃烧token和延迟重新推理已经正确的工作。或者,系统因缺乏明确的重新规划词汇而无限重试同一提示。
  • 模型锁定。 每一步都在同一个模型上运行,因为没有路由层。廉价的快速模型无法用于常规leaf,而重推理模型只负责规划——成本和品质被锁在一起。
  • 脆弱的恢复。 当模型本身既规划又执行时,失败与意图变更无法区分。系统要么盲目重试,要么彻底放弃。

所有这些失败都是编排层面的失败,而非模型质量的问题。该框架通过为每个职责分配一个独立的、确定性的所有者来解决这些问题。

How it works

该框架以铁一般的边界强制执行三个角色:

  • Conductor 接收用户意图并返回一个由原子leaves组成的有向无环图(DAG)。每个leaf定义一个工作单元——一个提示模板、一个模型绑定(Opus、Codex、GLM)和一个失败阈值。Conductor是推理密集型且可热替换;你可以更换规划模型而不触及框架的其他部分。它从不接触执行,从不读取模型输出,从不消费原始token。其产品只有DAG。
  • Dispatch 是确定性的框架代码,不带模型参与循环。它轮询DAG中依赖已满足的leaves,按拓扑分层,在有限并发下扇出。每个leaf被路由到其预绑定的模型。状态转换——就绪、飞行中、完成、失败——通过比较并交换(CAS)进行门控,以防止双重分发或竞态。Dispatch从不规划、从不验证输出、从不调用模型。其职责严格限于排序和路由。
  • Executor 在其分配的模型上原子运行单个leaf。它接收leaf定义和来自其依赖的预计算输入,调用模型,并返回结构化输出或失败信号。它完全不可见DAG、之前的leaves或整体计划。它是廉价的、无状态的,并且可大规模并行。Executor不验证——它们只返回二元通过/失败。

关键循环:当一个executor发出失败信号时,dispatch将该leaf标记为失败,停止该分支的DAG,并将控制权返回给conductor。然后conductor重新规划——重新划分子DAG、更换模型或完全中止意图。失败绝不会静默通过dispatch门控;它总是重新进入推理层。

Trade-offs & boundaries

分离并非免费:

  • DAG构建开销。 每个任务,即使是琐碎的,至少需要一次conductor调用来生成初始计划。对于单步操作,这会增加延迟和成本而无益处。
  • 重新规划延迟。 失败的leaf必须冒泡到conductor,被重新推理,并产生新的子DAG才能恢复执行。对于失败率低的工作流,间接层可能过于繁重。
  • 粒度负担。 开发者必须将意图分解为真正原子的leaves。过于粗糙的leaf浪费重新规划周期;过于细碎的leaf膨胀DAG并增加dispatch开销。没有自动的合适尺寸。
  • 验证者补上“看似合理”的缺口。 一片 leaf 可能返回看似合理但错误的结果,executor 自己的 pass/fail 信号抓不到。验证者——一个 model-agnostic 的跨模型怀疑者,默认关闭——在 DAG 跑完后审查结果;发现真问题时 conductor 静默升级到更强模型并重规划。opt-in:不配置它,返回的结果即算成功。
  • 确定性的局限。 Dispatch的CAS门控保证每个leaf恰好运行一次,但并发分发的时序是非确定性的。如果leaves修改共享外部资源,顺序仍可能导致竞态——该框架不提供外部状态的事务安全性。
  • Conductor退化。 如果conductor本身反复失败(错误指定DAG、遇到速率限制),系统退化到硬错误。没有优雅的部分输出;要么计划完成,要么不完成。

红线是绝对的,违反它们将使可靠性保证失效:Dispatch从不规划,Executor从不验证,Conductor从不消费原始模型输出。如果Conductor曾经接触leaf输出,它将重新引入该框架旨在消除的静默损坏路径。

When it earns its place

这种架构在以下场景中物有所值:

  • 工作流跨越多个模型,具有不同的成本/延迟特征——例如,一个推理密集型规划器、一个用于批量操作的快速执行器,以及一个用于代码生成的专家模型。每个leaf预绑定到正确的模型。
  • 独立子任务可以并行运行(例如,为同一个函数生成测试、文档和桩代码)。有限并发防止资源饱和,同时充分利用并行性。
  • 高正确性要求不可妥协——金融、法律或安全关键任务,静默传播错误是不可接受的。重新规划循环确保每个失败都在推理层面被诊断。
  • 你需要可审计的可追溯性——每个leaf的输入、输出和失败历史被记录,DAG为调试提供完整的溯源记录。
  • 你预期模型不稳定,并希望拥有一个容错系统,其中重试或模型切换发生在计划层面,而不是在不透明的提示循环中。

规划者规划,路由者路由,执行者行动——失败回归推理层面,绝非模型在环重试。

编排 Harness

Web 栈

在模型之外工程化检索可靠性,将搜索意图转为干净、有界文本。

Web 栈是一个 harness 级别的资源,通过将整个检索管道——查询、故障切换、内容提取和大小沙箱——放在模型之外,把互联网变成研究级信号。其核心前提:Web 检索中每个脆弱环节都在 harness 中工程化实现,而非通过提示塞给 LLM。conductor 发出搜索意图,栈自主返回干净、有界的文本摘录;模型从不解析 HTML、处理 API 密钥或推理缺失的供应商问题。

失败模式

没有 Web 栈,任何需要在线信息的 agent 都会陷入无声失败模式。单一供应商依赖意味着一个过期或耗尽的 API 密钥就会停止所有检索,而且往往没有明确信号——模型收到空字符串或错误页面,继续在噪声上推理。手动 URL 策划或基于提示的搜索迫使 conductor 猜测链接或依赖模型解析混乱的 HTML,导致上下文被导航和广告膨胀。超大页面随即撑爆上下文窗口:一篇包含大量模板代码的文章可能在出现任何事实之前就消耗数千 token,触发静默截断或用无关内容淹没信号。由于检索被视为模型内部问题,脆弱性会叠加——恢复逻辑、重试提示和幻觉回退都浪费推理预算并污染下游结论。harness 缺失,因此可靠性依赖于脆弱且无声失效的工具调用链。

工作原理

Web 栈作为单个 harness 级别资源运作,由 conductor 用搜索意图调用。无需手工喂 URL,无需恢复提示。它封装了三个自主机制:

  • Provider rotation – 自动轮换搜索后端池(Bing、SerpAPI、自托管端点)。当供应商 API 密钥缺失或耗尽时,该后端被静默跳过。只有在池中所有供应商都不可达时,栈才返回结构化的“无结果”信封。降级是优雅的:缺失的密钥从不破坏检索,conductor 永远看不到故障切换。
  • Content extraction – 每个抓取的页面通过类 Trafilatura 的提取器缩减为文本信号,丢弃导航、广告、模板代码和格式。输出是干净的段落和标题块,剥离到语义核心。如果提取的文本超过可配置的大小阈值,MCP 输出轴会自动对其进行沙箱处理。下游 agent 接收修剪后的摘录或压缩引用——永远不会是可能溢出上下文或引入噪声的原始 DOM。
  • Model‑agnostic reliability – 搜索调度、供应商故障切换、提取和沙箱都在模型循环之外发生。harness 掌握机制,因此模型始终专注于决策。检索是确定性的:conductor 发送意图,栈返回带有来源元数据的结构化文本片段。

权衡与边界

Web 栈的设计经过深思熟虑,其边缘是诚实的。

  • 延迟开销 – 轮换供应商和抓取完整页面每次查询都会增加网络时间。栈用绝对速度换取有保证的结构化信号;它不适合亚秒级交互循环。
  • 内容提取有损 – 类 Trafilatura 的提取器在静态、结构良好的 HTML 上效果最佳。它丢弃图像、布局和交互元素,且无法执行 JavaScript。动态内容(单页应用、懒加载文本)可能极小或缺失。需要视觉证据或原始页面布局的工作流将得不到有用结果。
  • 沙箱是粗粒度工具 – 超大内容被截断而非智能摘要。低阈值可能丢失细微差别;高阈值仍可能给上下文窗口带来压力。可配置的大小限制需要针对所用模型进行调优。
  • 结果质量取决于供应商相关性 – 栈按原样返回搜索供应商的顶部结果。它不重新排名、不过滤垃圾信息、也不补偿低质量索引。返回噪声结果的降级供应商会把噪声送入提取,而无信号质量检查。
  • 网络和密钥依赖 – 池中必须存在至少一个有效供应商密钥。如果所有密钥耗尽或配置错误,则返回结构化的“无结果”信封,conductor 必须显式处理该情况(例如,回退到本地知识或将该分支标记为未解决)。栈不会无限重试,也不会在空信封之外发出警报。
  • 无交互或流式页面 – 栈每个结果抓取一个静态 URL。它无法跟踪分页链、处理表单提交或维护已验证会话。它是单次、文本优先的提取器,而非通用 Web 浏览器。

红线:栈永不暴露原始 HTML、永不解释 JavaScript、永不绕过大小沙箱。conductor 不能在单次请求基础上覆盖沙箱或要求特定供应商。

何时物有所值

Web 栈在以下场景中回报巨大:研究广度大、上下文预算紧张,且 conductor 必须基于实时、未策划的来源来制定计划,同时避免脆弱的逐个 agent 集成。

  • 研究密集型计划 – 需要从多个站点验证事实或跨域收集文档的 conductor 可以将搜索意图作为 DAG 步骤发出;栈处理并行检索、故障切换和修剪,使 token 消耗可预测。
  • 长时间运行的自主 agent – 在运行数小时的循环中,单个超大页面的代价呈指数增长。强制性沙箱能防止上下文窗口随时间累积爆炸。
  • 多步骤综合或报告 – 干净的提取文本可直接输入摘要 executor 或 verifier,无需预处理。无需手动 URL 白名单或提示工程化的恢复逻辑。
  • 拥有多个搜索供应商的环境 – 通过池化 Bing、SerpAPI 和自托管端点来避免供应商锁定的团队获得韧性:一个密钥过期不成问题,检索持续进行直到所有供应商耗尽。
  • 之前需要手工策划 URL 的场景 – 如果工作流需要人类预选页面或脆弱的脚本去爬取,Web 栈用单个意图调用替代之,让 conductor 留在其规划车道上。

harness 拥有检索,这样模型就永远不必协商速率限制或解析 <div>

记忆 Substrate

会提炼也会遗忘的记忆——分层、自策展,复利成能力。

记忆 Substrate

时间知识图谱

记忆是分层提炼遗忘图,仅保留有来源事实。

Xihe 中的记忆并不是重放日志,而是一个分层时间图谱(L0–L6),它会主动进行提炼、抽象和遗忘。其核心思想是:值得保留的知识必须通过反复、无冲突的强化来赢得自己的位置,然后被压缩成更高层次的表示,同时较低层次的痕迹会逐渐衰退。这种结构性置信——即一个事实的可靠性隐含在其到达的层级和背后的来源中——用设计驱动的记忆系统取代了临时性的驱逐策略。

失败模式

没有时间知识图谱,智能体记忆会陷入三种相互关联的故障。第一,事实膨胀:原始事件、消息和工具输出无限制地累积,使检索成本膨胀,并用噪声淹没推理。第二,无声污染:过时或矛盾的现象与当前现象并存,争夺注意力并损坏下游决策——智能体将一次偶然的错误陈述与一个反复确认的约束赋予同等权重。第三,置信盲目:所有事实看起来一样可靠,因为缺乏结构性溯源;智能体无法区分一个短暂的痕迹与在数十次独立会话中强化的模式。这些故障相互叠加,使得长期运行的智能体变得脆弱、健忘或昂贵——因为上下文窗口被无关内容填满。时间知识图谱通过使遗忘成为一等、可配置的过程、并使溯源成为结构性支柱,消除了这些问题。

工作原理

该图组织为七个层级,每个层级具有不同的保留和抽象速率:

  • L0 – 原始瞬时事件流(高容量,极短保留)。
  • L1 – 经过吸收清理后的归一化、去重信号。
  • L2 – 带有溯源的结构化事实(谁、何时、从哪个来源层说了什么)。
  • L3 – 实体图,追踪关系和时间置信,将每个事实链接到其来源层。
  • L4 – 行为基因:从反复、无冲突证据中压缩的可复用交互模式。
  • L5 – 战略模式和因果链,在充分巩固后涌现。
  • L6 – 从较低层提炼出的抽象概念和不变量规则。

三个并行的过程持续塑造该图:

  • 吸收 将新痕迹摄取到 L0,归一化到 L1,并用初始溯源构建 L2 事实。
  • 提升 在一个巩固的事实超过可配置阈值(通常是反复、独立的强化且无冲突)时将其提升到更高层。随着事实上升,它进一步抽象:L3 映射实体和时间边;L4 将序列压缩为可复用基因;L5 提取战略因果;L6 结晶为不变量。
  • 衰退 降级或移除失去强化的边。较低层级若无持续确认会快速退化;较高层级仅在其压缩反复、无冲突证据时持续存在。可配置的提升阈值和衰退速率控制学习和遗忘的节奏。

溯源是结构性的:每个 L2+ 事实存储指向其来源层的指针,因此置信不是浮动数字,而是图的一个属性——位于 L4 的事实经历了多次提升周期,比位于 L2 的事实权重更高。查询只呈现已巩固的事实(L2 及以上);原始事件(L0–L1)在超过可配置的时间窗口后不可访问。记忆从来不是重放日志。

权衡与边界

  • 洞察延迟:提升和衰退异步运行。来自单次对话的事实可能不会在多个周期内到达更高层,甚至永远不会——如果它从未被强化。对新鲜事件的实时召回需要一个独立的工作缓存区。
  • 调参敏感性:阈值过高会饿死抽象;阈值过低会让噪声淹没上层。正确平衡取决于领域的信噪比和新颖率。
  • 无原始重放:在可配置时间窗口后,原始事件消失。调试错误推断依赖溯源痕迹,而非完整日志。生产可观测性以信任图的巩固为代价,放弃了精确的历史回放。
  • 不是数据库:该图不保证时间点查询、精确重构或事务一致性。它是一个概率性、始终变化的结构。将不可变事实(例如法定名称)存储在单独的键值存储中。
  • 有损压缩:从 L4 到 L5 到 L6 的抽象丢弃了原始实例;系统无法恢复创建行为基因的原始对话。
  • 对抗性风险:如果噪声被故意重复以模拟强化,提升可能被利用。在对抗环境中,需要在图范围之外增加额外的鲁棒性检查。
  • 退化路径:L4–L6 深度强化的模式可能在行为突然变化后仍然顽固持续。它们最终会衰退,但时间线可能很长;明确发出“遗忘”信号或临时降低阈值可以加速转变。

适用场景

在任何长期运行的智能体系统中使用时间知识图谱,其中过去的交互塑造未来的行为,但噪声和过时是真正危险。它在以下场景中体现价值:

  • 个人助手:在数周内学习用户习惯——昨天的误沟通不应掩盖一年的一致偏好。
  • 代码库智能体:观察提交模式——一次实验性重构永远不会成为“标准”,除非被反复强化。
  • 持续监控智能体:吸收监控指标流,提升重复出现的异常,让短暂波动消失。
  • 多轮规划或研究:指挥者必须基于已巩固的事实而非完整记录进行推理,以避免上下文膨胀。
  • 多智能体共识:执行者产生矛盾说法时,图的结构性置信决定哪个事实被提升,提供共享的、可信的记忆。

值得保留的唯一事实是经受了反复、独立审视和时间考验的事实——其余一切皆是等待被遗忘的噪声。

记忆 Substrate

梦凝练

梦凝练在空闲期有损提炼历史经验,让智能体能力复合增长。

梦凝练是基板在空闲期的机制,将原始操作历史转化为分层、可重用的记忆——使智能体的经验得以复合,而非简单堆积。其核心思想是:若在停机时对过去吞吐量进行有目的地、有损地提炼,形成持久化的模式,则可靠性与速度就会像复利一样增长,智能体永远不会再去学习已经掌握的经验。

失效模式

未经凝练的记忆只是一个扁平追加日志。每项新任务都迫使规划官与执行器从头推导模式,一遍遍地扫描相同的噪声和矛盾信号。由此产生三种复合失效模式:

  • 延迟负债——检索与重聚类成本随日志规模增长,智能体运行越久速度越慢。
  • 无声的模式丢失——有用的反复教训(总是生效的速率限制退避、第三次尝试即可成功的恢复序列)始终掩埋在原始事件中,无法结晶为可查询形态。智能体行为始终脆弱,受制于原始数据。
  • 缺乏复合——即使经历过数千次相同的失败,智能体也从未改进其默认做法,因为每次任务都从一个无差异的原始堆出发。唯一的出路是人工整理或模型重训——两者都慢、昂贵且脆弱。

根本原因在于将记忆视为单一无差异水桶。没有机制区分信号与噪声,没有途径将稳定的教训提升为可复用状态,也没有纪律阻止过去失败被当作新问题重新经历。梦凝练通过设计一次性消除这三种失效模式。

工作方式

在智能体空闲时(无活跃工作、无待分发任务),规划官在一个滑动窗口内触发后台梦处理。该处理异步执行,绝不抢占活跃任务。在窗口内,它依次执行三个操作:

  • 聚类片段——将因果或语义相关的事件分组为连贯的块。孤立噪声(一次性超时、无关日志行)被丢弃。
  • 提取反复教训——识别跨多个独立块重复出现的模式。模式可能是“服务X的速率限制错误总是出现在>50请求/分钟后”,或者“重试路径按1s、2s、4s休眠,三次内成功”。
  • 提升模式——经多次处理仍存续(因而稳定)的教训被提升为永久化、可配置的形式。它们进入经验图——一个结构化记忆层,规划官和执行器直接查询它,完全绕过原始日志扫描。

输出是分层记忆。原始日志保留用于审计和调试。提炼出的模式形成紧凑的经验图。一旦提升,模式不可变——后续处理可在其旁边添加新模式,但不能覆盖已有模式。滑动窗口持续前进,较旧的原始事件最终被剔除,而提升后的模式永久留存。该过程天然是有损的:矛盾或无关信号被丢弃,记忆被压缩成更尖锐、更快检索的结构。经过连续的空闲周期,这便将过去吞吐量转化为复合能力——无需模型重训,无需人工整理。

权衡与边界

  • 天然有损。 矛盾、统计不显著或时间上孤立的信息被永久丢弃。罕见但关键的边界情况(例如百万次中才出现一次的竞态条件)可能永远无法通过聚类提取,不会出现在经验图中。原始日志仍是这类事件的回退手段,但凝练后的记忆针对高频、重复模式优化。
  • 需要空闲周期。 如果智能体从不空闲,凝练永远不运行。滑动窗口向前推进但不处理,记忆保持扁平。仅当空闲有保证时(例如有可预测间隔的调度工作负载)才可接受。
  • 提升教训不可变。 昨天正确的模式明天可能过时(例如已弃用API错误码改变含义)。梦凝练不会自动撤销或改变已提升的教训;矛盾的新证据只是不被提升到同一槽位。系统假设多次窗口后模式稳定,但无法预测最终的漂移。
  • 没有实时适应。 经验图仅在下一个完整的空闲处理之后更新。即时关键的新的教训必须等待凝练——或在此期间依赖较慢的原始日志查询。
  • 不替代训练。 凝练仅操作智能体的运行上下文;它从不更新底层模型权重。它是运行时记忆优化,而非学习算法。

何时值得使用

每当智能体长时间重复执行相似任务时,梦凝练尤其值得,尤其是在高噪声环境中:

  • 长期运行的自主智能体(代码审查机器人、分诊系统)每天处理数千个相似请求。没有凝练,每个小时都像第一次;有了它,响应时间降低、成功率提升,因为常见失败模式被预先规避。
  • 具有可预测空闲窗口的环境(夜间批处理、周末)。智能体在非高峰期凝练全天经验,第二天开始时更敏锐。
  • 希望避免手动模式提取的团队。无需人工阅读日志来编写重试策略或速率限制阈值,智能体自动推导并提升这些教训。
  • 任何原始日志规模增长快于检索速度的系统。有损压缩保持热内存查询成本低廉,同时保留审计跟踪。

智能体的过去吞吐量将成为其未来能力——前提是空闲时间被用来丢弃它已学不会重复的经验。

记忆 Substrate

约束门与写入校验器

模型的输出只有被允许且可质疑时,才能获得持久性。

模型的输出只有同时满足“允许写入”和“可被证伪”两个条件,才能在基板中获得持久性。约束门与写入校验器构成了自动事实写入的两阶段防护。其核心原则是:持久记忆默认不应信任模型的输出;任何自动存储的事实必须属于显式允许的事件类型,并且能够被未来证据反驳。秘密在模型与门之间被擦除;显式的 remember 命令绕过所有防护,保留所有者的主权。抵御幻觉污染的可靠性被工程化地构建在基板中,与生成该断言的模型无关。

失败模式

没有这些防护,每条模型生成的断言一旦抵达写入指令,就有资格被永久存储。一个自信的幻觉——“项目截止日期是下周二”——会像真实观察结果一样被记录为事实。这种失败是静默且累积的:没有自动纠正,没有自然衰减,也没有标记污染。虚假记忆会污染所有依赖记忆的下游推理,使决策偏离轨道,并侵蚀对系统状态的信任。

损害不仅限于彻头彻尾的假话。模糊的概括(“用户似乎很开心”)、不可证伪的解读、以及相互矛盾的陈述都可以共存于记忆中,使其变成一堆无法验证的断言。一旦写入,这些条目就成为未来 agent 步骤的依赖——包括依赖记忆作为真实依据的计划者和执行者步骤。结果是脆弱性:一次模型失误就会不可逆地改写共享状态,唯一的恢复手段是手动修剪或完全重置。

泄露到模型输出中的秘密——令牌、API 密钥、凭证——会与合法事实一起被写入,造成不可修复的安全与合规漏洞。信任的轴被完全放置在一个可能随时漂移或被利用的模型输出分布上。基板的记忆将成为负债,而非资产。

工作机制

每条自动事实写入——即系统试图在没有显式用户指令的情况下持久化的任何事实——在到达持久存储之前,会经过一条确定性的、不涉及模型的管道。

  • 秘密清除 在两个门之前运行。令牌、密钥和凭证从事实负载中被剥离。这防止了在自动路径上发生意外泄露,即使模型不经意间输出了秘密。
  • 约束门 检查写入的事件类型是否位于一个默认拒绝的允许事件类型白名单中。任何未显式许可的类型都会被静默丢弃;不产生写入,也不向模型暴露错误。这阻止了令人惊讶的写入——意外出现的结构化事实类别、看似记忆操作的模型幻觉——接触持久存储。
  • 写入校验器 测试剩余的事实内容是否可证伪:该陈述必须能够被未来证据反驳。具体声明(“用户的时区是 America/New_York”)通过;模糊或无根据的陈述(“用户对性能感兴趣”)被拒绝。校验器不评估真实性——只评估该事实是否有清晰、可检验的真值条件。无法被钉死的幻觉永远不会成为记忆。
  • 显式的 remember 命令 完全绕过两个门。当用户发出此指令时,事实直接被存储——包括秘密。所有者主权是绝对的:只有用户决定什么进入长期记忆,基板级的防护不会干预这一有意识的行为。

权衡与边界

保守性 vs. 召回率。 白名单默认拒绝。任何开发者忘记注册的合法事件类型都会被静默丢弃。这迫使操作者提前设想好应用应该自动记住的每个事实类别;遗漏的类型会导致不可见的数据丢失。可证伪性检查同样严格:真实但不可证伪的陈述(“用户喜欢整洁的代码”)会被拒绝,牺牲有用上下文以换取每条自动事实都可检验的保证。开发者必须要么将模型输出塑造成可证伪的观察结果,要么依赖 remember 路径来表达这些解释。

主权及其风险。 remember 命令是一个刻意的逃生口气,但它也是一把锋利的刀。一旦调用,没有门适用。用户可以故意存储幻觉、错误前提或秘密。基板将其视为真实依据。这种权衡之所以可接受,唯一原因是用户对自己记忆拥有最终权威;防护门只存在于模型驱动的自动写入路径中——该路径下用户不在循环内。

可证伪性不等于真实性。 通过写入校验器的事实仍然可能是错误的。“服务器的 IP 是 10.0.0.1” 是可证伪的,即使真实 IP 不同,它也会被存储。基板的保证是关于 记忆卫生——只有可检验的陈述才会积累——而不是关于知识论上的正确性。真实性验证属于独立的验证者角色(路线图中)的领域;写入校验器确保当验证到来时,已存储的事实确实可以被检查。

防护系统的边界。 两阶段防护只适用于自动写入。非持久状态(对话上下文、临时工作记忆)不会被过滤。系统内部写入和用户导向的 remember 命令完全绕过这些门。秘密擦除是一种尽力而为的防御:新颖或混淆的凭证可能逃脱模式检测,但其他门仍然能阻挡可能携带它们的意外事件类型。

退化路径。 如果白名单被过度放宽(例如,一个捕获所有的事件类型),约束门就变得形同虚设。如果有 bug 导致绕过校验器,记忆污染会卷土重来且无自动修复。恢复需要手动审计。此设计依赖于这些门简单、静态且极少被修改——草率地改动它们,保护就会蒸发。

它的适用场景

只要模型生成的事实被自动存储并随后用于驱动行为,两阶段防护就物有所值。它不可或缺的场景包括:

  • agent 的记忆是长期的,并在多个会话或多个 agent 之间共享。一次坏写入就会破坏数周的下游推理。
  • 多个模型(不同提供商、规模或版本)向同一记忆存储贡献内容。无论模型可靠性如何,门都强制实施统一的安全标准。
  • 环境中存在秘密——任何涉及令牌、密钥或凭证的管道都需要自动擦除,并确保模型不能意外制造出携带泄露的意外写入。
  • 操作者无法承受静默损坏。记忆中的每条事实都是计划者和执行者步骤的依赖;污染不会自我宣告。
  • 系统包含(或将要包含)一个质疑已存储断言的验证者。可证伪性检查预先调整记忆,使每个条目都可被检验。

对于短暂的、无状态的交互,或者对于每条事实都由人工在受控管道中精心筛选的系统,这些门是过度的。只有当记忆是自动的、持久的,并且一条幻觉条目的代价超过丢失几条不可证伪但真实的观察结果的代价时,它们才值得。

一个无法被未来证据反驳的事实,没有资格留在持久记忆中。

记忆 Substrate

熵减排选

熵减排选是有损异步机制,通过统一净化-聚类算法压缩记忆库,自动保持检索精度。

熵减排选是基底过程,它通过持续压缩和重组持久记忆库的内容,防止其退化为噪声。它基于一个单一洞见:通过适配器专用的视角(事实、技能、基因)应用统一的两阶段算法——先净化后聚类——能在无人工干预的情况下维护一个有损、高信噪比的图,即使数据量无限增长。该机制异步运行,由写入量或空闲周期触发,从不捏造新知识;它只精炼已有的内容。

失败模式

没有筛选,每次写入都会添加一个片段——可能是重复、近似重复或矛盾。久而久之,记忆库变成沼泽:相同事实以略有差异的措辞出现,过程步骤积累冗余变体,血统分叉长出死枝。检索精度崩溃,因为索引被近似的条目稀释,查询匹配到大量噪声而非信号。失败不是崩溃——而是图信噪比的缓慢累积侵蚀,使系统在不出现任何可观察的单个断裂的情况下逐渐变得不可靠。下游,指挥者(conductor)从矛盾前提制定计划,执行者(executor)拾取充满噪声的技能步骤,校验者(verifier)在模糊读取上浪费周期。存储膨胀加剧浪费。这种无声的退化迫使开发人员定期重建记忆库或手动去重,两者都无法扩展。

工作原理

单个筛选机制驱动三个适配器——facts(事实)、skills(技能)、genes(基因)——每个适配器应用相同的两阶段逻辑,但根据自身领域规则解释冗余和一致性。

  • Purify(净化) 通过去重和压缩移除冗余、矛盾或低信号的条目。事实适配器丢弃重复断言和矛盾陈述以保持一致性;技能适配器折叠功能相同的过程步骤并裁剪死变体;基因适配器合并等价的祖先记录并移除死分支。该机制从不创造替代品——它只移除或合并现有条目。
  • Cluster(聚类) 将存活的片段分组为连贯的邻域并重建检索索引。事实按主题链接,技能按工作流依赖链接,基因按血统链接。重建的索引确保后续查询返回紧凑、高信噪比的集合。

该机制异步运行:它在可配置数量的新写入之后(写入量阈值)或在空闲周期期间触发。开发人员选择记忆库使用哪些适配器,并且可以按适配器选择性调优净化或聚类的激进程度。其余一切——触发、执行顺序、索引重建——都是自动的。记忆自我筛选;你永远不需要手动维护记忆库。

权衡与边界

筛选有损是设计使然。它有意丢弃非本质的变化以保持表示紧凑。如果激进程度设置过高,重要细节可能被折叠;罕见查询可能丢失一些召回率。按适配器调优以找到正确平衡。

不创造知识。 筛选精炼已有记忆;它从不捏造新事实、新技能或新基因。空缺仍为空;无法解决的矛盾可能被完全丢弃。

最终一致性。 由于该机制异步运行,写入后存在一个窗口期,在此期间重复或矛盾仍可能被读到。需要在每次写入后立即精确性的系统必须要么在筛选完成前阻塞读取,要么在写入时强制执行即时去重——两者都不是筛选提供的。

不是写入时守卫。 筛选是一个长期卫生过程,不是即时检查。如果必须在写入时进行重复检测,则必须单独实现。

退化路径。 过度激进的筛选会将不同但相邻的概念合并为一个,降低表达能力(例如,合并“快速排序”和“稳定排序”)。不够激进的筛选会留下足够多的噪声,使检索精度仍然下降。写入密集型工作负载也可能导致积压:如果写入量持续超过筛选吞吐量,记忆库膨胀,精度暂时下降;仅在空闲周期赶上时检索恢复。对于高吞吐量部署,建议监控筛选延迟。

红线。 筛选会永久丢弃数据。它不是备份。为了保留完整历史保真度用于审计或回滚,请同时在筛选后的记忆库旁维护一个独立的仅追加日志。

何时发挥作用

  • 长期运行的智能体,它们在数天或数周内积累事实和技能——否则检索精度会单调下降,损害指挥者和校验者。
  • 多智能体或多模型记忆库,其中不同的执行者写入重叠条目;筛选无需人工交叉审查即可规范化差异。
  • 技能库,它们通过试错过程摄入步骤;筛选合并已验证的例程并丢弃失败变体,使过程索引保持精简。
  • 基因登记处,跟踪模型变体血统;筛选修剪死分支,只保留活跃的继承路径。
  • 任何手动清理成本超过丢失一小部分变异的代价的记忆库——筛选成为默认选项。
  • 当记忆库是临时的、极小(数百个片段),或必须逐字保留每条原始条目(例如严格的审计追踪)时,请调低或禁用筛选。

自我筛选的记忆保持敏锐;不筛选的记忆退化为噪声。

记忆 Substrate

修剪与衰减 (Prune & decay)

三信号遗忘弱记忆,陈旧底线保新项

修剪与衰减是将记忆转化为有限且老化的资源的底层机制。它认为每个存储项都会受到有意的遗忘,由三个信号驱动——时效性(Recency)、置信度(Confidence)和相关性(Relevance)——以及一个陈旧底线(staleness floor),该底线为新的记忆在衰减开始前提供一段受保护的时间窗口。核心思想:遗忘是一种设计好的过滤器,而非漏洞;没有它,低信号的记忆会积累并降低决策质量。

失败模式

没有修剪与衰减,每次观察、中间结果和弱化的事实会无限期保留。数小时或数天后,底层被噪声填满。conductor 规划 DAG 必须从过时的上下文中筛选,削弱其干净分解任务的能力。executor 检索到不相关的记忆,污染其输入,在已废弃的路径上浪费算力。没有单个错误浮现;智能体仍在运行,但逐渐漂移。延迟攀升,决策质量恶化,系统变得脆弱——记住了一切,因此什么都没记住有用的。这个失败是可靠性的无声腐蚀,而非崩溃。

工作原理

修剪与衰减依据三个独立信号评估每条记忆,这三个信号共同决定其存留:

  • Recency(时效性) – 未使用的项随时间失去权重。每次访问会重置该项的时效时钟;未被触及的时间越长,得分越低。
  • Confidence(置信度) – 弱强化或不确定的记忆衰减更快。只被写入一次或缺乏强化的记忆,具有更高的衰减乘数。
  • Relevance(相关性) – 不再匹配智能体当前活动目标的上下文会被积极修剪。当智能体焦点转移时,相关性信号急剧下降,加速记忆的清除。

陈旧底线(staleness floor) 基于项的时间戳保护新鲜但未使用的条目。无论初始时效性或置信度多低,新创建的记忆都被赋予最短生命周期——在地板持续时间到期前不应用衰减。这防止了一批低置信度观察在它们能发挥作用前就被剔除。

一旦超过底线,衰减会复合。项的组合信号下降,直到超过可配置的退役阈值(retirement threshold),此时记忆立即从活动底层被修剪。修剪是硬删除,非归档。

所有衰减参数——每个信号的衰减率、置信度底线、陈旧底线持续时间、退役阈值——均可按子空间配置。这使得每个子空间无需更改源代码即可调整其遗忘轮廓,使该机制成为可调策略,而非硬编码规则。

权衡与边界

修剪与衰减引入了配置复杂度。每个子空间必须根据其预期记忆生命周期进行调整;衰减过激会修剪有用上下文,衰减过宽则让底层膨胀,重创该机制本欲预防的失败模式。没有通用默认值。

陈旧底线保证每条新记忆的最小生命周期,这意味着高负载下产生的无用条目也会持续整个地板持续时间。这用少量噪声保留换取了真正新鲜信号的安全。

一旦修剪,记忆不可恢复。该机制不提供审计追踪或备份——需要完整保留的工作流必须将关键信息路由到独立的、不修剪的存储。它也不防范对抗性操纵(例如,恶意智能体反复访问低价值记忆以使其存活);这不在衰减策略的范围内。

修剪与衰减专为跨智能体角色的持久共享记忆设计。它不影响单个 executor 调用中的瞬态状态,也不替代永久参考数据的手动生命周期管理。

何时发挥作用

修剪与衰减在智能体随时间积累上下文且活跃目标转移时产生回报。具体场景:

  • 运行数日的长期工程智能体:已解决的 bug、已合并的分支和过时的设计笔记衰减,使 conductor 专注于当前任务。
  • 高吞吐量的 executor 集群产生大量低置信度中间输出(爬取结果、候选列表),其中大部分是噪声,必须快速遗忘。
  • 频繁切换话题的对话或支持智能体:基于相关性的修剪积极清除旧上下文,降低检索延迟。
  • 内存受限的部署,无界增长不可接受;衰减为底层大小提供可预测的上限。
  • 任何检索速度至关重要的工作流——更小、信号密集的底层产生更快的上下文查找,直接提升智能体响应性。

有意的遗忘是设计好的过滤器,而非漏洞——底层保持精简,智能体专注于重要之事。

记忆 Substrate

行为基因与BM25重用

行为基因将已知方法转化为幂等、BM25检索的片段——重用胜过回忆,无漂移。

行为基因是可复用、幂等的 how‑to 片段——与模型无关的执行模式,编码了特定能力。发现机制运行在 BM25 上,这是一种基于词袋的检索模型,平衡词频与文档长度:无嵌入、无 GPU、无漂移。整个机制依赖于重用胜过回忆:基因严格按照存储的样子应用,不训练、不记忆、不微调;只有当词法‑语义对齐度低于可配置阈值时,harness 才会退回到深思熟虑的规划。

失败模式

没有行为基因时,每个任务都迫使 conductor 从头重构解决方案,即使同样的能力已被执行数千次。这会引发延迟与质量之间的赛跑:廉价、快速的模型产生幻觉或不一致输出;深思熟虑的模型燃烧预算和 wall‑time 去重新发明稳定的模式。基于嵌入的检索引入了 GPU 依赖、语料库演化时的漂移,以及表面上相似但结构上错误匹配的风险。针对特定措辞微调的模型会悄然腐蚀——它们忘记稀有格式、在更新后退化,并将行为耦合到特定检查点。没有确定的“我以前解决过这个”信号,harness 无法区分已知与新颖。每次调用都会在琐碎的重复上浪费 token,幂等保证消失(几分钟内的两个相同任务可能产生不同结果),调试变得不透明。最终结果是脆弱的复用、累积的技术债务,以及一个本应成为可靠基座却在漂移的 harness。

工作原理

  • 发现是词法‑语义的,而非纯语义的。 BM25 使用词频、逆文档频率和长度归一化,对每个基因的文本签名与任务描述进行评分。它通过重叠词汇捕捉意图:“validate email format”和“check email regex”都共享核心术语,因此即使措辞变化,匹配的基因也会浮现。无嵌入、无 GPU、无向量存储——给定固定语料库,分数是确定性的。
  • 迁移是幂等的。 高于可配置阈值的最高分基因被逐字注入执行上下文,零转换。将同一基因重复应用于同一任务和上下文会得到相同结果,无副作用。基因可以安全地组合、重试或交换,因为它们不携带隐藏状态。
  • 对新颖性做回退。 如果没有基因得分超过阈值,conductor 将该任务视为新颖,回退到深思熟虑的规划(这一过程可能产生新基因)。这保持了可靠性:基因自动化已知;未知由显式推理处理。
  • 基因仅通过显式添加或删除演化。 基因库是一个由策展人编辑的静态目录。没有训练循环、没有梯度更新、没有对过去成功的记忆。添加或删除基因会简单地重建 BM25 索引,因为词频是静态的。无漂移、无过时嵌入,但也没有自动改进。

权衡与边界

BM25 的优势——零漂移、零 GPU 的词法匹配——也是其边界。只有当查询与基因签名共享足够多的显著术语时,它才能捕捉意图。高度释义或同义词丰富的描述(“使输出礼貌” vs. “应用礼貌过滤器”)可能会匹配失败,除非基因签名显式包含替代词汇。缓解措施是人工策展:用已知释义扩展签名可提高召回率,但代价是需要持续维护。

可配置阈值是一个锋利的杠杆。设得太低,通用基因会匹配它们本不设计执行的任务,悄无声息地注入不合适的行为。设得太高,太多任务会落入昂贵的 conductor 规划,违背复用的目的。找到最佳点需要对特定领域的任务‑基因对样本进行剖析。

基因不会从使用中学习。一个“足够好”的模式运行数千次后仍保持原样存储;如果底层能力需要改进,基因必须手动编辑。这对确定性而言是特性,但对期望自动适应的系统而言是局限。领域特定词汇极大地帮助了 BM25——充满 API 名称、行业术语或命令令牌的任务和基因签名会产生高精度匹配。相反,以基因从未使用的流行语描述的任务会退化匹配。

回退是安全的,但不免费。当没有基因得分超过阈值时,harness 优雅降级到规划,为每个任务支付推理成本。操作员必须监控回退率作为健康信号;上升的回退率表明基因库不再覆盖传入的任务词汇。最后,幂等保证在单个基因版本内成立。将基因替换为不同实现是安全的,因为每个都是不可变工件,但新版本的幂等链是独立的——仅在新版本本身设计为幂等时,跨版本重放才会产生相同结果。

何时发挥价值

行为基因在那些同一 how‑to 在许多任务中以轻微措辞差异重复出现的工作流中带来回报。具体情况包括:

  • 重复性的单一目的任务,例如“翻译为日语”、“提取电子邮件地址”或“格式化为 JSON”。BM25 的词频平衡能捕捉每种变体,无需重新规划。
  • 高吞吐量、低预算的工作负载。仅靠 CPU 的 BM25 查找替代消耗 token 的 conductor 调用,大幅降低每任务成本和延迟。
  • 需要审计或重放能力的确定性流水线。给定输入,基因的输出是固定的,因此重放作业会得到相同结果——这在模型回忆随温度、随机种子或权重更新而变化时是不可能的。
  • 跨模型自动化。同一基因在 GPT‑4、Claude、Mistral 或本地模型上工作完全相同,消除了按模型进行提示工程的需求。
  • 措辞不断漂移的稳定领域。只要显著术语保留,BM25 就能捕捉新措辞,因此基因库保持冻结,而术语不断演变——无需 MLOps 循环,无需模型刷新。
  • 团队共享的流程库。开发者贡献经过实战检验的 how‑to 片段作为基因;新成员添加任务而无需重写基本行为。

基因是由静态文本匹配发现的执行契约,而非记忆。harness 从不学习;它只从一个固定工具箱中挑选正确的杠杆。

记忆 Substrate

技能创造者飞轮

飞轮通过留出评估门,将高置信模式转化为技能,防止自证偏误。

技能创造者飞轮将经过验证的执行模式转化为候选技能,将智能体的增长能力锚定于可证明的结果而非模型内省。其核心思想是一个留出评估门,它阻止任何提案预览自身的评估数据,强制在模式发现与技能推广之间建立严格隔离。每一次变更都附带溯源信息记录在一个统一的 SQLite 基座上——该基座与基因和事实共享——使得从原始涌现到可操作技能的完整谱系完全可审计。

失败模式

没有飞轮,智能体的技能库会向自我确认滑移。产生模式的同一运行时也决定它是否足够好得以保留,形成了一个闭塞的反馈回路,将熟悉性混同于普适性。两种失败模式占主导:

  • 偏误级联。模型内部的“这感觉对”信号取代了实证验证。一个在某个上下文中成功的模式在没有对未见场景进行测试的情况下被推广,导致对巧合的过拟合。一旦推广,它便会滋生进一步的偏误提取——智能体学会偏好那些曾奏效的东西,循环往复地放大自身的盲点。
  • 无声腐烂。技能从未被重新审视。一个数月前正确的模式随着环境变化变得过时,但因为没有周期性再评估,它仍在运行,行为逐渐退化。智能体没有遗忘或降级技能的机制,直到故障在外部显现。

两种病根共享同一个根源:评估门要么缺失,要么存在缝隙。当评估数据与训练数据重叠时,自我确认偏误会直接渗入生产技能。技能集充斥未经检验的宣称,溯源蒸发,没有人能追踪一个技能是源自真正的普适性规律还是统计上的侥幸。

运作方式

飞轮完全运行在一个统一的 SQLite 基座上,每一行——技能、基因、事实——都携带一个溯源列。这强制所有操作知识进入一个真理模式,并使每一次变异都可追踪。该机制分为四个阶段:

  1. 情节挖掘。挖掘者周期性地扫描整合后的模式存储,只选择标记为 confidentworked 的条目——那些已经历反复执行并产生已验证结果的模式。它从这些高信噪比的模式中草拟候选技能提案,但它在一个留出评估门背后执行:一个提案永远无法读取的评估案例分区。这种隔离保证没有提案会被构造为适应后面将评判它的数据。

  2. 封闭精炼循环。每个提案进入一个紧凑的循环:

    • eval-generate 在留出案例上运行候选,产生通过/失败信号及失败细节。
    • record 记录每个结果并触发演化事件(例如,“提案置信度提升”,“在边缘案例 X 上失败”)。
    • suggest-actions 将结果转换为后续步骤——待挖掘的新模式、对候选的小幅调整、或向规划器的查询——从而馈入下一次挖掘者运行。

    每一步都被记录溯源;从原始模式涌现到最终推广的完整历史是可回放的。

  3. 推广门控。提案从不自我推广。它只能累积正评估证据,且当该证据超过预定义的置信层级时,门才会打开。该门是一个确定性规则,针对已记录的评估历史进行判断——而不是一次模型调用,也不是一个内部状态启发式。如果未达到阈值,提案要么留在精炼循环中,要么衰退回模式池。

  4. 可审计性。因为每一次变更都被记录,任何操作员都可以回溯:“哪个原始模式产生了此技能?它经历了多少次评估迭代?在推广之前它被哪些边缘案例击败过?”审计轨迹是一流的查询,不留任何黑箱。

权衡与边界

  • 留出门的成本。保留未见案例用于评估缩减了可供挖掘的池子。在数据稀疏的领域,门会饿死挖掘者的信号,迫使进行谨慎的样本预算规划。
  • 挖掘延迟。情节挖掘者不会即时反应。对于需要模式在数秒内成为技能的高频场景,飞轮是不兼容的——它是异步设计的。任何时间关键型的推广都需要单独的热路径。
  • 置信阈值调优。阈值设得太低,噪声会成为技能;设得太高,智能体僵化,永远无法适应真正的变化。阈值是一个按领域校准的治理参数,而非模型属性。
  • 模式范围限制。只有能表达为 confident + worked 的模式才符合条件。隐性知识——智能体做得好但无法表述为离散模式的东西——对挖掘者不可见。飞轮只处理智能体行为的显式、可评估部分。
  • 退化路径。如果留出评估集本身变得过时或受到污染,推广决策会无声恶化。溯源可以检测到这一点,但评估集必须周期性地从近期生产数据刷新。同样地,如果没有修剪,基座不断增长的扫描成本可能超过时间预算,需要单独的剔除机制。
  • 红线。绝不要将评估侧表合并到挖掘者的读取路径中。任何在提案起草过程中泄露评估数据的查询都会重新引入自我确认偏误,并使评估门崩溃。

何时值得拥有

飞轮在技能可靠性依赖于累积的、可审计的经验时最值得付出——特别是当一个坏技能的成本很高时:

  • 长期运行的自主动体,数周无需人工重训。飞轮保持技能集精炼并经过测试,防止旧模式带来的漂移。
  • 多模型环境,其中执行器运行在不同模型上。因为推广与模型无关(门评估的是结果而非内部机制),一个在廉价模型上验证过的技能可以推广用于昂贵模型,反之亦然。
  • 监管或审计密集型部署,其中每一操作决策都必须追溯至证据。溯源基座使得合规成为正常操作的副产品。
  • 演化自身工具的系统。只要评估门保持完好,飞轮让智能体无需人类策展就能发现并推广新能力——这是一个不自过拟合的自我改进智能体的核心。

是门,而非模型的内部状态,决定什么变成可操作——在留出分区背后积累的证据是从模式到技能的唯一途径。

方法 Method

让'便宜且宽'变安全的纪律——契约、模式、漂移控制、审议。

方法 Method

SDD + TDD 与可证伪合约

可证伪合约将规约变为持续被挑战的可执行边界;正确性是一场协商,而非声明。

在 Xihe 的方法中,规约并非散文——它是一个由类型约束、验证规则、状态机和 Given-When-Then 场景组成的可证伪合约,全部可机器执行。这颠覆了常规交付流水线:通过验收测试是地板,而非天花板,因为一个通过的合约仅意味着未发现违规。其核心思想是:正确性是规约与代码在共享证伪体制下持续协商的结果,每个 TDD 循环都试图证伪当前正确性的声称。

失败模式

缺乏可证伪合约时,规约-代码-验收流水线滋生出虚假信心。散文式需求含糊不清;两位实现者对“必须通知用户”的理解相互矛盾,而验收测试通过,是因为它们验证的是实现者的解读,而非规约的意图。悄然漂移开始——代码自顾自运行,散文规约沦为装饰品。当一个边界情况或状态转换从缝隙中漏掉,一个“通过验收”的系统会在生产环境中死锁。高风险接缝(支付结算、授权、外部集成、模型输出)得到的覆盖深度与快乐路径相同,因为规约从未强迫任何人攻击自身的假设。浪费体现在集成或 UAT 阶段的返工,脆弱性在于通过测试即等于正确性的幻觉,而静默的腐蚀在于规约中的缺陷未被挑战,反而被通过的测试强化,直到真实事故将其曝光。没有可执行的对立面,流水线将合规性与正确性混为一谈,并把自身的盲点作为特性发布。

运作机制

合约是一个可执行边界,由四个相互强化的产物组成:

  • 类型约束——结构不变式(例如 UUID、非负整数),在逻辑执行前拒绝无效数据。
  • 验证规则——跨字段不变式,超出类型范围(例如“送货地址必须在服务区域内”),在领域边界强制执行。
  • 状态机——明确允许的转换与禁止的状态;任何尝试非法转换的操作立即被拒绝。
  • Given-When-Then 场景——具体、可机器执行的例子,定义系统边缘行为的预期输出。

在 TDD 循环中,合约被持续证伪:开发者编写一个合约声称必须失败的情景(红),实现足够的代码使其通过(绿),然后检查该实现是否暴露了合约本身的缺陷。每次通过仅仅是未发现违规的证据——而非正确性的证明。

协商由两条裁决规则主导:

  • 合约胜出——如果实现与约束、规则、转换或场景矛盾,实现被拒绝。代码必须适应。
  • 代码胜出——如果实现证明合约中的某个元素不可能、矛盾或不充分(例如领域实际需要但状态机禁止的状态转换),合约让步并被记录修改。修改是一等产物,使变更可见且可审计。

高风险接缝获得额外的层次:对抗性证伪。自动模糊测试或专门的对抗性场景试图从外向内击穿合约,假设规约不完整。通过这些对抗性探测是强制性的;如果对抗性场景揭示了一个合约禁止但合理的行为,合约让步并修改。这种由外向内的接纳确保了通过规约从不被视为正确——它仍只是证伪的起点。

全程,规约与代码在共享证伪体制下协商正确性。两者皆不可单独信赖。TDD 循环成为持续试图证伪当前正确性命题的过程,每次成功通过只是暂时推迟了怀疑。

权衡与边界

成本。 构建可证伪合约需要前期精确性。编写状态机、验证规则和结构化 GWT 场景需要领域建模与纪律性;开销巨大。对于快速变化或一次性代码,成本超过收益——合约成为维护负担,其保护价值被消耗殆尽。粗糙的合约(模糊的类型、缺失的转换)在增加仪式感的同时提供虚假安慰。

红线。 将“通过验收”等同于“正确性”会彻底破坏整个体制。一个通过的合约仅仅是没有检测到违规;证伪循环必须继续。在高风险接缝上忽略对抗性证伪,会将合约降级为标准测试套件——验证合规但不挑战自身假设。静默地放宽合约以匹配可疑的实现——且无记录的修改——使合约沦为装饰,恢复到最初的失败模式。裁决规则需要组织信任;如果团队将“代码胜出”武器化以覆盖正确的规约,合约的权威便崩塌。

不适用场景。 可证伪合约覆盖结构与行为符合性,而非主观质量(如可用性、延迟或涌现系统属性)。它们运行在组件边界,不替代完整集成测试。探索性研究、原型和艺术性代码领域不适合。遗留系统中规约无法在不重大重写的情况下重构为可执行形式,同样超出范围。

退化路径。 如果跳过对抗性证伪,证伪循环减弱——合约保留为可执行文档,但不再是对立面。如果裁决规则应用不一致,合约失去可信度,开发者将其视为陷阱而非协商伙伴。系统仍可运行,但主要收益蒸发,成本却保留。

何时物有所值

此方法在规约误解成本高的地方回报显著:

  • 具有复杂状态转换的关键业务逻辑(支付流程、订单路由、账户操作)。
  • 有多个消费者的 API,合约阻止悄然漂移并使版本化明确。
  • 集成模型输出或外部 AI 代理的系统(如 Xihe),合约作为试图证伪模型行为的对立面,捕捉幻觉或越界行为。
  • 跨团队和年份的长寿命代码库——持续被证伪的合约成为最可靠的文档。
  • 大规模实践 TDD 的环境,合约作为第一个失败的测试,每个循环成为一次协商。
  • 经受对抗性证伪的高风险接缝,其中“通过验收”标准太弱,而经过证明的正确性是唯一可接受的地板。

一个通过的合约不是正确性的证明——它只是证伪的起点。

方法 Method

M1–M7 思考模式

按任务类型分配确定性推理策略,防止错误路由导致脆弱高成本输出。

一种思考模式不是人格面具——它是智能体按任务类型采用的默认推理策略。其核心思想是:一个拼写错误修复和一个子系统重构需要根本不同的推理结构,将任意一种路由到错误的结构会产生脆弱、昂贵且无法可信审计的输出。模式路由使这种选择变得确定且可见,将智能体的推理锚定在任务的形态上,而非模型的默认下一个词行为。

The failure mode

没有明确的思考模式时,智能体会陷入“万能求解器”陷阱。一个bug修复请求引发与架构讨论相同的思维链模式:智能体模拟系统行为而不是追溯错误路径,在grep就够用时从第一性原理争论,或者为一个只需纯粹删减的问题生成优雅的重构计划。输出表面看似合理,但与任务的逻辑需求脱节,而这种不匹配直到修复失败审查时才变得明显——更糟的是,当它悄然通过并在后续引起混乱时才被发现。

第一个具体症状是静默的成本升级。一个本可通过日志深潜和二分法隔离的简单bug,却引发了一个多步推理图,在无关的推测上浪费昂贵的推理容量。第二个症状是可复现性失败:同一个任务在稍有不同温度下运行两次,会产生截然不同的推理路径,因为没有任何结构约束方法。第三个是审计盲区。当追踪只记录结论时,人类审查者无法区分“智能体考虑了错误方法”与“模型在正确方法内犯了错误”两种情形。系统变成一个黑箱,其行为由隐藏的模型偏见主导,而非工程师的意图。

How it works

任务在到达时被分类并分配七种模式之一。分类是确定性的:它使用清晰、非LLM的任务信号,而非启发式猜测。分配的模式随后在整个conductor–dispatch–executor流程中约束规划与执行,且强制是结构性的——一个在重构任务上用M1推理的智能体会被截断。

每种模式规定了一套规范的推理模式:

  • M1 – 根因(bugs): 追踪错误路径,隔离故障点,并在提出任何修复前证明一个可测试的假设。
  • M2 – 第一性原理(clean build): 从公理重建逻辑;不信任现有代码为真理。继承行为默认可疑。
  • M3 – 减法(refactor):要移除什么开始,然后最小化diff。只有在移除边界定义后才能添加。
  • M4 – 搜索优先(unknown cause): grep、日志深潜、二分法——不要建模,找到它。智能体必须在提出解释模型之前穷尽基于搜索的隔离。
  • M5 – 逆向推导(architecture): 先定义目标状态,再推导必要的变更。在目标状态正式化之前,不得讨论实现约束。
  • M6 – 证据驱动(perf/quality): 行动前测量,行动后比较,拒绝推测性说法。基线测量是任何行动的前提。
  • M7 – 闭环(ops/default): 执行、观察、偏差时重入——无静默韧性。智能体必须验证输出并在现实偏离预期时重启规划循环。

活跃模式是每个规划器和executor追踪中的一等字段。因此,人类可以审计结论如何得出,而不仅仅是结论是什么。模式标签是输出的一部分,提供永久、可测试的推理策略记录。

Trade-offs & boundaries

主要成本是分类开销。确定性路由需要定义明确的信号;模糊任务(例如“这个慢,你能改进它吗?”)可能无法干净映射到单个模式,误分类会产生错误的推理形态。系统不会尝试从自由形式对话中推断模式——它依赖于显式的任务分类法,模糊情况需要在路由前澄清。没有“猜测模式”的回退路径。退化路径是保守的:如果信号集无法解析出匹配,系统默认使用M7(闭环)。该模式不会产生创造性工作,但也不会产生错误模式的生成。设计选择放弃了看似合理的输出,以换取安全、可观察的欠生成。

模式是策略,而非对创造力的约束。处于M2的智能体仍可引用现有代码来验证公理,但不得将现有代码视为权威。故意阻止任务中切换模式,除非由verifier信号或手动重启触发——harness通过防止自我重新分类来消除模式漂移。

这些是为工程工作设计的模式,尤其重视可靠结果和可审计推理。它们不适用于自由形式的头脑风暴、创意写作或开放式探索。对于这些用例,认知脚手架不必要,甚至可能感到阻碍;harness默认值(M7)提供纪律而不规定推理形态。

When it earns its place

在任何任务类型多样的非平凡代码库中,模式路由都能证明其价值。前端bug路由到M1可将隔离时间降低一个数量级,因为智能体不能浪费周期在架构推测上。重构路由到M3产生小而安全的diff,而非意外的重写。架构提案路由到M5强制在目标状态上达成一致,之后智能体才生成实现细节,减少审查波动。

当系统在没有人类监督的情况下从队列中挑选工作时——PR审查、bug分类、性能工单——这一机制变得不可或缺。在这种情况下,没有模式路由意味着智能体将所有任务视为同等昂贵、同等不透明,以规模产生看似合理但错误的输出。有了它,每个任务默认得到正确的推理形态,且追踪提供结构化解释说明结论如何得出。这个追踪正是区分可靠工程智能体与随机鹦鹉的东西。

将任务路由到错误模式是设计错误,而非提示错误——推理形态属于任务,而非智能体。

方法 Method

漂移检测与回退

对推理漂移分五类并回退到最近锚点,将质量变为系统的工程属性。

漂移检测与回退是一种 harness 机制,它将推理偏差归类到五个原型中,并回退到上一个不可变锚点。核心思想:推理质量变成系统的工程属性,而非对模型一致性的赌博。

失败模式

没有漂移检测,每一次 agent 运行都是一次盲目赌博。模型的推理可能游荡——合理化死胡同、悄悄膨胀范围、过早锁定方案、或丢弃关键引用——而 harness 没有任何信号表明质量正在下滑。输出仍然看似合理,但内部逻辑悄然腐败,浪费 token、计算和时间。系统在损坏的基础上层层叠加错误,产生脆弱的人工制品,不可预测地失败。调试意味着手动回放 trace,猜测推理在哪里断裂,且无法保证重跑不会重复同样的漂移。代价不仅是资源浪费,更是结果的无声腐败——一种系统脆性,表面看起来富有成效的运行可能完全不可靠。

工作原理

一个轻量级检测器(运行于 harness 层面)监控 conductor 的推理输出。每一步之后,它将推理与目标以及上一个已提交的锚点进行比较。当发现偏差时,将漂移归类到五个原型之一:

  • A(真实漂移): 真正的话题偏离目标。
  • B(合理化): 事后编造理由为死胡同辩护。
  • C(范围膨胀): 未经授权地扩大任务边界。
  • D(过早方案): 在充分探索之前跳到最终答案。
  • E(断线): 引用丢失或逻辑断裂。

检测到时,系统不会盲目重试。它会回退到最近锚点——conductor 先前提交过的已验证检查点。锚点一旦提交便不可变,提供干净、可审计的恢复面。回退丢弃锚点到漂移点之间的所有推理;从不尝试在单步内部分回滚。

分类本身作为语义上下文附加到 conductor 的下一个规划周期。例如,在范围膨胀回退后,conductor 可以重新注入原始约束;在合理化后,它可以要求替代证据。恢复逻辑位于 harness 中,而非模型提示内,因此策略调整保持确定性和可审计性。没有无声劣化:每个偏差都被识别、命名并回滚。

权衡与边界

  • 成本: 每一步都会产生检测开销(分类器延迟与计算)。回退丢弃最后一个锚点之后的工作,如果步骤很长且漂移发生得早,代价可能高昂。
  • 误报: 不完美的分类器可能产生误报(不必要的回退)或漏报(漂移未被捕获)。调优敏感度需要针对每次部署校准。
  • 粒度: 回退总是面向最近锚点。如果 conductor 提交锚点不频繁,单次漂移可能抹掉大量计算;如果锚点过于密集,开销上升。该机制无法在单步内部分回滚——回退的原子单位是整个锚点。
  • 前置条件: 漂移检测要求 conductor 提交离散的锚点。如果没有提交锚点(或锚点选择不当),就没有已知好状态可回退。该机制也无法捕获从一开始就走错方向的模型——它只能捕获偏离已提交计划的漂移。
  • 封闭分类法: 五个原型是固定的。新颖的漂移模式可能被错误分类或完全漏掉,尽管分类仍会给 conductor 提供调整信号。
  • 劣化: 如果重复回退触发在同一个锚点上,harness 必须限制尝试次数以避免循环。带有明确错误的硬失败优于无限跳跃。
  • 不适用于头脑风暴、创意生成或开放性探索模式,这些模式中刻意偏离正是其工作方式。它也不处理工具执行错误或数据转换 bug——这些需要单独的观测策略。

何时发挥作用

漂移检测在任何正确性至关重要且无法接受无声失败的多步骤工作流中都能体现价值。典型场景包括:

  • 跨模块代码生成,模型漂移到不同签名或未经授权的优化会导致下游连锁浪费。
  • 研究、分析或合规流水线,必须遵循固定方法论,不能发明额外步骤或妄下结论。
  • 约束密集型输出(配置文件、法律模板、财务报告),范围膨胀或断线会导致无效制品。
  • 可审计的生产 agent:每次漂移事件都会记录原型和锚点,支持事后分析和提示调优。
  • 委托给更便宜、易漂移的 executor:harness 吸收风险,将不可靠的模型转变为可恢复的子系统。

对于单次查询或琐碎的链式操作,重跑一次的成本微乎其微,该机制的开销会占主导而无实质收益,属于过度设计。

无无声劣化:检测到,分类好,回退掉。

方法 Method

计划模式

只读审议舱,执行前从内到外验证DAG,强制先计划后花钱。

计划模式是一个只读审议驾驶舱:它读取、推理和结构化,但从不写入或执行。其不变式为“先计划,后花钱”——在从内到外验证一个带有验证门的结构化DAG并获得明确批准之前,不会在执行上消耗任何token。它将计划从轻量级的前奏转变为主动的质量门,在矛盾与幻觉烧掉预算之前将其捕获。

失败模式

缺乏规划阶段约束时,智能体默认会按第一个看似合理的解释执行。这种审议与行动的混同会产生三种可预见的失败。

过早承诺与token浪费。 智能体读取提示,输出代码或变更,随后才发现它误解了schema、遗漏了依赖项或建立在无效假设之上。它只能回溯,两次消耗token——一次走错路,一次做纠正。单个未经校验的猜测会滚雪球成多轮重试螺旋,无任何进展却推高成本。

静默损坏。 当步骤从未与计划交叉校验时,微妙的矛盾就会潜入:一个迁移脚本删除了某列,但后续步骤仍在查询它;一次API重构更改了公开签名,却没有更新所有调用方;一个缓存键变了却没有相应失效钩子。缺陷被合并进代码库,直到运行时错误、构建失败或数据丢失才浮出水面——那时智能体早已离开。回滚变成了手动考古。

幻觉上下文的脆弱性。 缺少源锚定,智能体会捏造变量名、路由或业务逻辑,听起来合理但从未存在过。它随后为自己的发明辩护,消耗token将幻觉与现实调和。结果是一条脆弱的执行轨迹,在现实世界的最小摩擦下崩溃,让开发者重启对话,为同样的推理二次买单。

根本上,每次失败的根源相同:执行token在结构被从内到外验证之前就花掉了。计划模式消除了这场竞速。

工作方式

计划模式强制严格的只读边界。在此模式下操作的智能体可以读取、请求信息、分解任务并产生计划——但在人类明确批准之前,它不能调用任何会带来改动的工具。六个相互依赖的机制强制执行这一纪律。

  • 源锚定规划。 每个推理步骤必须锚定到提供的上下文:代码文件、schema、对话历史。智能体不能捏造像“为支付负载添加校验”这样的步骤而不引用确切的schema字段及其位置。如果缺少所需信息,它必须通过工具调用门请求,而非发明。这从根源消除了幻觉。

  • 工具调用门。 规划器只能调用只读工具——读取文件、列出目录、查询schema。任何写入、执行或部署的尝试都会被确定性地阻止。该门服务于两个目的:防止审议期间的意外副作用,并迫使规划器将信息收集视为规划的一部分,而不是跳过验证的捷径。所有写入都延迟到计划被批准之后。

  • 自动复杂度路由。 并非每个变更都值得同样的审议深度。一行改动(重命名变量)走快车道:一个几步的轻量计划,几乎立即呈现。跨层构建(涉及数据库、API和前端的特性)自动获得完整计划,带有跨模型审查、根因探测和多个验证门。审议的规模适应变更的真实深度,而非提示长度。

  • 根因探测。 当子问题模糊时——“改进错误处理”、“修复登录bug”——规划器递归分解,直到每个叶子具体且可测试。“改进错误处理”变成“在loader.py第47行添加针对FileNotFoundError的try-except”和“返回带有关联ID的结构化500响应”。只有每个叶子都是一个可独立验证的、单一可执行动作时,探测才停止,将模糊请求转化为可判定DAG。

  • 自内向外验证。 随着DAG构建,每个步骤的前置条件都会与先前步骤的输出进行核对。检测到的矛盾——循环依赖、变量在产生前被消费、某列被删除而后续步骤仍在查询——会被标记并报告。验证运行在计划本身之上,在花费一个执行token之前就捕获结构性缺陷。

  • 结构化DAG输出。 最终计划是步骤的DAG,每个步骤都带有验证门(前置条件、预期结果)的注释。它以人类可读的形式呈现给开发者。只有在明确批准后,智能体才切换到执行模式,根据经过验证的蓝图而非猜测来消耗token。

权衡与边界

计划模式并非免费。前期的审议会消耗token和时间;对于一个拼写修正,即使是快车道也增加了模式切换和批准步骤,这是纯执行智能体所跳过的。只有当错误执行的代价超过深思熟虑计划的代价时,这种权衡才值得。

人在环中批准引入了延迟。如果开发者没时间审查DAG,进度就会停滞。在高速度流中——结对编程、实时调试——这种延迟可能比小错误的风险感觉更重。计划模式假设审查者既有时间又有注意力;如果审查者不加审视就盖章批准计划,安全网就会崩溃。

源锚定规划的质量取决于所提供的上下文。当开发者提供模糊意图却没有相关文件时,规划器仍然会产生DAG——但锚定在空无之上。自内向外的验证不会发现内部矛盾,因为没有事实可矛盾。计划看起来连贯,但与现实脱节。计划模式不能补偿不完整的输入。

DAG本身可能变得笨重。一个涉及四十个步骤和十几个验证门的复杂重构需要几分钟的审查。如果计划让人感到不知所措,开发者可能不经阅读就批准,使该模式沦为仪式性税赋。该工具提供了每个叶子,但并未为扫读压缩计划。

计划模式并非通用规划神谕。它无法对照未声明的外部需求(“这个特性应该感觉流畅”)验证计划,也不替代运行时监控。它也不适用于本质上是探索性的任务——结果形状从中间结果中浮现的数据分析、创意写作、或结果随机的参数调优。在这些领域,计划模式的刚性会对抗工作流。

何时值得使用

当错误变更的波及半径很大时使用计划模式。跨层重构——重命名数据库列,该列会通过ORM、API和UI传播——DAG揭示了必须更新的每一条边,验证门在接触任何文件之前就捕获缺失引用。敏感状态变更——迁移脚本、配置更新、身份验证规则修改——工具调用门防止意外写入,人类必须评估波及范围。接入不熟悉的代码库,计划作为预期变更的地图,开发者可以在写一行代码之前修正智能体对架构的理解。需求模糊的特性开发,根因探测强制将模糊意图分解为有序、可测试的动作,早期浮现隐藏假设。以及在token预算敏感的环境中——当昂贵模型或紧张的API配额使多轮执行失败的成本难以承受时——审议投入通过消除投机性重试而收回成本。

先计划,后花钱:没有执行token被烧在猜测上——只烧在经验证的蓝图上。

方法 Method

角色与模型解耦

模型在分派时插接到角色上——通过配置即可互换任何角色的模型,无需改动代码。

Xihe 中的角色是接口,而非后端。它们在运行时、按任务绑定到模型,没有硬编码依赖。这一理念的核心思想是:模型是可插拔的杠杆,而不是你围绕其构建的支柱。你围绕角色职责——规划、执行、验证——来设计 agent 架构,然后在任务开始时,纯粹通过配置来决定哪个模型扮演哪个角色。

失败模式

如果不解耦,每个角色就会永久性地与特定模型绑定。更换模型——无论是升级、降本,还是规避弃用——都会迫使你改动代码、重写提示词、重新测试流水线并重新部署。结果就是三种脆弱的失败模式:

  • 伪装成架构的供应商锁定。模型选择被埋入平台代码。从一家供应商迁移到另一家会固化成一个多 sprint 的工程任务,因此即使更好的模型出现很久之后,团队仍会坚持使用劣质模型。
  • 流水线脆弱性与静默崩溃。当模型因 API 更新或微调而静默改变行为时,依赖该模型的角色会退化,且没有清晰边界。因为可靠性逻辑——重试、验证、回退——与模型特定提示词混杂在一起,每个角色都会继承这一偏移。降级的 executor 可能静默地破坏 conductor 和 verifier 预期有效的结果。
  • 浪费分配与并发锁定。不解耦时,所有角色倾向于共享同一模型家族。你要么在琐碎的 executor 工作上浪费昂贵的 token,要么用一个无法进行规划的廉价模型拖垮 conductor。当单一模型端点成为瓶颈、串行化工作而非在独立端点上并行运行角色时,并发性也会受损。

最终,模型成为中心支柱:改变它,整个结构就会动摇。平台的可靠性——验证、重试、回退、日志——被煮进模型特定提示词中,而非可复用的 harness。

工作原理

Xihe 反转了耦合关系。每个角色——conductor、executor、verifier——都被定义为带有工作描述的接口,而非模型特定的后端。模型绑定发生在任务分派时刻:

  • 分派时的独立分配。任务启动时,分派引擎(确定性代码,从不调用模型)读取一个配置映射,该映射将角色名称与模型端点配对。conductor 获得其分配;executor 获得自己的;verifier 得到另一个。所有分配都来自你可控制的配置。
  • 更换模型无需改动代码。将下一次任务的 conductor 从 Opus 切换为 GLM,只需更新一个配置键——一个环境变量、一个 JSON 值,任何适合你部署的方式均可。无需代码变更、无需重新部署、无需重建流水线。相同的 DAG 逻辑和提示词被执行;只有端点和 token 不同。
  • 并发、隔离的执行。每个角色都在任务的 DAG 边界内运行,使用其分配的端点。executor 叶子在自己的廉价模型上并行触发,同时 conductor 进行规划;verifier 可以在不等待所有叶子的情况下交叉检查结果。失败被隔离:一个行为异常的 executor 模型不会传播到 conductor 或 verifier。
  • Harness 拥有可靠性。重试逻辑、响应验证、回退到替代模型以及日志记录,都存在于包围每个角色的 harness 层中,而非提示词中。模型是一个可调用的端点,接收结构化指令并返回输出。你的领域逻辑、品牌规则和机密信息永远不会进入模型的 API 或权重空间。

这使模型选择变成了一个配置拨盘,而非设计承诺。

权衡与边界

解耦引入了一个新的配置面,必须加以管理。一个配置错误的端点(拼写错误、密钥过期)可能在分派时静默地使角色失败,因此运维纪律——配置验证和模型可用性监控——变得至关重要。

每个角色的绑定在任务生命周期内是一对一的。你无法在单个任务内将 executor 角色拆分,将不同的叶子发送到不同模型。如果你需要按叶子选择模型,请将工作分解为独立的任务。这个边界保持了接口的简单性和每个角色的契约清晰度。

解耦并不能保证任何模型能胜任任何角色。conductor 需要强推理能力;executor 擅长速度和低成本;verifier 需要跨模型怀疑能力。将弱模型分配给 conductor 自然会降低规划质量。如果某个角色的逻辑依赖于模型特定的原语(例如,某个供应商独有的特定函数调用模式),那么更换模型可能会破坏契约。在这种情况下,可以在配置中将该角色限制在一组允许的模型中——无需代码变动。

读取运行时配置的延迟开销是微秒级的,与模型推理时间相比可忽略不计。然而,在每个独立端点上运行每个角色意味着你不能跨角色共享连接池或重用内存中的上下文窗口。在高并发下,与单体流水线相比,这可能会增加总 API 延迟;但这种权衡是值得的,因为隔离性带来的好处。

退化路径是清晰的:如果模型端点失败或返回垃圾数据,harness 会重试,如果配置了回退,则对那个角色使用替代模型。如果没有配置回退,则该角色的任务会干净地失败,但其他角色继续不受影响。平台不会静默地吸收错误输出;它在契约被违反时就会停止。

它何时发挥价值

一旦你在生产中运营不止一种模型(或模型版本),并且需要在无需重写代码的情况下演进,角色与模型的解耦就物有所值了。具体场景:

  • 多模型成本/质量调优。使用昂贵的推理模型(如 Opus)进行规划,使用廉价快速的模型(MiMo)执行数百个叶子,并使用具有独立视角的第三个模型(Codex)进行验证。每个角色获得最适合其任务的模型。
  • A/B 测试与渐进式发布。将一小部分任务路由到候选规划器模型,其余仍用当前模型。测量完成率、延迟和成本,无需改动代码。通过回滚一个配置值即可回退。
  • 不停机迁移。一个模型被弃用或变得不可靠。更新配置映射指向替代品。DAG、提示词和 harness 保持不变。
  • 合规与数据隔离。在云端模型上运行 conductor 进行推理,但在本地模型上运行 executor,该模型从不将敏感数据发送到你的网络之外。按角色的配置强制执行数据边界。
  • 多租户部署。不同的客户或用例需要不同的模型栈。每个租户一个配置映射让同一代码库服务所有需求,而无需分支。

角色不是模型——它是模型履行的契约,而这个契约是按任务而非按部署来配置的。

方法 Method

钩子与扩展性

四个同步进程内钩子,关键点注入确定性策略,模型外工程可靠性

Xihe 提供四个同步、进程内的扩展点,让你无需分叉或修补核心即可将自定义逻辑插入 agent 运行时。每个钩子映射到一个特定生命周期事件,默认空操作,且仅在你需要的部署中注册。它们所开启的一个核心理念是:模型无法提供的可靠性保证,必须通过确定性、模型无感知的拦截缝在模型之外工程出来。

失败模式

没有这些钩子,每个领域特定策略——权限检查、PII 脱敏、外部监控、私有工具暴露——都会迫使你要么分叉运行时(脆弱、合并困难、不可重复),要么信任模型自我调节。这种信任会无声地崩溃:

  • 叶子未经检查即执行。 一个含有畸形或未授权参数的叶子仍然消耗模型配额,破坏性操作(文件删除、外部 API 调用)可能溜过,因为在调度前没有门槛可以阻止它。
  • 可观测性是事后附加的。 没有生命周期级别的任务结果接入点,意味着操作员要么尾随原始模型输出,要么改造脆弱的包装器——导致生产失败时审计盲区和猜测。
  • 内存写操作未经检查即提交。 模型生成的内容,包括 PII、幻觉事实或违反保留策略的数据,进入持久存储时没有拦截点来编辑、修改或丢弃它。
  • 每个新工具都需要核心变更。 内部 API、遗留端点或团队特定服务必须通过修补运行时或维护带外代理来添加,将系统发布与 agent 能力耦合。

这些不是边缘情况——它们区别了与友好模型工作的原型和必须承受真实世界 corruption、合规审计和运维噪声的生产系统。

工作原理

每个钩子都是一个在启动时注册的可调用对象。运行时在定义的时刻同步调用它,使用其返回值(如果适用),并将不存在的钩子视为空操作。所有四个钩子都运行在进程内,模型无关且确定性。

  • pre_leaf_execute — 在任何叶子任务开始前立即调用,接收叶子已解析的参数。要干净地停止执行,抛出一个结构化错误;该错误传播给 conductor 进行重新规划或展示,并且该叶子永远不会被调度到模型。这是唯一可以阻塞执行的钩子。
  • post_task_complete — 在任何任务(叶子或复合)完成后触发,附带结果。其返回值被忽略,且不得影响流程。设计为即发即弃的副作用出口:日志、发射指标、触发 webhook。异常被捕获并记录,不致命,保留任务结果。
  • memory_write_gate — 在每次内存写提交之前拦截。接收提议的内容;原样返回、返回修改后的版本、或返回 None 以静默丢弃该写入。这会覆盖每个领域的内置约束逻辑,无需触碰持久化层即可实现 PII 脱敏、保留执行或内容类型禁止。
  • tool_discovery — 在启动时执行一次,在系统工具加载之后。返回一个工具模式列表;conductor 将它们与系统工具集合并。使 agent 能够访问内部 API、数据库或自定义端点,无需网关变更。如果该钩子抛出异常,agent 将无法启动。

所有钩子都在 dispatch 线程上按固定顺序运行,对于给定事件没有并发。它们是按 agent 实例注册的,并且只能在单个钩子的实现内部组合。

权衡与边界

  • 延迟耦合。 同步进程内执行意味着每个钩子都将其挂钟时间添加到临界路径上。一个缓慢的 pre_leaf_execute(例如外部权限检查)会阻塞叶子调度;一个沉重的 memory_write_gate 会阻塞每一次写入。性能下降是线性的:每个叶子 200 毫秒的门控会给 10 个叶子的链增加 2 秒。钩子必须保持快速;昂贵的工作应被卸载(例如,在 post_task_complete 内部加入异步管道队列)。
  • 失败语义锋利。pre_leaf_executememory_write_gate 中,未处理的异常会中止操作(叶子或写入)。在 post_task_complete 中,错误被静默吞噬,因此你可能会在不注意的情况下丢失副作用。tool_discovery 异常会阻止启动。每个钩子都需要健壮的内部错误处理。
  • 无跨钩子状态。 没有共享上下文或协调;一个 pre_leaf_execute 无法看到另一个叶子的 post_task_complete 结果。为了关联,通过元数据传递你自己的标识符。
  • tool_discovery 在启动时是静态的。 在会话中间无法添加或移除工具,除非重启。该钩子只添加工具;无法修改或移除系统工具。
  • 不是通用的中间件管道。 钩子无法注入新任务、修改 DAG 或检查计划状态。它们是点扩展,不是编排器。从模型失败中恢复(verifier 的角色)不在范围内。
  • 仅限进程本地。 在分布式部署中,每个运行时实例独立注册自己的钩子;没有跨进程协调。

何时物尽其用

  • 多租户部署。 使用 pre_leaf_execute 在工具调用上强制执行基于角色的访问,在未授权叶子消耗模型预算或到达外部服务之前中止它们。
  • 合规敏感领域。 memory_write_gate 确定性地脱敏 PII(SSN、信用卡号)或强制执行保留限制——无论模型输出什么,这是保证策略的唯一可靠方式。
  • 运维可观测性。 post_task_complete 将每个任务结果送入你的指标管道,为你提供延迟直方图、错误计数和审计跟踪,无需触碰核心。
  • 内部工具生态。 tool_discovery 将私有 API(员工目录、内部仪表盘、遗留服务包装器)注册为一级工具,避免网关发布。
  • 渐进式策略部署。 在预发布环境中注册一个空操作钩子,然后仅通过钩子的存在来门控生产行为,无需代码分支。

钩子是模型停止、你的策略开始的地方——在模型之外工程可靠性。