
类型:向量数据库
简介:存储、索引和管理由深度神经网络和机器学习(ML)模型生成的大规模嵌入向量。
本文介绍 Milvus 相似度搜索方法,包括查询向量生成、TopK 设置、标量过滤、返回字段配置、搜索结果验证和常见问题排查。
一、一次可用的搜索不只是返回结果
Milvus 相似度搜索的核心流程是:把用户问题转换成向量,再到 Collection 中查找相似向量。这个过程看起来简单,但真正可用的搜索还需要返回文本、来源、标题、版本和相似度等信息。
如果搜索只返回 ID,业务系统就很难使用。用户需要看到命中的内容来自哪里,前端也需要根据返回字段展示结果。
因此,一次完整搜索至少要考虑:
- 查询向量怎么生成;
- TopK 返回多少条;
- 是否需要过滤条件;
- 返回哪些字段;
- 如何判断结果是否可信。
二、查询向量要和入库向量保持一致
用户输入的问题不能直接拿去 Milvus 搜索,需要先用 Embedding 模型转换成查询向量。这个模型应与入库时使用的模型一致或兼容。
1、不要混用不同模型
如果入库时使用一个模型,查询时换成另一个模型,搜索结果可能明显变差。即使两个模型输出维度相同,也不代表向量空间一致。
2、查询文本也要清洗
用户问题里可能有多余符号、换行或无关内容。可以在生成查询向量前做轻量清洗,但不要过度改写用户意图。
三、TopK 设置要看使用场景
TopK 表示返回最相似的前几条结果。知识库问答、商品推荐和图片检索对 TopK 的需求不同。
1、知识库问答
知识库问答常从 3 到 10 开始测试。返回太少,可能漏掉答案;返回太多,后续生成回答或展示结果时容易混入噪声。
2、商品相似推荐
商品推荐可能需要更多候选结果,再结合价格、库存、分类和销量做二次排序。
3、内部搜索
内部搜索可以返回较多结果,让用户自行筛选。但前端要展示来源、摘要和匹配原因,不能只显示标题。
四、过滤条件能让搜索更精准
Milvus 支持在向量搜索中结合标量过滤。过滤条件适合限制搜索范围,例如只搜索某个文档、某个分类、某个语言、某个版本或某种状态的数据。
1、常见过滤字段
知识库场景可以按这些字段过滤:
doc_id:只查某个文档;category:只查某个分类;language:只查某种语言;version:只查某个版本;status:只查 active 数据。
2、过滤条件不要过窄
如果过滤条件设置过窄,可能导致搜索没有结果。排查时可以先去掉过滤条件,确认基础向量搜索正常,再逐步加回条件。
五、返回字段决定结果能不能使用
搜索时应配置返回字段。知识库场景至少返回:
- 文本片段;
- 标题;
- 来源;
- 文档编号;
- 版本;
- 相似度或距离信息。
如果返回字段不足,即使 Milvus 找到了正确片段,前端也无法展示给用户。
1、面向用户的返回字段
面向用户展示时,标题、摘要、来源和链接很重要。用户需要判断结果是否可信。
2、面向系统的返回字段
面向系统处理时,doc_id、chunk_id、version、status 更重要。这些字段用于追踪、去重、更新和排查。
六、搜索结果要做二次判断
相似度搜索不是绝对答案。返回结果只是候选内容,业务系统还需要进一步判断。
可以从三个角度判断:
- 相似度是否足够高;
- 来源是否可信;
- 文本是否完整回答问题。
如果结果相似度不高,或命中内容只是关键词相似但语义无关,应用层应避免直接生成确定答案。
七、没有结果时怎么排查
1、先检查 Collection 是否已加载
如果 Collection 没有加载或服务状态异常,搜索可能无法正常执行。
2、再检查过滤条件
去掉过滤条件后重新搜索。如果能返回结果,说明问题可能出在过滤表达式或字段值上。
3、最后检查向量生成
确认查询向量维度正确,且使用了和入库一致的 Embedding 模型。
FAQ
Q1:TopK 设置多少合适?
A:没有固定值。知识库问答可以从 3 到 10 测试,再根据命中质量调整。
Q2:为什么搜索有结果但看不懂?
A:通常是返回字段配置不完整,需要返回文本、标题、来源等字段。
Q3:过滤条件会影响召回吗?
A:会。过滤条件越严格,搜索范围越小,可能提高精准度,也可能导致无结果。

