OpenAI Ada-003 嵌入是自然语言处理 (NLP) 的强大工具。然而,嵌入的大小是一个挑战,尤其是在实时搜索和检索方面。在本文中,我们将探讨如何使用 Qdrant 的二元量化来提升 OpenAI 嵌入的性能和效率。
在本文中,我们将讨论
- OpenAI 嵌入的重要性及现实世界中的挑战。
- Qdrant 的二元量化及其如何提升 OpenAI 嵌入的性能
- 一项突出搜索效率和准确性提升的实验结果
- 这些发现对现实世界应用的影响
- 利用二元量化增强 OpenAI 嵌入的最佳实践
如果您是二元量化的新手,请阅读我们的文章,其中介绍了概念以及如何与 Qdrant 一起使用
您还可以按照 Binary Quantization OpenAI 中描述的技术进行尝试,其中包含 Jupyter notebook。
新的 OpenAI 嵌入:性能与变化
随着嵌入模型技术的进步,需求不断增长。用户越来越寻求强大而高效的文本嵌入模型。OpenAI 的 Ada-003 嵌入在广泛的 NLP 任务上提供了最先进的性能,包括在 MTEB 和 MIRACL 中提到的任务。
这些模型支持超过 100 种语言的多语言。从 text-embedding-ada-002 过渡到 text-embedding-3-large 使性能得分显著提升(在 MIRACL 上从 31.4% 提升到 54.9%)。
套娃表示学习
新的 OpenAI 模型采用了一种名为“套娃表示学习”的新颖方法进行训练。开发者可以设置不同大小(维度数量)的嵌入。在本文中,我们使用了小型和大型变体。开发者可以选择平衡准确性和大小的嵌入。
在这里,我们展示了二元量化在不同维度下(对于这两种模型)都具有相当好的准确性。
使用二元量化提升性能和效率
通过减少存储需求,您可以以较低的成本扩展应用程序。这解决了原始嵌入大小带来的关键挑战。二元量化还加快了搜索过程。它将向量之间复杂的距离计算简化为更易于管理的位运算,从而支持跨海量数据集的潜在实时搜索。
附带的图表展示了二元量化在不同模型大小下可达到的令人期待的准确性水平,表明其在不严重牺牲性能的情况下具有实用性。存储减少和搜索加速的双重优势凸显了二元量化在各种现实世界应用中更有效地部署 OpenAI 嵌入的变革潜力。
二元量化带来的效率提升如下
- 减少存储空间:有助于处理大规模数据集。它还能节省内存,并以相同的成本扩展高达 30 倍。
- 提升数据检索速度:较小的数据大小通常会带来更快的搜索速度。
- 加速搜索过程:基于将向量之间复杂的距离计算简化为位运算。这使得即使在大型数据库中也能进行实时查询。
实验设置:聚焦 OpenAI 嵌入
为了确定二元量化对搜索效率和准确性的影响,我们在 OpenAI 文本嵌入模型上设计了实验。这些模型捕捉细微的语言特征和语义关系,是我们分析的基础。随后,我们深入探讨了 Qdrant 二元量化功能可能带来的增强效果。
这种方法不仅利用了高质量的 OpenAI 嵌入,还为评估所考察的搜索机制提供了广泛的基础。
数据集
本研究使用了来自 OpenAI 1M 数据集中的 10 万个随机样本,重点关注 100 个随机选择的记录。这些记录在实验中作为查询,旨在评估二元量化如何影响数据集内的搜索效率和精度。然后,我们使用查询的嵌入在数据集中搜索最近的邻居。
参数:过采样、重新评分和搜索限制
对于每条记录,我们对过采样数量、重新评分和搜索限制进行参数扫描。然后,我们可以了解这些参数对搜索准确性和效率的影响。我们的实验旨在评估二元量化在各种条件下的影响,基于以下参数
过采样:通过过采样,我们可以限制量化固有的信息丢失。这也有助于保留 OpenAI 嵌入的语义丰富性。我们尝试了不同的过采样因子,并确定了其对搜索准确性和效率的影响。剧透:更高的过采样因子倾向于提高搜索准确性。但是,它们通常需要更多的计算资源。
重新评分:重新评分细化了初始二元搜索的初步结果。这个过程利用原始的高维向量来优化搜索结果,总是提高准确性。我们打开和关闭重新评分来衡量其与二元量化结合时的效果。我们还测量了其对搜索性能的影响。
搜索限制:我们指定搜索过程返回结果的数量。我们尝试了各种搜索限制,以衡量其对准确性和效率的影响。我们探索了搜索深度和性能之间的权衡。结果为具有不同精度和速度要求的应用提供了见解。
通过这种详细的设置,我们的实验旨在阐明二元量化与 OpenAI 模型生成的高质量嵌入之间的微妙相互作用。通过精心调整和观察不同条件下的结果,我们旨在发现可操作的见解,帮助用户充分发挥 Qdrant 结合 OpenAI 嵌入的潜力,无论其具体应用需求如何。
结果:二元量化对 OpenAI 嵌入的影响
为了分析重新评分(True
或 False
)的影响,我们比较了不同模型配置和搜索限制下的结果。重新评分基于初始查询的结果,设置更精确的搜索。
重新评分
以下是一些主要观察结果,分析了重新评分(True
或 False
)的影响
准确性显著提升:
- 在所有模型和维度配置下,启用重新评分(
True
)始终比禁用重新评分(False
)带来更高的准确性得分。 - 准确性的提升在各种搜索限制(10、20、50、100)下均成立。
- 在所有模型和维度配置下,启用重新评分(
模型和维度特定的观察:
- 对于具有 3072 维度的
text-embedding-3-large
模型,重新评分将准确性从不重新评分时的平均约 76-77% 提升到重新评分时的 97-99%,具体取决于搜索限制和过采样率。 - 启用重新评分后,增加过采样带来的准确性提升更为显著,这表明可以更好地利用额外的二进制编码来优化搜索结果。
- 对于具有 512 维度的
text-embedding-3-small
模型,准确性从不重新评分时的约 53-55% 提升到重新评分时的 71-91%,这突显了重新评分的显著影响,尤其是在较低维度下。
- 对于具有 3072 维度的
相比之下,对于低维度模型(例如具有 512 维度的 text-embedding-3-small),即使启用了重新评分,增加过采样水平带来的增量准确性提升也较小。这表明在较低维度空间中,更高过采样对准确性提升的边际收益递减。
- 搜索限制的影响:
- 重新评分带来的性能提升在不同搜索限制下似乎相对稳定,这表明无论考虑多少个顶级结果,重新评分都能持续提高准确性。
总之,在所有测试配置下,启用重新评分显著提高了搜索准确性。对于精度至关重要的应用来说,这是一项关键功能。重新评分提供的持续性能提升突显了其在优化搜索结果中的价值,特别是在处理像 OpenAI 嵌入这样复杂、高维数据时。这种增强对于需要高准确性的应用至关重要,例如语义搜索、内容发现和推荐系统,在这些应用中,搜索结果的质量直接影响用户体验和满意度。
数据集组合
对于探索将文本嵌入模型与 Qdrant 集成的人员来说,考虑各种模型配置以获得最佳性能至关重要。上面定义的数据集组合说明了用于针对 Qdrant 进行测试的不同配置。这些组合主要有两个属性的不同
模型名称:指特定的文本嵌入模型变体,例如“text-embedding-3-large”或“text-embedding-3-small”。这种区别与模型的容量相关,“大型”模型以增加计算资源为代价提供更详细的嵌入。
维度:指模型生成的向量嵌入的大小。选项范围从 512 到 3072 维。更高的维度可能带来更精确的嵌入,但也可能增加 Qdrant 中的搜索时间和内存使用量。
优化这些参数是在搜索准确性和资源效率之间取得平衡的行为。通过测试这些组合,用户可以找到最符合其特定需求的配置,同时权衡计算资源和搜索结果的质量。
dataset_combinations = [
{
"model_name": "text-embedding-3-large",
"dimensions": 3072,
},
{
"model_name": "text-embedding-3-large",
"dimensions": 1024,
},
{
"model_name": "text-embedding-3-large",
"dimensions": 1536,
},
{
"model_name": "text-embedding-3-small",
"dimensions": 512,
},
{
"model_name": "text-embedding-3-small",
"dimensions": 1024,
},
{
"model_name": "text-embedding-3-small",
"dimensions": 1536,
},
]
探索数据集组合及其对模型性能的影响
代码片段遍历预定义的数据集和模型组合。对于每个以模型名称及其维度为特征的组合,都会加载相应的实验结果。这些以 JSON 格式存储的结果包括不同配置下的性能指标,例如准确性:带或不带过采样,带或不带重新评分步骤。
提取这些指标后,代码计算了不同设置下的平均准确性,排除了极低限制(特别是限制为 1 和 5)的极端情况。在计算每个子组的平均准确性之前,此计算将结果按过采样、重新评分存在与否和限制进行分组。
收集和处理这些数据后,将平均准确性组织到一个透视表中。此表以限制(考虑的顶级结果数量)为索引,列根据过采样和重新评分的组合形成。
import pandas as pd
for combination in dataset_combinations:
model_name = combination["model_name"]
dimensions = combination["dimensions"]
print(f"Model: {model_name}, dimensions: {dimensions}")
results = pd.read_json(f"../results/results-{model_name}-{dimensions}.json", lines=True)
average_accuracy = results[results["limit"] != 1]
average_accuracy = average_accuracy[average_accuracy["limit"] != 5]
average_accuracy = average_accuracy.groupby(["oversampling", "rescore", "limit"])[
"accuracy"
].mean()
average_accuracy = average_accuracy.reset_index()
acc = average_accuracy.pivot(
index="limit", columns=["oversampling", "rescore"], values="accuracy"
)
print(acc)
以下是这些结果的选定片段,其中 rescore=True
方法 | 维度 | 测试数据集 | 召回率 | 过采样 |
---|---|---|---|---|
OpenAI text-embedding-3-large(表中最高的 MTEB 得分) | 3072 | DBpedia 1M | 0.9966 | 3x |
OpenAI text-embedding-3-small | 1536 | DBpedia 100K | 0.9847 | 3x |
OpenAI text-embedding-3-large | 1536 | DBpedia 1M | 0.9826 | 3x |
过采样的影响
在机器学习中,您可以使用过采样来抵消数据集中的不平衡。当一个类别的数量显著多于其他类别时,它效果很好。这种不平衡可能会扭曲模型的性能,使其偏向多数类别而牺牲其他类别。通过从少数类别创建额外的样本,过采样有助于平衡训练数据集中类别的表示,从而实现更公平和准确的现实世界场景建模。
屏幕截图展示了过采样对模型性能指标的影响。虽然没有显示实际指标,但我们预计会在精确率、召回率或 F1 分数等指标上看到改进。这些改进说明了过采样在创建更平衡数据集方面的有效性。它使模型能够更好地学习所有类别的表示,而不仅仅是占主导地位的类别。
在没有明确的代码片段或输出的情况下,我们专注于过采样在模型公平性和性能中的作用。通过图形表示,您可以设置前后对比。这些对比说明了对机器学习项目的贡献。
利用二元量化:最佳实践
我们建议以下利用二元量化增强 OpenAI 嵌入的最佳实践
- 嵌入模型:使用 MTEB 中的 text-embedding-3-large。它是测试的模型中最准确的。
- 维度:使用模型可用的最高维度,以最大化准确性。结果对于英语和其他语言都适用。
- 过采样:使用过采样因子 3,以在准确性和效率之间取得最佳平衡。此因子适用于广泛的应用。
- 重新评分:启用重新评分以提高搜索结果的准确性。
- 内存:将完整向量和 payload 存储在磁盘上。限制从内存加载的内容为二元量化索引。这有助于减少内存占用并提高系统的整体效率。与 Qdrant 中使用 SIMD 指令进行二元评分带来的延迟节省相比,磁盘读取带来的增量延迟可以忽略不计。
接下来?
如果您需要在高召回率期望下处理大量数据,二元量化非常出色。您可以通过在本地启动一个 Qdrant 容器镜像 来尝试此功能,或者通过我们的云托管服务中的 免费帐户 让我们为您创建一个。
本文提供了您可以用来开始的数据集和配置示例。我们的文档涵盖了将大型数据集添加到 Qdrant 实例以及更多量化方法。
想讨论这些发现并了解更多关于二元量化的信息吗?加入我们的 Discord 社区。