Tiana随笔

开源权重模型选型:Qwen、DeepSeek、GLM、Kimi

· AI 与大模型

标签:#AI #开源 #大模型

开源权重模型选型:Qwen、DeepSeek、GLM、Kimi

公开调用量榜上中国模型已经占了大半席位。不是说它们全面超越了旗舰,而是“够用 + 便宜 + 拿得到权重”这个组合赢了。

2026 年的模型选型,和两年前最大的不同在于:开源权重已经不再是"退而求其次"的备选,而是很多团队默认的第一选项。我自己的博客后端、几个客户项目、以及一套内部知识库问答,背后跑的都不是闭源 API,而是本地或准本地的开源权重。但"开源"二字在今天已经严重过载,同样是开源,Qwen、DeepSeek、GLM、Kimi 这四家的定位、强项、许可证,差异大到足以让一个不做功课的团队在选型上栽跟头。

这篇文章不打算给你跑分排行榜,因为那东西过时太快,而且每家都能在对自己有利的基准上刷出好看的数字。我想谈的是更耐用的东西:这四家公开表达的定位差异、你真正该关心的几个选型维度、自托管成本到底由什么构成,以及一条"低试错成本"的选型路径。最后聊一个我现在很推崇的架构:敏感数据走本地,通用任务走云端,两套模型共生。

先泼一盆冷水:没有"最好的开源模型",只有"最适合你那摊事的开源模型"。把选型当成技术投票,往往会选出一个在别人场景里很猛、在你场景里很憋屈的东西。

四家的公开定位与谱系差异

下面我只描述公开层面广为人知的定位,不编任何精确数字,因为那些数字三个月后就变了。

Qwen(通义千问)的公开定位一直是"全尺寸、全场景、对中文和工具调用友好"。它的谱系覆盖从零点几 B 到几十 B 的密集模型,还有 MoE 版本,工具调用(function calling)和长上下文是它反复强调的强项。对想做 Agent、做中文应用、又希望模型尺寸档位齐全的团队,Qwen 是绕不开的选项。

DeepSeek 的公开叙事更偏向"以算法效率取胜"。它靠 MoE 架构和训练策略上的创新出名,公开强调推理类任务(代码、数学)上的竞争力,以及"用更低的训练成本达到接近前沿的效果"。如果你关心的是代码生成、复杂推理,DeepSeek 的谱系值得认真看,尤其是它的 MoE 模型在"参数总量大但激活参数小"上的设计,对推理成本很友好。

GLM(智谱)的公开定位偏"企业级与长文本"。它的模型在超长上下文、文档级理解上被反复宣传,许可证和企业服务生态也是它强调的差异化点。如果你的主场景是"啃长文档、做企业知识库",GLM 系是顺位的候选。

Kimi(月之暗面)的公开强项是"长上下文与 Agent 化能力",它最早以超长对话窗口出圈。在开源权重的布局上它相对 newer,但公开表达的方向是长上下文和复杂任务编排。如果你的应用天然要吃很长的输入(整本手册、大段日志),Kimi 系值得放进候选池。

选型的第一个认知陷阱,是拿"综合榜单排名"代替"场景匹配度"。榜单好不等于你的活儿它干得好。

选型维度:别只看跑分

我把选型拆成四个硬维度,按重要性排序说。

许可证限制

这是最容易被忽视、却最容易出事的一维。同样是"开源权重",许可证可能允许商用、可能要求衍生模型也开源、可能禁止某些用途、可能对大规模商用有阈值条款。我见过团队兴致冲冲把某个模型接进付费产品,上线前法务一扫许可证,发现"月活超过 X 万需单独授权",整条链路推倒重来。

我的做法是在选型第一步就拉一份许可证对照表(注意不是跑分表):是否允许商用、是否要求开源衍生、是否有规模/收入阈值、是否有使用场景黑名单。这件事三分钟能做完,但能挡掉后面三个月的坑。

部署尺寸

你的卡决定了你能跑多大。7B/8B 能在单张消费级卡上舒服地跑;14B/32B 需要更好的卡或量化;70B 以上基本要多卡或强量化。这里要和上一篇文章讲的量化联动:一个 70B 的 FP16 你跑不动,但 INT4 量化后可能在单卡上就活了,代价是精度,需要评测集兜底。

中文与代码能力倾向

四家都宣称中文强,但"强"的含义不同:有的强在通用语料覆盖,有的强在古文/方言,有的强在中文代码注释与中文技术文档生成。代码场景则要单独看,DeepSeek 系在代码上的公开声量一直很足。我的建议是:别信宣传语,用你自己的中文技术问答样例、你自己的代码仓库片段去测。

社区生态与工具链兼容

这点非常现实:一个模型再好,如果 vLLM、Ollama、llama.cpp 里对它支持滞后,你就要花大量时间自己改 tokenizer、自己对齐 chat template。Qwen 系因为生态活跃,工具链兼容通常最快;新兴模型的兼容往往要等社区追。选型时我会顺手查一下目标推理引擎的"已支持模型列表"。

自托管成本构成

很多人以为"开源=免费",这是 2026 年最贵的误解之一。开源权重不收授权费,但自托管成本由四块构成:

  • 硬件折旧:买卡或租卡的钱,按使用周期摊。
  • 电力与散热:尤其是 24x7 跑服务,电费不是小数。
  • 运维人力:模型更新、版本矩阵、监控、回滚,这些都是隐性成本。
  • 机会成本:你为了维护这套东西投入的工程时间,本可以做别的事。
def tco_monthly(
    gpu_rent_per_month: float,   # 单卡月租
    num_gpus: int,
    power_kwh_per_day: float,
    electricity_price: float,   # 每度电单价
    ops_hours_per_month: float, # 运维投入工时
    engineer_hourly: float,
) -> float:
    gpu = gpu_rent_per_month * num_gpus
    power = power_kwh_per_day * 30 * electricity_price
    ops = ops_hours_per_month * engineer_hourly
    return gpu + power + ops

# 举例:单卡 A 类卡月租 800,功耗约 0.5 度/天,运维 10 小时/月
print(tco_monthly(800, 1, 0.5, 1.0, 10, 200))   # 约 1015/月

这个估算会让你清醒:如果调用量很低,每月花一千块养一台本地卡,可能还不如直接调云端 API。自托管的甜蜜点在"调用量足够大、且数据不能出网"的交叉处。

低试错成本的选型流程

我强烈反对"先下载最大的模型,再慢慢试"的做法,那太烧钱也太慢。我给自己定的流程是"先 API 后权重,用自己评测集筛":

  • 第一步,用各家提供的云端 API(几乎每家都有开放平台)把你的真实任务跑一遍。API 成本极低,但能暴露"这个模型家族的'风格'适不适合我"。
  • 第二步,把你任务里最难的 50 到 100 条样例固化成评测集,对 API 结果打分,建立基线。
  • 第三步,只在表现进入前二的模型家族里,下载对应的开源权重做本地化验证。
  • 第四步,本地用量化把尺寸压到你的硬件能跑,再用同一评测集做回归,看掉了几点。
# 一个最小的"模型家族评分"流程骨架
from dataclasses import dataclass

@dataclass
class Candidate:
    name: str
    api_available: bool
    local_weights: bool
    license_allows_commercial: bool

def shortlist(candidates: list[Candidate], need_commercial: bool) -> list[Candidate]:
    out = []
    for c in candidates:
        if need_commercial and not c.license_allows_commercial:
            continue
        if not c.api_available:
            continue   # 先 API 快速筛选
        out.append(c)
    return out

qwen = Candidate("Qwen", True, True, True)
deepseek = Candidate("DeepSeek", True, True, True)
glm = Candidate("GLM", True, True, True)
kimi = Candidate("Kimi", True, True, True)

for c in shortlist([qwen, deepseek, glm, kimi], need_commercial=True):
    print("进入候选:", c.name)
选型的本质是"用最低成本排除错误答案"。API 是廉价的排除工具,评测集是客观的裁判,本地权重只是最后一公里的落地。

混合部署:敏感走本地,通用走云端

这是我目前最推荐的架构,尤其适合既想省钱又不想把客户数据往外送的团队。核心思路是把流量按"数据敏感性"和"任务难度"分成两个通道:

  • 本地通道:处理含 PII、合同、内部代码的请求,跑开源权重,数据不出网。这类请求通常模式固定、可预测,适合用量化后的中小模型。
  • 云端通道:处理开放的、通用的、偶发的复杂任务,直接调闭源或开源大厂的 API,不为这些请求养硬件。
def route_request(payload: dict) -> str:
    # 极简路由:含敏感字段则走本地
    sensitive_keys = {"id_card", "contract", "internal_code"}
    if sensitive_keys & set(payload.get("tags", [])):
        return "local"          # 本地开源权重
    if payload.get("complexity", 0) > 7:
        return "cloud"          # 云端强模型
    return "local"              # 简单通用也尽量本地,省 API 费

# 配置层面把两套 endpoint 分开管理
ENDPOINTS = {
    "local": "http://gpu-internal:8000/v1",
    "cloud": "https://api.provider.com/v1",
}

这套架构的好处是"鱼和熊掌的折中":你只在真正需要的时候为云端算力付费,而日常最大量的、含敏感信息的请求完全留在自己机房。它对推理栈的要求是"本地和云端尽量用兼容的接口格式"(比如都走 OpenAI 风格的 /v1/chat/completions),这样切换通道时业务代码几乎不动。

踩坑方面,我吃过的亏主要有两个。其一是"本地模型偷偷变差没人发现":混合部署后,本地通道长期没人 review 输出,某次底层框架升级把 chat template 改了,输出格式悄悄偏移,业务方两周后才反馈。后来我给本地通道也接了上一篇文章讲的评测集回归,每次模型或框架变更都自动跑分。其二是"路由规则太粗导致云端账单爆炸":早期我把"复杂度>5"就判云端,结果大量本可本地的请求跑去了云端。把阈值调到 7 并加缓存后,云端费用掉了将近六成。

另一个容易忽略的点是许可证的"传染性"在混合架构里更隐蔽:你本地用开源权重做推理通常不触发衍生开源义务,但如果你基于它做微调并分发,条款就可能收紧。我的底线是:商用前让法务过一遍许可证原文,不要只看模型首页的"可商用"三个字。

工具链兼容性:选型的隐藏成本

前面提过社区生态,这里展开说,因为它常常是压垮选型的最沉默的一根稻草。一个模型再强,如果你的推理栈不支持它的 chat template,你就要自己写适配;如果 vLLM 的已支持列表里没有它,你就享受不到连续批处理带来的吞吐提升;如果 Ollama 的官方库里没有对应的 GGUF,你就得自己转换。这些事单件都不大,但叠加起来就是"别人一天上线,你一周还在调 tokenizer"。

我常用的一个低成本预检,是在决定下载权重前,先用代码确认目标推理引擎是否认这个模型家族:

# 伪检查:确认推理栈是否原生支持目标模型
SUPPORTED = {
    "vllm": ["Qwen", "DeepSeek", "GLM", "Llama", "Mistral"],
    "ollama": ["Qwen", "DeepSeek", "GLM", "Llama", "Kimi"],
}

def engine_support(model_family: str) -> dict:
    return {eng: (model_family in fams) for eng, fams in SUPPORTED.items()}

print(engine_support("Qwen"))     # 通常全绿
# 若返回某个引擎为 False,就意味着你要多花时间自己接,选型时要扣分

chat template 是另一个重灾区。不同家族的对话模板(system/user/assistant 的拼接方式)不一样,FastAPI 后端如果写死了某一种格式,换模型就会输出乱码或把指令当正文。我的解法是把"模型名 -> chat template 函数"做成配置表,切换模型只改配置,不碰业务代码。这层抽象看似多余,却是混合部署能 scalable 的前提。

微调与量化的联动

如果你的场景需要微调(比如让模型学会你们公司的内部术语),有一个顺序铁律:先在全精度上微调,再量化;绝不要在已经量化的模型上微调。量化的权重是整数网格上的近似,在它上面做梯度更新,误差会被锁死甚至放大,效果往往不如直接用原始权重微调后一次性量化。

# 正确的顺序:全精度微调 -> 量化 -> 评测回归
# 1) 全精度 SFT(伪代码)
# trainer = SFTTrainer(model="Qwen2.5-7B", data=train_data, precision="fp16")
# trainer.train()

# 2) 微调完再量化(用 auto-gptq / auto-awq 工具)
# from awq import AutoAWQForCausalLM
# awq_model.quantize(calib_loader, w_bit=4)

# 3) 用自建评测集回归,确认微调+量化后没掉点
# score = run_eval(quantized_model_fn, "eval_set.json")

还有一个常见误判:以为"蒸馏出来的小模型不需要量化"。其实蒸馏解决的是"能力迁移",量化解决的是"部署体积",二者正交。学生模型上线前同样要过量化 + 评测这关。我见过把 1.5B 蒸馏模型直接 FP16 部署、结果单卡显存吃紧的案例,最后还是量化到 INT8 才舒服,蒸馏救了能力,量化救了成本,缺一不可。

一个真实的选型案例

说个我经手过的例子,让上面的框架落地。客户要做"中文合同风险审查",数据含大量敏感条款,不能出网;同时他们还有一块"公开 FAQ 机器人",流量波动大。

按框架走:先拉许可证,确认能商用;再用 API 把 80 条难例(嵌套条款、模糊责任划分)跑一轮,Qwen 和 GLM 进前二;下载两者开源权重本地验证,GLM 在超长合同上的得分略高,定为本地主力;用量化压到 INT8 塞进单卡;FAQ 机器人则直接走云端 API,因为流量稀疏、且不含敏感数据。路由按"是否含合同标签"分流。

结果:本地通道每月硬件加运维约一千出头,云端 FAQ 按量计费每月几十块,整体比"全量上云端大模型"省了将近七成,而合同审查的评测分数只比 FP16 低 0.5 个点,业务方无感。这个案例里没有"赢家模型",只有"每个通道选对了工具"。

选型的成熟标志,是从"选一个最强的"变成"为每个通道选最合适的"。混合架构的精髓,是用路由把异质需求拆开,再各自用最低成本满足。

常见选型误区

复盘我自己和身边团队踩过的坑,有几个误区反复出现,值得单列一节。

第一个误区是"开源=不要钱=随便用"。前面讲过自托管成本,这里补一个法律维度的盲区:很多团队只看模型主页写着"可商用"就放心接进产品,却没读许可证原文里的规模阈值、衍生义务、或特定领域禁令。我养成一个习惯,商用前让法务或自己逐字读许可证的"Permissions / Limitations / Conditions"三段,而不是信任何二手摘要。许可证是合同,不是宣传语。

第二个误区是"参数量越大越好"。在自托管场景里,一个 70B 的模型即便量化后,对显存和延迟的压力也远超 7B,而你的任务可能 7B 加好评测集就已经够用。我建议的尺子是"任务难度"而非"模型名气":能解决你难例评测集的最小模型,才是成本最优解。大模型的边际质量提升,往往抵不过它带来的边际成本。

第三个误区是"一次性选定,长期不动"。模型生态半年一变,今天的最优解六个月后可能出了更强或更便宜的同档位模型。我的做法是把选型结论写成"带版本号的决策记录":当时为什么选它、评测集分数多少、什么条件下应该重新评估。当新模型发布或业务变化时,这份记录就是重新决策的触发器,而不是每次都从零开始。

第四个误区是"混合部署太复杂不值得"。恰恰相反,对大多数既有敏感数据又有通用需求的团队,混合架构是性价比最高的。它不是技术炫技,而是把"合规"和"成本"两个硬约束同时落地的最自然方式。我见过完全本地化导致 GPU 账单爆炸的,也见过完全云端导致数据合规出问题的,混合架构正是为了避开这两个极端。

# 一个"决策是否该重新评估选型"的触发器
def should_reevaluate(
    last_review_months: int,
    new_model_in_family: bool,
    business_changed: bool,
) -> bool:
    if last_review_months >= 6:
        return True
    if new_model_in_family:
        return True
    if business_changed:
        return True
    return False

# 每月定时跑一次,命中就触发重新走选型流程
if should_reevaluate(7, True, False):
    print("该重新评估模型选型了")
选型的终点不是"选完",而是"建立一条能反复走的流程"。模型会老,流程不会;流程在,你就不怕任何新模型发布。

许可证细节:别只看"可商用"三个字

这部分值得再单独敲一笔,因为它是四个模型家族差异里最容易被一句话带过、却最可能让项目翻车的地方。公开层面,四家都提供"可商用"的权重版本,但"可商用"三个字背后的细则天差地别,我尽量只描述公开常识、不编具体条款数字。

首先是"衍生义务"的差异。某些许可证要求:如果你基于该权重做微调并对外分发(尤其是作为服务的一部分),需要公开你的改动或声明。对纯推理型服务(你只是调用,不分发权重),这通常不触发;但一旦你要做微调模型分发、或把模型嵌进要交付给客户的软件里,条款就收紧了。很多团队在"我们只是内部用"阶段一切正常,等到"要把能力打包给客户"时才发现许可证不支持,届时架构已经定型,改起来极痛。

其次是规模或收入阈值。部分开源权重对"达到某一用量/收入量级"设有需单独授权的条款。这对初创尤其重要:你现在月活一万没问题,但产品爆发后触线,可能面临补授权或替换模型的两难。我的做法是把"预计半年后的规模"也纳入选型考量,而不是只看当下的合规状态。

再次是"使用场景黑名单"。许可证通常会排除某些用途(比如某些高风险决策、特定受监管领域)。如果你做的是金融、医疗、法律这类强监管场景,务必逐条核对,别默认"开源就能用"。我见过法律科技团队兴冲冲接了某模型,结果发现许可证明确排除"法律意见生成"类用途,被迫回退到闭源 API。

# 一个许可证风险自检的极简清单(人工确认后填值)
LICENSE_CHECKS = {
    "commercial_allowed": True,     # 是否允许商用
    "derivative_must_open": False,  # 衍生是否须开源
    "scale_threshold": None,        # 规模/收入阈值(无则 None)
    "forbidden_domains": [],        # 禁用领域列表
}

def license_risk(checks: dict, plan: dict) -> str:
    if not checks["commercial_allowed"]:
        return "高风险:不可商用"
    if plan["will_distribute_weights"] and checks["derivative_must_open"]:
        return "中风险:分发需开源衍生"
    if checks["scale_threshold"] and plan["expected_scale"] > checks["scale_threshold"]:
        return "中风险:将触规模阈值"
    if plan["domain"] in checks["forbidden_domains"]:
        return "高风险:领域禁用"
    return "低风险:可推进"
许可证不是法务部门的事,是选型的第一道过滤器。把它放在跑分之前,能帮你用最低成本排除一批"根本不能用"的候选,而不是在投入后才发现。

我的实际操作清单

把上面所有东西收敛成一张我每次选型都会过的清单,供你抄作业:

  • 拉许可证对照,确认商用、规模阈值、衍生义务三件事。
  • 用各家 API 把真实任务跑一轮,建 50-100 条难例评测集。
  • 只在 API 表现前二的家族里下载开源权重,用评测集做本地回归。
  • 按硬件尺寸决定量化档位,INT8 通常是最稳的起步。
  • 设计本地/云端路由,敏感与高频走本地,复杂偶发走云端。
  • 给本地通道也接自动化评测回归,防止"静默退化"。

补充一个常被问到的实操细节:四家里 Qwen 和 DeepSeek 的 MoE 架构模型,在"总参数大但激活参数小"的设计上尤其适合自托管推理,你下载的权重文件可能很大,但每次推理只激活其中一部分,显存占用和延迟更接近小模型。这一点在评估"部署尺寸"维度时要特别留意:别被总参数量吓退,要看激活参数量和推理引擎对该 MoE 的支持成熟度。

回到最开始的话:2026 年开源权重已经足够强,强到"该不该用"不再是问题,"用哪一个、怎么用得不亏"才是真问题。把选型从信仰变成流程,从跑分变成评测集,从一次性决策变成带回归的持续运营,你的模型栈才会既便宜又靠谱。这也是我做技术这几年越来越确信的一件事,真正的工程能力,不在于追最新最猛的模型,而在于让一个够用的模型,稳定、可观测、可负担地跑在生产里。

相关文章