合约层
Source: Dev.to

状态: 信息性
受众: 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 系统从以下阶段演进:
- 单次提示
- 多步骤代理
- 使用工具的系统
- 生产基础设施
缺乏合同成为主要的失败来源。
合同层并非创新;它是一个 缺失的层,类似于:
- 未出现无类型脚本之前的类型系统
- 原始数据库访问之前的事务
- 随意部署之前的容器
它的出现只是时间问题。
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.
