知識圖譜驅(qū)動!港大LightRAG終結(jié)企業(yè)碎片化檢索,效率飆升200%
1、前言
當(dāng)前的檢索增強生成(RAG)技術(shù)在實際應(yīng)用中面臨若干挑戰(zhàn)。傳統(tǒng)的RAG采用基于向量的扁平化數(shù)據(jù)表示,難以有效建模實體之間的復(fù)雜語義關(guān)系,導(dǎo)致在處理復(fù)雜領(lǐng)域知識時檢索精度不足。此外,傳統(tǒng)RAG在多實體關(guān)聯(lián)推理中容易出現(xiàn)邏輯斷層,且全量更新機制使得知識庫的維護成本隨數(shù)據(jù)規(guī)模指數(shù)增長。相比之下,LightRAG通過引入圖結(jié)構(gòu)和增量更新算法,大幅降低了計算開銷,提高了系統(tǒng)在實時數(shù)據(jù)更新和復(fù)雜推理場景中的應(yīng)用效能。
本文將深入探討LightRAG的原理,通過實戰(zhàn)演示如何基于LightRAG生成知識圖譜,同時展示如何進行查詢操作,幫助你全方位掌握這一工具。感興趣的話就繼續(xù)往下閱讀吧~
2、LightRAG簡介
2.1 什么是LightRAG
LightRAG(Lightweight Retrieval-Augmented Generation)是香港大學(xué)團隊開發(fā)的一種輕量級、高效的檢索增強生成(RAG)系統(tǒng)。它通過將圖結(jié)構(gòu)融入文本索引和檢索過程中,采用雙層檢索機制,增強了對復(fù)雜實體依賴關(guān)系的理解能力,同時提高了信息檢索的效率和響應(yīng)速度,項目指路:https://github.com/HKUDS/LightRAG
LightRAG的主要優(yōu)勢包括:
- 高效的知識圖譜構(gòu)建: LightRAG通過圖結(jié)構(gòu)差異分析實現(xiàn)增量更新算法,顯著降低了計算開銷,使知識庫維護更加高效。
- 雙層檢索機制: 該系統(tǒng)結(jié)合了低層次(具體實體和屬性)和高層次(廣泛主題和概念)的檢索策略,滿足了不同類型的查詢需求,提高了檢索的全面性和多樣性。
- 快速適應(yīng)動態(tài)數(shù)據(jù): LightRAG能夠在新數(shù)據(jù)到來時快速整合,無需重建整個知識庫,確保系統(tǒng)在動態(tài)環(huán)境中保持高效和準(zhǔn)確。
通過了解和使用LightRAG,您可以構(gòu)建高效、靈活且易于維護的知識圖譜系統(tǒng),提升信息檢索和生成任務(wù)的性能,特別是在處理復(fù)雜實體關(guān)系和動態(tài)數(shù)據(jù)更新的場景中。
2.2 LightRAG檢索和查詢流程圖
上述流程可以歸納為兩大步驟,分別為索引構(gòu)建流程和查詢響應(yīng)流程:
索引構(gòu)建流程:
這個階段的目標(biāo)是把所有資料整理好,方便后續(xù)快速查找,就像把圖書館的書按主題、內(nèi)容、關(guān)系整整齊齊地放好:
1. 把文本切塊 + 提取知識
- 系統(tǒng)先把原始文檔分成一個個小段落(Chunk),方便處理。
- 然后通過語言模型,從中找出關(guān)鍵的人名、地名、概念等,并發(fā)現(xiàn)它們之間的聯(lián)系(比如:“喬布斯 創(chuàng)辦 蘋果公司”)。
- 最后去掉重復(fù)內(nèi)容,把圖譜結(jié)構(gòu)整理得更緊湊、更清晰。
2. 存進圖譜+向量庫
- 所有概念和它們之間的關(guān)系會被保存成一張“知識圖譜”,像思維導(dǎo)圖一樣儲存在圖數(shù)據(jù)庫里。
- 同時,每個概念和文本也會被轉(zhuǎn)成“向量”(一串?dāng)?shù)字),方便用數(shù)學(xué)方式快速找相似的內(nèi)容。
3. 動態(tài)更新
- 當(dāng)新數(shù)據(jù)加入時,LightRAG采用增量更新算法,只更新相關(guān)部分,而無需重建整個知識庫。
查詢響應(yīng)流程:
這個階段的任務(wù)是:當(dāng)用戶提出一個問題時,系統(tǒng)先理解問題在說什么,然后去“知識庫”里找答案,再組織成一段清晰自然的回復(fù)。
1. 先分析問題,分出兩類關(guān)鍵詞
系統(tǒng)會分析用戶提問的句子,從中提取出兩種關(guān)鍵詞:
- 局部關(guān)鍵詞:具體的內(nèi)容,比如“愛因斯坦”、“相對論”這種名詞。
- 全局關(guān)鍵詞:更偏概念性的詞,比如“物理學(xué)原理”、“科學(xué)貢獻”。
2. 兩步查找,信息更全面
- 局部檢索:先用具體的關(guān)鍵詞在“向量庫”里找最相關(guān)的小段落或知識點。
- 全局檢索:再根據(jù)概念性關(guān)鍵詞,在知識圖譜中沿著關(guān)系擴展,找更多相關(guān)內(nèi)容。
3. 組織上下文,生成自然語言回答
- 把剛才查到的信息拼成一個“上下文背景”,喂給語言模型(LLM)。
- 系統(tǒng)會按照提前設(shè)定的“回答模板”來組織內(nèi)容,確?;卮疬B貫、有邏輯、信息完整。
3、 LightRAG構(gòu)建檢索增強生成系統(tǒng)(生成知識圖譜)
3.1 本地安裝
本地安裝教程比較簡單,首先我們需要把項目克隆到本地,可以用git下載,也可以直接下載安裝包:
下載到本地后還是用Pycharm打開,配置一下環(huán)境(需要先建立虛擬環(huán)境LightRAG,怎么建的就不說了,實在不會的去看我這篇文章的3.1小節(jié):企業(yè)搶著要的AI方案:DeepSeek-R1微調(diào)實戰(zhàn),3天構(gòu)建行業(yè)內(nèi)容生成器)
打開命令行:
運行以下命令安裝LightRAG Core:
pip install -e .
之后運行以下命令安裝LightRAG Server:
pip install -e ".[api]"
3.2 LightRAG構(gòu)建檢索增強生成系統(tǒng)(生成知識圖譜)實戰(zhàn)
在程序的examples目錄下面提供了很多構(gòu)建檢索增強生成系統(tǒng)(生成知識圖譜)的python示例文件:
首先我們需要下載一下用于生成知識圖譜的示例文件(狄更斯的圣誕頌歌):
curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt
下載完成以后記得放到examples目錄下面。
3.2.1 基于ollama構(gòu)建檢索增強生成系統(tǒng)(生成知識圖譜)
基于ollama構(gòu)建檢索增強生成系統(tǒng)(生成支持圖譜)的python文件為lightrag_ollama_demo.py,官方就有相關(guān)視頻教我們怎么一步步生成知識圖譜和進行查詢操作:https://www.youtube.com/watch?v=g21royNJ4fw,如果你本地顯存很大,可以試一下,否則我不建議你去浪費時間,我就被卡了一下午,我的chat模型用的是deepseek-r1:1.5b,向量模型用的是nomic-embed-text:latest
報錯503,出于程序員的本能,我第一時間就想著用postman測一下這個接口能通嗎?測了以后是通的。
于是又去查了資料:
被自己蠢笑了,原本是本地電腦8G的顯存根本不夠.......
3.2.2 調(diào)用云端智普大模型構(gòu)建檢索增強生成系統(tǒng)(生成知識圖譜)
基于云端智普大模型生成知識圖譜的python文件為lightrag_zhipu_demo.py,加一行代碼配置一下智普大模型的apiKey就行:
os.environ["ZHIPUAI_API_KEY"] = ""
你實在不知道加哪里(純小白),就直接粘貼我這個代碼替換lightrag_zhipu_demo.py:
# 導(dǎo)入必要的標(biāo)準(zhǔn)庫
import os
import logging
import asyncio
# 從lightrag庫中導(dǎo)入LightRAG類和QueryParam類
from lightrag import LightRAG, QueryParam
# 從lightrag.llm.zhipu模塊中導(dǎo)入智普大模型的文本生成和嵌入函數(shù)
from lightrag.llm.zhipu import zhipu_complete, zhipu_embedding
# 從lightrag.utils模塊中導(dǎo)入EmbeddingFunc類,用于定義嵌入函數(shù)
from lightrag.utils import EmbeddingFunc
# 從lightrag.kg.shared_storage模塊中導(dǎo)入初始化管道狀態(tài)的函數(shù)
from lightrag.kg.shared_storage import initialize_pipeline_status
# 設(shè)置工作目錄
WORKING_DIR = "./dickens"
# 配置日志記錄,設(shè)置日志格式和日志級別為INFO
logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO)
# 如果工作目錄不存在,則創(chuàng)建該目錄
if not os.path.exists(WORKING_DIR):
os.mkdir(WORKING_DIR)
# 設(shè)置智普大模型的API密鑰
os.environ["ZHIPUAI_API_KEY"] = ""
# 獲取環(huán)境變量中的API密鑰
api_key = os.environ.get("ZHIPUAI_API_KEY")
# 如果API密鑰未設(shè)置,則拋出異常提示用戶設(shè)置API密鑰
if api_key is None:
raise Exception("Please set ZHIPU_API_KEY in your environment")
# 定義一個異步函數(shù),用于初始化LightRAG實例
async def initialize_rag():
# 創(chuàng)建LightRAG實例
rag = LightRAG(
working_dir=WORKING_DIR, # 設(shè)置工作目錄
llm_model_func=zhipu_complete, # 設(shè)置使用的語言模型函數(shù)
llm_model_name="glm-4-flashx", # 設(shè)置使用的語言模型名稱
llm_model_max_async=4, # 設(shè)置最大異步請求數(shù)
llm_model_max_token_size=32768, # 設(shè)置模型處理的最大token數(shù)量
# 設(shè)置嵌入函數(shù)
embedding_func=EmbeddingFunc(
embedding_dim=2048, # 設(shè)置嵌入向量的維度
max_token_size=8192, # 設(shè)置模型處理的最大token數(shù)量
func=lambda texts: zhipu_embedding(texts), # 使用智普的嵌入函數(shù)
),
)
# 初始化存儲系統(tǒng)
await rag.initialize_storages()
# 初始化管道狀態(tài)
await initialize_pipeline_status()
# 返回初始化好的LightRAG實例
return rag
# 定義主函數(shù)
def main():
# 使用異步事件循環(huán)初始化LightRAG實例
rag = asyncio.run(initialize_rag())
# 讀取本地文本文件并將其內(nèi)容插入到LightRAG中
with open("./book.txt", "r", encoding="utf-8") as f:
rag.insert(f.read())
# 使用不同的查詢模式進行檢索并打印結(jié)果
# 樸素檢索:基礎(chǔ)查詢模式
print(
rag.query(
"What are the top themes in this story?", param=QueryParam(mode="naive")
)
)
# 局部檢索:局部檢索模式,僅查找與輸入相關(guān)的區(qū)域
print(
rag.query(
"What are the top themes in this story?", param=QueryParam(mode="local")
)
)
# 全局檢索:全局檢索模式,擴展到整個知識圖譜的關(guān)系
print(
rag.query(
"What are the top themes in this story?", param=QueryParam(mode="global")
)
)
# 混合檢索:混合模式,結(jié)合局部與全局信息
print(
rag.query(
"What are the top themes in this story?", param=QueryParam(mode="hybrid")
)
)
# 如果當(dāng)前模塊是主模塊,則調(diào)用主函數(shù)
if __name__ == "__main__":
main()
上述代碼展示了如何使用LightRAG框架構(gòu)建一個基于智普大模型的檢索增強生成系統(tǒng)。首先,設(shè)置工作目錄并配置智普API密鑰。然后,定義了一個異步函數(shù)initialize_rag
,用于初始化LightRAG實例,包括設(shè)置語言模型、嵌入函數(shù)和其他參數(shù)。在main
函數(shù)中,讀取本地文本文件,將其內(nèi)容插入到LightRAG中,并執(zhí)行多種查詢模式(如naive、local、global、hybrid),以獲取不同層次的檢索結(jié)果。整個流程實現(xiàn)了從文本處理、嵌入生成到多模式檢索的功能。
不知道智普大模型的apiKey怎么申請的可以點擊這個網(wǎng)址:https://www.bigmodel.cn/usercenter/proj-mgmt/apikeys
填入apiKey后運行代碼,代碼運行完畢后會在工作目錄生成結(jié)果文件:
以下是對各文件功能的解釋(細節(jié)圖我就不截了,可以生成出來自己去看文件細節(jié)):
- graph_chunk_entity_relation.graphml:
- 該文件以GraphML格式存儲知識圖譜的圖形結(jié)構(gòu),包括實體節(jié)點及其相互關(guān)系。這種格式便于使用圖形處理工具進行可視化和分析。
- kv_store_doc_status.json:
- 此JSON文件記錄文檔處理的狀態(tài)信息,例如文檔是否已成功處理或是否存在錯誤。這有助于跟蹤文檔的處理進度和狀態(tài)。
- kv_store_full_docs.json:
- 存儲原始文檔的完整內(nèi)容。該文件包含了所有輸入文檔的文本數(shù)據(jù),便于后續(xù)的檢索和處理。
- kv_store_llm_response_cache.json:
- 用于緩存大型語言模型(LLM)的響應(yīng)結(jié)果,以提高系統(tǒng)的響應(yīng)速度和效率,避免對相同請求進行重復(fù)計算。
- kv_store_text_chunks.json:
- 存儲將文檔拆分成的小塊(chunks)后的文本數(shù)據(jù)。將長文檔拆分為較小的塊有助于提高處理效率和檢索精度。
- vdb_chunks.json:
- 包含文本塊的向量化表示。通過將文本塊轉(zhuǎn)換為向量,可以在向量數(shù)據(jù)庫中進行高效的相似度搜索和檢索。
- vdb_entities.json:
- 存儲知識圖譜中實體的向量表示。將實體轉(zhuǎn)換為向量形式,有助于在檢索和推理過程中快速匹配和識別相關(guān)實體。
- vdb_relationships.json:
- 記錄知識圖譜中實體之間關(guān)系的向量表示。通過將關(guān)系表示為向量,可以在圖譜中進行高效的關(guān)系檢索和推理。
這些文件共同構(gòu)成了LightRAG系統(tǒng)的數(shù)據(jù)存儲和管理架構(gòu),支持知識圖譜的構(gòu)建、更新和查詢等功能。
運行g(shù)raph_visual_with_html.py,就可以生成可視化的知識圖譜html頁面:
# 導(dǎo)入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")
# 導(dǎo)入networkx庫,用于創(chuàng)建和操作復(fù)雜的網(wǎng)絡(luò)圖
import networkx as nx
# 從pyvis.network模塊導(dǎo)入Network類,用于在瀏覽器中展示網(wǎng)絡(luò)圖
from pyvis.network import Network
# 導(dǎo)入random模塊,用于生成隨機數(shù)
import random
# 讀取GraphML格式的圖文件,創(chuàng)建一個NetworkX圖對象G
G = nx.read_graphml("./dickens/graph_chunk_entity_relation.graphml")
# 創(chuàng)建一個Pyvis的Network對象,用于在瀏覽器中展示網(wǎng)絡(luò)圖
net = Network(height="100vh", notebook=True)
# 將NetworkX圖對象G轉(zhuǎn)換為Pyvis網(wǎng)絡(luò)
net.from_nx(G)
# 遍歷網(wǎng)絡(luò)中的所有節(jié)點,為每個節(jié)點添加隨機顏色和提示信息
for node in net.nodes:
# 為節(jié)點分配一個隨機顏色
node["color"] = "#{:06x}".format(random.randint(0, 0xFFFFFF))
# 如果節(jié)點有"description"屬性,將其設(shè)置為鼠標(biāo)懸停時顯示的提示信息
if "description" in node:
node["title"] = node["description"]
# 遍歷網(wǎng)絡(luò)中的所有邊,為每條邊添加提示信息
for edge in net.edges:
# 如果邊有"description"屬性,將其設(shè)置為鼠標(biāo)懸停時顯示的提示信息
if "description" in edge:
edge["title"] = edge["description"]
# 將網(wǎng)絡(luò)圖保存為HTML文件,并在瀏覽器中展示
net.show("knowledge_graph.html")
上述代碼使用 networkx
創(chuàng)建圖結(jié)構(gòu),利用pyvis
將其轉(zhuǎn)換為交互式網(wǎng)絡(luò)圖,并在瀏覽器中顯示。代碼首先檢查并安裝所需的pyvis
和networkx
庫,隨后讀取存儲在./dickens/graph_chunk_entity_relation.graphml
的圖數(shù)據(jù)文件。通過pyvis
的Network
類,將networkx
圖對象轉(zhuǎn)換為可視化網(wǎng)絡(luò),隨機為每個節(jié)點分配顏色,并設(shè)置節(jié)點和邊的提示信息。最終,生成的交互式網(wǎng)絡(luò)圖被保存為knowledge_graph.html
文件,用戶可在瀏覽器中打開并與之交互。
把鼠標(biāo)移動到節(jié)點上還能查看詳情:
4、LightRAG查詢
在lightrag_zhipu_demo.py中選擇你想要的查詢模式(注釋其他模式),輸入問題即可進行查詢(我選的是global模式):
我的問題是:
這個故事的主題是什么?
LightRAG的回答:
這個故事的主題是道德救贖和人物轉(zhuǎn)變。通過講述吝嗇鬼斯克魯奇在圣誕節(jié)的經(jīng)歷,以及他與三位圣誕靈的相遇,故事展現(xiàn)了斯克魯奇從自私、冷酷到慷慨、仁慈的轉(zhuǎn)變。圣誕節(jié)作為一個象征性的節(jié)日,強調(diào)了慷慨、善良和對他人的關(guān)懷。故事傳達了深刻的道德教訓(xùn),即人們可以通過反思和改變自己的行為來獲得救贖。以下是幾個重要的主題:
1. 道德救贖:斯克魯奇在故事中經(jīng)歷了深刻的道德轉(zhuǎn)變,他從最初的冷漠和吝嗇,最終轉(zhuǎn)變?yōu)橐粋€慷慨和仁慈的人。
2. 人物轉(zhuǎn)變:斯克魯奇的轉(zhuǎn)變是故事的核心,它展示了一個人在經(jīng)歷啟示后如何改變自己的性格和行為。
3. 圣誕節(jié)的象征意義:圣誕節(jié)作為一個節(jié)日,象征著慷慨、善良和社區(qū)的團結(jié),對斯克魯奇的性格轉(zhuǎn)變起到了重要的推動作用。
4. 社會批判:故事通過描繪斯克魯奇對窮人和慈善事業(yè)的冷漠態(tài)度,對社會的不平等和貧富差距進行了批判。
5. 人性的復(fù)雜性:斯克魯奇的形象展示了人性的復(fù)雜性,即使是一個冷酷的人也有機會改變自己,成為更好的人。
以上主題共同構(gòu)成了《圣誕頌歌》的核心內(nèi)容,使其成為一部經(jīng)典的文學(xué)作品。
5、 結(jié)語
通過對LightRAG技術(shù)的探索與應(yīng)用,我們不僅成功地構(gòu)建了一個高效的知識圖譜系統(tǒng),還進一步理解了RAG(檢索增強生成)技術(shù)在實際應(yīng)用中的潛力與挑戰(zhàn)。LightRAG通過引入圖結(jié)構(gòu)和增量更新機制,大大提升了知識圖譜的構(gòu)建效率與查詢精度,特別是在處理復(fù)雜領(lǐng)域知識時,展現(xiàn)了其獨特的優(yōu)勢。此外,LightRAG通過結(jié)合檢索與生成的雙層機制,能夠在保持語義連貫性的同時,實現(xiàn)對多實體、多層次關(guān)系的深入理解。無論是在文本生成、信息檢索還是知識圖譜的可視化等方面,LightRAG都為我們提供了新的思路和工具,推動了智能系統(tǒng)在處理復(fù)雜問題時的表現(xiàn)。