共享存储不是瓶颈
当一个集群从少数几个智能体扩展到数千个时,本能反应是去找一个共享数据库。把所有事实放在一个地方,让每个智能体都能读写,协调就变成了一个存储问题。这种本能是错的。存储很便宜,而且已被充分理解。集群规模下的失效模式不是容量,而是一致:智能体对什么是事实、事实何时是当前的、谁有权声称它存在,并没有共同的定见。
没有发现契约的共享存储会变成只写不读的垃圾场。每个智能体都能追加,很少有人能解读,没有人能退役。结果不是知识库,而是一堆关系未定义的主张。
并发写入者产生相互冲突的记录,没有任何单一智能体能裁决
两个智能体观察到同一个底层事件,往往会以不同方式记录它。一个把温度写成浮点数,另一个写成带单位的字符串。一个用本地时间打时间戳,另一个用 UTC。单独看,两者都没错。合在一起,它们无法调和,因为没有任何智能体拥有决定哪种表示是规范形式的权威。存储忠实地保留了两者,每一个下游读者都继承了这份歧义。
这不是一个靠更强事务模型就能解决的一致性难题。即便有可串行化的写入,除非写入者事先就事实如何命名达成一致,存储也无法知道两条记录描述的是同一个事实。共识协议为写入排序;它们不解读写入。
没有命名规则,重复项看起来就像独立证据
这是更危险的失效。如果三个智能体各自独立发现了同一个事实,并用三个不同的键写入,下游消费者会看到三条记录。如果该消费者把记录数量当作置信度的代理指标,它会断定这个事实得到了充分支持。并非如此。它只是一个观察,被意外复制了。
重复即证据是一种无声的腐化。它不报错,它抬高置信度分数。依赖佐证计数的集群,如果没有命名纪律,就是在测量自身的冗余,并称之为一致。
发现契约

发现契约是一组规则,规定事实在进入任何存储之前如何命名、如何版本化、如何退役。它是一个协议,不是模式。模式描述记录长什么样;契约描述它意味着什么,以及何时不再意味着什么。
有三个属性是承重的。
规范键、生产者身份、时间戳
每个事实都必须携带一个由其内容派生、而非由写入它的智能体派生的规范键。像 sensor:temperature:celsius:station-7:2024-06-01T12:00Z 这样的键,任何观察到同一事实的智能体都能推导出来。两个写入同一观察的智能体会产生相同的键,存储可以把它们合并为一条带两份证言的记录,而不是两条记录。
键必须伴随生产者身份和时间戳。生产者身份不是显示名称;它是对发出该事实的那次运行的引用,足以检索该运行的输入和配置。时间戳是观察时间,不是写入时间,因为写入时间反映的是排队,而不是现实。
读取方声明它所依赖的版本
消费某个事实的读取方必须声明它依赖哪个版本。这把陈旧读取从无声的隐患变成了明确的选择。一个读取版本 3 并据此行动的智能体,事后可以被审计:它依赖版本 3,而版本 5 取代了它。没有这一点,消费了被取代事实的读取方,与消费了当前事实的读取方看起来一模一样,由此产生的错误无法归因。
版本声明不是免费的。它迫使读取方携带状态,迫使写入方发布版本转换。这个权衡是真实的:跳过版本声明的系统获得吞吐量,失去解释自身输出的能力。对于做出会累积的决策的集群来说,解释比吞吐量更值钱。
退役是一等操作
被取代的事实必须停止被引用。这需要一个与写入同样明确的退役操作。事实不是被删除;它被标记为已退役,并附上取代它的事实和原因。声明了对某个已退役事实的版本依赖的下游读取方,会收到错误或重定向,而不是无声的替换。
退役正是大多数共

下游智能体必须能够把一项主张追溯到产生它的那次运行。这不是调试时的锦上添花;它是让契约其余部分可被执行的属性。如果一个事实无法被追溯,它就无法被版本化、退役或裁决。
实际后果是一条写入时规则:无归属的事实被拒绝。不是在读取时过滤,不是隔离待后处理,而是拒绝。读取时过滤器是每个消费者都必须正确且一致实现的策略。写入时拒绝是系统的一个属性。前者在某个消费者忘记时无声失败;后者在边界处大声失败。
这是对写入灵活性的权衡。无法产生运行引用的智能体无法贡献。在早期原型中这感觉受限;在集群规模下,这是保持语料干净的唯 一方式。替代方案是存储不断累积无法归属的主张,直到没有任何消费者能区分信号与残渣。
评估含义
集群质量不能仅靠任务完成度来衡量。一个通过引用被取代的事实、或把同一个观察的三份副本当作三次独立确认来完成任务的集群,是偶然成功的,并且会以不可预测的方式失败。
因此评估必须包含事实级指标:智能体之间在规范键上的一致率、共享同一键但在值上分歧的事实之间的矛盾率,以及被引用事实中属于当前而非已退役的比例。这些是集群共享状态的属性,不是任何单一智能体输出的属性,而且它们需要发现契约才能被测量。
诚实的局限是:事实级指标比任务完成度更难计算。它们需要对契约本身进行埋点,以及一个关于什么算作一致的参照。这个成本,就是知道一个集群是连贯的、还是仅仅多产的代价。
先构建契约
共享存储是最后一个决定,不是第一个。在选择数据库之前,先定义事实如何命名、谁可以产生它、读取方依赖哪个版本,以及它如何退役。这四条规则就是发现契约。实现了它们的存储是协调基座。没有实现的存储,只是一个索引更好的共享文件夹。
集群失败,不是因为它们存不下足够多的东西。它们失败,是因为无法就自己存了什么达成一致。
封面照片:panumas nikhomkhai / Pexels。
