Embedding 三个后端怎么选以及为什么必须统一一个入口选 embedding 模型最容易犯的错不是选错而是选完之后把if backend ...散落在业务代码的每个角落。这篇讲我在这周踩的三个坑和一个我现在觉得是硬规矩的设计。一、先把三个后端摆出来我语料是三家 LLM 平台的官方 API 文档embedding 后端也考察了三家后端模型维度单批上限额度智谱embedding-3204832免费额度已耗尽阿里百炼text-embedding-v4102410免费 100 万 token / 90 天本地bge-small——装不上torch 拉不下来先说一个容易被忽略的事实DeepSeek 不提供 embedding 接口。所以我 chat 用 DeepSeek、embedding 也顺手用 DeepSeek这条路根本不存在必须另找一家。本地bge-small是最诱人的选项——离线、免费、可控。但本机没有显卡torch从 download.pytorch.org 拉不下来DNS 失败装都装不上。本地最省事在没显卡的机器上是句空话。二、统一入口是硬要求不是洁癖最后选了百炼额度够、MRR 也最高见第五节。但真正重要的决定不是选谁是怎么把它接进代码。# 统一入口业务代码只调 embed()永远不知道后端是谁defembed(texts:list[str],backend:strbailian)-list[list[float]]:return_BACKENDS[backend](texts)# 反面教材把 if/else 散落在业务代码里ifbackendlocal:vbge.encode(q)# 1024 维elifbackendbailian:vdashscope_embed(q)# 1024 维else:vglm_embed(q)# 2048 维 ← 维度都对不上为什么这是硬要求不是好看一点因为这里藏着一个最阴的 bug库里写入用百炼、查询时用智谱代码照常跑、不报错、HTTP 200但向量维度对不上、语义空间根本不是同一个检索结果全错而且极难排查。这种 bug 不会在单元测试里冒出来只会在某个角落漏改了一处之后悄悄上线。统一入口把改后端从全局搜embed改八处变成改一处从根上消灭这个错误类别。三、换后端必须整库 查询一起重算这是统一入口之外的第二个硬规矩不同模型的向量不能混用。维度不同智谱 2048百炼 1024即使维度相同语义空间的几何也不一样——同一个词在两个模型里的向量距离和方向对不上。所以我把写入换到百炼查询还留着智谱是自欺。换后端只有一条路1. 全库重新 embedding写入端 2. 查询端同步换成同一模型 3. 重新跑一遍评测确认没退化实测一次全量重建3700 块 / 3563 向量 / 407.6 秒 / ¥0.59。因为额度是按 token 算的重建整库约 84 万 token吃掉百炼免费额度100 万/90 天的八成多。所以换后端不是免费的成本上要想清楚再动。四、批量上限要按后端分别设两个后端的单批上限不一样百炼10智谱 32。这是服务端硬校验超了就 400。写批量脚本时最容易犯的错是统一设成 32——因为智谱能到 32顺手就全用 32。结果百炼那边第 10 条之后就报 400你还以为是网络抖动。批次大小是后端的属性不是脚本的属性。我的做法是把batch_size挂在后端配置里而不是写死在循环里。五、选谁不靠感觉靠冒烟 MRR哪个模型效果好这种话靠嘴说没用。我用同一批冒烟查询8 条含跨文档综合题对两个后端做了检索质量对比后端MRR百炼 text-embedding-v40.729智谱 embedding-30.646百炼 MRR 更高加上额度还够就定了百炼。这个对比只有 8 条样本只能用来选型不能当最终指标——真正拍板检索质量的是后面 50 条 golden set 的 recall5。一个藏得最深的坑额度耗尽不是 429智谱额度耗尽时返回的错误码是1113不是大家条件反射去匹配的 429。我当时全量重建跑到第 59 批卡住日志里既没有 429 也没有明确的额度不足查了半天才发现是 1113。教训别把可用性押在一份免费额度上。免费额度是让你做原型验证的不是让生产服务依赖的。你代码里对 429 做了重试、降级、告警但额度耗尽这条错误路径根本没覆盖——因为它的错误码不在你的想象里。小结结论数字 / 事实DeepSeek 不提供 embedding必须另找后端三个候选智谱(2048/批32/额度耗尽) · 百炼(1024/批10/免费) · 本地(装不上)统一入口 embed()硬要求消灭库一个模型、查询另一个模型这类不报错的全错 bug换后端必须整库 查询一起重算不能混用全量重建成本3700 块 / 407.6s / ¥0.59 / 84 万 token百炼单批上限10超了 400冒烟选型百炼 MRR 0.729 智谱 0.646额度耗尽错误码 1113不是 429上一篇为什么我没用 LangChain。下一篇为什么 3563 条向量我用暴力全量而不是 ANN 索引。