如何为LlamaIndex添加全文检索,实现向量与关键词混合搜索?
在LlamaIndex中结合向量KNN与关键词精准搜索的实现方法
要让LlamaIndex同时支持向量KNN搜索和关键词直接命中搜索,核心思路是通过混合检索或自定义检索逻辑实现两种能力的结合,以下是几种可行方案:
1. 使用官方HybridRetriever组合双检索器
LlamaIndex内置的HybridRetriever可以直接将向量检索器和关键词检索器组合,同时返回两种搜索的结果,无需额外复杂逻辑:
from llama_index import VectorStoreIndex, KeywordTableIndex, SimpleDirectoryReader from llama_index.retrievers import HybridRetriever from llama_index.query_engine import RetrieverQueryEngine # 加载电影相关文档 documents = SimpleDirectoryReader("movie_datasets").load_data() # 分别构建向量索引和关键词表索引 vector_index = VectorStoreIndex.from_documents(documents) keyword_index = KeywordTableIndex.from_documents(documents) # 创建对应检索器,设置返回结果数量 vector_retriever = vector_index.as_retriever(similarity_top_k=3) keyword_retriever = keyword_index.as_retriever(keyword_top_k=3) # 组合成混合检索器 hybrid_retriever = HybridRetriever(retrievers=[vector_retriever, keyword_retriever]) # 基于混合检索器构建查询引擎 query_engine = RetrieverQueryEngine.from_args(hybrid_retriever) # 测试查询:同时触发向量语义匹配和关键词精准匹配 response = query_engine.query("请介绍《盗梦空间》的核心设定") print(response)
2. 用BM25算法实现更精准的关键词检索
如果需要比简单关键词表更高效的关键词匹配,可以集成BM25检索器(经典信息检索算法,更贴近搜索引擎的关键词匹配逻辑):
from llama_index.retrievers import BM25Retriever # 安装依赖:pip install rank_bm25 bm25_retriever = BM25Retriever.from_documents(documents, similarity_top_k=3) # 替换关键词检索器,组合向量检索器与BM25检索器 hybrid_retriever = HybridRetriever(retrievers=[vector_retriever, bm25_retriever]) # 后续查询逻辑与上述一致
3. 自定义检索逻辑实现优先级控制
如果需要更灵活的规则(比如优先返回关键词精准命中结果,无命中时再走向量搜索),可以自定义检索函数:
from llama_index.schema import NodeWithScore def custom_retrieve(query): # 先执行关键词检索,筛选完全匹配的结果 keyword_nodes = keyword_retriever.retrieve(query) exact_matches = [node for node in keyword_nodes if query.strip().lower() in node.node.text.lower()] if exact_matches: return exact_matches # 无精准命中时,合并向量检索与关键词检索结果并去重 vector_nodes = vector_retriever.retrieve(query) combined_nodes = keyword_nodes + vector_nodes unique_nodes = {} for node in combined_nodes: if node.node.id_ not in unique_nodes: unique_nodes[node.node.id_] = node return list(unique_nodes.values()) # 基于自定义检索函数构建查询引擎 query_engine = RetrieverQueryEngine.from_args(retriever=None, retrieve_fn=custom_retrieve)
以上方案均可实现向量KNN搜索与关键词直接命中搜索的结合,既保留向量检索的语义理解能力,又能快速定位精准匹配的电影信息。
内容的提问来源于stack exchange,提问作者Nick Zorander
相关产品推荐
相关产品推荐

