稀疏向量是一种特殊的高维向量,其中大部分元素为零,只有少数维度的值不为零。如下图所示,稠密向量通常表示为连续数组,其中每个位置都有一个值(例如[0.3, 0.8, 0.2, 0.3, 0.1] )。相比之下,稀疏向量只存储非零元素及其维度的索引,通常以{ index: value} 的键值对表示(如[{2: 0.2}, …, {9997: 0.5}, {9999: 0.7}] )。

在这里插入图片描述
字段使用SPARSE_FLOAT_VECTOR 数据类型存储稀疏向量。

类型 向量特点 常见来源 Milvus 字段类型
稠密向量(Dense Vector) 每个维度都有数值(如 [0.2, -1.3, 0.8, ..., 0.5]),长度固定(如 768 维) BERT、ResNet、CLIP 等深度学习模型输出 FLOAT_VECTORBFLOAT16_VECTOR
稀疏向量(Sparse Vector) 只有少数位置有值,大部分是 0(如 {15: 2.1, 1024: 0.9}),用“索引:值”表示 BM25、SPLADE、ColBERT 等关键词或稀疏文本模型 SPARSE_FLOAT_VECTOR

我是小朋友😄
稠密向量 (Dense Vector)
小朋友的解释: 这就像一个几乎每个抽屉里都放了东西的抽屉柜。比如,这个柜子有 1000 个小抽屉,里面有 900 多个抽屉都放了玩具、糖果或者小卡片。虽然不是每个抽屉都满,但大部分都装了东西。
在电脑里: 它就像一个长长的数字列表,里面大部分数字都不是 0,比如 [0.1, 0.8, -0.3, 0.99, …],后面还有很多很多数字。
2. 稀疏向量 (Sparse Vector)**
小朋友的解释: 这就像一个超级大但是绝大部分抽屉都是空的抽屉柜。比如说,这个柜子有 10000 个小抽屉,但是只有 10 个抽屉里放了东西,其他的 9990 个抽屉都是空的。
在电脑里: 它也是一个长长的数字列表,但里面大部分数字都是 0,比如 [0, 0, 0, 5.2, 0, 0, 0, 0, -1.8, …],后面跟着好多好多的 0。

🧸 稠密索引(Dense Index)
就像你每个玩具都仔细拍一张照片,写清楚它是什么、颜色、大小、品牌……
这些信息非常完整,所以当你想找“红色的小汽车”时,系统能很快在所有照片里找到它。
这种“每个玩具都有详细资料”的方式,就叫稠密索引。
✅ 优点:找得准、找得快(尤其适合图像、人脸、语音这些“整体感觉”重要的东西)。
❌ 缺点:要存很多信息,占地方!

稠密索引 (Dense Index)
目的: 专门为了加速稠密向量的近似最近邻搜索(ANN)而设计的索引结构。
常见算法:
IVF_FLAT: 基于倒排文件(Inverted File)的方法,先将向量聚类,搜索时只在相关簇中查找。
IVF_SQ8: IVF 的量化版本,通过标量量化压缩向量以节省内存,牺牲少量精度换取更高效率。
HNSW (Hierarchical Navigable Small World): 一种高效的图遍历算法,通过构建多层导航图实现快速搜索,在精度和速度上表现优异。
DISKANN: 适用于超大规模数据集,利用磁盘进行存储和搜索。
选择: 用户可以根据对查询延迟、召回率和内存使用的要求来选择合适的稠密索引类型。
稀疏索引 (Sparse Index)
目的: 专门为了优化稀疏向量的存储和检索效率而设计的索引。
常见算法:
SPARSE_INVERTED_INDEX: 专门为稀疏向量设计的倒排索引,利用向量的稀疏性,只索引非零元素,能有效提升搜索性能。
SPARSE_WAND_INDEX: 基于 WAND 算法的稀疏索引,旨在更高效地处理内积等相似度计算,通常比 SPARSE_INVERTED_INDEX 更快。
优势: 这些索引充分利用了稀疏向量的特性,避免了对大量零值的无效计算和存储。

🕳️ 稀疏索引(Sparse Index)
现在换一种方式:你只记下每个玩具最关键的几个词,比如“乐高”、“会发光”、“恐龙”。
很多玩具可能只有一两个关键词,甚至有些地方是空的(比如一个普通小球,你只写了“球”)。
这种“只记重点、其他不管”的方式,就叫稀疏索引。
✅ 优点:省空间,特别适合处理文字(比如一句话里只有几个重要词)。
❌ 缺点:如果关键词没写对,可能找不到!

混合索引 (Hybrid Index / Hybrid Search)
目的: 用于同时处理稠密向量和稀疏向量的组合搜索场景,以结合两种向量的优势,提供更全面、更精确的检索结果。例如,结合语义搜索(稠密向量)和关键词匹配(稀疏向量)。
实现方式:
在一个集合(Collection)中创建两个独立的字段,一个用于存储稠密向量(并建立稠密索引),另一个用于存储稀疏向量(并建立稀疏索引)。
执行混合搜索时,系统会分别在这两种索引上执行搜索,并将得到的结果分数按照一定方式进行融合(例如加权求和),最后返回排序后的综合结果。
应用场景: 高级的搜索引擎、推荐系统等,需要同时考虑语义理解和精确关键词匹配的场合。
总结来说,Milvus 通过对稠密和稀疏向量及其对应索引的支持,能够满足从传统信息检索到现代 AI

混合搜索 (Hybrid Search)
小朋友的解释: 这就像你既想靠颜色(比如找红色的东西)来找玩具,又想靠形状(比如找圆形的东西)来找玩具。你把这两个方法混在一起用。比如,你先找所有红色的东西,再在里面挑出圆形的;或者你觉得颜色更重要,就多按颜色来挑,但也看看形状。混合搜索就是把“稠密向量搜索”(像靠形状找)和“稀疏向量搜索”(像靠颜色找)这两种方法结合起来,帮你找到最符合你心意的东西!
在电脑里: 它就是把稠密向量搜索和稀疏向量搜索的结果合并起来,让你可以同时根据“语义意思”(稠密)和“关键词”(稀疏)来查找信息,得到更准确、更全面的结果。比如,你问“一只可爱的猫”,电脑既能理解“猫”的样子(稠密),也能识别“可爱”这个关键词(稀疏),然后给你最好的答案。

总结:
稠密向量: 抽屉柜里东西很多。
稀疏向量: 抽屉柜里东西很少,大部分是空的。
稠密索引: 给东西很多的柜子做的详细地图。
稀疏索引: 给东西很少的柜子做的聪明地图(只记有东西的地方)。
混合搜索: 把两种找东西的方法(稠密和稀疏)混在一起用,找到最棒的结果!

# 示例伪代码
dense_query_vector = [...] # 查询的稠密向量
sparse_query_vector = {token_id1: weight1} # 查询的稀疏向量

# 执行混合搜索
search_params = {
    "metric_type": "COSINE", # 稠密部分的度量
    "params": {"nprobe": 10},
    "expr": "some_scalar_filter", # 可选的标量过滤条件
}

results = milvus_client.hybrid_search(
    collection_name,
    reqs=[ # 定义每个向量字段的搜索请求
        AnnSearchRequest(dense_query_vector, "dense_vector", search_params, limit=10),
        AnnSearchRequest(sparse_query_vector, "sparse_vector", {"metric_type": "IP"}, limit=10) # 稀疏向量的搜索参数
    ],
    rerank=RRFRanker(), # 指定如何融合和重排结果,例如 RRF (Reciprocal Rank Fusion)
    limit=10, # 最终返回的 Top-K 数量
    output_fields=["text", "id"]
)
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐