category
在矢量查询执行过程中,搜索引擎会查找相似的矢量,以找到在搜索结果中返回的最佳候选者。根据对矢量内容进行索引的方式,对相关匹配的搜索要么是详尽的,要么被限制在近邻,以加快处理速度。一旦找到候选者,就使用相似性度量根据匹配的强度对每个结果进行评分。
本文介绍了用于查找相关匹配的算法和用于评分的相似性度量。如果搜索结果不符合预期,还提供了提高相关性的提示。
矢量搜索中使用的算法
矢量搜索算法包括穷举k近邻(KNN)和分层导航小世界(HNSW)。
- 穷举KNN执行强力搜索,扫描整个向量空间。
- HNSW执行近似最近邻(ANN)搜索。
只有在索引中标记为可搜索的矢量字段或在查询中标记为searchFields的矢量字段才用于搜索和评分。
何时使用详尽【exhaustive】的KNN
穷举KNN计算所有数据点对之间的距离,并找到查询点的精确k个最近邻居。它适用于高召回率至关重要的场景,并且用户愿意接受查询延迟的权衡。由于计算密集型,请对中小型数据集使用详尽的KNN,或者在精度要求超过查询性能考虑时使用。
第二个用例是建立一个数据集来评估近似最近邻算法的召回率。穷举KNN可以用于建立最近邻居的地面实况集。
详尽的KNN支持可通过2023-11-01 REST API、2023-10-01预览REST API以及针对任一REST API版本的Azure SDK客户端库获得。
何时使用HNSW
在索引过程中,HNSW会创建额外的数据结构,以便更快地进行搜索,将数据点组织成层次图结构。HNSW有几个配置参数,可以对这些参数进行调整,以实现搜索应用程序的吞吐量、延迟和调用目标。例如,在查询时,您可以指定穷举搜索的选项,即使矢量字段是为HNSW编制索引的。
在查询执行期间,HNSW通过在图中导航来启用快速邻居查询。这种方法在搜索精度和计算效率之间取得了平衡。建议在大多数情况下使用HNSW,因为它在搜索较大数据集时效率很高。
最近邻居搜索的工作原理
向量查询针对由同一嵌入模型生成的向量组成的嵌入空间执行。通常,查询请求中的输入值被馈送到与在向量索引中生成嵌入相同的机器学习模型中。输出是同一嵌入空间中的向量。由于相似的矢量聚集在一起很近,因此查找匹配项相当于查找最接近查询矢量的矢量,并将相关联的文档作为搜索结果返回。
例如,如果查询请求是关于酒店的,则模型会将查询映射到表示酒店文档的向量集群中某个位置的向量中。基于相似性度量来识别哪些向量与查询最相似,从而确定哪些文档最相关。
当为穷举KNN索引矢量字段时,查询将针对“所有邻居”执行。对于为HNSW编制索引的字段,搜索引擎使用HNSW图在矢量索引内的节点子集上进行搜索。
创建HNSW图
在索引期间,搜索服务构建HNSW图。将新矢量索引到HNSW图中的目标是以允许有效的最近邻居搜索的方式将其添加到图结构中。以下步骤总结了该过程:
- 初始化:从一个空的HNSW图开始,如果不是新索引,则从现有的HNSW图形开始。
- 入口点:这是层次图的顶层,是索引的起点。
- 添加到图中:不同的层次级别表示图的不同粒度,更高的级别更全局,更低的级别更细粒度。图中的每个节点表示一个矢量点。
- 每个节点最多连接到附近的m个邻居。这是m参数。
- 被视为候选连接的数据点的数量由efConstruction参数决定。这个动态列表形成了现有图中最接近点的集合,供算法考虑。efConstruction值越高,考虑的节点越多,这通常会导致每个向量的局部邻域越密集。
- 这些连接使用配置的相似性度量来确定距离。有些连接是跨不同层次连接的“远距离”连接,可以在图中创建快捷方式,从而提高搜索效率。
- 图修剪和优化:这可以在索引所有向量后进行,并提高HNSW图的导航性和效率。
在查询时导航HNSW图
矢量查询导航层次图结构以扫描匹配项。以下总结了该过程中的步骤:
- 初始化:算法在层次图的顶层启动搜索。此入口点包含用作搜索起点的向量集。
- 遍历:接下来,它逐层遍历图形,从顶级导航到较低级别,根据配置的距离度量(如余弦相似度)选择更接近查询向量的候选节点。
- 修剪:为了提高效率,该算法只考虑可能包含最近邻居的节点来修剪搜索空间。这是通过维护潜在候选者的优先级队列并随着搜索的进行进行更新来实现的。此队列的长度由参数efSearch配置。
- 细化:随着算法向更低、更细粒度的级别移动,HNSW会考虑查询附近的更多邻居,这允许对候选向量集进行细化,从而提高准确性。
- 完成:当识别出所需数量的最近邻居时,或当满足其他停止条件时,搜索完成。这个期望数量的最近邻居由查询时间参数k控制。
用于测量接近度的相似性度量
该算法找到候选向量来评估相似度。为了执行该任务,相似度度量计算将候选向量与查询向量进行比较,并测量相似度。该算法跟踪其找到的最相似向量的有序集,当算法完成时,该有序集形成排序结果集。
Metric | Description |
---|---|
cosine |
This metric measures the angle between two vectors, and isn't affected by differing vector lengths. Mathematically, it calculates the angle between two vectors. Cosine is the similarity metric used by Azure OpenAI embedding models, so if you're using Azure OpenAI, specify cosine in the vector configuration. |
dotProduct |
This metric measures both the length of each pair of two vectors, and the angle between them. Mathematically, it calculates the products of vectors' magnitudes and the angle between them. For normalized vectors, this is identical to cosine similarity, but slightly more performant. |
euclidean |
(also known as l2 norm ) This metric measures the length of the vector difference between two vectors. Mathematically, it calculates the Euclidean distance between two vectors, which is the l2-norm of the difference of the two vectors. |
矢量搜索结果中的分数
分数会被计算出来并分配给每一场比赛,最高的比赛会作为k个结果返回。@search.score属性包含分数。下表显示了分数下降的范围。
Search method | Parameter | Scoring metric | Range |
---|---|---|---|
vector search | @search.score |
Cosine | 0.333 - 1.00 |
对于cosine度量,需要注意的是,计算的@search.score不是查询向量和文档向量之间的余弦值。相反,Azure AI Search应用转换,使分数函数单调递减,这意味着随着相似性的恶化,分数值的值总是会降低。这种转换可确保搜索分数可用于排名目的。
相似性得分有一些细微差别:
- 余弦相似性定义为两个向量之间的角度的余弦。
- 余弦距离定义为1-余弦相似性。
为了创建单调递减函数,@search.score被定义为1/(1+cosine_distance)。
需要余弦值而不是合成值的开发人员可以使用公式将搜索得分转换回余弦距离:
C#
double ScoreToSimilarity(double score) { double cosineDistance = (1 - score) / score; return -cosineDistance + 1; }
在设置阈值以修剪低质量结果的结果的自定义解决方案中,具有原始余弦值可能很有用。
相关性调整提示
如果没有得到相关的结果,请尝试更改查询配置。矢量查询没有特定的调整功能,如评分配置文件或字段或术语提升:
- 尝试块大小和重叠。试着增加块的大小,并确保有足够的重叠来保持块之间的上下文或连续性。
- 对于HNSW,尝试不同级别的efConstruction来更改接近图的内部组成。默认值为400。范围为100到1000。
- 如果你正在使用聊天模型,增加k个结果可以将更多的搜索结果输入聊天模型。
- 尝试使用语义排序的混合查询。在基准测试中,这种组合始终产生最相关的结果。
接下来的步骤
- 登录 发表评论
- 3 次浏览
Tags
最新内容
- 3 days 23 hours ago
- 4 days 1 hour ago
- 4 days 1 hour ago
- 6 days 17 hours ago
- 1 week ago
- 1 week ago
- 1 week ago
- 1 week ago
- 1 week 4 days ago
- 1 week 4 days ago