LightRAG
论文题目:LIGHTRAG: SIMPLE AND FAST RETRIEVAL-AUGMENTED GENERATION
LightRAG工作流程
LightRAG整体架构图
LightRAG的基本工作流程,主要包括
- **Graph-based Indexing(基于图的文本索引):**包括三个主要函数D(·)—用于对识别的实体去重、P(·)—配置实体的信息,配置每个节点(实体)和边(关系)的键值对索引结构 (K, V);R(·)—将实体关系提取
- Index Graph(构建索引图):构建知识图谱将实体和关系以图的形式连接起来
- Dual-level Retrieval Paradigm(双层检索):包含低级和高级关键词,以及实体、关系和上下文的结构化表示
- **Retrieval-Augmented Answer Generation( 检索增强答案生成):**先生成检索信息,包括名称、实体和关系的描述以及原文的摘录。然后根据上下文让LLM生成答案
构建索引图的prompt工程
增量更新机制
- 新数据无需重建全图,只需将新提取的实体与原图合并
Dual-Level Retrieval Paradigm—双层检索
在细节层(Specific)与抽象层(Abstract)两个层面生成查询关键词:
- 细节查询(Specific Queries):针对特定实体节点或关系边进行精准信息检索。例如,“《傲慢与偏见》的作者是谁?”;
- 抽象查询(Abstract Queries):关注主题性、概念性信息,而非具体实体。例如,“人工智能如何影响现代教育?”
两种对应的检索策略: - 低层检索(Low-Level Retrieval):聚焦于节点和边的细粒度信息,如属性、关系等,适合具体细节型查询;
- 高层检索(High-Level Retrieval):面向跨主题、综合类问题,通过多实体和关系聚合提供全局性回答。
prompt工程如下
整体过程
图中为询问内容和提取的关键词,以及增强生成的内容和大模型的回答结果
实验评估
数据集选用Agriculture、CS、Legal 和 Mix 四个数据集
对比试验
指示 LLM 生成五个 RAG 用户,并为每个用户生成五个任务。对于每个用户任务组合,LLM 都会生成五个问题,需要了解整个语料库,总共每个数据集产生 125 个问题。如图为生成问题的提示词设计
再利用LightRAG与Naive RAG ,RQ-RAG,HyDE,GraphRAG四种RAG架构对比,评价维度包括全面性(回答多大程度解决了问题的所有方面和细节)、多样性(与问题相关的不同观点,答案的多样性和丰富性如何)、接受度(答案是否有效使读者理解主题并做出明确判断)、整体评价(评估前三个标准的累积评价),如图为评价模型回答好坏的提示词设计
消融实验
- 将 LightRAG 的完整版本与删除了高阶检索的-High变体与删除了低阶阶检索的-Low变体对比
- 将 LightRAG 的完整版本与移除了对原始文本使用的-Origin变体对比
跑通LightRAG
由于LightRAG团队更新太快,源码发生一定改变,因此网络上大多教程有些许不适用
部分参考b站视频
如何快速部署和运行lightRag(轻量版的GraphRag), 并且进行知识图谱的可视化。_哔哩哔哩_bilibili
由于LightRAG更新太快,源码也进行了一定的修改
大模型使用智谱AI的glm4-flash
向量模型使用本地的bge-m3
一 环境配置
首先需要将LightRAG的项目拉到本地,具体可以参考github的项目,
git clone https://github.com/HKUDS/LightRAG.git //下载lightRAG源码
cd LightRAG
pip install -e . //下载依赖包
在官网安装Ollama
安装完成后在Ollama官网的Models页面里搜索你想要的模型,然后复制红框里的命令在cmd执行
二 运行代码
我运行的是LightRAG/examples/lightrag_openai_compatible_demo.py
这个demo
先在examples的目录下创建book.txt文件用于存放你所要储存在知识图谱中的信息,我使用的是孔乙己这篇文章,以及.env文件用于存放自己的apikey。
然后修改这个代码
with open("./book.txt.txt", "r", encoding="utf-8") as f:##这段代码用于读取book文件的信息,但我不清楚为什么是两个.txt,我删掉了一个
await rag.ainsert(f.read())
在智谱bigmodel申请一个apikey用于调用云端大模型,我使用的是glm-4-flash-250414
LLM_BINDING_API_KEY就是在.env文件中的apikey
大模型部分代码
async def llm_model_func(
prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs
) -> str:
return await openai_complete_if_cache(
os.getenv("LLM_MODEL", "glm-4-flash-250414"),#填入自己调用大模型的名字
prompt,
system_prompt=system_prompt,
history_messages=history_messages,
api_key=os.getenv("LLM_BINDING_API_KEY") or os.getenv("OPENAI_API_KEY"),#在.env文件配置
base_url=os.getenv("LLM_BINDING_HOST", "https://open.bigmodel.cn/api/paas/v4/"),#填入网址
**kwargs,
)
向量数据库部分代码
async def initialize_rag():
rag = LightRAG(
working_dir=WORKING_DIR,
llm_model_func=llm_model_func,
embedding_func=EmbeddingFunc(
embedding_dim=int(os.getenv("EMBEDDING_DIM", "1024")),\#bge-m3的嵌入维度
max_token_size=int(os.getenv("MAX_EMBED_TOKENS", "8192")),#最大文本长度
func=lambda texts: ollama_embed(
texts,
embed_model=os.getenv("EMBEDDING_MODEL", "bge-m3:latest"),#修改成使用的向量数据库名称
host=os.getenv("EMBEDDING_BINDING_HOST", "http://localhost:11434"),
),
),
)
# Perform naive search
print("\n=====================")
print("Query mode: naive")\#lightrag提供四种回答模式,naive,local,global,hybrid
print("=====================")
resp = await rag.aquery(
"这篇文档的主题是什么?",#在此修改想要提的问题
param=QueryParam(mode="naive", stream=True),
)
if inspect.isasyncgen(resp):
await print_stream(resp)
else:
print(resp
)
生成部分内容如图
lightrag会生成.log文件记录控制台生成信息,以及dickens文件夹存放存入文档的图信息,可以可视化为知识图谱