召回与查询模式
检索与查询模式
相关源文件
本章引用的主要源码文件:
examples/rerank_example.pylightrag/base.pylightrag/lightrag.pylightrag/operate.pylightrag/prompt.pylightrag/rerank.pylightrag/utils.pytests/test_aquery_data_endpoint.pytests/test_lightrag_ollama_chat.pytests/test_overlap_validation.pytests/test_rerank_chunking.py
LightRAG 的检索系统旨在弥合结构化知识图谱(KG)数据与非结构化向量嵌入向量之间的鸿沟。它实现了一种双层检索架构,通过多种不同的查询模式支持不同程度的全局和局部上下文感知能力。
检索架构总览
核心检索逻辑实现在 lightrag/operate.py 中的 kg_query 函数内。该函数负责编排关键词提取、实体/关系查找、向量搜索和上下文组装。
自然语言到代码实体的映射
下图展示了自然语言查询如何被转换为内部代码实体和操作。
图:查询流程与实体映射
来源:lightrag/operate.py:107-108, lightrag/base.py:85-180, lightrag/operate.py:1186-1210
查询模式
LightRAG 支持六种主要查询模式,这些模式在 QueryParam 类中定义。
| 模式 | 描述 | 实现策略 |
|---|---|---|
local | 关注特定实体及其直接邻域。 | 通过向量搜索检索实体,然后拉取相关的 1 跳关系和片段。 |
global | 关注高层级概念和广泛关系。 | 使用高层级关键词查找相关关系及其摘要。 |
hybrid | 结合 local 和 global 策略。 | 同时执行两条检索路径,并将结果合并到单个上下文中。 |
mix | 集成知识图谱和向量检索。 | 执行基于知识图谱的检索,并用原始向量片段搜索进行补充。 |
naive | 标准检索增强生成(RAG)方法。 | 仅对文本片段执行简单的向量相似性搜索。 |
bypass | 不进行检索。 | 直接将查询传递给大语言模型(LLM),不提供额外上下文。 |
来源:lightrag/base.py:88-95, lightrag/operate.py:1186-1210
检索实现细节
关键词提取
检索过程首先使用大语言模型(LLM)从用户查询中提取"高层级"(抽象/概念性)和"低层级"(具体/基于实体)的关键词。此操作由 _HL_LL_extract_entities 使用 keyword_extraction_system_prompt 处理。
Token 预算管理
为防止大语言模型(LLM)上下文溢出,LightRAG 实现了一个统一的 Token 控制系统。QueryParam 类定义了三个关键限制:
max_entity_tokens:实体描述的限制。lightrag/lightrag.py:205-209max_relation_tokens:关系描述的限制。lightrag/lightrag.py:210-214max_total_tokens:最终提示的总预算(系统提示 + 上下文 + 片段)。lightrag/lightrag.py:215-219
在上下文组装过程中,使用 truncate_list_by_token_size 函数来强制执行这些限制。lightrag/operate.py:24-24
上下文组装逻辑
kg_query 函数按以下顺序组装上下文:
- 关键词提取:识别搜索词。
- 实体/关系查找:查询
entities_vdb和relationships_vdb。lightrag/operate.py:1255-1270 - 片段检索:根据
kg_chunk_pick_method(WEIGHT或VECTOR),选择与检索到的图元素最相关的文本片段。lightrag/lightrag.py:230-234 - 重排序:如果
enable_rerank为 True,则使用配置的rerank_model_func对片段进行重新排序。lightrag/base.py:168-171
图:上下文组装数据流
来源:lightrag/operate.py:1213-1350, lightrag/lightrag.py:230-234, lightrag/rerank.py:182-195
重排序集成
LightRAG 支持外部重排序器(例如 Cohere、Jina、BGE)以提高精度。系统在 lightrag/rerank.py 中提供了实用函数来处理:
- 用于重排序的片段切分:拆分长文档以适应重排序器的 Token 限制(例如 512 个 Token)。
lightrag/rerank.py:22-41 - 分数聚合:如果文档被拆分为多个片段进行重排序,
aggregate_chunk_scores会使用max、mean或first策略将这些分数合并,为原始文档分配一个单一分数。lightrag/rerank.py:116-133
重排序配置
重排序在 LightRAG 初始化时通过传递 rerank_model_func 进行配置。可以在每次查询时使用 QueryParam(enable_rerank=True) 来切换启用或禁用。examples/rerank_example.py:89-99
来源:lightrag/rerank.py:1-200, examples/rerank_example.py:70-77, lightrag/base.py:168-171