一、换模型,为什么这么痛?

以前做 AI 项目,换模型简直是灾难。明明只是换一个供应商,却要动一堆代码、改一堆文件、测好几天,还常常引入新的 bug。

真实案例:去年做一个智能客服项目

一开始用 GPT-3.5-turbo,代码长这样:

import openai
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "你好,我想退货"}],
temperature=0.7
)
answer = response.choices[0].message.content

后来业务方说 GPT-3.5 回答不够专业,要换 Claude。我当时的内心是崩溃的:

import anthropic
response = anthropic.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=1024,
messages=[{"role": "user", "content": "你好,我想退货"}]
)
返回结构完全不一样!
answer = response.content[0].text

然后发现:

  • 参数名不一样(max_tokens vs max_completion_tokens)

  • 返回结构不一样(choices[0].message.content vs content[0].text)

  • 流式处理的格式不一样

  • 错误码定义不一样

  • 连 role 的枚举值都有细微差别

为了换一个模型,我改了 6 个文件,测了 2 天,还引入了新的 bug。

二、好的设计,应该长什么样?

现在如果调用层设计得好,体验应该是:

from my_client import AIClient
client = AIClient()
今天用这个
response = client.chat.completions.create(
model="claude-3.5-sonnet",
messages=[{"role": "user", "content": "你好,我想退货"}]
)
明天想换,改一个字符串
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "你好,我想退货"}]
)
后台自动处理所有差异,解析逻辑完全不用动
answer = response.choices[0].message.content

这种差距,就像:

  • 以前换服务器要重新装机、配环境、迁移数据

  • 现在云平台点几下,镜像一克隆就完成了

三、核心思路:把差异关进黑盒

好的基础设施,就是让复杂的事情对你不可见。

你不需要知道 Claude 和 GPT 的返回结构差异,不需要关心哪家在限流,不需要为每个模型写适配器。你只需要关心:这个场景下,哪个模型效果最好?

你的项目里换一次模型要改多少代码?评论区报个数,让我看看谁最惨。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐