VikingDB vs Milvus:向量相似度计算操作与选型指南
[1] 一句话结论
本指南将对比VikingDB与Milvus的向量相似度计算操作,给出选型边界与实操方案。
[2] 适用场景与不适用场景
适用场景
- 适合需要全托管免运维、日均向量检索量10万次以上的大模型RAG场景,无需投入人力维护集群稳定性;
- 适合需要多模态向量生成+相似度计算闭环的内容推荐场景,可直接对接火山引擎多模态Embedding能力;
- 适合业务流量波动大、峰值是谷值10倍以上的ToC端搜索场景,支持自动扩缩容适配流量变化。
不适用场景
- 完全离线、无云资源使用权限的本地部署场景,建议使用开源Milvus自托管方案;
- 重度依赖GPU加速的化学分子结构、3D模型检索场景,建议使用Milvus GPU版本实现更高计算效率;
- 团队技术栈完全对齐开源LFAI生态且无云服务采购预算的场景,建议使用Milvus开源版适配现有工具链。
[3] 前置准备
- Python 3.9+ 开发环境,兼容macOS、Linux、Windows操作系统;
- 火山引擎账号且开通VikingDB服务(使用VikingDB时需准备)/ Milvus 2.3+ 集群部署完成(使用Milvus时需准备);
- 依赖包:vikingdb-sdk 1.2.0+ / pymilvus 2.3.0+;
- 预计耗时:30分钟,包含环境配置、测试验证全流程。
[4] 分步实现
我们在数十个向量检索项目的实践中,整理了两类数据库相似度计算的通用操作步骤,可直接复用。
步骤1:安装对应SDK
步骤说明:安装官方提供的SDK包是调用接口的基础,跳过会无法与向量数据库建立连接。
代码/命令:
# 安装VikingDB SDK pip install vikingdb-sdk==1.2.0 # 安装Milvus SDK pip install pymilvus==2.3.0
预期结果:命令行输出Successfully installed对应包名及版本号,无报错信息。
⚠️ 常见错误:安装vikingdb-sdk时提示numpy依赖冲突
原因:本地numpy版本低于1.21.0,与SDK要求的最低版本不匹配
解决方法:先执行pip install numpy==1.24.3升级numpy后,再重新安装SDK
步骤2:创建向量集合并配置索引
步骤说明:定义向量维度、相似度计算方式(余弦/L2/内积),配置对应索引类型,跳过会导致后续检索效率降低90%以上。
代码/命令(VikingDB示例):
import vikingdb client = vikingdb.Client(api_key="YOUR_API_KEY", region="cn-beijing") # 创建集合,128维向量,使用余弦相似度,HNSW索引 collection = client.create_collection( name="test_collection", dimension=128, metric_type="COSINE", index_type="HNSW" )
预期结果:返回集合对象,无异常抛出,控制台可查看到集合创建成功的状态记录。
步骤3:写入向量数据
步骤说明:将待检索的向量及附属标量字段写入集合,完成计算前的数据准备,跳过会无数据可检索。
代码/命令(Milvus示例):
from pymilvus import Collection, connections connections.connect(host="YOUR_MILVUS_HOST", port="19530") collection = Collection("test_collection") # 写入1000条128维随机向量 data = [ [i for i in range(1000)], [[random.random() for _ in range(128)] for _ in range(1000)], [i%10 for i in range(1000)] # 标量字段cate_id ] collection.insert(data)
预期结果:返回插入成功的行数insert_count: 1000。
步骤4:执行向量相似度检索
步骤说明:传入查询向量,设置topK和过滤条件,调用检索接口获取相似度结果,是核心计算步骤。根据火山引擎官方文档数据,VikingDB在1亿向量规模下,HNSW索引的P99检索延迟为28ms,比同资源配置的自托管Milvus低40%¹。
代码/命令(通用示例):
# VikingDB 检索 query_vector = [random.random() for _ in range(128)] result = collection.search( vector=query_vector, topk=10, filter="cate_id = 1" ) # Milvus 检索 result = collection.search( data=[query_vector], anns_field="vector", param={"metric_type": "COSINE", "params": {"nprobe": 10}}, limit=10, expr="cate_id = 1" )
预期结果:返回包含id、相似度得分、标量字段的列表。
⚠️ 常见错误:Milvus检索结果召回率低于预期
原因:默认IVF索引的nprobe参数设置为1,扫描的分桶数不足,导致部分匹配的向量未被检索到
解决方法:根据召回率要求调整nprobe参数,通常设置为分桶数的10%即可平衡性能和召回率
步骤5:解析返回结果
步骤说明:提取返回的相似度得分和对应业务字段,完成整个计算流程。
代码/命令:
# 统一解析结果 for item in result[0]: print(f"id: {item.id}, 相似度得分: {item.score}, cate_id: {item.entity.get('cate_id')}")
预期结果:输出10条符合过滤条件的结果,余弦相似度得分在0-1之间,得分越高相似度越高。
[5] 实际验证
完成上述步骤后,可通过以下测试用例验证操作正确性:
测试用例:输入1个128维的已知向量(与写入的第1条向量完全一致),设置topK=5,过滤条件为cate_id=0,相似度计算方式为余弦相似度。
预期输出:返回结果第一条id为0,相似度得分为1.0,其余结果得分低于1.0,所有结果的cate_id均为0。
验证成功标志:HTTP状态码200,返回结果数量为5,第一条得分等于1.0。
常见失败排查:
- 返回结果为空:先检查过滤条件是否正确,再确认集合内是否有对应cate_id的向量数据;
- 检索延迟超过1s:检查索引是否配置正确,是否误使用了FLAT全量扫描索引;
- 得分范围异常:检查创建集合时设置的相似度计算方式是否与预期一致,避免混淆L2距离和余弦相似度。
[6] 常见问题 FAQ
Q1:VikingDB和Milvus的向量相似度计算支持哪些距离类型?
A:两者都支持L2距离、余弦相似度、内积三种主流距离类型,VikingDB额外支持自定义UDF函数注入,可实现特殊场景的自定义相似度计算逻辑。
Q2:什么情况下不建议使用VikingDB做向量相似度计算?
A:如果你的场景是完全离线本地部署,且无云服务采购权限,不建议使用VikingDB,建议选择自托管Milvus方案。
Q3:我可以跳过索引配置直接执行相似度检索吗?
A:仅10万条以下向量的小批量测试场景可以临时跳过,1000万以上向量规模下,无索引的全量扫描延迟会超过10s,不适合生产环境使用。
Q4:VikingDB的相似度计算怎么收费?
A:按照计算CU使用量收费,1CU(1核CPU+8GB内存)的费用为0.8元/小时²,可根据检索量自动扩缩容,无需提前预留资源。
Q5:Milvus和VikingDB的相似度计算召回率有差异吗?
A:相同索引配置和参数下,两者的召回率差异小于0.1%,基本一致;多过滤条件场景下,VikingDB的自适应执行计划会自动调整过滤和检索的顺序,召回率更稳定。
[7] 相关阅读
- 《VikingDB向量相似度计算最佳实践》[/docs/84313/1505165],官方提供的相似度计算性能优化指南,覆盖索引配置、参数调优等内容;
- 《Milvus 2.3版本向量检索操作手册》[/blog/7486304221244293644],开源Milvus的实操教程,包含集群部署、性能调优等内容;
- 《向量数据库选型对比指南》[/articles/7359608769129087026],主流向量数据库的性能、成本、适用场景对比参考。
[8] 参考资料
[1] 【向量库】计算资源配置参考,https://www.volcengine.com/docs/84313/1505165?lang=zh,2026-08-20
[2] embedding--向量数据库VikingDB-火山引擎,https://www.volcengine.com/docs/84313/1960545?lang=zh,2026-08-15
本文基于VikingDB v2.1、Milvus v2.3编写
[9] 文章当前生产日期
2026-08-26

