command-r-plus是别名会随新快照迁移,固定快照后输出稳定、评估有意义,但需自行处理快照退役维护。
裸模型名称会解析为 Cohere 当前认为该系列默认的快照版本。一旦新的快照发布,别名就会移动。你的请求随后会由不同的模型提供——输出风格不同、详细程度不同、限制也可能不同——除非你记录了每个请求所服务的模型,否则日志中没有任何标记能够标记出这个变化的时刻。
这个权衡值得坦诚说明,因为固定(pinning)并非免费的。别名意味着你永远不会落后,也意味着你无需任何操作——快照退役时不会发生事故,因为别名已经把你移走了。而固定意味着输出是稳定的,你的评估始终有意义,但也意味着如果没人盯着,退役就是一种故障。
这种变化很少是剧烈,这正是它代价高昂的原因。新的快照平均表现更好,但在细节上有所不同:它可能在旧版本用段落的地方用了标题,在旧版本断言的地方用了保守措辞,或者在你解析器期望三个要点时返回了四个要点。整体质量上升的同时,你的特定集成却出现了偏差,而且由于代码仓库中没有发生任何变化,调查会从审视一切开始——除了真正的原因。
对于任何经过调优的 prompt、有评估套件、或有下游解析器的场景,都应该固定。别名驱动的行为变化是代价更高的故障,因为它没有任何信号就悄然到来,会被诊断为其他原因。但固定了就要监控,否则你只是把问题推迟到了一个你没有记下的日期。
用 API 而非文档来查询。models 端点是实时列表,它告诉你你的 key 实际上可以调用什么:
curl -s "https://api.cohere.com/v1/models?page_size=100&endpoint=chat" \
-H "Authorization: Bearer $CO_API_KEY" \
| jq -r '.models[] | [.name, .context_length, .is_deprecated] | @tsv'
理解命名规则。Cohere 的快照带有月份和年份——command-r-08-2024、command-r-plus-08-2024、command-r7b-12-2024、command-a-03-2025。没有日期后缀的名称是别名。这就是全部规则,它让你的代码库审计变成了一次对没有日期的模型字符串的 grep。
如果你是为现有服务做固定,选择别名当前指向的快照。固定到当前默认值在行为上是一个空操作——这正是你想要从一个旨在防止未来变化的变更中得到的。
找到每一个字面量。在整个代码库中搜索 rg -n "command-[a-z0-9-]*",包括测试固件、notebook 和任何在正文中命名模型的 prompt 模板。
把它移到配置中。一个常量、一个环境变量、一个地方:
// config/models.ts
export const CHAT_MODEL = process.env.COHERE_CHAT_MODEL ?? "command-r-plus-08-2024";
export const RERANK_MODEL = process.env.COHERE_RERANK_MODEL ?? "rerank-v3.5";
环境变量覆盖使得最终的迁移成为一个可以在几秒内回滚的配置变更,而不是一次部署。
同样固定 rerank 和 embed 模型。它们独立于 Chat 进行版本更新,同样可能在夜间改变你的检索质量。
固定请求只是其中一半。记录返回的内容,这样不匹配就是可见的,而不是被假设掉:
const res = await cohere.chat({ model: CHAT_MODEL, messages });
logger.info({
requested_model: CHAT_MODEL,
response_id: res.id,
input_tokens: res.usage?.tokens?.inputTokens,
output_tokens: res.usage?.tokens?.outputTokens,
finish_reason: res.finishReason,
});
这里有一个值得知道的微妙之处:与某些提供商不同,Cohere 不会在聊天响应中返回所服务的模型名称作为字段,所以"哪个模型回答了?"这个问题是通过你发送的内容来回答的,而不是通过返回的内容。这正是为什么记录请求模型很重要——使用别名,根本没有任何记录表明哪个快照服务了给定请求,而使用固定,请求本身就是记录。
请求 ID 是支持对话会询问的内容,token 计数是告诉你 prompt 增长了多少的内容。在每条日志行上保留请求模型意味着当输出质量发生变化时,第一个问题——模型改变了吗?——可以从数据而非记忆中回答。
每周轮询配置中确切快照的 is_deprecated:
curl -s "https://api.cohere.com/v1/models/command-r-plus-08-2024" \
-H "Authorization: Bearer $CO_API_KEY" | jq '.is_deprecated'
把 true 结果发送到有人会阅读的地方。该标志含义的完整说明在 Cohere 关于 Command 模型的退役公告中。
保留一个可以重新运行的评估集。二十到五十个具有预期属性的真实输入——不是预期的字符串。这正是将迁移从一次跳跃变成一次测量的东西,也是固定值得拥有的唯一原因。
当公告出现时从容迁移。在 staging 中更改环境变量,运行评估集,比较,然后提升。因为模型名称是配置,如果新的快照在你的任务上表现更差,回滚是即时的。
固定的全部意义在于:这个序列发生在你自己选择的某个周二下午,而不是在别名移动的那个早晨。
固定的快照修复了权重。它不能修复决定你收到什么的所有因素,而明确边界可以防止虚假的可重现感。
服务栈。 推理内核、批处理策略和硬件在固定权重集下会发生变化。这就是为什么 temperature 0 不是确定性保证的原因——当算术以不同方式批处理时,相同权重的相同输入仍然可能产生不同输出。
默认 prompt 内容。 默认前言和安全前言由 API 提供,而不是由你提供,它们的措辞不是模型名称的一部分。那里的变化是你没有做也不能看到的 prompt 变化。提供你自己的前言可以消除两个中的一个;安全前言仍然存在。
参数默认值。 你没有设置的任何内容都可能被提供商或 SDK 升级更改。显式设置 temperature、max_tokens 和引用模式——即使设置为它们的当前默认值——使请求自描述并免受默认值移动的影响。
你自己的输入。 实际上是最大的漂移来源。检索到的文档随着语料库的变化而变化,而从某个被编辑过的模板组装的 prompt 是一个不同的 prompt。固定模型缩小了输出变化时的搜索范围;但它不会使语料库成为常量。
坦诚的总结是:固定将一个大的、不可见的、提供商驱动的变化源转换为一个小的、带有日期的、有计划的变化源。这是值得做的,但它与可重现性不是同一件事。一个可以按需重新运行的评估集才是真正告诉你行为是否发生了变化的东西,而且是在上述四点之前值得投入的 artifact。
Cohere's Deprecation Timeline for Legacy Command Models
Command R+'s Context Window and Output Limit