Milvus:向量字段-二进制向量、稀疏向量与密集向量(六)
一、向量类型概念深度解析
1.1 什么是向量?
在机器学习和数据科学中,向量是用来表示对象特征的数字数组。每个维度代表一个特定的特征,向量值表示该特征的强度或重要性。
1.2 三种向量类型核心概念
密集向量(Dense Vector)
定义:密集向量是由连续实数构成的数组,其中大部分或所有元素都包含有意义的非零值。
核心特征:
- 高信息密度:每个维度都承载语义信息
- 连续表示:值为连续的浮点数
- 语义丰富:能够捕捉复杂的语义关系
- 固定维度:通常为384、768、1024等固定长度
直观理解:
想象一个学生的综合能力评估:
[数学能力: 0.85, 语文能力: 0.92, 英语能力: 0.78, 逻辑思维: 0.88, ...]
每个维度都有具体的能力分数,共同构成完整的能力画像。典型示例:
# BERT模型生成的文本向量(前8维示例)
dense_vector = [-0.013052909, # 语义维度10.020387933, # 语义维度2 -0.007869, # 语义维度3-0.11111383, # 语义维度4-0.030188112, # 语义维度5-0.0053388323, # 语义维度60.0010654867, # 语义维度70.072027855, # 语义维度8# ... 更多语义维度
]稀疏向量(Sparse Vector)
定义:稀疏向量是大部分元素为零,只有少数维度有非零值的高维向量。
核心特征:
- 低信息密度:大部分维度为零值
- 关键词驱动:非零值对应重要特征或关键词
- 高维度:通常有数万到数百万个维度
- 高效存储:只存储非零值及其位置
直观理解:
想象一个图书馆的书籍分类:
{计算机类: 0.8, 文学类: 0, 历史类: 0, 数学类: 0.6, 物理类: 0, 艺术类: 0.3, ...}
只记录实际存在的书籍类别,忽略不存在的类别。典型示例:
# 文档关键词的稀疏表示
sparse_vector = {27: 0.5, # 维度27:"机器学习" - 权重0.5100: 0.3, # 维度100:"算法" - 权重0.35369: 0.6, # 维度5369:"深度学习" - 权重0.6# 其他数万个维度都为0,不存储
}二进制向量(Binary Vector)
定义:二进制向量是只包含0和1两种值的向量,是密集向量的二值化版本。
核心特征:
- 二值表示:每个维度只能是0或1
- 极度压缩:存储空间大幅减少
- 计算高效:使用位运算快速计算相似度
- 信息简化:丢失部分精度信息
直观理解:
想象一个简单的特征检查表:
[有红色: 1, 有圆形: 0, 有纹理: 1, 是大尺寸: 0, 是金属: 1, ...]
只记录特征是否存在,不记录强度或程度。典型示例:
# 图像感知哈希的二进制向量
binary_vector = [1, 0, 1, 1, 0, 0, 1, 0, # 字节1:图像区块1的特征0, 1, 0, 1, 1, 0, 1, 1, # 字节2:图像区块2的特征1, 1, 0, 0, 1, 0, 0, 1, # 字节3:图像区块3的特征# ... 更多图像特征位
]1.3 三种向量的关系与演进
信息密度与计算复杂度关系
二进制向量 ←---→ 稀疏向量 ←---→ 密集向量↓ ↓ ↓
效率最高 平衡效率精度 精度最高
存储最小 中等存储 存储最大
速度最快 中等速度 速度较慢适用场景的思维模型
二进制向量 - "快速筛选"
- 像超市的快速结账通道
- 不求完美,但求快速找到大致匹配
- 适合:初筛、去重、移动端
稀疏向量 - "精确查找"
- 像图书馆的目录检索系统
- 基于明确的关键词和分类
- 适合:文档检索、关键词搜索
密集向量 - "智能理解"
- 像经验丰富的专业顾问
- 理解深层含义和复杂关系
- 适合:语义搜索、智能推荐
二、二进制向量技术详解
2.1 二进制向量核心概念
什么是二进制向量?
二进制向量是将高维浮点向量转换为只包含0和1的二进制表示:
# 二进制向量示例
binary_vector_8d = [1, 0, 1, 1, 0, 0, 1, 0] # 8维二进制向量
binary_vector_16d = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] # 16维核心优势
优势 | 说明 | 影响 |
存储效率 | 每个维度仅需1位 | 存储空间减少8-16倍 |
计算速度 | 使用位运算(XOR) | 计算速度提升10-100倍 |
资源友好 | 低内存占用 | 适合移动设备、嵌入式系统 |
实时性能 | 快速相似性计算 | 支持大规模实时推荐 |
2.2 二进制向量完整实践
创建二进制向量 Collection
from pymilvus import MilvusClient, DataTypedef create_binary_vector_collection():"""创建二进制向量 Collection 完整示例"""client = MilvusClient(uri="http://localhost:19530")# 清理现有 Collectionif client.has_collection("binary_vector_demo"):client.drop_collection("binary_vector_demo")# 创建 Schemaschema = client.create_schema(auto_id=True,enable_dynamic_fields=True,)# 添加主键字段schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)# 添加二进制向量字段 - 注意:维度必须是8的倍数schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=128 # 128维,对应16字节)# 添加元数据字段schema.add_field(field_name="description", datatype=DataType.VARCHAR, max_length=500)# 配置索引参数index_params = client.prepare_index_params()index_params.add_index(field_name="binary_vector",index_name="binary_idx",index_type="BIN_IVF_FLAT", # 二进制向量专用索引metric_type="HAMMING", # 汉明距离params={"nlist": 1024})# 创建 Collectionclient.create_collection(collection_name="binary_vector_demo",schema=schema,index_params=index_params)print("✅ 二进制向量 Collection 创建成功")return client# 执行创建
binary_client = create_binary_vector_collection()二进制向量数据转换与插入
def binary_vector_utils():"""二进制向量工具函数"""def bool_list_to_bytes(bool_list):"""将布尔列表转换为字节数组"""if len(bool_list) % 8 != 0:raise ValueError("布尔列表长度必须是8的倍数")byte_array = bytearray(len(bool_list) // 8)for i, bit in enumerate(bool_list):if bit == 1:index = i // 8shift = i % 8byte_array[index] |= (1 << shift)return bytes(byte_array)def bytes_to_bool_list(byte_data, dim):"""将字节数组转换回布尔列表"""bool_list = []for byte in byte_data:for i in range(8):bool_list.append((byte >> i) & 1)return bool_list[:dim]return bool_list_to_bytes, bytes_to_bool_list# 使用工具函数
bool_to_bytes, bytes_to_bool = binary_vector_utils()def insert_binary_data(client):"""插入二进制向量数据"""# 生成示例二进制向量数据(128维)binary_data = [{"binary_vector": bool_to_bytes([1, 0, 0, 1, 1, 0, 1, 1] * 16), # 128维"description": "科技类内容特征向量"},{"binary_vector": bool_to_bytes([0, 1, 0, 1, 0, 1, 0, 0] * 16),"description": "教育类内容特征向量"},{"binary_vector": bool_to_bytes([1, 1, 0, 0, 1, 0, 1, 0] * 16),"description": "娱乐类内容特征向量"}]# 插入数据result = client.insert(collection_name="binary_vector_demo",data=binary_data)print(f"✅ 插入 {len(result['ids'])} 条二进制向量数据")return result# 插入数据
insert_result = insert_binary_data(binary_client)二进制向量搜索
def binary_vector_search(client):"""二进制向量相似性搜索"""# 准备查询向量query_bool = [1, 0, 0, 1, 1, 0, 1, 1] * 16 # 128维查询向量query_vector = bool_to_bytes(query_bool)# 搜索参数search_params = {"params": {"nprobe": 10}}# 执行搜索results = client.search(collection_name="binary_vector_demo",data=[query_vector],anns_field="binary_vector",search_params=search_params,limit=3,output_fields=["description"])print("🔍 二进制向量搜索结果:")for i, hits in enumerate(results):print(f"查询 {i+1}:")for hit in hits:# 汉明距离越小表示越相似similarity = 1 - (hit['distance'] / 128) # 转换为相似度分数print(f" - ID: {hit['id']}, 汉明距离: {hit['distance']}, 相似度: {similarity:.3f}")print(f" 描述: {hit['entity']['description']}")return results# 执行搜索
search_results = binary_vector_search(binary_client)三、稀疏向量技术详解
3.1 稀疏向量核心概念
什么是稀疏向量?
稀疏向量是高维向量,其中大部分元素为零:
# 稀疏向量表示示例
dense_vector = [0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.7] # 稠密表示
sparse_vector = {2: 0.2, 7: 0.5, 9: 0.7} # 稀疏表示 - 只存储非零值稀疏向量生成方法
方法 | 技术 | 特点 |
传统统计 | TF-IDF, BM25 | 基于词频统计,精确匹配 |
神经稀疏 | SPLADE, DeepCT | 基于深度学习,语义增强 |
3.2 稀疏向量完整实践
创建稀疏向量 Collection
def create_sparse_vector_collection():"""创建稀疏向量 Collection"""client = MilvusClient(uri="http://localhost:19530")# 清理现有 Collectionif client.has_collection("sparse_vector_demo"):client.drop_collection("sparse_vector_demo")# 创建 Schemaschema = client.create_schema(auto_id=True,enable_dynamic_fields=True,)# 添加字段schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR # 稀疏向量类型)schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535)schema.add_field(field_name="category", datatype=DataType.VARCHAR, max_length=100)# 配置稀疏向量索引index_params = client.prepare_index_params()index_params.add_index(field_name="sparse_vector",index_name="sparse_idx",index_type="SPARSE_INVERTED_INDEX",metric_type="IP", # 内积params={"inverted_index_algo": "DAAT_MAXSCORE"})# 创建 Collectionclient.create_collection(collection_name="sparse_vector_demo",schema=schema,index_params=index_params)print("✅ 稀疏向量 Collection 创建成功")return client# 执行创建
sparse_client = create_sparse_vector_collection()稀疏向量数据插入
def insert_sparse_data(client):"""插入稀疏向量数据"""# 稀疏向量数据 - 使用字典表示sparse_data = [{"text": "机器学习深度学习自然语言处理","sparse_vector": {1: 0.8, # 机器学习5: 0.9, # 深度学习 10: 0.7, # 自然语言处理15: 0.3, # 人工智能20: 0.1 # 算法},"category": "AI"},{"text": "数据库存储系统分布式计算","sparse_vector": {2: 0.6, # 数据库6: 0.8, # 存储系统12: 0.9, # 分布式计算18: 0.4, # 大数据25: 0.2 # 云计算},"category": "数据库"},{"text": "网络安全加密算法隐私保护","sparse_vector": {3: 0.7, # 网络安全8: 0.8, # 加密算法14: 0.6, # 隐私保护22: 0.5, # 信息安全30: 0.3 # 数据保护},"category": "安全"}]# 插入数据result = client.insert(collection_name="sparse_vector_demo",data=sparse_data)print(f"✅ 插入 {len(result['ids'])} 条稀疏向量数据")return result# 插入数据
sparse_insert_result = insert_sparse_data(sparse_client)稀疏向量搜索
def sparse_vector_search(client):"""稀疏向量相似性搜索"""# 查询稀疏向量query_sparse = {1: 0.5, # 机器学习5: 0.6, # 深度学习10: 0.4 # 自然语言处理}# 搜索参数search_params = {"params": {"drop_ratio_search": 0.1} # 丢弃比例,加速搜索}# 执行搜索results = client.search(collection_name="sparse_vector_demo",data=[query_sparse],anns_field="sparse_vector",search_params=search_params,limit=3,output_fields=["text", "category"])print("🔍 稀疏向量搜索结果:")for i, hits in enumerate(results):print(f"查询 {i+1}:")for hit in hits:print(f" - ID: {hit['id']}, 相似度: {hit['distance']:.4f}")print(f" 文本: {hit['entity']['text']}")print(f" 类别: {hit['entity']['category']}")return results# 执行搜索
sparse_search_results = sparse_vector_search(sparse_client)四、密集向量技术详解
4.1 密集向量核心概念
什么是密集向量?
密集向量是由实数组成的数组,大部分元素不为零:
# 密集向量示例
dense_vector_4d = [0.1, 0.2, 0.3, 0.7]
dense_vector_768d = [-0.013, 0.020, -0.007, -0.111, ...] # BERT输出密集向量数据类型对比
数据类型 | 精度 | 存储 | 适用场景 |
FLOAT_VECTOR | 32位 | 标准 | 高精度语义搜索 |
FLOAT16_VECTOR | 16位 | 50%节省 | 推荐系统召回 |
BFLOAT16_VECTOR | 16位 | 50%节省 | 大规模图像检索 |
INT8_VECTOR | 8位 | 75%节省 | 量化模型推理 |
4.2 密集向量完整实践
创建密集向量 Collection
def create_dense_vector_collection():"""创建密集向量 Collection"""client = MilvusClient(uri="http://localhost:19530")# 清理现有 Collectionif client.has_collection("dense_vector_demo"):client.drop_collection("dense_vector_demo")# 创建 Schemaschema = client.create_schema(auto_id=True,enable_dynamic_fields=True,)# 添加字段schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=384 # 常用维度:384, 768, 1024)schema.add_field(field_name="content", datatype=DataType.VARCHAR, max_length=2000)schema.add_field(field_name="embedding_model", datatype=DataType.VARCHAR, max_length=100)# 配置索引index_params = client.prepare_index_params()index_params.add_index(field_name="dense_vector",index_name="dense_idx",index_type="AUTOINDEX",metric_type="COSINE" # 余弦相似度)# 创建 Collectionclient.create_collection(collection_name="dense_vector_demo",schema=schema,index_params=index_params)print("✅ 密集向量 Collection 创建成功")return client# 执行创建
dense_client = create_dense_vector_collection()密集向量数据插入
def insert_dense_data(client):"""插入密集向量数据"""# 模拟不同嵌入模型生成的密集向量dense_data = [{"dense_vector": [0.1, 0.2, 0.3, 0.4] * 96, # 384维"content": "人工智能是未来科技发展的重要方向","embedding_model": "BERT-base"},{"dense_vector": [0.2, 0.3, 0.4, 0.5] * 96,"content": "机器学习算法在数据分析中广泛应用", "embedding_model": "BERT-base"},{"dense_vector": [0.15, 0.25, 0.35, 0.45] * 96,"content": "深度学习模型需要大量计算资源","embedding_model": "Sentence-BERT"}]# 插入数据result = client.insert(collection_name="dense_vector_demo", data=dense_data)print(f"✅ 插入 {len(result['ids'])} 条密集向量数据")return result# 插入数据
dense_insert_result = insert_dense_data(dense_client)密集向量搜索
def dense_vector_search(client):"""密集向量相似性搜索"""# 查询向量query_vector = [0.12, 0.22, 0.32, 0.42] * 96 # 384维查询向量# 搜索参数search_params = {"params": {"nprobe": 16}}# 执行搜索results = client.search(collection_name="dense_vector_demo",data=[query_vector],anns_field="dense_vector", search_params=search_params,limit=3,output_fields=["content", "embedding_model"])print("🔍 密集向量搜索结果:")for i, hits in enumerate(results):print(f"查询 {i+1}:")for hit in hits:print(f" - ID: {hit['id']}, 相似度: {hit['distance']:.4f}")print(f" 内容: {hit['entity']['content']}")print(f" 模型: {hit['entity']['embedding_model']}")return results# 执行搜索
dense_search_results = dense_vector_search(dense_client)五、三种向量类型对比与应用场景
5.1 技术特性对比
特性 | 二进制向量 | 稀疏向量 | 密集向量 |
数据表示 | 0/1二进制 | 键值对{索引:值} | 浮点数数组 |
存储效率 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
计算速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
语义理解 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
精度损失 | 中-高 | 低-中 | 无-低 |
适用维度 | 中低维度 | 超高维度 | 中高维度 |
典型维度 | 64-512维 | 1万-100万维 | 384-1024维 |
5.2 应用场景详解
二进制向量应用场景
1. 图像去重与版权保护
- 技术原理:使用感知哈希(pHash)算法生成图像指纹
- 优势特点:快速计算图像相似性,高效识别重复或侵权内容
- 典型应用:
- 社交媒体平台的内容去重
- 数字版权管理(DRM)系统
- 电商平台商品图片查重
2. 移动端实时推荐
- 技术原理:将浮点向量二值化,大幅减少模型大小
- 优势特点:低内存占用,支持设备端实时推理
- 典型应用:
- 移动APP的个性化内容推荐
- 嵌入式设备的智能功能
- 离线环境下的相似内容推荐
3. 大规模检索系统
- 技术原理:采用哈希学习技术,将高维数据映射到汉明空间
- 优势特点:支持亿级数据量的毫秒级检索
- 典型应用:
- 电商平台的商品检索
- 视频平台的内容检索
- 新闻资讯的相似文章推荐
稀疏向量应用场景
1. 关键词搜索与文档检索
- 技术原理:基于BM25、TF-IDF等传统信息检索算法
- 优势特点:精确的术语匹配,结果可解释性强
- 典型应用:
- 企业知识库的文档检索
- 学术论文检索系统
- 站内搜索引擎
2. 专业领域精准匹配
- 技术原理:使用SPLADE等神经稀疏嵌入模型
- 优势特点:对专业术语和领域词汇有更好的理解
- 典型应用:
- 法律案例和法条检索
- 医疗文献查询系统
- 专利检索与分析
3. 电商搜索与商品推荐
- 技术原理:基于商品属性和用户行为的稀疏表示
- 优势特点:对商品属性进行精确匹配和筛选
- 典型应用:
- 电商平台的商品搜索
- 基于属性的商品推荐
- 多维度商品筛选
密集向量应用场景
1. 深度语义搜索
- 技术原理:使用BERT、Sentence-BERT等预训练语言模型
- 优势特点:理解深层语义,支持同义词和上下文理解
- 典型应用:
- 智能客服问答系统
- 企业知识库语义搜索
- 内容平台的智能推荐
2. 个性化推荐系统
- 技术原理:基于用户行为和内容的深度嵌入表示
- 优势特点:能够捕捉用户的深层兴趣和偏好
- 典型应用:
- 流媒体平台的内容推荐
- 电商平台的个性化商品推荐
- 社交网络的好友推荐
3. 多模态检索与理解
- 技术原理:采用CLIP、Multimodal BERT等跨模态模型
- 优势特点:实现文本、图像、音频等多模态数据的统一表示
- 典型应用:
- 以文搜图、以图搜文
- 跨模态内容检索
- 多媒体内容理解
5.3 混合使用策略
召回-排序两阶段策略
- 第一阶段:快速召回
- 使用二进制向量进行粗筛,快速从海量数据中召回候选集
- 目标:覆盖尽可能多的相关结果,保证召回率
- 第二阶段:精准排序
- 使用密集向量对召回结果进行精细排序
- 目标:提升结果的相关性和准确性
多路召回融合策略
- 语义召回通路
- 使用密集向量捕捉语义相似性
- 覆盖语义相关但关键词不同的内容
- 关键词召回通路
- 使用稀疏向量进行精确关键词匹配
- 确保重要关键词的精确命中
- 去重召回通路
- 使用二进制向量识别近似重复内容
- 提升结果的多样性
渐进式检索策略
- 第一层:二进制向量粗筛
- 从全量数据中快速筛选出大致相关的内容
- 减少后续处理的数据量
- 第二层:稀疏向量精筛
- 在粗筛结果基础上进行关键词精确匹配
- 进一步提升结果质量
- 第三层:密集向量重排
- 对精筛结果进行语义重排序
- 输出最终最优结果
六、选择指南与最佳实践
6.1 向量类型选择指南
基于数据规模的选择
- 亿级以上数据量
- 首选:二进制向量
- 备选:稀疏向量 + 二进制向量混合
- 理由:存储和计算效率是首要考虑因素
- 千万级数据量
- 推荐:稀疏向量 + 二进制向量组合
- 可选:优化的密集向量方案
- 理由:在精度和效率间取得平衡
- 百万级数据量
- 推荐:密集向量 + 稀疏向量组合
- 可选:纯密集向量方案
- 理由:可以追求更高的准确率
基于精度要求的选择
- 高精度场景(>95%)
- 首选:密集向量
- 适用:语义搜索、智能问答、重要推荐
- 中等精度场景(85%-95%)
- 推荐:稀疏向量
- 适用:文档检索、关键词搜索、商品匹配
- 基础精度场景(70%-85%)
- 推荐:二进制向量
- 适用:内容去重、初步筛选、移动端应用
基于响应时间要求的选择
- 毫秒级响应(<100ms)
- 首选:二进制向量
- 适用:实时推荐、交互式搜索
- 百毫秒级响应(100-500ms)
- 推荐:稀疏向量
- 适用:一般搜索、批量处理
- 秒级响应(>500ms)
- 可选:密集向量
- 适用:离线分析、深度挖掘
基于硬件资源的选择
- 资源受限环境
- 移动设备、嵌入式系统:二进制向量
- 边缘计算节点:稀疏向量
- 理由:低内存、低算力需求
- 中等资源环境
- 普通服务器:稀疏向量 + 二进制向量
- 云服务器基础配置:密集向量(优化版)
- 资源充足环境
- GPU服务器:密集向量
- 大规模集群:任意向量类型组合
6.2 性能指标参考
向量类型 | QPS | 平均延迟 | 准确率范围 | 内存占用 |
二进制向量 | 10,000+ | 70%-85% | 极低 | |
稀疏向量 | 1,000-5,000 | 10-50ms | 85%-95% | 中等 |
密集向量 | 100-1,000 | 50-200ms | 95%-99% | 较高 |

