因为在论文查重的时候,需要从大量的文本片段中找到相似的片段,在做技术选型的时候,需要将比对库中的文本片段先生成simhash,然后选择了milvus做向量的高速检索。虽然我们本身比较熟悉ES,不过ES太重,对机器的要求很高,并不适合我们的场景,而且估计就向量检索而言,ES的性能估计会比milvus低很多。milvus很早前就有了解,不过并没有实际使用过,安排了工程师对它进行熟悉。不过同事探索一两天说,这个向量检索有问题,没有出来预期的结果。于是只能自己去探索一下,协助定位问题,顺便比较一下milvus的性能。

测试数据量:1000万随机向量,维度64,向量维度的每个值都是0或者1。
机器配置:8核16GB内存(好几年前的工作站配置)
浮点数索引
存储字段:
[
FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=64)
]索引使用参数:
{
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {"nlist": 128},
}批量查询5000个向量的相似变量,每个向量查询10个相似向量,代码如下:
vectors_to_search = data[0:5000]
search_params = {
"metric_type": "L2",
"params": {"nprobe": 10},
}
result = hello_milvus.search(vectors_to_search, "embeddings", search_params, limit=10)二值向量索引
存储字段:
[
FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embeddings", dtype=DataType.BINARY_VECTOR, dim=64)
]索引使用参数:
{
"index_type": "BIN_IVF_FLAT",
"metric_type": "HAMMING",
"params": {"nlist": 128},
}检索代码差不多,只是距离使用汉明距离。
检索性能比较
内存 | 耗时 | ||
|---|---|---|---|
二值索引 | 0.52GB | 9.2秒 | |
浮点数索引 | 2.72GB | 45秒 |
内存计算:向量加载到内存前后的内存占用差值。(根据这个值也可以计算出我们项目大概在向量的存储上大概需要的内存配置)
这个耗时差距应该并不只是索引类型的差异,很可能跟距离指标有关,一个是使用L2距离,一个是使用汉明距离,显然前者的计算量要大于后者。
可见选择正确的存储及索引方式是非常重要的,有时间可以进行更多的比较。