系统指纹

System Fingerprint

System Fingerprint 是 OpenAI 2024 年引入的响应字段(形如 fp_abc123),用于标识当前请求实际使用的底层模型检查点/配置快照;同模型名不同 fp 意味着输出分布有漂移,可复现性受影响。

详细解释

System Fingerprint(系统指纹,字段名 system_fingerprint 解决了 AI API 消费方最头疼的一个”薛定谔稳定性”问题:同一个模型名(比如 gpt-4o-2024-05-13)在不同时间点调用,输出为什么突然变了?

厂商会在不修改模型名对外暴露的前提下,静默做一些后端改动:

  • 小版本权重更新(安全补丁、轻度再训练)
  • 推理后端切换(TensorRT-LLM → vLLM、换算子实现)
  • 路由策略调整(不同集群、不同量化版本)
  • 提示词缓存 / MoE 路由策略微调

这些改动对外 API 字段完全兼容,但输出分布变了——你固定了 Seed 也没用,同样的 Prompt 不再给同样的回答。

system_fingerprint 就是厂商用来把”当前这次请求实际落到哪个后端配置”以短哈希的形式告诉你:

{
  "id": "chatcmpl-abc",
  "model": "gpt-4o-2024-05-13",
  "system_fingerprint": "fp_4008e3b73c",   // ← 关键
  "choices": [...],
  "usage": {...}
}

如果你在两次调用之间发现 system_fingerprint 变了,就不要指望输出完全一致——即使 Seed / Temperature 全都一样。

参考:OpenAI 官方说明

与可复现性的关系(三要件满足才算”可复现”)

要件说明变化时会怎样
相同参数temperature=0, seed=xxx, top_p=1.0, ... 完全一致参数变了 distribution 直接变
相同 model 名请求中 model 字段不变新版本模型通常强制要求换名(带日期)
相同 system_fingerprint响应 fp 前后一致fp 变化 → 即使 Seed 一样也不一样

只有三者同时满足,才有可能获得字节级一致输出(OpenAI 文档里措辞是 “likely to be the same”,仍不保证 100%,因为底层浮点并行顺序等细微因素仍可能造成差异)。

在实际工程中怎么用

  1. 离线评估对比要记 fp:如果你跑了一套自动评估(Eval)集,每次调用把 model + system_fingerprint + prompt 三元组一起入库,下次跑同样 eval 前先对比 fp——fp 变了就不要直接和旧结果比,否则你会分不清是 Prompt 改坏了还是模型偷偷改了。
  2. 生产回归测试做白名单:对于强一致要求的场景(比如法律文书、医疗报告输出),可以把当前稳定的 fp 值写进白名单。一旦响应里 fp 不在白名单,就走告警或者切换模型。唯元智创 聚合网关对”fp 漂移”提供了可选告警钩子,你可以在控制台订阅。
  3. 不要把 fp 写死做业务逻辑:fp 本身厂商随时可能废弃或滚动,用 fp 做监控、做评估分组没问题,不要拿来做条件分支。
  4. 对可复现要求极高的任务:宁可固定模型名到日期版(比如 gpt-4o-mini-2024-07-18 而不是 gpt-4o-mini),并且接受”每隔 1–3 个月会有一次强制升级需要重新跑评估”这个现实。

常见问题

同样的请求,为什么 fp 一会是 A 一会是 B?
说明厂商正在做”灰度切换”——你一部分请求落到新集群、一部分落到旧集群。通常持续几小时到几天,全部切完就稳定在同一个 fp 了。如果你有一致性要求,期间可以暂时换别的模型名避开灰度。
非 OpenAI 厂商有 System Fingerprint 吗?
很多没有这个字段,但同样存在”模型名不变输出变了”的问题。唯元智创 网关对所有接入模型(无论原厂有没有 fp)都生成一层统一的 vendor_fingerprint,方便你跨厂商做同样的可复现性监控。
我设了 seed 但输出还是不一样,是 bug 吗?
基本不是 bug,90% 情况是 fp 变了。剩下 10% 情况:Temperature 没设到 0、Top-P 变动、流式与非流式差异、或者并发请求底层 batch 顺序不同导致 量化 浮点微小漂移。先把 fp 加入日志排查,不要上来就找厂商报 bug。