lightrag是什么
1. Light RAG 介绍
1. 研究背景与动机
-
传统 Naive RAG 只用向量检索 → 容易丢失实体间复杂关系,全局理解差,回答常碎片化(无法很好合成多跳、多源信息)。
-
GraphRAG(Microsoft)用社区摘要 + 图结构提升全局理解,但非常贵且慢:构建阶段 token 消耗巨大(常数十万到百万 token),增量更新几乎不可能。
-
LightRAG要做的事:保留图结构的优势(捕捉关系、全局理解),但大幅降低成本与时间,支持增量更新,适合实际生产。
2. 核心创新:双层检索
LightRAG 的关键设计是 dual-level retrieval(双层检索) + graph-enhanced text indexing(图增强文本索引)。
-
知识图构建方式
-
文档分块 → LLM 提取实体 + 关系 → 构建知识图(节点=实体,边=关系)。
-
同时为每个实体/关系生成简短文本描述(key-value pairs),存入向量数据库。
-
-
双层检索机制
-
低层(low-level):针对查询提取具体实体/关系关键词 → 向量匹配最相关实体 + 直接邻居 → 提供精确细节。 (孙悟空的师傅是谁这种问题)
-
高层(high-level):提取更抽象的主题/关键词 → 检索更广的上下文 + 高阶邻居(2-3跳)→ 提供全局视角。(西游记说的什么样的故事)
-
最终把两层结果融合 → 给 LLM 更全面的上下文。
-
-
增量更新
-
新文档进来时,只更新受影响的局部图 + 向量,不需重跑整个 corpus。
-
这点让
LightRAG在动态知识库场景下远比GraphRAG友好。
-
3. 系统整体流程
-
索引阶段:文档 → 分块 → LLM 抽实体/关系 → 建图 + 向量嵌入(实体/关系/文本块)。
-
检索阶段:查询 → 双层关键词提取 → 向量检索 + 图遍历(低层精确 + 高层全局)→ 融合上下文。
-
生成阶段:检索结果 + 查询 → 喂给 LLM 生成最终回答。
-
整个过程只用少量 API 调用,token 消耗极低。
2. 架构流程分析

也可以自行搜索资料综合分析。
功能介绍
-
索引阶段
-
Input Documents → Text Chunks : 把原始文档切分成小块(chunks)
-
Store in Vector DB Storage : 把文本块的向量存入向量数据库(NanoVectorDB/ Faiss 等)
-
Store in KV Storage : 把实体/关系/块的元数据、描述、chunk_id 等存入 JSON KV 存储
-
Extract Entities & Relations : 用 LLM 从文本块中提取实体(人、物、地点等)和关系(谁对谁做了什么)
-
Max Cleaning Turns / Dedupe : 去重(set dedupe + LLM 进一步清洗),避免重复实体/关系
-
Update Description : 用 LLM 为去重后的实体/关系生成/优化描述(更简洁、准确)
-
Store in Knowledge Graph : 把实体(节点)和关系(边)存入知识图谱
-
-
检索阶段
-
Query → Keywords Extraction : 用 LLM + 专用 Prompt 从查询中提取两组关键词: low_level_keywords(底层:实体导向) high_level_keywords(高层:主题/关系导向)
-
low_level_keywords → Embedding → Top Entities Results : 用底层关键词向量搜索 → 找到最相关的实体
-
high_level_keywords → Embedding → Top Relations Results : 用高层关键词向量搜索 → 找到最相关的关系
-
Top Entities Results → related text_units / related Relations / Local Query Context : 从 Top 实体拉取:相关文本块 + 直接相关关系 + 局部上下文
-
Top Relations Results → related text_units / Global Query Context : 从 Top 关系拉取:相关文本块 + 全局聚合上下文
-
Local Query Context + Global Query Context → Combined Context : 把局部 + 全局上下文融合(简单拼接或加权)
-
3. 实战案例
-
模块安装
pip install lightrag-hku
-
操作案例
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# pip install lightrag-hku
import asyncio
import os
from lightrag import LightRAG, QueryParam
from lightrag.llm.openai import openai_complete_if_cache, openai_embed
from dotenv import load_dotenv
from lightrag.utils import EmbeddingFunc
from lightrag.kg.shared_storage import initialize_pipeline_status
from sentence_transformers import SentenceTransformer
load_dotenv()
# 创建嵌入模型 512
model_name = r'D:\LLM\Local_model\maidalun\bce-embedding-base_v1'
WORKING_DIR = 'light_test'
model = SentenceTransformer(model_name)
# 准备大模型链接
async def llm_func(prompt, system_prompt=None, history_messages=[], **kwargs):
return await openai_complete_if_cache(
model="qwen3.7-plus",
prompt=prompt,
system_prompt=system_prompt,
history_messages=history_messages,
base_url=os.getenv("DASHSCOPE_BASE_URL"),
api_key=os.getenv("DASHSCOPE_API_KEY"),
**kwargs
)
# 准备向量模型
async def local_embedding_func(texts):
embeddings = model.encode(texts, convert_to_numpy=True, batch_size=32) # 生成嵌入
return embeddings
async def initialize_rag():
rag = LightRAG(
llm_model_func=llm_func,
# 使用自定义本地嵌入函数
embedding_func=EmbeddingFunc(
embedding_dim=768, # 模型维度,根据你的模型调整
max_token_size=8192, # 最大 token 长度,根据模型调整
func=local_embedding_func # 传入你的函数(异步或同步)
),
# vector_storage="FaissVectorDBStorage",
# window 添加之后会报错 RuntimeError: Event loop is closed 使用get_event_loop启动协程
graph_storage='Neo4JStorage',
)
# IMPORTANT: Both initialization calls are required!
await rag.initialize_storages() # Initialize storage backends
await initialize_pipeline_status() # Initialize processing pipeline
return rag
async def main():
rag = await initialize_rag()
# 第一遍生成好后,第二遍执行时,可以注释掉 代码开始位置。
await rag.aclear_cache()
with open('西游记.txt', 'r', encoding='utf-8')as f:
data = f.read()
task = loop.create_task(rag.ainsert(data))
await asyncio.gather(task)
# 第一遍生成好后,第二遍执行时,可以注释掉 代码结束位置。
# 向量检索
# da1 = await rag.aquery('孙悟空的虎皮裙怎么得到的?', param=QueryParam(mode="naive"))
# print(da1)
# da1 = await rag.aquery('美猴王被谁压在五指山下?', param=QueryParam(mode="local"))
# print(da1)
# da1 = await rag.aquery('五指山是谁的技能?', param=QueryParam(mode="global"))
# print(da1)
# da1 = await rag.aquery('唐僧的为什么要西天?为什么不去东天?', param=QueryParam(mode="hybrid"))
# print(da1)
da1 = await rag.aquery('孙悟空和观音菩萨有啥联系?', param=QueryParam(mode="hybrid"))
print(da1)
da1 = await rag.aquery('猪八戒和菩提祖师有啥联系?', param=QueryParam(mode="naive"))
print(da1)
if __name__ == '__main__':
# asyncio.run(main())
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
观察结果:

查看neo4j控制台,没有建立任何实体和关系。

1853



被折叠的 条评论
为什么被折叠?



