You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:52:15