LlamaIndex 检索器 Retriever

检索器负责在给定用户查询(或聊天消息)的情况下获取最相关的上下文。

它可以建立在索引之上,也可以独立定义。它作为查询引擎(和聊天引擎)中用于检索相关上下文的关键构建模块。

使用方法

从索引中获取检索器

retriever = index.as_retriever()

为问题检索相关上下文:

nodes = retriever.retrieve("蒲公英的作用?")

完整示例:

from llama_index.core import Settings, StorageContext, load_index_from_storage

from my_llms.MyLLMsClients import MyLLMsClients

Settings.llm = MyLLMsClients.deepseek_client()
Settings.embed_model = MyLLMsClients.qwen_embeddings()

# 加载已持久化的索引
storage_context = StorageContext.from_defaults(persist_dir="../storage")

# 加载索引
index = load_index_from_storage(storage_context=storage_context)

# 获取检索器
retriever = index.as_retriever(
    similarity_top_k=5, # 返回相似度最高的前 k 个结果, 默认值: 2
)

# 为问题检索相关上下文
nodes = retriever.retrieve("介绍以下蒲公英")

print(nodes)

检索到的Node节点:

[NodeWithScore(
    node=TextNode(
        id_='49da7962-8fe0-43be-8a5f-fad06ac3440b', 
        embedding=None, 
        metadata={
            'file_path': 'D:\\01-LlaDeepSeek-蒲公英.md', 
            'file_name': 'DeepSeek-蒲公英.md', 
            'file_type': 'text/markdown', 
            'file_size': 2391, 
            'creation_date': '2025-07-12', 
            'last_modified_date': '2025-07-12'
        }, 
        excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'],
        excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], 
        relationships={
            <NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(
                node_id='61a454d4-11e7-4e5a-8466-5e46f951a93e', 
                node_type='4', 
                metadata={'file_path': 'D:\\01-Lla\本草纲目\\DeepSeek-蒲公英.md', 
                          'file_name': 'DeepSeek-蒲公英.md', 
                          'file_type': 'text/markdown', 
                          'file_size': 2391, 
                          'creation_date': '2025-07-12', 
                          'last_modified_date': '2025-07-12'
                         }, 
                hash='6a54f6f1f00dd9488d4d7ac1a21af443d69d69b5c3745e80db8450816e69489b'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='af068d0d-37b7-40d2-9cd3-059176d5af86', node_type='1', metadata={}, hash='7d60ffdf1172bc7560732fe82933d1e363ba6ffa25d2421adebf0ed78d10db60')}, metadata_template='{key}: {value}', metadata_separator='\n', text='蒲公英(学名:**Taraxacum**)是。\r\n  - 根可烘焙后替代咖啡(蒲公英咖啡)。\r\n- **其他用途**:\r\n  - 汁液曾被用作天然染料或橡胶原料(部分品种含乳胶)。\r\n\r\n---\r\n\r\n### **5.', mimetype='text/plain', start_char_idx=0, end_char_idx=829, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.7675869519092057), 
 
 NodeWithScore(node=TextNode(id_='f3fabd45-b876-4f21-b2ba-b3be0d970ef9', embedding=None, metadata={'file_path': 'D:\\01-LlamaIndex\\project\\MyLlamaIndex\\10-检索其Retriever\\..\\data\\本草纲目\\通义千问-蒲公英.md', 'file_name': '通义千问-蒲公英.md', 'file_type': 'text/markdown', 'file_size': 2403, 'creation_date': '2025-07-12', 'last_modified_date': '2025-07-12'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='43f8fa95-4138-4ff3-b742-fda8ade753f0', node_type='4', metadata={'file_path': 'D:\\01-LlamaIndex\\project\\MyLlamaIndex\\10-检索其Retriever\\..\\data\\本草纲目\\通义千问-蒲公英.md', 'file_name': '通义千问-蒲公英.md', 'file_type': 'text/markdown', 'file_size': 2403, 'creation_date': '2025-07-12', 'last_modified_date': '2025-07-12'}, hash='075cdf6e3c16762c6a6155395e613dadb7955debcb23bdf472fe27c86b1461c8'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='6d88a2fb-b06e-4191-9bb3-32b8403f5047', node_type='1', metadata={}, hash='ad076e1df247008987d729e5ff8b6f8a26ea3475001bf24246f2400e1df73272')}, metadata_template='{key}: {value}', metadata_separator='\n', text='蒲公英(学名:**Tara尿通淋**:有利尿作用,适用于水肿等症状。\r\n- **抗炎抗菌**:现代研究发现其含有多种活性成分,如黄酮类、萜类化合物等,具有一定的抗炎和抗氧化作用。\r\n\r\n#### 3.', mimetype='text/plain', start_char_idx=0, end_char_idx=706, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), score=0.7424136926100374)]

VectorIndexRetriever

完整示例:

from llama_index.core import Settings, SimpleDirectoryReader, VectorStoreIndex
from llama_index.core.indices.vector_store import VectorIndexRetriever

from my_llms.dash_scope_client import DashScopeClient

Settings.llm = DashScopeClient.get_llm()
Settings.embed_model = DashScopeClient.get_embedder()

# 加载数据
documents = SimpleDirectoryReader("../data/vlog").load_data()

# 创建索引
index = VectorStoreIndex.from_documents(documents)

# 获取检索器
retriever = VectorIndexRetriever(
    index=index, # 向量索引
    similarity_top_k=5, # 返回相似度最高的前 k 个结果, 默认值: 2
)

nodes = retriever.retrieve("和田玉是如何形成的?")

for node in nodes:
    print(f"文本内容: {node.text[:50]}...")
    print(f"得分: {node.score}")
    print("-------------------------------")
文本内容: 其实它形成需要极端的地质条件,很多人可能都想了解。大部分研究人员认为和田玉的形成时间大约在两亿五千万...
得分: 0.6971156252891842
-------------------------------
文本内容: 文件名:地质狼孙春贵-和田玉,中国四大明玉之一的和田玉 和田玉的由来与介绍
作者:地质狼孙春贵
...
得分: 0.6890189978861022
-------------------------------
文本内容: 文件名:地质狼孙春贵-讲解和田玉所出产的产地与鉴别方法 #科普 #和田玉 #玉 #地质 #玉文化
...
得分: 0.6330236593881674
-------------------------------
文本内容: 这个戈壁料往往指的是什么?是原生玉石经过河流、泥石流等自然冲刷、搬运到。上中下游的古河床里面这些河流...
得分: 0.6265738869599385
-------------------------------
文本内容: 因为颜色像红糖,所以被形象的称为糖玉。
- 第七种是墨玉,墨玉在自然光下呈纯黑色,油润度看着也是非...
得分: 0.6086931353934419
-------------------------------

高级检索与搜索

这些指南包含高级的检索技术。有些是常见的方法,如关键词/混合搜索、重新排序等;还有一些是针对 LLM + RAG 工作流程的特定技术,例如由小到大的检索(small-to-big)和自动合并检索(auto-merging retrieval)。

自动检索

这些检索技术能够执行半结构化查询,将语义搜索与结构化过滤相结合。

知识图谱检索器

组合检索器

这些检索技术是在其他检索技术的基础上组合而成的——提供了层级检索和查询分解等更高层次的功能。

托管检索器

其他检索器

这些指南无法明确归类到某个特定类别中,但依然值得关注。

### LlamaIndex 检索算法原理与实现方式 LlamaIndex 是一个基于语言模型(LLM)的开源信息检索系统,支持多种检索算法和策略,能够处理大规模文本数据集的快速检索。其核心检索算法包括向量检索、BM25 检索以及混合检索策略。 #### 向量检索 向量检索是 LlamaIndex 中最常见的检索方式之一。它通过将文本数据转换为嵌入向量(embedding),并在向量空间中进行相似度计算,从而实现语义级别的检索。具体实现方式如下: 1. **文本向量化**:LlamaIndex 使用预训练的语言模型(如 BERT 或 Sentence-BERT)对文本进行编码,生成高维向量表示。 2. **相似度计算**:通过余弦相似度(Cosine Similarity)等方法,计算查询向量与文档向量之间的相似度。 3. **结果排序**:根据相似度得分对文档进行排序,返回最相关的文档。 向量检索的优势在于其强大的语义理解能力,可以处理模糊匹配和语义相似的查询。 #### BM25 检索 BM25RetrieverLlamaIndex 提供的一个基于 BM25 算法的检索器。BM25 是一种广泛使用的信息检索排序函数,特别适用于处理长文档和短查询。其实现原理如下: 1. **关键词匹配**:BM25 算法基于词频(TF)和逆文档频率(IDF)计算每个文档与查询的相关性得分。 2. **评分公式**:BM25 的评分公式考虑了词频饱和度和文档长度归一化,其公式为: $$ \text{score}(q, d) = \sum_{i=1}^{n} IDF(q_i) \cdot \frac{f(q_i, d) \cdot (k_1 + 1)}{f(q_i, d) + k_1 \cdot (1 - b + b \cdot \frac{|d|}{\text{avgdl}}))} $$ 其中,$ f(q_i, d) $ 表示词项 $ q_i $ 在文档 $ d $ 中的频率,$ |d| $ 表示文档长度,$ \text{avgdl} $ 表示平均文档长度,$ k_1 $ 和 $ b $ 是调节参数。 3. **结果排序**:根据 BM25 得分对文档进行排序,返回最相关的文档。 BM25 检索的优势在于其对关键词匹配的高效处理能力,尤其适用于精确匹配场景。 #### 混合检索 LlamaIndex 支持将向量检索与 BM25 检索结合,实现混合检索。这种方案通过集合运算(AND/OR 模式)将语义匹配与关键词匹配融合,提升检索效果。具体实现方式如下: 1. **多检索器并行**:同时运行向量检索器和 BM25Retriever,分别获取两组检索结果。 2. **融合策略**:LlamaIndex 提供了多种融合模式,包括: - **RECIPROCAL_RANK**:应用互惠重排融合。 - **RELATIVE_SCORE**:应用相对得分融合。 - **DIST_BASED_SCORE**:应用基于距离的得分融合。 - **SIMPLE**:简单地根据原始得分重新排序结果。 3. **结果整合**:根据融合策略生成最终的检索结果。 混合检索的优势在于其能够同时利用语义匹配和关键词匹配的优势,适用于复杂查询场景。 #### 代码示例 以下是一个简单的混合检索实现示例: ```python from llama_index import VectorStoreIndex, BM25Retriever from llama_index.retrievers import MultiModalRetriever # 创建向量检索器 vector_index = VectorStoreIndex.from_documents(documents) vector_retriever = vector_index.as_retriever(similarity_top_k=5) # 创建 BM25 检索器 bm25_retriever = BM25Retriever.from_documents(documents, similarity_top_k=5) # 创建混合检索器 hybrid_retriever = MultiModalRetriever(retrievers=[vector_retriever, bm25_retriever], mode="reciprocal_rerank") # 执行查询 results = hybrid_retriever.retrieve("查询内容") ``` 在上述代码中,`MultiModalRetriever` 是 LlamaIndex 提供的多检索器类,支持多种融合模式。通过设置 `mode` 参数,可以选择不同的融合策略。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值