合约层

发布: (2025年12月17日 GMT+8 06:35)
7 min read
原文: Dev.to

Source: Dev.to

《合约层》封面图

rokoss21

状态: 信息性
受众: AI 系统架构师、框架维护者、平台工程师
范围: 基于 LLM 的系统的确定性合约

1. 什么是 Contract Layer

Contract layer 是一种架构层,用于在模型执行之前定义 AI 系统中允许发生的行为

不是

  • 提示(prompt)
  • 验证器(validator)
  • 重试机制(retry mechanism)
  • 框架特定的抽象(framework‑specific abstraction)

Contract layer

一组 执行前约束,使得无效状态 不可表示

在传统软件系统中,合约通过以下方式隐式存在:

  • 类型系统
  • 函数签名
  • 内存模型
  • 执行顺序保证

LLM 系统历史上 没有 这层合约。

2. 合约层所在位置

合约层位于 编排逻辑和模型执行之间

Application Logic
        |
        v
[ Contract Layer ]
        |
        v
LLM / Tool Runtime

任何跨越此边界的内容 必须已经有效

如果它无效:

  • 执行必须不启动
  • 不应进行重试
  • 不应向下游泄漏部分状态

这类似于编译器在执行之前拒绝无效程序的方式。

Source:

3. 合约层管理的内容

一个完善的合约层管理 五个不同的领域

3.1 类型

  • 可以存在哪些值
  • 允许的形状有哪些
  • 适用的约束是什么(范围、枚举、格式)

如果没有类型:

  • 工具调用会退化为结构松散的 JSON
  • 提供商对模式的解释会不一致
  • 验证会变成被动而非预防

3.2 接口(工具合约)

接口定义:

  • 存在哪些工具
  • 如何调用它们
  • 它们返回什么

合约层将工具接口视为 硬性边界,而不是文档说明。

违规情况包括:

  • 缺少工具名称
  • 大小写错误
  • 缺少必填字段
  • 序列化格式错误

如果工具调用违反其接口,必须在 执行前 被拒绝。

3.3 执行顺序

LLM 系统隐式依赖于:

  • 消息序列规则
  • 提供商特定的回合约束
  • 流式与非流式的差异

合约层将执行顺序 显式化,防止:

  • 无效的回合序列(例如 Gemini 的 INVALID_ARGUMENT 错误)
  • 模糊的工具调用位置
  • 同步模式与流模式之间的状态漂移

3.4 上下文作为资源

上下文 不是 文本;它是一个 有界资源

合约层必须定义:

  • 哪些部分是关键的
  • 哪些可以缩减
  • 哪些可以舍弃
  • 它们被考虑的顺序

这取代了:

  • 临时的截断
  • 启发式的重试
  • “抱希望” 的上下文管理

3.5 标准化输出

合约层定义系统状态的 标准化表示

  • 标准化 JSON
  • 稳定的顺序
  • 确定性的布局

这使得能够:

  • 可复现的运行
  • 缓存
  • 差异比较
  • 重放
  • 审计

如果没有标准化,系统就无法可靠地进行推理。

4. 合约层 不是

  • ❌ 提示工程
  • ❌ 生成后输出验证
  • ❌ 重试逻辑
  • ❌ 模型特定的技巧
  • ❌ 框架胶水代码

5. 系统属性的确定性

关键原则: 确定性不是模型的属性;它是周围系统的属性。

LLM 本质上是概率性的。合约层 试图改变这一点。相反,它们确保概率组件在 确定性边界 内运行:

  • 无效输出在结构上不可能被消费

这与以下领域的做法相呼应:

  • 操作系统
  • 数据库
  • 编译器
  • 分布式系统

6. 缺少契约层导致的失败

没有契约层的系统不可避免地会累积:

  • 重试
  • 回退
  • 验证器
  • 提供者特定的条件分支
  • 未文档化的不变量

随着时间推移,系统会变得:

  • 脆弱
  • 不可复现
  • 调试成本高
  • 无法形式化推理

这不是工具问题——而是架构上的遗漏。

7. FACET and the Contract Layer

FACET 通过结合以下内容来形式化合同层:

  • 严格的类型系统(FTS)
  • 显式接口(@interface
  • 确定性的执行阶段
  • 响应式依赖图(R‑DAG)
  • 正式的上下文分配算法(Token Box Model)
  • 标准化的 JSON 渲染

FACET 是 一种实现 的合同层;该概念本身比任何单一工具都更广泛。

8. 为什么合同层是不可避免的

随着 LLM 系统从以下阶段演进:

  1. 单次提示
  2. 多步骤代理
  3. 使用工具的系统
  4. 生产基础设施

缺乏合同成为主要的失败来源。

合同层并非创新;它是一个 缺失的层,类似于:

  • 未出现无类型脚本之前的类型系统
  • 原始数据库访问之前的事务
  • 随意部署之前的容器

它的出现只是时间问题。

9. 长期影响

事后看来,没有合同层的 AI 系统将显得不完整。未来的系统将假设:

  • typed tools
  • deterministic context packing
  • canonical execution
  • reproducible behavior

默认可靠性

问题不再是是否存在合同层——而是它被定义得多明确

10. Summary

A contract layer:

  • 使无效状态不可表示
  • 将失败从运行时转移到编译时
  • 将工程纪律恢复到 AI 系统中
  • 在不混乱的情况下实现规模化

It is not optional for reliable AI.

It is foundational.

Back to Blog

相关文章

阅读更多 »

FACET的历史与原理

本文件的目的 本文件记录了 FACET 的历史背景、架构动机以及设计决策背后的理由。它的存在…