知識圖譜驅動!港大LightRAG終結企業碎片化檢索,效率飆升200%
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都為我們提供了新的思路和工具,推動了智能系統在處理復雜問題時的表現。