马特里奥什卡嵌入:使用自适应检索加速OpenAI向量搜索

马特里奥什卡嵌入:使用自适应检索加速OpenAI向量搜索

💡 原文英文,约3700词,阅读约需14分钟。
📝

内容提要

OpenAI于一月底发布了第三代文本嵌入模型,具备缩短维度的能力,并在MTEB和MIRACL基准测试中超越了前一版本。新API允许用户根据需求调整嵌入维度,尽管缩短可能导致轻微的准确性损失。该模型采用“马特里奥什卡表示学习”技术,确保在较低维度下仍能保留有用信息,同时自适应检索方法提升了向量搜索的速度和准确性。

🔎

延伸解读

自适应检索的两阶段机制

文章详细介绍了自适应检索如何利用马特里奥什卡嵌入加速向量搜索。它分为两阶段:首阶段使用低维子向量(如512维)快速筛选出候选集,此时候选数量会多于最终所需;第二阶段用完整高维向量(如3072维)对候选集重新排序,确保精度。这种设计平衡了速度与准确性,因为首阶段虽快但精度较低,而次阶段虽慢但只处理少量记录,整体效率高于单次全维搜索。

维度选择与训练粒度的关系

文章指出,马特里奥什卡模型在训练时使用了离散的维度粒度(如256、512、1024等),因此截断到这些粒度时子向量最具意义。若截断到未训练的任意维度,可能丢失信息。根据MTEB对比,text-embedding-3-large可能训练了256、1024和3072等粒度,但实际测试表明,首阶段使用512维能在精度和速度间取得最佳平衡,推测512也是训练粒度之一。

pgvector中的实现要点

在PostgreSQL的pgvector扩展中实现自适应检索,需要创建自定义函数sub_vector来截断并重新归一化向量,并基于该函数建立HNSW索引。查询时,首阶段必须使用与索引完全相同的表达式(包括类型转换)以确保索引被使用,同时将子向量包裹在子查询中避免重复计算。相似度算子需与索引算子一致(如内积对应vector_ip_ops),且内积仅适用于归一化向量。

性能权衡与优化方向

文章通过实验表明,首阶段使用512维向量、配合适当的HNSW参数(ef_construction=400, m=32)和检索倍数(8倍),能达到99%的准确率并维持580 QPS。首阶段是性能瓶颈,因其需过滤全表,而次阶段重排序开销很小。因此,优化首阶段(如调整维度或索引参数)比增加检索阶段更能提升整体性能。降低首阶段维度虽可提速,但需检索更多记录来补偿精度,可能反而更慢。

❓

Q&A

OpenAI的第三代文本嵌入模型有什么新特性?

该模型具备缩短维度的能力,并在MTEB和MIRACL基准测试中超越了前一版本。

如何调整OpenAI文本嵌入模型的维度?

用户可以通过新API参数调整嵌入维度,尽管缩短可能导致轻微的准确性损失。

什么是马特里奥什卡表示学习技术?

马特里奥什卡表示学习是一种训练技术,允许在单个高维向量中以多层次的粒度嵌入信息,确保即使在较低维度下也能保留有用信息。

自适应检索方法如何提升向量搜索的速度和准确性?

自适应检索方法通过两次搜索,第一次使用低维表示快速获取相关记录,第二次使用高维表示对结果进行精确排序,从而提高了搜索效率和准确性。

缩短嵌入维度会有什么影响?

缩短嵌入维度可能导致轻微的准确性损失,但这种损失是渐进的,且在马特里奥什卡模型中仍能保留有用信息。

如何在SQL中实现自适应检索?

可以通过创建一个存储文档和嵌入的表,并使用自定义函数和索引来实现自适应检索,具体步骤包括创建表、函数和索引。

🏷️

标签

➡️

继续阅读