Embedding 模型选择与领域适配
Embedding 模型选择与领域适配Embedding 模型决定了向量的质量直接影响检索准不准。中文场景选什么模型好垂直领域法律、医疗、技术通用模型效果差怎么办这篇讲主流 Embedding 模型对比、选型方法、以及领域适配的技巧。大家好我是黒漂技术佬。RAG 检索准不准Embedding 模型是核心因素之一。同样的文本不同模型转出来的向量检索效果差很多。尤其是中文场景直接用英文模型效果一般垂直领域法律、医疗、技术文档通用模型又不够专业。这篇讲主流 Embedding 模型怎么选、中文场景哪些好用、垂直领域怎么优化。一、Embedding 是什么直观理解把一段文本变成一串数字向量语义相近的文本向量距离就近。怎么退货 → [0.12, -0.34, 0.56, ...] 退换货流程 → [0.15, -0.31, 0.52, ...] ← 距离近语义像 产品价格 → [-0.22, 0.45, -0.18, ...] ← 距离远语义不同衡量标准语义相似度意思一样的文本向量距离近多语言支持中英文都能用向量维度维度越高信息越多但越慢推理速度生成向量的快慢影响建库和检索速度二、主流 Embedding 模型对比闭源 API 类模型厂商维度中文效果特点text-embedding-3-smallOpenAI1536一般便宜通用text-embedding-3-largeOpenAI3072较好贵效果好通义千问 embedding阿里1536好中文优化便宜文心一言 embedding百度1024较好中文场景智谱 embedding智谱AI1024较好中文支持开源模型中文友好模型维度中文效果速度特点bge-large-zh-v1.51024很好中中文标杆BAAI出品bge-base-zh-v1.5768好快平衡之选推荐bge-small-zh-v1.5512较好很快轻量速度优先m3e-large1024很好中多任务训练中文强m3e-base768好快平衡text2vec-large-chinese1024较好中老牌中文模型gte-large-zh1024很好中阿里通义实验室开源多语言模型模型维度多语言特点bge-m31024100语言多语言强支持长文本multilingual-e5-large1024多语言微软出品all-MiniLM-L6-v2384英文为主极快英文场景怎么选中文为主效果优先bge-large-zh-v1.5或m3e-large中文 MTEB 榜单前列效果好中文为主平衡速度和效果bge-base-zh-v1.5768 维我最常用的大部分场景够用速度也不错速度优先、数据量大bge-small-zh-v1.5512 维速度快省内存百万级数据友好中英混合bge-m3多语言效果都不错不想自己部署通义千问 embedding API中文好价格便宜调用方便 我的经验企业中文知识库bge-base-zh-v1.5 是甜点效果和速度平衡得很好。要求高就上 large数据量大就用 small。三、Embedding 模型的关键参数1. 向量维度384/512 维轻量速度快适合大数据量768 维平衡最常用1024/1536 维高精度效果好但慢维度不是越高越好768 和 1024 在很多场景差距不大但速度差不少。2. 最大输入长度每个模型有最大 token 限制一般 512 tokens约 300-400 汉字长文本模型1024、2048、8192分块大小不能超过模型的最大长度不然截断了效果差。3. 指令Instructionbge 系列支持加指令查询时加一句提示效果更好为这个句子生成表示以用于检索相关文章用户的问题检索时给 query 加 instruction文档不用加。4. 归一化向量归一化后余弦相似度和点积等价点积计算更快。一般使用时建议归一化。四、垂直领域效果差怎么办通用模型在专业领域法律、医疗、金融、技术效果往往一般因为训练数据里专业内容少。优化方法方法 1领域微调Fine-tuning拿领域内的文本对相似/不相似继续训练 Embedding 模型。需要的数据正样本对语义相似的句子对负样本对语义不同的句子对效果领域内检索效果提升明显涨 5-15 个点很正常。成本需要标注数据训练成本中等。方法 2领域预训练用领域内的大量无标注文本继续预训练。效果更好但成本高数据量要求大。一般项目不建议做投入太大。方法 3微调不行就换模型有些模型天生在某些领域表现好。比如法律场景试试法律领域训练的 embedding医疗场景试试医疗领域模型方法 4后处理补救检索效果不够后面加重排序Rerank来补。下一篇会讲。什么时候需要微调通用模型的召回率达不到要求有足够的领域数据几千对以上对检索精度要求高如果通用模型 混合检索 重排序已经够用就不用折腾微调。五、微调 Embedding 的方法数据准备1. 监督数据有标注相似句对(句子A, 句子B, 1) ← 相似 (句子A, 句子C, 0) ← 不相似2. 弱监督数据自动构造没有标注的话从文档里自动构造同一段落的句子 → 正样本不同文档的句子 → 负样本困难负样本更好训练框架推荐sentence-transformers微调很方便fromsentence_transformersimportSentenceTransformer,losses,InputExamplefromtorch.utils.dataimportDataLoader modelSentenceTransformer(bge-base-zh-v1.5)# 构造训练数据train_examples[InputExample(texts[怎么退货,退换货流程],label1.0),InputExample(texts[怎么退货,产品价格],label0.0),# ... 更多样本]train_dataloaderDataLoader(train_examples,shuffleTrue,batch_size32)train_losslosses.CosineSimilarityLoss(model)# 微调model.fit(train_objectives[(train_dataloader,train_loss)],epochs3,warmup_steps100,output_path./finetuned_model)困难负样本挖掘普通负样本太简单模型学不到东西。困难负样本看起来像但实际不同训练效果更好。做法先用通用模型检索Top 10 里不是正确答案的作为困难负样本加入训练数据再微调一轮一轮迭代效果逐步提升。六、模型效果怎么评估不能凭感觉选模型要量化评估。评估指标RecallKTop K 检索结果里有多少比例包含了正确答案。Recall5 相关文档出现在前5个的次数 / 总查询数RAG 里最重要的指标因为检索到了大模型才能答对。MRR平均倒数排名正确答案排在第几位。排第一得分最高越靠后得分越低。更看重排序质量的时候用。NDCG考虑排序位置的综合指标。评估数据集自己构造一个测试集100-1000 个问题每个问题标注对应的正确文档覆盖各种场景和类别评估流程准备测试集问题 正确文档 ID每个问题生成 query 向量检索 Top K计算 RecallK、MRR对比不同模型的结果不要只看榜单MTEB 榜单上的分数是通用基准不一定在你的领域表现好。一定要在自己的数据集上测。七、部署与性能优化部署方式API 服务用 sentence-transformers FastAPI 封装或者用 vLLM、Text Embeddings Inference 等推理框架适合生产环境支持并发本地库调用直接 import sentence-transformers适合离线建索引、小数据量性能优化1. 批量处理建索引的时候批量 embedding比一条条快很多。embeddingsmodel.encode(texts,batch_size64,show_progress_barTrue)2. GPU 加速有 GPU 的话速度快 10-100 倍。数据量大建议上 GPU 建库。3. 量化模型量化INT8速度更快内存更少精度损失小。4. 缓存相同文本的 embedding 缓存起来不用重复算。速度参考大概模型CPU 速度GPU 速度bge-small~500 条/秒~10000 条/秒bge-base~200 条/秒~5000 条/秒bge-large~80 条/秒~2000 条/秒十万条数据GPU 建库几分钟CPU 可能要几十分钟。八、实际案例企业技术知识库场景中文技术文档、产品手册、FAQ约 30 万条选型过程先试了 OpenAI text-embedding-ada-002中文效果一般还贵试了 bge-base-zh-v1.5中文效果明显更好又试了 m3e-base和 bge 差不多选了 bge生态更好用技术领域数据微调了一版召回率再涨 6%最终bge-base-zh-v1.5 领域微调Recall5从 82% → 88%微调后速度GPU 建库半小时查询毫秒级选型建议先上 bge-base-zh-v1.5中文通用场景的基线测一下你的数据上 RecallK 够不够不够的话先换 large 试试 → 再加重排序 → 最后考虑微调微调成本高但提升也明显精度要求高值得做九、常见误区误区 1维度越高越好1536 维不一定比 768 维好多少但速度慢一倍存储多一倍。先试 768不够再升。误区 2只看 MTEB 榜单通用榜单高分不代表你的领域高分。一定要在自己的测试集上评估。误区 3上来就微调微调是大招成本高。先把分块、检索策略、重排序这些优化了还不够再微调。误区 4query 和文档用不同模型query embedding 和 doc embedding 必须用同一个模型不然向量空间不一样距离没意义。误区 5长文本直接 embedding超过模型最大长度的文本会被截断后面的信息丢了。分块要控制在最大长度内。十、本篇小结Embedding 模型决定检索质量是 RAG 的核心组件中文场景首选 bge 系列base 版本平衡速度和效果垂直领域效果差可以微调困难负样本效果好评估用 RecallK自己的测试集上测别只看榜单优化顺序选对模型 → 优化分块 → 混合检索 → 重排序 → 微调部署注意批量处理、GPU 加速、缓存提升建库速度下一篇讲检索策略优化混合检索、重排序、查询改写进一步提升召回率。我是黒漂技术佬。