
RAG 模型的“灵魂伴侣”:如何挑选最适合的嵌入方法? 原创
在当今信息爆炸的时代,如何从海量数据中快速、准确地获取所需信息,成为了一个亟待解决的问题。而 Retrieval-Augmented Generation(RAG)模型的出现,就像为信息检索和生成插上了翅膀。它就像一位记者,在撰写报道时不仅依赖记忆,还会深入档案库查找资料、核实事实,从而让内容更加准确、有说服力。而在这个过程中,选择合适的嵌入方法(embedding)就如同为记者配备了强大的“搜索引擎”,能够帮助模型更高效地检索和排序相关信息。今天,就让我们一起深入探讨如何为 RAG 模型挑选出最合适的嵌入方法,让模型的输出更加精准、高效!
一、选择合适文本嵌入模型的关键参数
RAG 模型对文本嵌入的质量有着极高的要求。文本嵌入的作用是将文本转换为数值向量,让模型能够对文本数据进行处理和比较。一个优质的嵌入模型可以显著提升检索的准确性、响应的相关性以及系统的整体性能。那么,在众多的嵌入模型中,我们该如何做出选择呢?以下这些关键参数将帮助我们做出明智的决策。
(一)上下文窗口(Context Window)
上下文窗口是指模型在一次输入中能够处理的最大标记(单词或子词)数量。例如,如果一个模型的上下文窗口为 512 个标记,那么它一次只能处理 512 个标记的内容。如果文本更长,就需要将其截断或分割成更小的片段。有些嵌入模型,比如 OpenAI 的 text-embedding-ada-002(支持 8192 个标记)和 Cohere 的嵌入模型(支持 4096 个标记),拥有更长的上下文窗口,这使得它们在处理 RAG 应用中的长篇文档时表现出色。
为什么它很重要?
- 更宽的上下文窗口可以让模型处理更长的文档或文本字符串,而不会被截断。
- 对于像语义搜索长文本(例如科学论文)这样的操作,需要较大的上下文窗口(例如 8192 个标记)。
(二)标记化单元(Tokenization Unit)
标记化是将文本分解成模型可以处理的更小单元(标记)的过程。标记化单元指的是用于将文本分割成标记的方法。
常见的标记化方法如下:
- 子词标记化(Subword Tokenization,例如字节对编码 BPE):它将单词分割成更小的子词单元,例如将“unhappiness”分割成“un”和“happiness”。这种方法可以有效处理罕见或词汇表外的单词,提高文本表示的鲁棒性。
- WordPiece:这种方法与字节对编码类似,但针对像 BERT 这样的模型进行了优化。它根据频率将单词分割成更小的单元,确保高效的标记化和更好的罕见词处理能力。
- 单词级标记化(Word-Level Tokenization):它将文本分割成单独的单词,对于处理罕见词或大词汇表的效率较低,因为它缺乏子词分割。
为什么它很重要?
- 标记化技术会影响模型处理文本的质量,尤其是对于不常见的或特定领域的单词。
- 当代大多数模型倾向于使用子词标记化,因为它既能满足词汇表大小的需求,又能保持灵活性。
(三)维度(Dimensionality)
维度指的是模型生成的嵌入向量的大小。例如,一个具有 768 维嵌入的模型会为每个输入文本输出一个包含 768 个数字的向量。
为什么它很重要?
- 更高维度的嵌入可以捕捉更细微的语义信息,但需要更多的计算资源。
- 更低维度的嵌入速度更快、效率更高,但可能会丢失一些语义丰富性。
- 例如,OpenAI 的 text-embedding-3-large 生成 3072 维的嵌入,而 Jina Embeddings v3 生成 1024 维的嵌入。
(四)词汇表大小(Vocabulary Size)
词汇表大小是指分词器能够识别的独特标记(单词或子词)的数量。
为什么它很重要?
- 更大的词汇表大小可以让模型处理更广泛的单词和语言,但会增加内存使用量。
- 更小的词汇表大小更高效,但可能难以处理罕见的或特定领域的术语。
- 例如,大多数现代模型(如 BERT、OpenAI)的词汇表大小为 30000-50000 个标记。
(五)训练数据(Training Data)
训练数据是指用于训练模型的数据集。它决定了模型的知识和能力。
不同类型的训练数据如下:
- 通用数据(General-Purpose Data):这些模型在多种数据源上进行训练,例如网页、书籍和维基百科。它们在广泛的任务中表现出色,如语义搜索和文本分类。
- 特定领域数据(Domain-Specific Data):这些模型基于特定领域的数据集构建,例如法律文件、生物医学文本或科学论文。它们在特定应用中表现更好。
为什么它很重要?
- 训练数据的质量和多样性会影响模型的性能。
- 特定领域的模型(例如 LegalBERT、BioBERT)在特定任务中表现更好,但在通用任务中可能会遇到困难。
(六)成本(Cost)
成本指的是使用嵌入模型所需的财务和计算资源,包括与基础设施、API 使用和硬件加速相关的费用。
模型分为以下两种类型:
- 基于 API 的模型(API-Based Models):像 OpenAI、Cohere 和 Gemini 这样的按使用付费服务,根据 API 调用和输入/输出大小收费。
- 开源模型(Open-Source Models):免费使用,但需要计算资源(如 GPU 或 TPU)进行训练或推理,并且如果自行托管,可能会产生基础设施成本。
为什么它很重要?
- 基于 API 的模型使用方便,但对于大规模应用可能会变得昂贵。
- 开源模型具有成本效益,但需要技术专长和基础设施。
(七)质量(MTEB 分数)
MTEB(大规模文本嵌入基准)分数衡量嵌入模型在广泛任务中的性能,包括语义搜索、分类和聚类。
为什么它很重要?
- 更高的 MTEB 分数表示更好的整体性能。
- MTEB 分数较高的模型更有可能在你的特定任务中表现良好。
- 例如,OpenAI 的 text-embedding-3-large 的 MTEB 分数约为 64.6,而 Jina Embeddings v3 的分数约为 59.5。
二、构建 RAG 模型的热门文本嵌入
现在,让我们来了解一下构建 RAG 系统的热门文本嵌入模型。以下是一些常见的模型及其关键参数对比:
模型名称 | 上下文窗口 | 每百万标记成本 | MTEB 分数 | 词汇表大小 | 标记化单元 | 维度 | 训练数据 |
OpenAI text-embedding-ada-002 | 8192 个标记 | 0.10 美元 | 约 61.0 | 未公开 | 子词(BPE) | 1536 | 未公开 |
NVIDIA NV-Embed-v2 | 32768 个标记 | 开源 | 72.31 | 50000+ | 子词(BPE) | 4096 | 硬负样本挖掘、合成数据生成、公开数据集 |
OpenAI text-embedding-3-large | 8192 个标记 | 0.13 美元 | 约 64.6 | 未公开 | 子词(BPE) | 3072 | 未公开 |
OpenAI text-embedding-3-small | 8192 个标记 | 0.02 美元 | 约 62.3 | 50257 | 子词(BPE) | 1536 | 未公开 |
Gemini text-embedding-004 | 2048 个标记 | 不适用 | 约 60.8 | 50000+ | 子词(BPE) | 768 | 未公开 |
Jina Embeddings v3 | 8192 个标记 | 开源 | 约 59.5 | 50000+ | 子词(BPE) | 1024 | 大规模网络数据、书籍等 |
Cohere embed-english-v3.0 | 512 个标记 | 0.10 美元 | 约 64.5 | 50000+ | 子词(BPE) | 1024 | 大规模网络数据、书籍等 |
voyage-3-large | 32000 个标记 | 0.06 美元 | 约 60.5 | 50000+ | 子词(BPE) | 2048 | 多领域数据集,包括大规模网络数据、书籍等 |
voyage-3-lite | 32000 个标记 | 0.02 美元 | 约 59.0 | 50000+ | 子词(BPE) | 512 | 多领域数据集,包括大规模网络数据、书籍等 |
Stella 400M v5 | 512 个标记 | 开源 | 约 58.5 | 50000+ | 子词(BPE) | 1024 | 大规模网络数据、书籍等 |
Stella 1.5B v5 | 512 个标记 | 开源 | 约 59.8 | 50000+ | 子词(BPE) | 1024 | 大规模网络数据、书籍等 |
ModernBERT Embed Base | 512 个标记 | 开源 | 约 57.5 | 30000 | WordPiece | 768 | 大规模网络数据、书籍等 |
ModernBERT Embed Large | 512 个标记 | 开源 | 约 58.2 | 30000 | WordPiece | 1024 | 大规模网络数据、书籍等 |
BAAI/bge-base-en-v1.5 | 512 个标记 | 开源 | 约 60.0 | 30000 | WordPiece | 768 | 大规模网络数据、书籍等 |
law-ai/LegalBERT | 512 个标记 | 开源 | 约 55.0 | 30000 | WordPiece | 768 | 法律文件、案例法等 |
GanjinZero/biobert-base | 512 个标记 | 开源 | 约 54.5 | 30000 | WordPiece | 768 | 生物医学和临床文本 |
allenai/specter | 512 个标记 | 开源 | 约 56.0 | 30000 | WordPiece | 768 | 科学论文和引文图 |
m3e-base | 512 个标记 | 开源 | 约 57.0 | 30000 | WordPiece | 768 | 中英文文本 |
三、如何选择嵌入方法:案例研究
接下来,我们将通过一个具体的案例来展示如何根据需求选择合适的嵌入模型。假设我们需要为一个基于文本的检索系统选择最佳的嵌入模型,该系统将在一个包含大量科学论文的大型数据集上执行语义搜索。这个系统必须能够处理长篇文档(2000 到 8000 个单词),并且要实现高准确率的检索,通过强大的大规模文本嵌入基准(MTEB)分数来衡量,以确保搜索结果具有意义和相关性。同时,它还需要在成本效益和可扩展性方面表现出色,每月预算在 300 到 500 美元之间。
(一)特定领域需求
科学论文中充满了技术术语和复杂的语言,因此需要一个在学术、科学或技术文本上训练过的模型。因此,我们需要排除那些主要针对法律或生物医学领域定制的模型,因为它们可能无法有效地推广到更广泛的科学文献中。
被排除的模型:
- law-ai/LegalBERT(专门处理法律文本)
- GanjinZero/biobert-base(专注于生物医学文本)
(二)上下文窗口大小
一篇典型的科研论文包含 2000 到 8000 个单词,这相当于 2660 到 10640 个标记(假设每 1.33 个标记对应一个单词)。将系统的容量设置为 8192 个标记,可以处理长达约 6156 个单词的论文(8192 ÷ 1.33)。这将涵盖大多数研究论文,无需截断,能够捕捉研究论文的完整上下文,包括摘要、引言、方法、结果和结论。
对于我们的用例来说,上下文窗口小于或等于 512 个标记的模型是不足够的。因此,我们需要排除上下文窗口为 512 个标记或更小的模型。
被排除的模型:
- Stella 400M v5(512 个标记)
- Stella 1.5B v5(512 个标记)
- ModernBERT Embed Base(512 个标记)
- ModernBERT Embed Large(512 个标记)
- BAAI/bge-base-en-v1.5(512 个标记)
- allenai/specter(512 个标记)
- m3e-base(512 个标记)
(三)成本与托管偏好
考虑到每月 300 到 500 美元的预算,并且更倾向于自行托管以避免重复的 API 费用,我们需要评估每个模型的成本效益。让我们来看看剩下列表中的模型。
OpenAI 模型:
- text-embedding-3-large:每 1000 个标记收费 0.13 美元
- text-embedding-3-small:每 1000 个标记收费 0.02 美元
Jina Embeddings v3:
开源且可以自行托管,消除了按标记收费的成本。
成本分析:假设平均每篇文档有 8000 个标记,每月处理 10000 篇文档,那么上述嵌入的成本如下:
- OpenAI text-embedding-3-large:
- 8000 个标记/文档 × 10000 篇文档 = 80000000 个标记
- 80000 × 0.13 = 10400 美元(超出预算)
- OpenAI text-embedding-3-small:
- 80000 × 0.02 = 1600 美元(超出预算)
- Jina Embeddings v3:
- 没有按标记收费,只有基础设施费用。
被排除的模型(超出预算):
- OpenAI text-embedding-3-large
- OpenAI text-embedding-3-small
(四)基于 MTEB 分数的最终评估
大规模文本嵌入基准(MTEB)会在各种任务中评估嵌入模型,提供一个全面的性能指标。
性能洞察:
让我们比较一下剩下几个模型的性能。
- Jina Embeddings v3:
- 在 MTEB 框架内的英语任务中,其表现优于 OpenAI 的专有嵌入。
- Voyage-3-large:
- MTEB 分数约为 60.5,具有 32000 个标记的上下文窗口,使其适合长文档检索,并且成本效益高。
- NVIDIA NV-Embed-v2:
- MTEB 分数达到 72.31,显著优于许多其他选择。
- 32768 个标记的上下文窗口使其非常适合长文档。
- 自行托管且开源,消除了按标记 API 成本。
(五)做出最终决定
现在,让我们综合评估这些模型的各个方面,做出最终选择。
- NVIDIA NV-Embed-v2:推荐选择,因为它具有较高的 MTEB 分数(72.31)、长上下文窗口(32768 个标记)以及自行托管的能力。
- Jina Embeddings v3:一个具有成本效益的替代方案,没有 API 成本,并且性能具有竞争力。
- Voyage-3-large:一个预算友好的选择,具有较大的上下文窗口(32000 个标记),但 MTEB 分数略低。
如果对基础设施成本有顾虑,Jina Embeddings v3 和 Voyage-3-large 是不错的选择。但如果追求高性能、成本效益和长上下文的语义搜索,NVIDIA NV-Embed-v2 是科学论文检索系统中的最佳选择。
四、进阶技巧:微调嵌入模型
微调嵌入模型并不总是必要的。在许多情况下,现成的模型已经足够好。然而,如果你需要为特定数据集优化结果,微调可能会帮助你榨取出最后一点性能提升。当然,微调会带来大量的计算成本和费用,这需要谨慎考虑。
如何微调嵌入模型
- 收集特定领域的数据:整理与你的应用相关的数据集。例如,如果你的任务涉及法律文件,就收集案例法和法律文本。
- 预处理数据:清理、分词并格式化文本,确保在训练前保持一致性。
- 选择基础模型:选择一个与你的领域最接近的预训练嵌入模型(例如,SBERT 适用于基于文本的应用)。
- 使用对比学习进行训练:使用监督对比学习或三元组损失技术,根据语义相似性细化嵌入。
- 评估性能:将微调后的嵌入与原始模型进行比较,确保检索准确性有所提高。
五、总结
为你的检索增强生成(RAG)模型选择合适的嵌入方法,是实现有效、准确检索相关文档的重要过程。这个决策基于多种因素,如数据模态、检索复杂性、计算能力和可用预算。虽然基于 API 的模型通常提供高质量的嵌入,但开源替代方案为自行托管的解决方案提供了更大的灵活性和成本效益。
通过仔细评估嵌入模型的上下文窗口大小、语义搜索能力和基准性能,你可以为你的特定用例优化 RAG 系统。此外,微调嵌入可以在特定领域应用中进一步提升性能,但这需要仔细考虑计算成本。最终,一个精心选择的嵌入模型为有效的 RAG 流程奠定了基础,提高了响应准确性和系统的整体效率。
希望这篇文章能帮助你在选择嵌入模型时更加得心应手,让你的 RAG 模型在信息检索的战场上所向披靡!
本文转载自公众号Halo咯咯 作者:基咯咯
原文链接:https://mp.weixin.qq.com/s/JqQKIn9kd0Ys5DsnuZGtsg
