很多人卡在同一个问题上:代码里写的是 OpenAI 兼容接口,手上又有一台能跑模型的机器,到底该本地还是走云端。这篇不讲谁更强,只讲怎么按你的任务去判。读完你能自己做一张对照表,判断哪些请求放本地、哪些必须走线上,以及切换时该改哪几处。
很多人卡在同一个地方:代码里写的是 OpenAI 兼容接口,手上又有一台能跑模型的机器,到底该本地还是走云端。这事没有统一答案,因为「好用」这个词本身就没定义清楚。你可能是想省钱,也可能是想数据不出内网,还可能只是想让 demo 跑起来别报错。
这篇不讲谁更强,只讲怎么按你的任务去判。看完你能自己做一张对照表,判断哪些请求放本地、哪些必须走线上,以及将来真要切换时该动哪几处代码。判断类的内容都有前提,哪种情况下不适用我会单独标出来,别照抄。
先分清:你比的其实是两个层面的东西
第一个层面是推理位置:请求到底在哪台机器上算。第二个层面是接口规范:客户端怎么调用。这两件事经常被混在一起聊,导致结论互相打架。Ollama 是本地跑模型的服务,它除了自己的接口也兼容 OpenAI 的请求格式;OpenAI 是托管服务,你拿到的只有 key 和一个 endpoint。
- 推理位置
- 模型权重跑在谁的机器上,决定了数据边界、延迟特征和成本结构
- 接口规范
- 客户端怎么发请求、怎么解析返回,这一层两者可以互换
- OpenAI 兼容
- 指请求和响应的字段结构对齐,不代表输出行为也一致
把这两层拆开以后就好办了。接口这一层,你完全可以用同一个 openai 客户端库,只改 base_url 就换后端,不必维护两套逻辑。位置这一层才是真正要做选的,改不了,只能权衡。所以结论取决于任务,不取决于工具本身。
- 先把自己的请求按敏感度分堆:能出内网的一堆,不能出内网的一堆
- 再按延迟要求分:能等几秒的一堆,必须秒回的一堆
- 再按调用量分:低频试错的一堆,高频批量的一堆
- 分完堆你基本能看出哪堆归本地、哪堆归云端,剩下的才需要纠结
什么情况下 Ollama 这边更顺手
本地跑的核心价值不是便宜,是边界可控。数据不出内网、断网能用、模型版本锁得住,这三条是托管服务给不了的。如果你的任务正好吃这三条,本地基本是默认选项。
- 数据不能出内网、不能经过第三方,比如合同、病历、内部代码库
- 调用量很大但单次请求很简单,比如批量打标签、格式清洗、文本分类,云端按量计费会越用越贵
- 需要断网可用,或者对上游服务可用性不想强依赖,比如出差、离线演示、内网 CI
- 要固定模型版本和参数做可复现实验,本地权重不会被上游悄悄换掉
还有一个容易被忽略的点:本地不等于零成本。硬件折旧、电费、以及你花在驱动和显存上的时间都要算进去。想算清楚这笔账,去 /price-watch 对照当时的云端单价,再和你自己的机器成本放一起比。
什么情况下 OpenAI 接口更省事
托管的优势是省心。模型换得勤、流量有峰谷、团队没人愿意折腾显卡驱动,这几种情况下按量付费买的是确定性。你不用半夜起来看显存有没有爆。
- 任务杂、模型换得勤,今天改文案明天写代码,托管侧一次切换比本地重新拉权重快得多
- 有明显峰值流量,本地那台机器平时闲着、忙起来排不上队,按量付费反而更省心
- 需要多模态输入、长上下文、函数调用这类能力,本地能跑的档位往往受限
- 团队里没人愿意维护显卡驱动、CUDA 版本和显存溢出问题,托管把这块运维成本直接抹掉
另外「托管」不等于「不会挂」。配额、限流、区域可用性都会影响你。上线前先压一遍并发,别等真实流量来了才发现超限会被拒。具体的限流口径以官方文档和你账号后台为准。
一张对照表:按这六项打分再决定
别靠感觉选,列六项打分。其中第一项是硬门槛,不参与权衡:数据不允许外发,后面五项写得再好也只能选本地。剩下五项按你自己的权重相加,哪边分高用哪边。
| 判断项 | 看什么 | 怎么量 |
|---|---|---|
| 数据边界 | 能不能出内网 | 硬门槛,不能出内网直接排除云端 |
| 单位成本 | 电费加折旧 对比 按量单价乘调用量 | 两边分开算,数字到 /price-watch 核对 |
| 延迟与吞吐 | 首字延迟、整体耗时 | 用 /tools/speed-test 量你自己的基线 |
| 并发与排队 | 本地看显存,云端看配额 | 两边都先压测再上线 |
| 可控性 | 版本锁定、采样参数、日志 | 本地能改权重,云端只能改请求参数 |
| 迁移成本 | 管模型拉取 对比 管 key 和账单 | 哪个人力更缺就避开哪边 |
延迟这一项特别容易被想当然。本地受显卡档位影响极大,同一台机器换个量化档位数字就变了;云端受网络和限流影响,不同时段结果也不一样。所以别抄别人的数字,用 /tools/speed-test 在你自己网络下量,量完才有讨论基础。
最省事的做法常常是混合,而不是二选一
大部分真实项目最后都不是纯粹二选一。涉密的走本地,需要强能力的走云端,两边用同一套客户端库,只在网关层路由。这样做的好处是以后换哪一边,改动都集中在配置里。
- 按路由分流:涉密和批量任务走本地,需要强能力的走云端,在网关层按请求类型打标
- 按兜底设计:默认走本地,失败或超时再回退云端,回退前先过滤掉不允许外发的内容
- 按阶段切换:开发调试用本地省额度,上线压测和正式流量按需切云端,代码里只留一个 base_url 配置项
- 统一请求协议:不管后端是谁,客户端都按同一套字段发,验收时只关注行为差异
- 第一步:定路由规则写清楚哪类请求走本地、哪类走云端,规则要落到代码里可判断的字段上,比如来源、内容标签、预估长度。不要靠人肉决定。
- 第二步:做一层网关网关负责选后端、设超时、记日志。客户端只管发请求,不知道后面是谁。这样换后端不用动业务代码。
- 第三步:加回退过滤回退前检查这条请求是否允许外发。规则写死在代码里,别留给运行时判断,否则迟早出事。
- 第四步:统一验收回归集里同时跑两个后端,比对输出格式、超时和错误码。差异记下来,别假设它们一致。
真要切换时,按这个顺序改
切换不是把 base_url 一改就完事。参数支持度、输出行为、错误码都可能不一样。顺序建议从上往下,先把连接层打通,再谈效果。乱序改的话,出了问题你不知道是哪一层引起的。
| 层次 | 改什么 | 验证方式 |
|---|---|---|
| 连接层 | base_url、key、模型名、超时 | 发一条最小请求,能拿到返回即可 |
| 参数层 | 采样参数、stop 词、最大输出长度 | 逐个确认后端是否支持,不支持的降级 |
| 行为层 | 输出格式、拒答边界 | 跑固定回归集,比对格式合规率 |
| 运维层 | 日志、错误码、显存或限流 | 看错误集中在哪类请求,决定是否拆路由 |
回归集不用很大,几十条真实请求就够,但要覆盖你线上最常见的几类。格式在不在、该拒的拒没拒、错别字多不多,这三项先看。具体怎么搭回归集,站内指南中心有对应文章,别在这篇里找。
几个容易踩的坑
下面这几条看着像常识,但实际项目里反复出现。写在这里是让你在动手前先对一遍,省得返工。
- 把「接口兼容」当成「行为一致」:同样的 prompt 在两个后端上格式合规率和拒答边界可能明显不同,必须各自验收
- 本地跑通小模型就以为大任务也行,参数规模和量化档位一变,效果和显存占用都得重算,参考 /models/deploy 的测算口径
- 只算电费不算硬件和人力,本地那台机器的折旧和调试时间经常比云端账单贵
- 把云端配额当成无限,超出以后会限流或报错,上线前先压一遍并发
- 忽略版本漂移:托管侧模型会更新,本地则要自己拉新权重,两边都需要定期复验
最后提醒一句:上面这些判断前提是你已经知道自己任务长什么样。如果连「我的请求有多长、一天多少条、允不允许外发」都还没数,先别选,去把这三件事量出来。量完答案通常会自己浮出来。
下一步把你要用的模型和后端放一起比一遍,再到价格追踪页核对当时的数字,用速度测试量自己的基线,最后看指南中心里的迁移文章。判断标准都在站内,别抄别人的结论。→常见问题
接口兼容是不是意味着代码完全不用改?
不是。客户端库能通用,但模型名、最大输出长度、采样参数支持范围、错误码格式都可能不同。切换后必须拿一批真实请求回归,重点看输出格式合规率和超时处理,不能只测一个 hello world 就上线。
小团队预算有限,是不是一律先本地?
看两点:任务难度和数据敏感度。涉密或大批量的简单任务本地更划算;需要强通用能力、需求还在频繁变的阶段,托管的试错成本更低。可以先本地跑开发和调试,正式流量按任务分流,别一上来就二选一。
本地跑得好好的,什么时候该考虑换成接口?
出现这三种信号就值得评估:请求量涨到本地机器排不上队、任务开始需要本地模型档位撑不住的能力、维护显卡和驱动的时间超过写业务的时间。转运维成本之前先算一遍调用量和单价。
混着用会不会让排查变难?
会,但可以控。关键是每个请求带上路由来源的标记,日志里能区分走后端还是本地,出错时先看是连接问题还是模型问题。回退链路要有开关,别让它默认静默生效,否则你会查不到真实的失败率。
怎么判断本地这台机器够不够用?
先量三件事:峰值并发请求数、单次请求的平均输入输出长度、可接受的等待时间。拿这三项去对照显存和量化档位的测算口径,估出能承载的并发上限,再留出余量。估不准就先压测,别按参数规模拍脑袋。