隨著資料規模增長,知識管理成為挑戰。本文介紹根據知識圖譜的 RAG 系統建置方法,解決資料關聯和有效檢索問題。系統流程包含資料收集、向量儲存填充及根據知識圖譜索引的 RAG 執行,並以 Wikipedia 為例,示範自動化資料檢索與知識圖譜建構流程。透過 Wikipedia API 取得資料,經預處理後,利用 LlamaIndex 建立知識圖譜索引,實作根據知識圖譜的 RAG 系統,有效提升生成內容的準確性和關聯性。
使用Wikipedia API和LlamaIndex建立可擴充套件的知識圖譜RAG系統
隨著資料集的規模不斷擴大,資料管理變得越來越具有挑戰性。在實際專案中,資料管理往往比人工智慧更令人頭痛!專案經理、顧問和開發人員不斷掙扎於取得必要的資料,以啟動任何專案,更不用說是根據RAG驅動的生成式人工智慧應用程式。在經過痛苦的決策過程後,資料通常會變得有條理,但在這之前往往是無結構的。Wikipedia就是一個很好的例子,展示了隨著資料規模的擴大,如何演變成大多數情況下可靠但有時不正確的資訊。實際專案往往會像Wikipedia一樣演變。資料在公司中不斷累積,對資料函式倉管理員、專案經理和使用者都提出了挑戰。
知識圖譜的重要性
其中一個主要問題是,如何將大量資料進行關聯,而知識圖譜提供了一種有效的視覺化不同型別資料之間關係的方法。本章首先定義了為RAG驅動的生成式人工智慧設計的知識函式庫生態系統的架構。該生態系統包含三個流程:資料收集、填充向量儲存以及執行根據知識圖譜索引的RAG程式。然後,我們將建立Pipeline1:收集和準備檔案,其中我們將建立自動化的Wikipedia檢索系統。
知識圖譜架構設計
知識圖譜是一種結構化的資料儲存方式,可以有效地表示實體之間的關係。在RAG驅動的生成式人工智慧應用中,知識圖譜可以幫助我們更好地理解和檢索相關資訊,從而提高生成內容的準確性和相關性。
Pipeline1:收集和準備檔案
在這個流程中,我們將使用Wikipedia API來檢索相關檔案,並對其進行預處理,以便後續的向量化和知識圖譜建立。
import wikipedia
from wikipedia.exceptions import DisambiguationError, PageError
def retrieve_wikipedia_page(title):
try:
page = wikipedia.page(title)
return page.content
except DisambiguationError as e:
print(f"Disambiguation error: {e}")
except PageError as e:
print(f"Page error: {e}")
# 檢索Wikipedia頁面
title = "Artificial Intelligence"
content = retrieve_wikipedia_page(title)
print(content)
內容解密:
上述程式碼使用Wikipedia API來檢索特定主題的頁面內容。首先,我們定義了一個函式retrieve_wikipedia_page,該函式接受一個標題作為輸入,並嘗試檢索對應的Wikipedia頁面。如果頁面存在,則傳回頁面的內容;如果發生了消歧義錯誤或頁面錯誤,則捕捉相應的異常並列印錯誤訊息。
資料預處理
在檢索到Wikipedia頁面內容後,我們需要對其進行預處理,以便後續的向量化和知識圖譜建立。預處理步驟包括但不限於:
- 文字清理:移除不必要的字元,如標點符號、特殊字元等。
- 分詞:將文字分割成單詞或片語。
- 停用詞移除:移除常見但無實際意義的詞彙,如“的”、“是”等。
- 詞幹提取或詞形還原:將詞彙還原到其基本形式。
import re
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
def preprocess_text(text):
# 文字清理
text = re.sub(r'\W', ' ', text)
# 分詞
tokens = word_tokenize(text)
# 停用詞移除
tokens = [token for token in tokens if token.lower() not in stopwords.words('english')]
# 詞形還原
lemmatizer = WordNetLemmatizer()
tokens = [lemmatizer.lemmatize(token) for token in tokens]
return ' '.join(tokens)
# 預處理文字
preprocessed_content = preprocess_text(content)
print(preprocessed_content)
內容解密:
上述程式碼對檢索到的Wikipedia頁面內容進行預處理。首先,我們使用正規表示式移除非單詞字元;然後,使用NLTK函式庫進行分詞;接著,移除停用詞;最後,使用詞形還原器將詞彙還原到其基本形式。預處理後的文字更適合後續的向量化和知識圖譜建立。
知識圖譜建立
在完成資料預處理後,我們可以使用LlamaIndex來建立知識圖譜。LlamaIndex是一個強大的工具,可以幫助我們將文字資料轉換為結構化的知識圖譜,從而更好地表示實體之間的關係。
from llama_index import LlamaIndex
def create_knowledge_graph(text):
index = LlamaIndex(text)
return index
# 建立知識圖譜
knowledge_graph = create_knowledge_graph(preprocessed_content)
print(knowledge_graph)
內容解密:
上述程式碼使用LlamaIndex來建立知識圖譜。首先,我們定義了一個函式create_knowledge_graph,該函式接受預處理後的文字作為輸入,並使用LlamaIndex建立知識圖譜。建立好的知識圖譜可以有效地表示實體之間的關係,從而提高生成內容的準確性和相關性。
未來方向
未來的研究可以進一步探討如何最佳化知識圖譜的建立過程,以及如何將知識圖譜更好地應用於實際的RAG驅動生成式人工智慧應用程式中。此外,還可以探索如何將其他型別的資料來源整合到知識圖譜中,以進一步提高其準確性和相關性。
透過本章節的介紹,我們瞭解瞭如何使用Wikipedia API和LlamaIndex建立可擴充套件的知識圖譜RAG系統。這一系統可以有效地表示實體之間的關係,從而提高生成內容的準確性和相關性。未來,我們可以進一步最佳化這一系統,並將其應用於更廣泛的領域。
從Wikipedia API到知識圖譜的RAG系統建置
本章節將介紹如何建立一個根據知識圖譜的檢索增強生成(RAG)系統,用於語義搜尋。我們將利用Wikipedia API來收集資料,並使用Deep Lake向量儲存和LlamaIndex來建立知識圖譜索引,最終實作一個可以與知識圖譜互動的系統。
RAG系統的架構
我們的目標是建立一個根據圖的RAG程式,能夠視覺化地呈現RAG資料集中檔案之間的關係。這個圖可以利用LlamaIndex自動生成。程式將設計為適用於任何Wikipedia主題。
系統流程
- 選擇Wikipedia主題:選擇一個與行銷相關的Wikipedia主題,例如。
- 生成Wikipedia頁面語料函式庫:使用Wikipedia API生成相關Wikipedia頁面的語料函式庫。
- 檢索和儲存參照:檢索每個頁面的參照並儲存。
- 檢索和儲存URL:檢索每個頁面的URL並儲存。
- 檢索和更新內容:檢索URL的內容並更新到Deep Lake向量儲存中。
- 建立知識圖譜索引:使用LlamaIndex建立知識圖譜索引。
- 定義使用者輸入提示:定義使用者輸入提示。
- 查詢知識圖譜索引:查詢知識圖譜索引。
- 生成回應:利用LlamaIndex的內建LLM功能生成回應。
- 評估回應:使用句子轉換器和人類反饋評分來評估LLM的回應。
- 提供時間指標:提供關鍵功能的時間指標。
Pipeline1:收集和準備檔案
我們將建立一個Wikipedia程式,使用Wikipedia API來檢索連結和後設資料(摘要、URL和參照資料)。然後,我們將載入和解析URL以準備資料進行更新。
import wikipedia
def get_wikipedia_data(topic):
# 搜尋Wikipedia頁面
search_results = wikipedia.search(topic)
page_title = search_results[0]
page = wikipedia.page(page_title)
# 取得頁面內容、URL和參照資料
content = page.content
url = page.url
citation = page.references
return content, url, citation
# 測試函式
topic = "行銷"
content, url, citation = get_wikipedia_data(topic)
print("內容:", content)
print("URL:", url)
print("參照:", citation)
內容解密:
此段程式碼定義了一個函式get_wikipedia_data,用於檢索Wikipedia頁面的內容、URL和參照資料。首先,它使用wikipedia.search函式搜尋與給定主題相關的Wikipedia頁面。然後,它使用wikipedia.page函式取得第一個搜尋結果的頁面物件。最後,它從頁面物件中提取內容、URL和參照資料。
Pipeline2:建立和填充Deep Lake向量儲存
我們將使用Deep Lake的內建自動分塊和OpenAI嵌入功能,將解析後的Wikipedia頁面內容嵌入並更新到Deep Lake向量儲存中。
import deeplake
from deeplake import VectorStore
def create_deeplake_vector_store(data):
# 建立Deep Lake向量儲存
vector_store = VectorStore(
dataset_path="hub://activeloop/wikipedia-embeddings",
embedding_function=OpenAIEmbeddings()
)
# 更新資料到向量儲存
vector_store.upsert(data)
# 測試函式
data = [{"text": content, "metadata": {"url": url, "citation": citation}}]
create_deeplake_vector_store(data)
內容解密:
此段程式碼定義了一個函式create_deeplake_vector_store,用於建立Deep Lake向量儲存並更新資料。首先,它使用VectorStore類別建立一個向量儲存物件,指定資料集路徑和嵌入函式。然後,它使用upsert方法將資料更新到向量儲存中。
Pipeline3:根據知識圖譜索引的RAG
我們將使用LlamaIndex建立知識圖譜索引,並顯示它。然後,我們將建立功能來查詢知識圖譜索引,並讓LlamaIndex的內建LLM生成回應。
from llama_index import KnowledgeGraphIndex
def create_knowledge_graph_index(data):
# 建立知識圖譜索引
index = KnowledgeGraphIndex(nodes=data)
# 顯示知識圖譜
index.display()
return index
# 測試函式
data = [{"text": content, "metadata": {"url": url, "citation": citation}}]
index = create_knowledge_graph_index(data)
def query_knowledge_graph(index, query):
# 查詢知識圖譜索引
response = index.query(query)
return response
# 測試函式
query = "什麼是行銷?"
response = query_knowledge_graph(index, query)
print("回應:", response)
內容解密:
此段程式碼定義了兩個函式:create_knowledge_graph_index和query_knowledge_graph。create_knowledge_graph_index函式使用LlamaIndex的KnowledgeGraphIndex類別建立知識圖譜索引,並顯示它。query_knowledge_graph函式用於查詢知識圖譜索引,並傳回回應。