【RAG】【vector_stores054】Milvus混合索引示例分析
1. 案例目标本示例展示了如何使用LlamaIndex与Milvus向量数据库实现混合搜索功能结合语义搜索和全文搜索的优势提高搜索结果的相关性和准确性。主要目标包括演示如何配置Milvus向量存储以支持混合搜索展示如何使用BM25算法实现全文搜索展示如何使用BGE-M3等稀疏嵌入模型实现混合搜索演示如何自定义文本分析器和稀疏嵌入函数展示如何配置不同的混合重排序策略2. 技术栈与核心依赖LlamaIndexMilvusOpenAIBM25BGE-M3FlagEmbedding核心依赖包llama-index-vector-stores-milvus- LlamaIndex的Milvus向量存储集成llama-index-embeddings-openai- OpenAI嵌入模型集成llama-index-llms-openai- OpenAI语言模型集成pymilvus- Milvus Python客户端FlagEmbedding- BGE-M3稀疏嵌入模型3. 环境配置3.1 安装依赖!pip install -q llama-index-vector-stores-milvus llama-index-embeddings-openai llama-index-llms-openai pymilvus!pip install -q FlagEmbedding3.2 配置OpenAI APIimport os os.environ[OPENAI_API_KEY] sk-...3.3 配置Milvus服务器URI http://localhost:19530 # TOKEN ... # 如果使用Zilliz Cloud需要设置token4. 案例实现4.1 基础混合搜索实现首先创建支持混合搜索的MilvusVectorStore同时启用密集嵌入和稀疏嵌入from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, StorageContext from llama_index.vector_stores.milvus import MilvusVectorStore # 加载文档 documents SimpleDirectoryReader(./data/paul_graham).load_data() # 创建支持混合搜索的向量存储 vector_store MilvusVectorStore( uriURI, # tokenTOKEN, dim1536, enable_sparseTrue, # 启用稀疏嵌入 overwriteTrue, ) # 创建索引 storage_context StorageContext.from_defaults(vector_storevector_store) index VectorStoreIndex.from_documents( documents, storage_contextstorage_context )4.2 执行混合搜索查询设置查询引擎的vector_store_query_mode为hybrid以启用混合搜索import textwrap query_engine index.as_query_engine( vector_store_query_modehybrid, similarity_top_k5 ) response query_engine.query(What did the author learn at Viaweb?) print(textwrap.fill(str(response), 100))4.3 自定义文本分析器使用BM25BuiltInFunction自定义文本分析器配置tokenizer和filterfrom llama_index.vector_stores.milvus.utils import BM25BuiltInFunction bm25_function BM25BuiltInFunction( analyzer_params{ tokenizer: standard, filter: [ lowercase, # 内置过滤器 {type: length, max: 40}, # 自定义token长度限制 {type: stop, stop_words: [of, to]}, # 自定义停用词 ], }, enable_matchTrue, ) vector_store MilvusVectorStore( uriURI, dim1536, enable_sparseTrue, sparse_embedding_functionbm25_function, # 使用自定义分析器的BM25 overwriteTrue, )4.4 使用BGE-M3稀疏嵌入的混合搜索使用内置的BGEM3SparseEmbeddingFunction实现更高级的混合搜索from llama_index.vector_stores.milvus.utils import BGEM3SparseEmbeddingFunction vector_store MilvusVectorStore( uriURI, dim1536, enable_sparseTrue, sparse_embedding_functionBGEM3SparseEmbeddingFunction(), overwriteTrue, ) storage_context StorageContext.from_defaults(vector_storevector_store) index VectorStoreIndex.from_documents( documents, storage_contextstorage_context ) # 执行混合搜索查询 query_engine index.as_query_engine( vector_store_query_modehybrid, similarity_top_k5 ) response query_engine.query(What did the author learn at Viaweb??) print(textwrap.fill(str(response), 100))4.5 自定义稀疏嵌入函数实现自定义的稀疏嵌入函数继承BaseSparseEmbeddingFunctionfrom FlagEmbedding import BGEM3FlagModel from typing import List from llama_index.vector_stores.milvus.utils import BaseSparseEmbeddingFunction class ExampleEmbeddingFunction(BaseSparseEmbeddingFunction): def __init__(self): self.model BGEM3FlagModel(BAAI/bge-m3, use_fp16False) def encode_queries(self, queries: List[str]): outputs self.model.encode( queries, return_denseFalse, return_sparseTrue, return_colbert_vecsFalse, )[lexical_weights] return [self._to_standard_dict(output) for output in outputs] def encode_documents(self, documents: List[str]): outputs self.model.encode( documents, return_denseFalse, return_sparseTrue, return_colbert_vecsFalse, )[lexical_weights] return [self._to_standard_dict(output) for output in outputs] def _to_standard_dict(self, raw_output): result {} for k in raw_output: result[int(k)] raw_output[k] return result4.6 自定义混合重排序策略Milvus支持两种重排序策略RRF(Reciprocal Rank Fusion)和Weighted Scoring# 使用WeightedRanker设置密集和稀疏嵌入的权重 vector_store MilvusVectorStore( uriURI, dim1536, overwriteFalse, # 使用之前创建的集合 enable_sparseTrue, hybrid_rankerWeightedRanker, hybrid_ranker_params{weights: [1.0, 0.5]}, # 密集权重1.0稀疏权重0.5 ) index VectorStoreIndex.from_vector_store(vector_store) query_engine index.as_query_engine( vector_store_query_modehybrid, similarity_top_k5 ) response query_engine.query(What did the author learn at Viaweb?) print(textwrap.fill(str(response), 100))5. 案例效果本示例展示了混合搜索的多种实现方式和效果基础混合搜索结合OpenAI密集嵌入和BM25稀疏嵌入提供更全面的搜索结果自定义文本分析器通过配置tokenizer和filter优化文本处理效果BGE-M3稀疏嵌入使用更先进的稀疏嵌入模型提高搜索精度自定义稀疏嵌入函数允许用户实现特定的稀疏嵌入逻辑自定义重排序策略通过调整权重平衡语义搜索和全文搜索的重要性混合搜索相比单一搜索方式的优势语义搜索擅长理解概念和上下文关系全文搜索擅长精确匹配关键词混合搜索结合两者优势提供更相关、更全面的搜索结果6. 案例实现思路本案例的实现思路如下环境准备安装必要的依赖包配置OpenAI API和Milvus服务器连接数据加载使用SimpleDirectoryReader加载Paul Graham的文章数据向量存储配置创建MilvusVectorStore同时启用密集和稀疏嵌入索引构建使用VectorStoreIndex.from_documents构建索引查询执行设置vector_store_query_mode为hybrid执行混合搜索高级配置自定义文本分析器、稀疏嵌入函数和重排序策略关键技术点Milvus 2.3版本支持混合搜索功能通过enable_sparse参数启用稀疏嵌入通过sparse_embedding_function指定稀疏嵌入函数通过hybrid_ranker和hybrid_ranker_params配置重排序策略7. 扩展建议多语言支持尝试使用不同语言的文本分析器支持多语言混合搜索性能优化针对大规模数据优化索引构建和查询性能实时更新实现向量索引的实时更新功能多模态混合搜索结合文本、图像等多种模态的混合搜索分布式部署将Milvus部署为分布式集群提高可扩展性自定义重排序算法实现更复杂的重排序算法提高搜索精度查询结果分析添加查询结果分析功能了解不同搜索策略的贡献度8. 总结本示例详细介绍了如何使用LlamaIndex和Milvus实现混合搜索功能展示了从基础配置到高级自定义的完整流程。混合搜索结合了语义搜索和全文搜索的优势能够提供更相关、更全面的搜索结果。通过本示例我们学习了如何配置Milvus向量存储以支持混合搜索如何使用BM25和BGE-M3实现稀疏嵌入如何自定义文本分析器和稀疏嵌入函数如何配置不同的重排序策略这些技术可以应用于各种需要高精度搜索的场景如知识库检索、文档搜索、电商推荐等为用户提供更优质的搜索体验。