1、前言
当前的检索增强生成(RAG)技术在实际应用中面临若干挑战。传统的RAG采用基于向量的扁平化数据表示,难以有效建模实体之间的复杂语义关系,导致在处理复杂领域知识时检索精度不足。此外,传统RAG在多实体关联推理中容易出现逻辑断层,且全量更新机制使得知识库的维护成本随数据规模指数增长。相比之下,LightRAG通过引入图结构和增量更新算法,大幅降低了计算开销,提高了系统在实时数据更新和复杂推理场景中的应用效能。
本文将深入探讨LightRAG的原理,通过实战演示如何基于LightRAG生成知识图谱,同时展示如何进行查询操作,帮助你全方位掌握这一工具。感兴趣的话就继续往下阅读吧~
2、LightRAG简介
2.1 什么是LightRAG
LightRAG(Lightweight Retrieval-Augmented Generation)是香港大学团队开发的一种轻量级、高效的检索增强生成(RAG)系统。它通过将图结构融入文本索引和检索过程中,采用双层检索机制,增强了对复杂实体依赖关系的理解能力,同时提高了信息检索的效率和响应速度,项目指路:https://github.com/HKUDS/LightRAG
LightRAG的主要优势包括:
- 高效的知识图谱构建: LightRAG通过图结构差异分析实现增量更新算法,显著降低了计算开销,使知识库维护更加高效。
- 双层检索机制: 该系统结合了低层次(具体实体和属性)和高层次(广泛主题和概念)的检索策略,满足了不同类型的查询需求,提高了检索的全面性和多样性。
- 快速适应动态数据: LightRAG能够在新数据到来时快速整合,无需重建整个知识库,确保系统在动态环境中保持高效和准确。
通过了解和使用LightRAG,您可以构建高效、灵活且易于维护的知识图谱系统,提升信息检索和生成任务的性能,特别是在处理复杂实体关系和动态数据更新的场景中。
2.2 LightRAG检索和查询流程图
上述流程可以归纳为两大步骤,分别为索引构建流程和查询响应流程:
索引构建流程:
这个阶段的目标是把所有资料整理好,方便后续快速查找,就像把图书馆的书按主题、内容、关系整整齐齐地放好:
1. 把文本切块 + 提取知识
- 系统先把原始文档分成一个个小段落(Chunk),方便处理。
- 然后通过语言模型,从中找出关键的人名、地名、概念等,并发现它们之间的联系(比如:“乔布斯 创办 苹果公司”)。
- 最后去掉重复内容,把图谱结构整理得更紧凑、更清晰。
2. 存进图谱+向量库
- 所有概念和它们之间的关系会被保存成一张“知识图谱”,像思维导图一样储存在图数据库里。
- 同时,每个概念和文本也会被转成“向量”(一串数字),方便用数学方式快速找相似的内容。
3. 动态更新
- 当新数据加入时,LightRAG采用增量更新算法,只更新相关部分,而无需重建整个知识库。
查询响应流程:
这个阶段的任务是:当用户提出一个问题时,系统先理解问题在说什么,然后去“知识库”里找答案,再组织成一段清晰自然的回复。
1. 先分析问题,分出两类关键词
系统会分析用户提问的句子,从中提取出两种关键词:
- 局部关键词:具体的内容,比如“爱因斯坦”、“相对论”这种名词。
- 全局关键词:更偏概念性的词,比如“物理学原理”、“科学贡献”。
2. 两步查找,信息更全面
- 局部检索:先用具体的关键词在“向量库”里找最相关的小段落或知识点。
- 全局检索:再根据概念性关键词,在知识图谱中沿着关系扩展,找更多相关内容。
3. 组织上下文,生成自然语言回答
- 把刚才查到的信息拼成一个“上下文背景”,喂给语言模型(LLM)。
- 系统会按照提前设定的“回答模板”来组织内容,确保回答连贯、有逻辑、信息完整。
3、 LightRAG构建检索增强生成系统(生成知识图谱)
3.1 本地安装
本地安装教程比较简单,首先我们需要把项目克隆到本地,可以用git下载,也可以直接下载安装包:
下载到本地后还是用Pycharm打开,配置一下环境(需要先建立虚拟环境LightRAG,怎么建的就不说了,实在不会的去看我这篇文章的3.1小节:企业抢着要的AI方案:DeepSeek-R1微调实战,3天构建行业内容生成器)
打开命令行:
运行以下命令安装LightRAG Core:
复制pip install -e .
之后运行以下命令安装LightRAG Server:
复制pip install -e ".[api]"
3.2 LightRAG构建检索增强生成系统(生成知识图谱)实战
在程序的examples目录下面提供了很多构建检索增强生成系统(生成知识图谱)的python示例文件:
首先我们需要下载一下用于生成知识图谱的示例文件(狄更斯的圣诞颂歌):
复制curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt
下载完成以后记得放到examples目录下面。
3.2.1 基于ollama构建检索增强生成系统(生成知识图谱)
基于ollama构建检索增强生成系统(生成支持图谱)的python文件为lightrag_ollama_demo.py,官方就有相关视频教我们怎么一步步生成知识图谱和进行查询操作:https://www.youtube.com/watch?v=g21royNJ4fw,如果你本地显存很大,可以试一下,否则我不建议你去浪费时间,我就被卡了一下午,我的chat模型用的是deepseek-r1:1.5b,向量模型用的是nomic-embed-text:latest
报错503,出于程序员的本能,我第一时间就想着用postman测一下这个接口能通吗?测了以后是通的。
于是又去查了资料:
被自己蠢笑了,原本是本地电脑8G的显存根本不够.......
3.2.2 调用云端智普大模型构建检索增强生成系统(生成知识图谱)
基于云端智普大模型生成知识图谱的python文件为lightrag_zhipu_demo.py,加一行代码配置一下智普大模型的apiKey就行:
复制os.environ["ZHIPUAI_API_KEY"] = ""
你实在不知道加哪里(纯小白),就直接粘贴我这个代码替换lightrag_zhipu_demo.py:
复制# 导入必要的标准库 import os import logging import asyncio # 从lightrag库中导入LightRAG类和QueryParam类 from lightrag import LightRAG, QueryParam # 从lightrag.llm.zhipu模块中导入智普大模型的文本生成和嵌入函数 from lightrag.llm.zhipu import zhipu_complete, zhipu_embedding # 从lightrag.utils模块中导入EmbeddingFunc类,用于定义嵌入函数 from lightrag.utils import EmbeddingFunc # 从lightrag.kg.shared_storage模块中导入初始化管道状态的函数 from lightrag.kg.shared_storage import initialize_pipeline_status # 设置工作目录 WORKING_DIR = "./dickens" # 配置日志记录,设置日志格式和日志级别为INFO logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) # 如果工作目录不存在,则创建该目录 if not os.path.exists(WORKING_DIR): os.mkdir(WORKING_DIR) # 设置智普大模型的API密钥 os.environ["ZHIPUAI_API_KEY"] = "" # 获取环境变量中的API密钥 api_key = os.environ.get("ZHIPUAI_API_KEY") # 如果API密钥未设置,则抛出异常提示用户设置API密钥 if api_key is None: raise Exception("Please set ZHIPU_API_KEY in your environment") # 定义一个异步函数,用于初始化LightRAG实例 async def initialize_rag(): # 创建LightRAG实例 rag = LightRAG( working_dir=WORKING_DIR, # 设置工作目录 llm_model_func=zhipu_complete, # 设置使用的语言模型函数 llm_model_name="glm-4-flashx", # 设置使用的语言模型名称 llm_model_max_async=4, # 设置最大异步请求数 llm_model_max_token_size=32768, # 设置模型处理的最大token数量 # 设置嵌入函数 embedding_func=EmbeddingFunc( embedding_dim=2048, # 设置嵌入向量的维度 max_token_size=8192, # 设置模型处理的最大token数量 func=lambda texts: zhipu_embedding(texts), # 使用智普的嵌入函数 ), ) # 初始化存储系统 await rag.initialize_storages() # 初始化管道状态 await initialize_pipeline_status() # 返回初始化好的LightRAG实例 return rag # 定义主函数 def main(): # 使用异步事件循环初始化LightRAG实例 rag = asyncio.run(initialize_rag()) # 读取本地文本文件并将其内容插入到LightRAG中 with open("./book.txt", "r", encoding="utf-8") as f: rag.insert(f.read()) # 使用不同的查询模式进行检索并打印结果 # 朴素检索:基础查询模式 print( rag.query( "What are the top themes in this story?", param=QueryParam(mode="naive") ) ) # 局部检索:局部检索模式,仅查找与输入相关的区域 print( rag.query( "What are the top themes in this story?", param=QueryParam(mode="local") ) ) # 全局检索:全局检索模式,扩展到整个知识图谱的关系 print( rag.query( "What are the top themes in this story?", param=QueryParam(mode="global") ) ) # 混合检索:混合模式,结合局部与全局信息 print( rag.query( "What are the top themes in this story?", param=QueryParam(mode="hybrid") ) ) # 如果当前模块是主模块,则调用主函数 if __name__ == "__main__": main()
上述代码展示了如何使用LightRAG框架构建一个基于智普大模型的检索增强生成系统。首先,设置工作目录并配置智普API密钥。然后,定义了一个异步函数initialize_rag,用于初始化LightRAG实例,包括设置语言模型、嵌入函数和其他参数。在main函数中,读取本地文本文件,将其内容插入到LightRAG中,并执行多种查询模式(如naive、local、global、hybrid),以获取不同层次的检索结果。整个流程实现了从文本处理、嵌入生成到多模式检索的功能。
不知道智普大模型的apiKey怎么申请的可以点击这个网址:https://www.bigmodel.cn/usercenter/proj-mgmt/apikeys
填入apiKey后运行代码,代码运行完毕后会在工作目录生成结果文件:
以下是对各文件功能的解释(细节图我就不截了,可以生成出来自己去看文件细节):
- graph_chunk_entity_relation.graphml:
- 该文件以GraphML格式存储知识图谱的图形结构,包括实体节点及其相互关系。这种格式便于使用图形处理工具进行可视化和分析。
- kv_store_doc_status.json:
- 此JSON文件记录文档处理的状态信息,例如文档是否已成功处理或是否存在错误。这有助于跟踪文档的处理进度和状态。
- kv_store_full_docs.json:
- 存储原始文档的完整内容。该文件包含了所有输入文档的文本数据,便于后续的检索和处理。
- kv_store_llm_response_cache.json:
- 用于缓存大型语言模型(LLM)的响应结果,以提高系统的响应速度和效率,避免对相同请求进行重复计算。
- kv_store_text_chunks.json:
- 存储将文档拆分成的小块(chunks)后的文本数据。将长文档拆分为较小的块有助于提高处理效率和检索精度。
- vdb_chunks.json:
- 包含文本块的向量化表示。通过将文本块转换为向量,可以在向量数据库中进行高效的相似度搜索和检索。
- vdb_entities.json:
- 存储知识图谱中实体的向量表示。将实体转换为向量形式,有助于在检索和推理过程中快速匹配和识别相关实体。
- vdb_relationships.json:
- 记录知识图谱中实体之间关系的向量表示。通过将关系表示为向量,可以在图谱中进行高效的关系检索和推理。
这些文件共同构成了LightRAG系统的数据存储和管理架构,支持知识图谱的构建、更新和查询等功能。
运行graph_visual_with_html.py,就可以生成可视化的知识图谱html页面:
复制# 导入pipmaster库,用于简化Python包的安装和管理 import pipmaster as pm # 检查并安装pyvis库,如果尚未安装 if not pm.is_installed("pyvis"): pm.install("pyvis") # 检查并安装networkx库,如果尚未安装 if not pm.is_installed("networkx"): pm.install("networkx") # 导入networkx库,用于创建和操作复杂的网络图 import networkx as nx # 从pyvis.network模块导入Network类,用于在浏览器中展示网络图 from pyvis.network import Network # 导入random模块,用于生成随机数 import random # 读取GraphML格式的图文件,创建一个NetworkX图对象G G = nx.read_graphml("./dickens/graph_chunk_entity_relation.graphml") # 创建一个Pyvis的Network对象,用于在浏览器中展示网络图 net = Network(height="100vh", notebook=True) # 将NetworkX图对象G转换为Pyvis网络 net.from_nx(G) # 遍历网络中的所有节点,为每个节点添加随机颜色和提示信息 for node in net.nodes: # 为节点分配一个随机颜色 node["color"] = "#{:06x}".format(random.randint(0, 0xFFFFFF)) # 如果节点有"description"属性,将其设置为鼠标悬停时显示的提示信息 if "description" in node: node["title"] = node["description"] # 遍历网络中的所有边,为每条边添加提示信息 for edge in net.edges: # 如果边有"description"属性,将其设置为鼠标悬停时显示的提示信息 if "description" in edge: edge["title"] = edge["description"] # 将网络图保存为HTML文件,并在浏览器中展示 net.show("knowledge_graph.html")
上述代码使用 networkx创建图结构,利用pyvis将其转换为交互式网络图,并在浏览器中显示。代码首先检查并安装所需的pyvis和networkx库,随后读取存储在./dickens/graph_chunk_entity_relation.graphml的图数据文件。通过pyvis的Network类,将networkx图对象转换为可视化网络,随机为每个节点分配颜色,并设置节点和边的提示信息。最终,生成的交互式网络图被保存为knowledge_graph.html 文件,用户可在浏览器中打开并与之交互。
把鼠标移动到节点上还能查看详情:
4、LightRAG查询
在lightrag_zhipu_demo.py中选择你想要的查询模式(注释其他模式),输入问题即可进行查询(我选的是global模式):
我的问题是:
复制这个故事的主题是什么?
LightRAG的回答:
复制这个故事的主题是道德救赎和人物转变。通过讲述吝啬鬼斯克鲁奇在圣诞节的经历,以及他与三位圣诞灵的相遇,故事展现了斯克鲁奇从自私、冷酷到慷慨、仁慈的转变。圣诞节作为一个象征性的节日,强调了慷慨、善良和对他人的关怀。故事传达了深刻的道德教训,即人们可以通过反思和改变自己的行为来获得救赎。以下是几个重要的主题: 1. 道德救赎:斯克鲁奇在故事中经历了深刻的道德转变,他从最初的冷漠和吝啬,最终转变为一个慷慨和仁慈的人。 2. 人物转变:斯克鲁奇的转变是故事的核心,它展示了一个人在经历启示后如何改变自己的性格和行为。 3. 圣诞节的象征意义:圣诞节作为一个节日,象征着慷慨、善良和社区的团结,对斯克鲁奇的性格转变起到了重要的推动作用。 4. 社会批判:故事通过描绘斯克鲁奇对穷人和慈善事业的冷漠态度,对社会的不平等和贫富差距进行了批判。 5. 人性的复杂性:斯克鲁奇的形象展示了人性的复杂性,即使是一个冷酷的人也有机会改变自己,成为更好的人。 以上主题共同构成了《圣诞颂歌》的核心内容,使其成为一部经典的文学作品。
5、 结语
通过对LightRAG技术的探索与应用,我们不仅成功地构建了一个高效的知识图谱系统,还进一步理解了RAG(检索增强生成)技术在实际应用中的潜力与挑战。LightRAG通过引入图结构和增量更新机制,大大提升了知识图谱的构建效率与查询精度,特别是在处理复杂领域知识时,展现了其独特的优势。此外,LightRAG通过结合检索与生成的双层机制,能够在保持语义连贯性的同时,实现对多实体、多层次关系的深入理解。无论是在文本生成、信息检索还是知识图谱的可视化等方面,LightRAG都为我们提供了新的思路和工具,推动了智能系统在处理复杂问题时的表现。