向量检索高级参数

本文介绍如何设置向量检索高级参数。

使用数据类型定义可以设置检索时的高级参数。

设置多向量检索时每个向量的候选个数

title_vector = [0.1, 0.2, 0.3, 0.4]
content_vector = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
vectors = {
    "title": VectorQuery(vector=title_vector, num_candidates=10),
    "content": VectorQuery(vector=content_vector),
}
ret = collection.query(
    vector=vectors,
    topk=20,
)

上面的代码中,设置title向量召回10条结果,content向量没有设置num_candidates,召回topk=20条结果。

开启线性(暴力)检索

print(collection.query(vector=VectorQuery(np.random.rand(768), is_linear=True)))
重要
  1. 生产环境不建议开启线性检索,检索性能会显著下降。

  2. 开启线性检索后,不一定保证召回达到100%.

    1. 对于开启量化的集合,会使用量化后的数据做计算,召回可能小于100%.

    2. 对于未开启量化的集合,召回为100%.

调整HNSW检索的ef参数

print(collection.query(vector=VectorQuery(np.random.rand(768), ef=100)))

HNSW索引中,ef表示检索过程中的候选集个数,具体可参考这里。通过调整ef值,可以在检索性能和召回之间获得一定的权衡:增大ef值,会提升召回但可能降低检索性能;减小ef值,会提高检索性能但可能降低召回。

ef 的取值范围为[0, 4294967295],其中0表示使用默认ef值。

说明
  1. ef 取值超过一定值之后可能性能/召回结果达到稳定,取更大的值也不再变化。

  2. 建议生产环境不要使用过大的ef,以免影响检索效率。

RNN 检索

RNN(Radius nearest neighbour)在一般的向量检索基础上增加了限制条件,只返回距离query向量的距离不超过阈值radius的文档。

print(collection.query(vector=VectorQuery(np.random.rand(768), radius=1.0)))

对于不同的距离类型,radius含义不同

  1. 对于欧式距离和余弦距离,返回 score <= radius 的doc。

  2. 对于内积距离,返回 score >= radius 的doc。

说明

RNN 检索返回的结果条数仍然受topk限制。