向量数据库检索配置:让相似度搜索返回正确结果的关键参数
检索结果不准,多数情况不是向量数据库本身坏了,而是嵌入模型、距离度量、索引参数和返回数量这四项没有对齐。
向量数据库检索配置的本质,是让查询向量与库内向量在同一套规则下比较,并把最相似的几条稳定取回来。
下面按实际配置流程展开,以 Milvus 的 collection 参数为例,其他向量库的字段名不同,判断逻辑相通。
先确认嵌入模型和向量维度
向量数据库只负责存和算,不负责把文字变成向量。
配置检索之前,必须先固定嵌入模型,并确认它输出的维度。
比如某个模型输出 768 维,collection 的向量字段就必须是 768 维,查询时也必须用同一个模型生成查询向量。
常见错误是建库时用了 A 模型,查询时换了 B 模型,维度即使碰巧相同,语义空间也不一致,检索结果会明显跑偏。
另一个坑是文本预处理不一致:入库时做了小写和去标点,查询时没做,相似度分数会下降。
建议在建库前把下面三件事记下来:
- 嵌入模型名称和版本,入库与查询必须一致
- 向量维度,与 collection 定义严格匹配
- 文本清洗规则,入库和查询共用同一段预处理代码
距离度量要和模型训练方式匹配
距离度量决定“相似”怎么算。
常见选项有内积(IP)、余弦相似度(COSINE)和欧氏距离(L2)。
多数文本嵌入模型在训练时使用余弦相似度或归一化后的内积,因此文本检索优先选 COSINE 或 IP。
如果模型输出向量已经归一化,IP 和 COSINE 的结果排序通常一致;
如果没归一化,用 IP 可能被向量长度带偏。
L2 更适合图像特征或坐标类数据,不要因为“看起来通用”就选它。
配置时注意:距离度量在创建 collection 时就固定,后期修改通常要重建索引甚至重建 collection。
建库前确认清楚,比事后补救省事。
索引参数按数据规模选
以 Milvus 为例,创建索引时可以指定类型和关键参数。
数据量在百万级以内,HNSW 是常用选择,配置片段大致如下:
index_params = {
"index_type": "HNSW",
"metric_type": "COSINE",
"params": {
"M": 16,
"efConstruction": 200
}
}
M 控制每个节点的连接数,值越大召回越高、内存占用也越大;efConstruction 影响建索引时的搜索深度,值越大索引质量越好但构建越慢。
数据量更大或内存受限时,可以考虑 IVF 系列,用 nlist 控制聚类数量,查询时用 nprobe 控制扫描的聚类数。
参数没有“最佳值”,只有和你的数据规模、内存、延迟要求匹配的值。
新手先从小规模样本调起,不要一上来就照搬网上的大参数。
检索时控制 top_k 和过滤条件
检索请求里有两个容易忽略的配置:返回数量 top_k 和标量过滤条件。top_k 太小会漏掉相关结果,太大会把不相关结果带进后续流程。
一般从 5 到 10 开始,根据下游是直接展示还是交给大模型再排序来调整。
如果检索时带了过滤条件,比如只查某个分类下的文档,要确认过滤字段已经建好索引,否则查询会退化成全量扫描,延迟明显上升。
过滤条件过多时,可以适当提高 top_k 再在应用层截断。
一个可执行的检索调用示例:
results = collection.search(
data=[query_vector],
anns_field="embedding",
param={"metric_type": "COSINE", "params": {"ef": 64}},
limit=10,
expr="category == 'manual'"
)
这里的 ef 是查询时的搜索深度,通常不小于 top_k,调大能提升召回,但会增加延迟。
用固定样本验证召回效果
配置完成后不要凭感觉判断。
准备 10 到 20 条已知答案的查询样本,记录每条查询期望返回的文档 ID,然后实际检索,看期望结果是否出现在前 top_k 中。
验证时重点看三类现象:
- 期望结果完全不在返回列表:先查嵌入模型是否一致、向量维度是否匹配
- 期望结果排名靠后:适当调大
ef或nprobe,或检查距离度量是否选错 - 返回结果重复或明显不相关:检查入库时是否重复写入、文本清洗是否一致
每次只改一个参数,改完重新跑同一批样本,记录召回变化。
这样调出来的配置才是可复现的。
常见疑问
向量维度和索引参数哪个更优先确认?
维度优先。
维度不匹配时检索直接报错或结果无意义,索引参数只影响召回和延迟,所以先保证维度、模型、距离度量三者一致,再调索引参数。
top_k 调大就能解决召回差吗?
不一定。
如果相关文档根本没进候选集,调大 top_k 只是把更多不相关结果带出来。
先确认嵌入模型和距离度量,再考虑调大搜索深度参数。
改索引参数需要重建数据吗?
多数向量数据库修改索引类型或距离度量需要重建索引,部分参数可以动态调整。
操作前先备份 collection 或确认可以从原始数据重新导入,避免改坏后无法回滚。
向量数据库检索配置没有一劳永逸的模板。
把嵌入模型、距离度量、索引参数和 top_k 当作一组联动的配置来管理,每次变更后用固定样本复查召回,才能让相似度搜索稳定返回正确结果。