隨著資料規模增長,知識管理成為挑戰。本文介紹根據知識圖譜的 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主題。

系統流程

  1. 選擇Wikipedia主題:選擇一個與行銷相關的Wikipedia主題,例如。
  2. 生成Wikipedia頁面語料函式庫:使用Wikipedia API生成相關Wikipedia頁面的語料函式庫。
  3. 檢索和儲存參照:檢索每個頁面的參照並儲存。
  4. 檢索和儲存URL:檢索每個頁面的URL並儲存。
  5. 檢索和更新內容:檢索URL的內容並更新到Deep Lake向量儲存中。
  6. 建立知識圖譜索引:使用LlamaIndex建立知識圖譜索引。
  7. 定義使用者輸入提示:定義使用者輸入提示。
  8. 查詢知識圖譜索引:查詢知識圖譜索引。
  9. 生成回應:利用LlamaIndex的內建LLM功能生成回應。
  10. 評估回應:使用句子轉換器和人類反饋評分來評估LLM的回應。
  11. 提供時間指標:提供關鍵功能的時間指標。

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_indexquery_knowledge_graphcreate_knowledge_graph_index函式使用LlamaIndex的KnowledgeGraphIndex類別建立知識圖譜索引,並顯示它。query_knowledge_graph函式用於查詢知識圖譜索引,並傳回回應。