You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Milvus中搜索浮点向量时应用余弦相似度(不就地归一化)

在Milvus中不就地归一化向量时使用余弦相似度搜索的方法

Milvus的余弦相似度计算依赖向量归一化,但如果不想修改原始存储的向量(避免就地归一化),可以通过以下两种可靠方式实现:

1. 利用Milvus内置参数自动处理临时归一化

当创建Collection或构建索引时,直接指定相似度度量为COSINE,Milvus会在搜索阶段自动对查询向量和存量向量进行临时归一化计算,完全不会改动你存入的原始向量数据。

操作示例

  • 创建Collection时指定余弦度量:
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection

# 定义字段
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False)
vec_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)

# 绑定Schema并指定余弦相似度为度量类型
schema = CollectionSchema(fields=[id_field, vec_field], description="demo collection", metric_type="COSINE")

# 创建Collection
collection = Collection(name="demo_collection", schema=schema)
  • 构建索引(推荐,提升搜索效率):
# 为向量字段创建IVF_FLAT索引,指定度量为COSINE
collection.create_index(
    field_name="embedding",
    index_params={"metric_type": "COSINE", "index_type": "IVF_FLAT", "params": {"nlist": 1024}}
)
  • 执行搜索(无需手动处理向量):
collection.load()

# 模拟128维查询向量(无需提前归一化)
query_vec = [0.1, 0.2, ..., 0.5]

# 搜索时Milvus自动完成归一化计算
results = collection.search(
    data=[query_vec],
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"nprobe": 10}},
    limit=10
)

2. 手动归一化查询向量,结合内积搜索

基于数学等价性:两个向量的余弦相似度 = 它们归一化后的内积。你可以仅对查询向量做归一化处理,存量向量保持原始状态,然后将搜索度量设为IP(内积),最终结果与余弦相似度完全一致。

操作示例

import numpy as np

# 原始查询向量
query_vec = np.array([0.1, 0.2, ..., 0.5])
# 手动归一化(避免除以0的情况)
norm = np.linalg.norm(query_vec)
normalized_query = query_vec / norm if norm != 0 else query_vec

# 用内积度量执行搜索
results = collection.search(
    data=[normalized_query.tolist()],
    anns_field="embedding",
    param={"metric_type": "IP", "params": {"nprobe": 10}},
    limit=10
)

内容的提问来源于stack exchange,提问作者faraway0621

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:17:30