作者复盘了自己选错模型的踩坑经历,总结出一套从任务复杂度、可靠性需求、成本控制等维度出发的选型决策框架,避免只看推特热门这种随意选型。
选对 AI 模型:开源还是闭源、成本还是质量
Syed Muhammad Ali Raza
这个系列写到第九篇了,我一直在几乎所有代码示例里悄悄用同一个模型,却从来没有解释过为什么。确实该回答这个问题了——为什么是那个模型,更重要的是,对于你自己的项目,你究竟该怎么选。因为"用 Twitter 这周最火的模型"还真不是一个靠谱的策略。
这个教训我是慢慢才学到的,选错过好几次。把一个贵得要死的模型用在一个便宜得多的模型就能搞定的事情上,白白烧了好几个月的钱才反应过来。也试过为了一个其实需要托管 API 稳定性的项目去自托管开源模型,结果花在维护基础设施上的时间比真正做产品的时间还多。每一次犯错都源于没有一套真正的决策框架,只是跟着感觉走。这篇文章就是那套框架。
技术细节之前,先说一个真实案例
想想买车的道理。没有人会理智地走进一家 4S 店说"给我来一辆最好的车",因为这个问题本身就没有意义——"最好"是相对于什么而言的?
每天开车通勤二十分钟上下班的人,想要的是可靠和省钱,而不是一辆赛车。六口之家需要的是座位数和安全评级,而不是原始速度。真正需要越野的人,和每天要在狭窄城市车库停车的人,需要的是完全不同的配置。而一个真正喜欢捣鼓的技师可能会专门买一辆旧车,就因为他们能按自己的方式亲手重装发动机,用便利性换取完全的控制权。
选 AI 模型就是这个道理,只是没那么有视觉冲击力。没有哪个模型是单一意义上的"最好",只有最适合你特定组合的方案:预算、必要质量、隐私需求,以及你实际愿意承担多少基础设施工作。一个只有三个用户的创业公司 MVP,和一家每天处理数百万请求、有严格数据主权要求的大公司,正确的答案完全不同。
核心决策:闭源 API 模型 vs 开源模型
这是第一个分岔口,而且它几乎决定了之后的所有决策。
闭源模型,比如 Claude、GPT、Gemini,你只能通过 API 来访问。发一个请求,收一个响应,永远碰不到底层权重或基础设施,运营模型的公司包办一切。你是在按 token 租用智能。
开源模型,比如 Llama、Mistral、Qwen 等,模型的权重是公开可下载的,你可以在自己的硬件或自己控制的云服务器上运行,或者通过各种托管商来跑这些开源模型,而无需自己管理服务器。
两者没有绝对优劣,它们在特定的、可预测的方面各有取舍,理解这些取舍才是这件事的核心。

取舍之一:成本,这比表面看起来复杂得多
一个朴素的假设是"开源免费,闭源收费",而实际上这个说法具有相当的误导性。
闭源模型 API 成本很直接,按 token 付费,无需管理基础设施,成本随用量线性、可预测地增长,但永远不会归零,而且到了真正大规模的量级,成本会快速飙升——这正是本系列之前用一整篇文章讨论的成本问题。
开源模型运行也不是免费的,只是换了一种货币来支付——计算资源而不是 API 费用。自托管需要真正的 GPU 基础设施,无论你跑一个请求还是一千个请求,都要花真金白银,而且需要团队里有人真的懂得如何搭建和稳定运维这套东西。对于低频、偶发的使用场景,固定的基础设施成本很可能还不如直接按 token 付 API 费。对于真正高频、稳定、可预测的大流量,自托管最终可能明显更便宜,因为不用在原始计算成本之上再加一层 per-token 的溢价。
def rough_cost_comparison(monthly_requests, avg_tokens_per_request):
# closed API, pay per token, rough example pricing
closed_cost_per_million_tokens = 3.00 # varies a lot by model and provider
total_tokens = monthly_requests * avg_tokens_per_request
closed_monthly_cost = (total_tokens / 1_000_000) * closed_cost_per_million_tokens
# self hosted open source, rough fixed monthly GPU server cost
# this stays roughly the same whether you use it a little or a lot
self_hosted_monthly_cost = 600 # a reasonable ballpark for a decent GPU instance
print(f"Closed API estimated cost: ${closed_monthly_cost:.2f}/month")
print(f"Self hosted estimated cost: ${self_hosted_monthly_cost:.2f}/month")
if closed_monthly_cost > self_hosted_monthly_cost:
print("At this volume, self hosting is likely cheaper")
else:
print("At this volume, the API is likely cheaper and a lot less hassle")
# a small side project
rough_cost_comparison(monthly_requests=5000, avg_tokens_per_request=800)
print()
# a genuinely high volume product
rough_cost_comparison(monthly_requests=2_000_000, avg_tokens_per_request=800)
用真实数字跑一下,交叉点就很明显了——低用量时 API 轻松胜出,真正高持续流量时,数学才开始偏向自托管。说实话,大多数项目压根永远不会到达那个交叉点生效的用量级——在花几周搭自托管基础设施之前,诚实面对这一点是值得的。
取舍之二:质量与能力
这是闭源模型通常确实有真实、显著优势的地方,尤其是在真正困难的推理任务、复杂多步骤指令和需要细腻判断的场景上。最大的闭源模型用巨大资源专门训练,就是为了突破能力的上限。
不过开源模型也在逐步缩小差距,对于大量真实任务——分类、提取、简单的摘要、定义明确的窄范围工作——一个不错的中等规模开源模型表现和一个大得多的闭源模型已经非常接近,成本却只是零头。差距主要体现在最难的那一端:真正困难的多步推理、需要细腻判断的任务、充满歧义的工作。
这里的实践教训和本系列之前讲多智能体的那篇文章直接相关——如果你本来就在按难度路由任务,把简单任务发给便宜模型、把困难任务发给能力强的模型,那这种直觉恰好也应该引导你用开源模型专门承接简单、定义明确的那部分工作,而把真正困难的推理部分留给强大的闭源模型。
def choose_model_for_task(task_difficulty, privacy_sensitive=False):
if privacy_sensitive:
return "self-hosted-open-model" # data never leaves your infrastructure
if task_difficulty == "simple":
return "small-open-source-model" # classification, extraction, basic lookups
elif task_difficulty == "moderate":
return "small-closed-model" # good balance of cost and capability
else:
return "large-closed-model" # genuinely hard reasoning, worth the cost here
取舍之三:隐私与数据控制
对于很多真实组织来说,这个取舍会完全压过成本和质量的讨论,即使对于处理任何敏感信息的个人项目,也值得认真对待。
每一次对闭源 API 的请求都会离开你的基础设施,发送到第三方服务器。大多数有信誉的提供商都有真实、严肃的数据处理政策,但对于某些行业——医疗记录、法律文件、任何需要严格合规监管的内容——向任何第三方发送数据可能根本不被允许,不管他们的政策有多好。
自托管开源模型意味着你的数据真的永远不会离开你自己的基础设施,就是这样。如果你在一个受监管领域做产品,或者客户明确要求数据必须完全留在内部,这一个取舍就可以让整个成本和质量讨论变得毫无意义——自托管不是抽象意义上的更便宜或更好的选项,而是唯一真正被允许的选项。
取舍之四:控制与定制
闭源模型是一个你只能 prompt 但永远无法从根本上改变的 黑箱,你得到的就是提供商交付的行为,只能通过 prompt 和他们选择暴露给你的微调 API 来塑造。
开源模型给你真正完全的控制权,你可以用本系列之前微调那篇文章里的技术随意微调实际权重,如果真有野心还可以修改架构,完全离线运行,零外部依赖,而且没有任何提供商能未经警告就改变定价、废弃某个模型版本或变更行为——这种事在真实依赖闭源提供商路线图的生产系统上确实发生过。
一个真正实用的决策框架
这是我现在真正使用的检查清单,是用高昂代价学来的,希望你不必如此。

def recommend_model_approach(
monthly_volume,
task_difficulty,
privacy_sensitive,
team_has_ml_infra_experience,
need_full_customization
):
if privacy_sensitive and not team_has_ml_infra_experience:
return "Self hosted open source, but budget real time to learn the infrastructure, or use a provider that hosts open models for you without you managing servers directly"
if privacy_sensitive:
return "Self hosted open source model, your team can handle the infrastructure"
if need_full_customization:
return "Open source model, fine-tuned for your specific need"
if monthly_volume < 100_000 and not team_has_ml_infra_experience:
return "Closed API model, infrastructure overhead isn't worth it at this volume"
if monthly_volume > 1_000_000 and task_difficulty == "simple":
return "Consider self hosted open source for the high volume simple tasks specifically, keep a closed API for genuinely hard reasoning tasks"
return "Closed API model, simplest path, reassess if volume or requirements genuinely change"
recommendation = recommend_model_approach(
monthly_volume=50_000,
task_difficulty="moderate",
privacy_sensitive=False,
team_has_ml_infra_experience=False,
need_full_customization=False
)
print(recommendation)
注意看,在这个框架里"自托管开源模型"实际上很少真正胜出,除非隐私真正要求它,或者流量真的巨大。这不是偶然,它反映了大多数真实项目中决策的实际走向——API 路线是务实的默认选择,自托管是当你有具体、真实的理由时才去主动选择的例外。
为自己的特定任务真实地做基准测试
不要盲目信任一般性声誉或基准测试排行榜,它们测的是通用任务,不是你的特定任务。这和本系列之前的评估文章直接相关——用你自己的 eval 套件在几个候选模型上跑,用你的真实任务上的真实数字来做决策。
import anthropic
import time
client = anthropic.Anthropic(api_key="your-api-key-here")
def benchmark_model(model_name, test_prompts):
results = []
for prompt in test_prompts:
start = time.time()
response = client.messages.create(
model=model_name,
max_tokens=300,
messages=[{"role": "user", "content": prompt}]
)
duration = time.time() - start
results.append({
"prompt": prompt[:50],
"response": response.content[0].text,
"duration_seconds": round(duration, 2),
"output_tokens": response.usage.output_tokens
})
return results
def compare_models(model_names, test_prompts):
for model in model_names:
print(f"\n--- {model} ---")
results = benchmark_model(model, test_prompts)
avg_duration = sum(r["duration_seconds"] for r in results) / len(results)
print(f"Average response time: {avg_duration:.2f}s")
# in a real comparison, you'd also run these outputs through
# the llm_judge function from the evals article, scoring
# actual quality per model, not just speed
test_prompts = [
"Summarize the key benefits of remote work in three sentences.",
"Extract the main action items from this text: 'We need to finish the report by Friday and John will handle the client call.'"
]
compare_models(["claude-haiku-4-5", "claude-sonnet-4-6"], test_prompts)
这样你得到的是针对你具体用例的真实、特定的证据:响应时间、输出质量,结合生产那篇文章的成本追踪代码,还有真实的每次请求成本。三个在你的实际任务上测出的数字,胜过任何一般性排行榜排名来帮你做具体决策。
诚实的底线
如果你是独立开发者或小团队在做新产品,从一个扎实的闭源 API 模型开始,不用犹豫。基础设施的节省和可靠性值得你付出 per-token 的成本,直到你有一个真正具体的理由去重新考虑——真正的隐私需求、真正大规模下的真实成本问题,或者一个真正的深度定制需求,而 prompt 本身无法实现。不要因为自托管听起来更酷、听起来更像"真正的工程"就去自托管——那个直觉让我在 一个真的不需要自托管的项目上浪费了真实的时间。让一个真正的约束、而不是感觉,来推动你走向开源和自托管。
回到整个系列
整个系列的所有技术——RAG、微调、Agent、多 Agent 系统、评估、生产部署、多模态工作——全部建立在一个根本性选择之上:由哪个模型来做思考这件事。为你的特定场景把这个决策做对,整个系列的其他内容都会建立在坚实的基础之上。做错了,你就会花真实的时间和真实的金钱去对抗项目实际需要的和你最初出于习惯或炒作而选的那个之间的错配。像买车一样对待这件事——在决定之前搞清楚你真正在优化什么,而不是之后。
如果你曾经为一个真实项目做过这个选择,我真的很想听听是什么最终推动了你的决策——成本、隐私,还是完全其他的因素——那通常才是故事里最有用的部分。