本文介绍如何设置向量检索高级参数。
使用数据类型定义可以设置检索时的高级参数。
设置多向量检索时每个向量的候选个数
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)))
重要
生产环境不建议开启线性检索,检索性能会显著下降。
开启线性检索后,不一定保证召回达到100%.
对于开启量化的集合,会使用量化后的数据做计算,召回可能小于100%.
对于未开启量化的集合,召回为100%.
调整HNSW检索的ef参数
print(collection.query(vector=VectorQuery(np.random.rand(768), ef=100)))
HNSW索引中,ef表示检索过程中的候选集个数,具体可参考这里。通过调整ef值,可以在检索性能和召回之间获得一定的权衡:增大ef值,会提升召回但可能降低检索性能;减小ef值,会提高检索性能但可能降低召回。
ef 的取值范围为[0, 4294967295],其中0表示使用默认ef值。
说明
ef 取值超过一定值之后可能性能/召回结果达到稳定,取更大的值也不再变化。
建议生产环境不要使用过大的ef,以免影响检索效率。
RNN 检索
RNN(Radius nearest neighbour)在一般的向量检索基础上增加了限制条件,只返回距离query向量的距离不超过阈值radius的文档。
print(collection.query(vector=VectorQuery(np.random.rand(768), radius=1.0)))
对于不同的距离类型,radius含义不同
对于欧式距离和余弦距离,返回 score <= radius 的doc。
对于内积距离,返回 score >= radius 的doc。
说明
RNN 检索返回的结果条数仍然受topk限制。
文档内容是否对您有帮助?