【RAG】【vector_stores053】Milvus全文搜索向量存储示例分析

张开发
2026/4/17 3:44:21 15 分钟阅读

分享文章

【RAG】【vector_stores053】Milvus全文搜索向量存储示例分析
案例目标本案例展示了如何使用LlamaIndex和Milvus向量数据库构建支持全文搜索和混合搜索的检索增强生成(RAG)系统。通过Milvus 2.5的Sparse-BM25方法原始文本可以自动转换为稀疏向量无需手动生成稀疏嵌入从而实现混合搜索策略平衡语义理解与关键词相关性。案例从实现纯全文搜索开始然后通过集成语义搜索增强功能提供更全面的搜索结果。这种混合搜索方法在单一方法不足的情况下特别有用可以显著提高信息检索的准确性和相关性。技术栈与核心依赖LlamaIndex Milvus OpenAI BM25算法 全文搜索 混合搜索# 核心依赖包 pip install llama-index-vector-stores-milvus pip install llama-index-embeddings-openai pip install llama-index-llms-openai本示例使用了OpenAI的嵌入模型和GPT模型但也可以使用其他嵌入模型和LLM。Milvus 2.5的Sparse-BM25方法支持自动将原始文本转换为稀疏向量无需手动生成稀疏嵌入。环境配置运行此示例需要以下环境配置安装必要的Python包llama-index-vector-stores-milvus、llama-index-embeddings-openai和llama-index-llms-openai设置OpenAI API密钥配置Milvus服务器URI可以是本地服务器或Zilliz Cloud下载示例数据Paul Graham的文章# OpenAI API配置 import openai openai.api_key sk- # Milvus配置 URI http://localhost:19530 # 本地Milvus服务器 # TOKEN # 如果使用Zilliz Cloud需要设置TOKEN注意全文搜索目前支持Milvus Standalone、Milvus Distributed和Zilliz Cloud但尚不支持Milvus Lite计划在未来实现。如果需要更多信息可以联系supportzilliz.com。案例实现本案例的实现分为两个主要部分全文搜索实现和混合搜索实现。1. 导入必要的库和模块from llama_index.core import SimpleDirectoryReader, VectorStoreIndex, StorageContext from llama_index.vector_stores.milvus import MilvusVectorStore from llama_index.vector_stores.milvus.utils import BM25BuiltInFunction from llama_index.core import Settings2. 加载文档# 使用SimpleDirectoryReader加载文档 documents SimpleDirectoryReader(./data/paul_graham/).load_data()3. 实现全文搜索首先我们实现仅使用全文搜索的RAG系统# 跳过密集嵌入模型 Settings.embed_model None # 构建Milvus向量存储仅启用稀疏向量 vector_store MilvusVectorStore( uriURI, enable_denseFalse, # 禁用密集向量 enable_sparseTrue, # 启用稀疏向量用于全文搜索 sparse_embedding_functionBM25BuiltInFunction(), overwriteTrue, ) # 存储文档到Milvus storage_context StorageContext.from_defaults(vector_storevector_store) index VectorStoreIndex.from_documents( documents, storage_contextstorage_context )上述代码将示例文档插入Milvus并构建索引以启用BM25排名进行全文搜索。它禁用了密集嵌入并使用默认参数的BM25BuiltInFunction。4. 执行全文搜索查询import textwrap # 创建查询引擎使用稀疏向量模式 query_engine index.as_query_engine( vector_store_query_modesparse, similarity_top_k5 ) answer query_engine.query(What did the author learn at Viaweb?) print(textwrap.fill(str(answer), 100))5. 自定义文本分析器分析器在全文搜索中起着至关重要的作用通过将句子分解为标记并执行词法处理如词干提取和停用词移除。它们通常是特定于语言的。Milvus支持两种类型的分析器内置分析器和自定义分析器。bm25_function BM25BuiltInFunction( analyzer_params{ tokenizer: standard, filter: [ lowercase, # 内置过滤器 {type: length, max: 40}, # 自定义单个标记的大小上限 {type: stop, stop_words: [of, to]}, # 自定义停用词 ], }, enable_matchTrue, )6. 实现混合搜索混合搜索系统结合了语义搜索和全文搜索优化了RAG系统中的检索性能。以下示例使用OpenAI嵌入进行语义搜索使用BM25进行全文搜索# 创建向量存储同时启用密集向量和稀疏向量 vector_store MilvusVectorStore( uriURI, dim1536, # OpenAI嵌入的维度 enable_sparseTrue, # 启用稀疏向量 sparse_embedding_functionBM25BuiltInFunction(), overwriteTrue, # hybrid_rankerRRFRanker, # hybrid_ranker默认为RRFRanker # hybrid_ranker_params{}, # hybrid_ranker_params默认为{} ) storage_context StorageContext.from_defaults(vector_storevector_store) index VectorStoreIndex.from_documents( documents, storage_contextstorage_context, embed_modeldefault, # default将使用OpenAI嵌入 )这种方法将文档存储在具有两个向量字段的Milvus集合中embedding由OpenAI嵌入模型生成的密集嵌入用于语义搜索sparse_embedding使用BM25BuiltInFunction计算的稀疏嵌入用于全文搜索此外我们应用了使用RRFRanker及其默认参数的重新排名策略。要自定义重新排名器可以按照Milvus重新排名指南配置hybrid_ranker和hybrid_ranker_params。7. 执行混合搜索查询# 创建混合搜索查询引擎 query_engine index.as_query_engine( vector_store_query_modehybrid, similarity_top_k5 ) answer query_engine.query(What did the author learn at Viaweb?) print(textwrap.fill(str(answer), 100))这种混合方法通过利用语义和基于关键字的检索确保在RAG系统中提供更准确、上下文感知的响应。案例效果本案例成功实现了以下功能1. 全文搜索实现成功实现了基于BM25算法的全文搜索功能能够根据关键词精确匹配文档内容并按照相关性对结果进行排名。通过禁用密集嵌入并启用稀疏嵌入系统专注于文本的关键词匹配提供了精确的搜索结果。2. 混合搜索实现成功实现了结合语义搜索和全文搜索的混合搜索功能通过同时使用密集向量和稀疏向量系统能够同时理解语义含义和匹配关键词提供更全面和准确的搜索结果。3. 自定义文本分析器展示了如何自定义文本分析器通过配置分词器、过滤器等参数优化全文搜索的效果提高搜索的准确性和相关性。4. 搜索效果对比通过对比全文搜索和混合搜索的结果可以看出混合搜索在保持关键词匹配准确性的同时能够更好地理解查询的语义含义提供更全面和相关的搜索结果。搜索方式优点缺点全文搜索精确匹配关键词结果可预测无法理解语义含义可能错过相关内容语义搜索理解语义含义能找到相关内容可能错过精确关键词匹配混合搜索结合两者优点提供更全面准确的结果实现复杂度较高案例实现思路本案例的实现思路如下全文搜索原理全文搜索使用精确的关键词匹配通常利用BM25等算法对文档进行相关性排名。在RAG系统中这种方法检索相关文本以增强AI生成的响应。Milvus Sparse-BM25方法利用Milvus 2.5的Sparse-BM25方法原始文本可以自动转换为稀疏向量无需手动生成稀疏嵌入简化了全文搜索的实现。向量存储配置创建MilvusVectorStore对象配置Milvus服务器的连接参数、集合名称、向量维度等。通过设置enable_dense和enable_sparse参数控制是否启用密集向量和稀疏向量。BM25BuiltInFunction使用BM25BuiltInFunction作为稀疏嵌入函数自动应用BM25算法对文本进行分词和评分实现全文搜索功能。混合搜索策略通过同时启用密集向量和稀疏向量并使用RRFRanker进行重新排名实现混合搜索策略平衡语义理解和关键词相关性。文本分析器定制通过配置analyzer_params参数自定义文本分析器包括分词器、过滤器等优化全文搜索的效果。整个实现充分利用了Milvus 2.5的新特性特别是Sparse-BM25方法和混合搜索功能通过结合语义搜索和全文搜索提供了更全面和准确的搜索结果。案例中的代码实现清晰展示了如何配置和使用这些功能为开发者构建高效的RAG系统提供了参考。扩展建议基于本案例可以考虑以下扩展方向高级重新排名策略探索更复杂的重新排名策略如使用机器学习模型对搜索结果进行重新排序提高搜索结果的准确性。多语言支持扩展对多语言的支持为不同语言配置适当的文本分析器和停用词列表提高多语言搜索的准确性。动态权重调整根据查询类型和内容动态调整语义搜索和全文搜索的权重优化不同场景下的搜索效果。查询意图识别添加查询意图识别功能根据用户意图自动选择最适合的搜索模式全文搜索、语义搜索或混合搜索。搜索结果可视化开发搜索结果可视化工具直观展示不同搜索模式的结果差异和重叠部分帮助用户理解搜索结果。性能优化针对大规模数据集进行性能优化如使用分片、索引优化等技术提高搜索速度和系统吞吐量。实时更新实现文档的实时更新和增量索引确保搜索结果始终反映最新的文档内容。用户反馈循环添加用户反馈机制收集用户对搜索结果的评价利用这些反馈不断优化搜索算法和参数。总结本案例详细展示了如何使用LlamaIndex和Milvus 2.5构建支持全文搜索和混合搜索的RAG系统。通过利用Milvus的Sparse-BM25方法实现了自动将原始文本转换为稀疏向量的功能简化了全文搜索的实现。案例的核心价值在于展示了全文搜索和混合搜索在RAG系统中的应用和优势提供了具体的代码实现演示了如何配置和使用Milvus的全文搜索功能展示了如何自定义文本分析器优化全文搜索的效果提供了可复用的代码实现便于开发者应用到实际项目中通过进一步的扩展和优化可以构建出更加高效和智能的搜索系统满足各种复杂搜索需求。全文搜索和混合搜索技术将成为构建高效RAG系统的重要手段值得开发者深入研究和应用。

更多文章