在一天内构建领域专属嵌入模型
摘要
本指南演示如何在一天内为RAG系统微调领域专属嵌入模型,涵盖数据生成、困难负样本挖掘、训练以及通过NVIDIA NIM进行部署。
查看缓存全文
缓存时间: 2026/05/08 09:17
在一天内构建领域特定的 Embedding 模型
来源:https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune 返回文章列表 (https://huggingface.co/blog)
- ⚙️ 环境配置 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%E2%9A%99%EF%B8%8Fsetup)
- 📚 步骤 1:从文档生成训练数据 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%93%9A-step-1-generate-training-data-from-documents) - 它是如何工作的? (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#how-does-it-work) - 输出是什么样的? (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#what-does-the-output-look-like)
- ⛏️ 步骤 2:挖掘困难负样本(以及它们为何重要) (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%E2%9B%8F%EF%B8%8F-step-2-mine-hard-negatives-and-why-they-matter) - 2a. 训练 / 验证 / 测试集划分 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#2a-train–validation–test-split) - 2b. 困难负样本挖掘 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#2b-hard-negative-mining) - 2c. 多跳展开 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#2c-multi-hop-unrolling)
- 🔍 步骤 3:理解多跳问题及其如何提升检索效果 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%94%8D-step-3-understand-multi-hop-questions-and-why-they-improve-retrieval)
- 🧠 步骤 4:微调 Embedding 模型 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%A7%A0-step-4-fine-tune-the-embedding-model) - 对比学习的工作原理 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#how-contrastive-learning-works) - 关键超参数 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#key-hyperparameters) - 检查点频率 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#checkpoint-frequency)
- 📈 步骤 5:评估改进效果 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%93%88-step-5-measure-the-improvement) - 如果指标没有提升怎么办? (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#what-if-the-numbers-dont-improve) - 🏆 实际案例:Atlassian (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%8F%86-real-world-results-atlassian)
- 🚀 步骤 6:导出与部署 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%9A%80-step-6-export-and-deploy) - 导出为 ONNX / TensorRT (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#export-to-onnx–tensorrt) - 使用 NVIDIA NIM 部署 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#deploy-with-nvidia-nim) - 验证部署精度 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#verify-deployment-accuracy)
- 整合汇总 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#putting-it-all-together) - 预期时间与资源 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#expected-time-and-resources)
- 动手尝试 (https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#try-it-yourself)
如果你正在构建 RAG(检索增强生成)系统,很可能遇到过这样的困境:一切正常……直到它不再正常。通用 embedding 模型训练于互联网数据,它们理解的是网络世界,而非你的合同、制造日志、专有化学配方或内部分类体系。它们能捕捉广泛的语义相似性,却无法理解你所在领域中至关重要的细粒度区别。当现成模型无法有效捕捉领域特定细微差别时,微调 embedding 模型可以提升检索管道的性能。尽管 embedding 对 RAG 性能至关重要,但相关流程仍然出人意料地分散,所需技能专业,时间投入也令人望而却步。
借助单张 GPU 和不足一天的训练时间,你就能将通用 embedding 模型转变为真正理解你所在领域的模型,无需人工标注。为了帮助你快速上手,我们还发布了一个即用型合成训练数据集 (https://huggingface.co/datasets/nvidia/Retrieval-Synthetic-NVDocs-v1),该数据集使用此流程从 NVIDIA 的公开文档生成。使用该数据和这套方法,我们在 Recall@10 和 NDCG@10 上均实现了超过 10% 的提升。Atlassian (https://www.atlassian.com/) 应用此方法在其 JIRA 数据集 (https://zenodo.org/records/15719919/files/2025-06-23%20ThePublicJiraDataset.zip?download=1) 上进行微调,在单张 GPU 上将 Recall@60 从 0.751 提升至 0.951,实现了 26% 的改进。
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%94%97quick-links-to-dataset-and-code 🔗 数据集与代码快捷链接:
- Embedding 模型 (https://huggingface.co/nvidia/llama-nemotron-embed-1b-v2)
- GitHub (https://github.com/NVIDIA-NeMo/Nemotron/tree/main/src/nemotron/recipes/embed)
- 基于 NVIDIA 公开文档的合成数据集 (https://huggingface.co/datasets/nvidia/Retrieval-Synthetic-NVDocs-v1)
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%A7%91%F0%9F%92%BBopen-source-projects-recipe-integrates 🧑💻 本方案集成的开源项目:
- NeMo Data Designer (https://github.com/NVIDIA-NeMo/DataDesigner) — 用于合成数据生成
- NeMo Automodel (https://github.com/NVIDIA/NeMo-Automodel) — 用于 embedding 模型训练
- BEIR (https://github.com/beir-cellar/beir) — 用于信息检索评估
- NeMo Export-Deploy (https://github.com/NVIDIA/NeMo-Export-Deploy) — 用于 ONNX/TensorRT 转换
- NVIDIA NIM (https://developer.nvidia.com/nim) — 用于生产环境推理服务
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%93%8Bprerequisites 📋 前置条件:
- 一个领域文档目录(文本文件 — .txt、.md 或类似格式)
- 有效的 NVIDIA API 密钥(在 build.nvidia.com (https://build.nvidia.com/) 免费获取)
- NVIDIA Ampere 架构或更新的 GPU,至少 80GB 显存(计算能力 (https://developer.nvidia.com/cuda-gpus) >= 8.0)
- 本教程已在 1xA100 (80GB) 和 1xH100 (80GB) 上测试通过
读完本文,你将学会:📄 从领域文档生成训练数据,无需标注数据 🎯 使用困难负样本挖掘进行有效的对比训练 🔗 利用多跳查询提升 embedding 质量 ⚙️ 微调双编码器 embedding 模型 📊 评估微调是否提升了检索效果 🚀 将微调后的模型部署到你的流程中
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%E2%9A%99%EF%B8%8Fsetup ⚙️ 环境配置
在本教程中,我们将微调基础模型 Llama-Nemotron-Embed-1B-v2 (https://huggingface.co/nvidia/llama-nemotron-embed-1b-v2) — 一个 10 亿参数的 embedding 模型,在质量和推理成本之间取得了平衡。要开始,请按照此设置指南 (https://github.com/NVIDIA-NeMo/Nemotron/blob/main/docs/nemotron/embed/README.md) 操作。
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%93%9A-step-1-generate-training-data-from-documents 📚 步骤 1:从文档生成训练数据
微调 embedding 模型需要数千个(查询,相关文档)对。大多数用例并没有现成的这类数据。手动创建成本高昂、速度缓慢,而且往往受到标注者对“相关性“个人理解的偏见影响。无需手工标注数据,你可以使用 LLM(nvidia/nemotron-3-nano-30b-a3b)阅读你的文档,自动生成高质量的合成问答对。
nemotron embed sdg -c default corpus_dir=./data/my_domain_docs
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#how-does-it-work 它是如何工作的?
在幕后,这运行一个由 NeMo Data Designer (https://github.com/NVIDIA-NeMo/DataDesigner) 驱动的四阶段合成数据生成(SDG)流程:
sdg_pipeline (https://cdn-uploads.huggingface.co/production/uploads/662a9c2154a9f1037104a075/84IMYChKX4twWnC4U6iCQ.png)
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#what-does-the-output-look-like 输出是什么样的?
源文档片段:
H100 GPU 的热设计功耗(TDP)在 SXM 形态下为 700W。冷却解决方案必须在持续工作负载下将结温维持在 83°C 以下。对于每节点超过 4 个 GPU 的密集部署,推荐使用液冷,因为风冷无法在标准 2U 机箱配置中散发足够的热量。
生成的 QA 对:
{
"question": "当每个服务器节点部署超过 4 个 H100 GPU 时,推荐采用哪种冷却方案?",
"answer": "对于每节点超过 4 个 GPU 的密集部署,推荐使用液冷,因为风冷无法在标准 2U 机箱配置中散发足够的热量。",
"query_type": "contextual",
"reasoning_type": "factual",
"question_complexity": 3,
"segment_ids": [1],
"quality_score": 8.5
}
{
"question": "H100 SXM 的 700W TDP 如何制约多 GPU 配置中风冷与液冷的选择?",
"answer": "700W 的 TDP 产生大量热量,必须散发以将结温保持在 83°C 以下。在每节点超过 4 个 GPU 的密集配置中,标准 2U 机箱内的风冷无法承受这一热负荷,使得液冷成为必要。",
"query_type": "multi_hop",
"reasoning_type": "causal",
"question_complexity": 4,
"segment_ids": [1, 2],
"hop_count": 2,
"quality_score": 9.0
}
注意其中的区别:第一个问题是简单的事实查找。第二个则需要多跳因果推理。该流程生成这两种类型的问题,复杂度级别可配置(2–5),跳数可配置(1–3)。每个 QA 对随后经过质量评估,获得相关性、准确性、上下文支持和清晰度等子评分,以及一个总体评分。只有达到阈值的配对才会被纳入训练。
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%E2%9B%8F%EF%B8%8F-step-2-mine-hard-negatives-and-why-they-matter ⛏️ 步骤 2:挖掘困难负样本(以及它们为何重要)
如果你仅用正样本对(查询 + 正确文档)训练 embedding 模型,它学会区分明显不同的文档,但在困难案例上表现不佳 — 那些看起来相关但并非正确答案的段落。在真实检索系统中,这些险些命中正是导致错误答案的文档。困难负样本挖掘找到这些令人困惑的段落,让模型学会区分它们。
nemotron embed prep -c default
上述命令自动运行三个子步骤:
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#2a-train–validation–test-split 2a. 训练 / 验证 / 测试集划分
生成的 QA 对被划分为训练集(80%)和测试集(20%)。测试集被格式化为与 BEIR (https://github.com/beir-cellar/beir) 兼容的基准,以便在步骤 5 中进行标准化评估。
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#2b-hard-negative-mining 2b. 困难负样本挖掘
使用基础 embedding 模型,该流程:
- 嵌入每个查询和语料库中的每个段落。
- 计算每个查询与所有段落之间的相似度。
- 屏蔽掉每个查询的标注正样本文档。
- 应用边界过滤:任何非正样本文档的得分高于最低正样本得分的 95% 的,将被淘汰。这个排除区防止假阴性 — 那些与正样本如此接近、实际上可能相关的未标注段落。
- 从剩余的候选中,选择得分最高的 top-k 文档作为困难负样本(默认每个查询 5 个)。
结果是:困难负样本是最相似的非正样本段落,同时安全地低于正样本得分上限。它们是当前模型认为高度相关但并非标注答案的段落。
为何有效:在简单负样本(完全不相关的段落)上训练,模型学不到新东西。在困难负样本上训练,迫使它学会领域中重要的细微区别。例如,在医学语料库中,关于“二甲双胍用于 2 型糖尿病的剂量“的问题,其困难负样本可能是“二甲双胍的副作用“或“1 型糖尿病的胰岛素剂量“ — 相似但关键不同。95% 的边界上限防止挖掘器选择过于接近正样本的段落,这些可能是 SDG 过程中未被标注的正确答案。
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#2c-multi-hop-unrolling 2c. 多跳展开
多跳问题引用多个正样本文档。例如,像*“3.2 节中的热管理系统与 5.1 节描述的功率约束有何关联?”*这样的问题有两个正样本段落。
展开为每个(查询,正样本文档)对创建一个训练样本,因此对比损失独立地看到每个正样本。一个具有 2 个正样本文档的问题变成 2 个训练样本,每个具有相同的困难负样本但不同的正样本。
最终输出是一个训练就绪的 JSON 文件:
{
"question_id": "q42_0",
"question": "How does the thermal management system in Section 3.2 relate to the power constraints described in Section 5.1?",
"pos_doc": [{"id": "Section 3.2"}],
"neg_doc": [{"id": "d_x7y8z9"}, {"id": "d_m4n5o6"}, {"id": "d_p1q2r3"}, {"id": "d_s4t5u6"}, {"id": "d_v7w8x9"}]
},
{
"question_id": "q42_1",
"question": "How does the thermal management system in Section 3.2 relate to the power constraints described in Section 5.1?",
"pos_doc": [{"id": "Section 5.1"}],
"neg_doc": [{"id": "d_x7y8z9"}, {"id": "d_m4n5o6"}, {"id": "d_p1q2r3"}, {"id": "d_s4t5u6"}, {"id": "d_v7w8x9"}]
}
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%94%8D-step-3-understand-multi-hop-questions-and-why-they-improve-retrieval 🔍 步骤 3:理解多跳问题及其如何提升检索效果
标准的 embedding 微调为每个段落生成一个问题,并训练模型将它们匹配。这适用于简单的事实查找,但真实用户会提出跨越多个文档或章节的复杂问题。如果模型只见过单跳训练数据,它将难以检索这些复杂查询的所有相关段落。
SDG 流程默认生成 1 到 3 跳的问题:
- 1 跳:“H100 SXM 的 TDP 是多少?” — 由单个段落回答。
- 2 跳:“H100 的 TDP 如何与密集部署中的冷却需求相关联?” — 需要连接两个段落的信息。
- 3 跳:“给定 TDP、冷却约束和机架密度限制,标准数据中心行中最多可部署多少个 H100 GPU?” — 综合三个段落的信息。
每跳都通过其自身的上下文摘要和段落 ID 进行跟踪,因此训练数据保留了完整的推理链。经过展开(步骤 2c)后,每个(问题,相关段落)对成为独立的训练信号,教导模型这些段落全部与多跳查询相关。
微调后的模型学会检索上下文相关的文档,而不仅仅是词汇相似的文档。
https://huggingface.co/blog/nvidia/domain-specific-embedding-finetune#%F0%9F%A7%A0-step-4-fine-tune-the-embedding-model 🧠 步骤 4:微调 Embedding 模型
相似文章
极简RAG模型:B1ade 335M嵌入模型与1B参数小型语言模型
介绍了B1ade,一种极简RAG架构,包含一个335M零训练嵌入模型和一个通过GRPO在723M tokens上训练的1B小型语言模型,展示了涌现归因行为,无需大规模预训练即可获得具有竞争力的问答性能。
Nemotron-3-Embed 1B/8B
NVIDIA 发布了 Nemotron-3-Embed 1B 和 8B 模型,这是最先进的多语言文本嵌入模型,用于检索和语义相似度,针对 RAG 系统进行了优化。
nvidia/Nemotron-3-Embed-1B-BF16
NVIDIA发布了Nemotron-3-Embed-1B-BF16,一款针对检索和语义相似度优化的多语言文本嵌入模型,在34种语言上实现了RAG系统的最优性能。
NVIDIA Nemotron 3 Embed 在RTEB整体排名第一,推动智能检索发展
NVIDIA发布Nemotron 3 Embed,这是一组开源嵌入模型,在RTEB排行榜上名列前茅,包括一个80亿参数的旗舰模型以及适用于生产规模检索的高效10亿参数变体。
Q-RAG:通过基于价值的 Embedder 训练实现长上下文多步检索
Q-RAG 引入了一种基于强化学习的 Embedder 模型微调方法,以实现高效的多步检索,并在长达 10M token 的长上下文基准测试中取得了最先进的结果。该方法为微调小型 LLM 以处理复杂的多步搜索任务提供了一种资源高效的替代方案。