跳到主要内容

模型迁移指南:如何在不冻结功能开发的情况下更换基础模型

· 阅读需 13 分钟
Tian Pan
Software Engineer

每个生产环境中的 LLM 系统都会面临模型迁移。供应商发布了新版本。你需要降低成本。竞争对手提供了更好的延迟。监管要求需要更换供应商。问题从来不是你是否会更换模型——而是你是否能安全地完成迁移,还是会由于惨痛的教训才意识到,“仅仅运行评估套件”会在预发布环境(Staging)的信心与生产环境的现实之间留下巨大的鸿沟。

大多数团队将模型迁移视为库升级:更换依赖项、运行测试、然后发布。这对于确定性软件有效。但对于概率性系统,这种方式会遭遇灾难性的失败。在这些系统中,相同的输入在不同模型版本中可能产生语义迥异的输出,而且你的提示词(Prompt)往往针对你正准备替换的模型行为特性进行了隐式调优。

为什么模型迁移与软件升级截然不同

当你升级数据库驱动程序时,契约是明确的:同样的查询,同样的结果。LLM 迁移则从三个互相关联的维度打破了这一假设。

提示词与模型的共同适应(Prompt-model co-adaptation)。 你的提示词是随着当前模型一起演进的。每当工程师微调系统提示词以修复边缘情况时,他们其实是在隐式地将该模型的理解风格编码到提示词中。一个在 GPT-4 上能稳定产生结构化 JSON 的提示词,在 Claude 上可能会产生被 Markdown 包裹的 JSON,或者在 Gemini 上添加不必要的评论。这些并不是新模型的 bug —— 它们是为旧模型优化后留下的痕迹。

行为表面积(Behavioral surface area)。 模型不仅仅是在你的评估集上的准确率。它还包括它如何处理歧义、如何果断地拒绝边缘情况、在模式(Schema)未完全指定时如何格式化输出,以及它如何响应对抗性输入。两个在基准测试中得分相同的模型,在 15% 不符合评估分布的生产流量中,表现可能完全不同。

下游耦合。 你的后处理代码、护栏(Guardrails)、输出解析器 —— 它们都学会了期待当前模型的特定模式。一个用三个反引号包裹 JSON、或者用单词拼写数字而不是数字、或者在结构化响应前添加前导语的模型,会以单元测试从未预料到的方式破坏下游系统。

阴影期:切换前进行双写

模型迁移中唯一最重要的技术是阴影部署期(Shadow deployment period)。在真实的生产流量上运行新模型,但将其响应返回给用户。记录一切。对比一切。只有当差异(Delta)被理解且在可接受范围内时,才进行切换。

以下是其实施结构:

第一阶段:并行执行(1-2 周)。 将每个生产请求的副本路由到新模型。使用关联 ID 存储两者的响应。用户只看到现有模型的响应。这会增加你的推理成本,但这是你能买到的最便宜的保险。

第二阶段:自动化对比。 构建超越字符串匹配的对比流水线。你需要旧输出与新输出之间的语义相似度评分、结构一致性检查(新模型的 JSON 是否能正确解析?),以及行为分类(新模型是否拒绝了旧模型处理过的请求,反之亦然?)。

第三阶段:差异分类。 并非所有差异都是退化。新模型在某些输入上可能会产生更好的答案。目标不是零差异 —— 而是零令人惊讶的差异。将差异分为:

  • 改进(Improvements):新模型明显更好
  • 中性变体(Neutral variants):语义等价,表述不同
  • 退化(Regressions):新模型在旧模型成功的地方失败了
  • 新行为(Novel behaviors):新模型执行了既非预期也未被评估覆盖的操作

“新行为”类别是最棘手的。这些是你的评估套件从未预料到的情况,因为旧模型从未触发过它们。

提示词转换是工程问题,而非查找替换

当团队在不同的模型系列之间迁移时 —— 例如,从 OpenAI 到 Anthropic,或者从专有模型到开源模型 —— 提示词层需要真正的重新工程化。每个模型系列对于指令结构、上下文界定以及输出格式规范都有不同的偏好。

OpenAI 模型对带有章节分隔符的 Markdown 格式提示词响应良好。Claude 更喜欢使用 XML 标签来分隔指令和上下文。Gemini 则强调明确的约束放置。这些并不是表面的差异 —— 它们影响着模型遵循复杂多步指令的可靠性。

实际的迁移模式:

  1. 提取意图:从每个提示词中提取意图。这个提示词实际想要实现的目标是什么?剥离模型特定的格式,写下核心要求。
  2. 针对目标模型重新表述:使用目标模型偏好的结构约定。这通常意味着重写,而不是翻译。
  3. 先在最困难的案例上进行测试:不要从理想路径(Happy path)开始。先处理那些在旧模型上需要最多迭代才能搞定的提示词 —— 这些最容易出问题。
  4. 保留逃生舱口:如果你的旧提示词有处理边缘情况的特定指令(“如果用户询问 X,则回答 Y”),验证这些仍然能被正确触发。边缘情况的处理是模型特定调优最集中的地方。

一个常见的错误是构建一个旨在“规范化”跨供应商提示词的抽象层。这听起来很优雅,但在各处的表现都平平。最好的提示词是特定于模型的。接受为每个模型维护提示词变体的成本,以换取每个模型的可靠性。

嵌入迁移:没人预留预算的重索引问题

如果你的系统使用了嵌入(Embedding)——无论是用于 RAG、语义搜索还是分类——模型迁移都会引发第二次迁移,而且往往规模更大:你的整个向量索引将变得不兼容。新的嵌入模型会在不同的语义空间中生成向量。你不能在同一个索引中混合使用新旧嵌入,并指望获得有意义的相似度评分。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates