Milvus向量数据库-BM25稀疏嵌入

milvus向量数据库

milvus支持混合搜索,多个向量同时检索,然后进行重排序最终返回结果。多向量包括(多个密集向量或稀疏向量)

Embedding嵌入

它是一种机器学习概念,用于将数据映射到高维空间,其中具有相似语义的数据被放置在一起。通常是来自 BERT 或其他 Transformer 家族的深度神经网络,嵌入模型可以有效地用一系列称为向量的数字表示文本、图像和其他数据类型的语义。这些模型的一个关键特征是高维空间中向量之间的数学距离可以指示原始文本或图像的语义相似性。

嵌入有两个主要类别,每个类别产生不同类型的向量:

  • 密集嵌入(Dense embedding) :大多数嵌入模型将信息表示为数百到数千维的浮点向量。输出被称为“密集”向量,因为大多数维度具有非零值。例如,流行的开源嵌入模型 BAAI/bge-base-en-v1.5 输出 768 个浮点数的向量(768 维浮点向量)。
  • 稀疏嵌入(Sparse embedding) :相反��稀疏嵌入的输出向量大多数维度为零,即“稀疏”向量。这些向量通常具有更高的维度(数万甚至更多),这取决于标记词汇的大小。稀疏向量可以通过深度神经网络或对文本语料库进行的统计分析生成。由于它们的可解释性和观察到的更好的跨领域泛化能力,开发人员越来越多地采用稀疏嵌入作为密集嵌入的补充。

Milvus支持的稀疏嵌入函数

嵌入函数 类型 API 或开源
<think>好的,我现在需要帮助用户了解如何在Milvus中实现混合检索并应用过滤条件。首先,我得回顾一下Milvus的相关知识,确保自己理解正确。混合检索通常指的是同时使用向量搜索和标量过滤,或者结合稠密向量和稀疏向量(比如BM25)的搜索方式。用户提到的过滤条件可能涉及标量字段的过滤。 根据提供的引用,特别是引用[3]和[4],Milvus内置了BM25算法,支持混合检索,并且可以在搜索时添加标量过滤条件。需要明确混合检索在Milvus中的两种常见情况:一种是向量搜索结合标量过滤,另一种是稠密向量与稀疏向量的混合搜索。用户的问题可能同时涉及这两个方面,但需要具体分析。 接下来,我需要按照用户的要求分步骤解释实现方式。首先,确认数据准备阶段,包括定义集合结构,包含向量字段和标量字段。然后,在插入数据时,需要包含这些字段。接着,在搜索时,使用布尔表达式进行标量过滤,并指定混合搜索的参数,比如结合BM25和向量相似度。 需要注意不同Milvus版本可能有所差异,但根据引用[4],官方文档中的示例展示了如何加载集合、执行混合搜索,并应用过滤条件。可能还需要提到如何设置搜索参数,比如调整两者的权重,以及如何解析返回结果。 用户可能还关心实际应用的例子,比如在RAG系统中使用混合检索提升效果。需要确保步骤清晰,代码示例正确,并且符合用户提供的引用内容。同时,生成的相关问题需要与主题相关,帮助用户进一步探索。</think>### Milvus混合检索实现方式及过滤条件使用方法 #### 一、混合检索实现原理 Milvus的混合检索主要包含两种形式: 1. **向量相似度+标量过滤**:在向量搜索基础上,通过布尔表达式筛选标量字段(如ID、分类标签等)[^4] 2. **稠密向量+稀疏向量混合搜索**:同时使用稠密向量(如BERT嵌入)和稀疏向量(BM25算法生成的词袋向量)进行联合检索[^3] #### 二、实现步骤 ##### 1. 数据准备阶段 ```python from pymilvus import CollectionSchema, FieldSchema, DataType # 定义字段(包含向量字段和标量字段) fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=1000), FieldSchema(name="category", dtype=DataType.INT64), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768), FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR) ] # 创建集合 schema = CollectionSchema(fields) collection = Collection("hybrid_collection", schema) ``` ##### 2. 数据插入 ```python data = [ [1, 2, 3], # ids ["文本内容1", "文本内容2", "文本内容3"], # contents [101, 102, 101], # categories [...], # 稠密向量数组 {...} # 稀疏向量字典(BM25自动生成) ] collection.insert(data) ``` ##### 3. 创建索引 ```python # 稠密向量索引 index_params = { "index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 128} } collection.create_index("vector", index_params) # 稀疏向量索引自动创建(BM25) ``` ##### 4. 执行混合检索 ```python # 查询条件设置 search_params = { "metric_type": "L2", "params": {"nprobe": 10}, "anns_field": "vector", "sparse_params": { "analyzer": "milvus_bm25", # 使用内置分词器 "topk": 50 } } # 混合搜索请求 results = collection.search( data=[query_vector], # 查询向量 anns_field="vector", param=search_params, limit=10, expr="category == 101", # 标量过滤条件[^4] output_fields=["content", "category"], hybrid=True, rerank=rrf() # 结果重排序策略 ) ``` #### 三、过滤条件使用技巧 1. **布尔表达式**:支持`&&`, `||`, `==`, `>`, `<`等运算符 - 示例:`"(rating > 4) && (category in [101, 102])"`[^4] 2. **动态范围过滤**: ```python expr = f"timestamp >= {start_time} && timestamp <= {end_time}" ``` 3. **多条件组合**: ```python expr = "(user_type == 'VIP' && click_count > 10) || (is_recommended == true)" ``` 4. **性能优化**: - 为过滤字段建立标量索引 - 优先使用数值型过滤条件 - 避免全表扫描表达式(如`LIKE`模糊查询) #### 四、典型应用场景 1. **电商推荐**:`向量相似度(商品特征)+ 价格区间过滤` 2. **内容检索**:`BM25(关键词匹配)+ 用户画像向量相似度` 3. **时间序列分析**:`时序向量相似度 + 时间范围过滤`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值