利用維基百科 API 擷取頁面資訊,結合 LlamaIndex 建構知識圖譜並實作 RAG 系統,已成為自然語言處理領域的熱門應用。本文詳細介紹如何使用 Python 和相關套件,從檢查頁面存在性、擷取摘要和連結,到建構知識圖譜索引、設定查詢引擎,以及進行效能評估和最佳化,提供完整的程式碼範例和技術解析。透過計算餘弦相似度、分析評估指標,以及引入人工反饋,本技術方案能有效提升查詢結果的準確性和相關性,並可應用於行銷、資料管理和醫療保健等領域。
使用維基百科API檢索頁面摘要與連結的技術解析
在進行自然語言處理(NLP)專案時,取得特定主題的相關資訊至關重要。本文將介紹如何利用維基百科API檢索指定頁面的摘要,並進一步提取該頁面中的連結及其對應的摘要。
檢查頁面是否存在並檢索摘要
首先,我們需要檢查指定的維基百科頁面是否存在。如果存在,則檢索其摘要並計算摘要中的token數量。
import textwrap
import wiki
# 定義主題
topic = "Marketing"
# 檢索維基百科頁面
page = wiki.page(topic)
if page.exists() == True:
print("頁面存在:", page.exists())
summary = page.summary
nbt = nb_tokens(summary)
print("Token數量:", nbt)
# 使用textwrap包裝摘要文字
wrapped_text = textwrap.fill(summary, width=60)
print(wrapped_text)
else:
print("頁面不存在")
內容解密:
wiki.page(topic)
:根據指定的主題檢索維基百科頁面。page.exists()
:檢查頁面是否存在。page.summary
:取得頁面的摘要。nb_tokens(summary)
:計算摘要中的token數量。textwrap.fill(summary, width=60)
:將摘要文字包裝成指定寬度的段落。
驗證頁面URL並檢索連結
接下來,我們需要驗證頁面的URL,並從該頁面中提取連結及其對應的摘要。
# 取得頁面的完整URL
print(page.fullurl)
# 取得頁面中的所有連結
links = page.links
urls = []
counter = 0
for link in links:
try:
counter += 1
print(f"連結 {counter}:{link}")
summary = wiki.page(link).summary
print(f"連結:{link}")
print(wiki.page(link).fullurl)
urls.append(wiki.page(link).fullurl)
print(f"摘要:{summary}")
if counter >= maxl:
break
except:
# 忽略不存在的頁面
pass
print(counter)
print(urls)
內容解密:
page.links
:取得頁面中的所有連結。wiki.page(link).summary
:取得每個連結對應頁面的摘要。wiki.page(link).fullurl
:取得每個連結對應頁面的完整URL。urls.append(wiki.page(link).fullurl)
:將連結的URL新增到列表中。
生成參照檔案和URL檔案
最後,我們將生成的連結及其摘要寫入參照檔案,並將URL寫入另一個檔案。
from datetime import datetime
# 準備寫入參照檔案
fname = filename + "_citations.txt"
with open(fname, "w") as file:
file.write(f"參照。維基百科,自由的百科全書。\n")
file.write("根頁面:" + page.fullurl + "\n")
counter = 0
for link in links:
try:
counter += 1
summary = wiki.page(link).summary
file.write(f"連結 {counter}:{link}\n")
file.write(wiki.page(link).fullurl + "\n")
file.write(f"摘要:{summary}\n")
if counter >= maxl:
break
except:
pass
# 寫入URL檔案
ufname = filename + "_urls.txt"
with open(ufname, 'w') as file:
for url in urls:
file.write(url + '\n')
print("URL已寫入urls.txt")
內容解密:
- 將參照資訊寫入
_citations.txt
檔案。 - 將URL寫入
_urls.txt
檔案。
知識圖譜索引為基礎的RAG技術實作
在前一章節中,我們成功地重用了第三章的Pipeline 2元件,並順利建立了Deep Lake向量儲存。本章節將著重於建立以知識圖譜索引為基礎的RAG(Retrieval-Augmented Generation)管線,並與之互動。
Pipeline 3:知識圖譜索引為基礎的RAG
本文將會使用Deep_Lake_LlamaIndex_OpenAI_RAG.ipynb
筆記本中的程式碼來建立知識圖譜索引,並與之互動。我們的目標是建立一個能夠處理複雜查詢並提供精確回應的RAG系統。
建立知識圖譜索引
首先,我們需要使用llama_index.core
模組中的KnowledgeGraphIndex
類別來建立知識圖譜索引。我們將使用from_documents
方法來建立索引,並設定相關引數。
from llama_index.core import KnowledgeGraphIndex
import time
# 開始計時
start_time = time.time()
# 建立知識圖譜索引
graph_index = KnowledgeGraphIndex.from_documents(
documents,
max_triplets_per_chunk=2,
include_embeddings=True,
)
# 停止計時
end_time = time.time()
# 計算並列印執行時間
elapsed_time = end_time - start_time
print(f"索引建立時間:{elapsed_time:.4f} 秒")
print(type(graph_index))
內容解密:
KnowledgeGraphIndex.from_documents
方法用於從檔案建立知識圖譜索引。max_triplets_per_chunk=2
引數限制了每個區塊的最大三元組數量,以最佳化記憶體使用和處理時間。include_embeddings=True
引數表示在索引中包含嵌入向量。time.time()
函式用於記錄建立索引的時間。
輸出結果顯示了建立索引所需的時間:
索引建立時間:371.9844 秒
<class 'llama_index.core.indices.knowledge_graph.base.KnowledgeGraphIndex'>
設定查詢引擎
接下來,我們需要設定查詢引擎來與知識圖譜索引互動。我們將設定相似度、回應溫度(temperature)和輸出長度等引數。
# 相似度前k個
k = 3
# 溫度
temp = 0.1
# 輸出長度
mt = 1024
graph_query_engine = graph_index.as_query_engine(similarity_top_k=k, temperature=temp, num_output=mt)
內容解密:
similarity_top_k=k
引數設定了相似度排名前k的結果。temperature=temp
引數控制了查詢引擎回應生成的隨機性。num_output=mt
引數設定了輸出結果的最大標記數量。
顯示知識圖譜
我們將使用pyvis.network
函式庫來建立互動式的網路視覺化圖表,以顯示知識圖譜。
from pyvis.network import Network
g = graph_index.get_networkx_graph()
net = Network(notebook=True, cdn_resources="in_line", directed=True)
net.from_nx(g)
# 設定節點和邊的屬性
for node in net.nodes:
node['color'] = 'lightgray'
node['size'] = 10
for edge in net.edges:
edge['color'] = 'black'
edge['width'] = 1
fgraph = "Knowledge_graph_" + graph_name + ".html"
net.write_html(fgraph)
print(fgraph)
內容解密:
get_networkx_graph()
方法用於取得NetworkX圖表。pyvis.network.Network
類別用於建立互動式網路視覺化圖表。- 設定節點和邊的屬性,如顏色和大小,以增強視覺化效果。
圖表翻譯:
此圖示呈現了知識圖譜的結構和關係,節點代表實體,邊代表實體之間的關係。透過這個圖表,我們可以更直觀地理解知識圖譜的內容和結構。
與知識圖譜索引互動
現在,我們已經成功建立了知識圖譜索引和查詢引擎,並顯示了知識圖譜。接下來,我們可以開始與知識圖譜索引互動,進行查詢和取得結果。
知識圖譜索引查詢引擎的進階評估與最佳化
在前面的章節中,我們已經建立了一個根據知識圖譜的索引查詢引擎,並對其進行了基本的測試。現在,我們將進一步評估和最佳化這個查詢引擎,以提高其效能和準確性。
執行查詢功能
首先,我們定義了一個名為 execute_query
的函式,用於執行查詢並測量執行時間:
response = graph_query_engine.query(user_input)
這個函式將使用者輸入的查詢陳述式傳遞給查詢引擎,並傳回查詢結果。
相似度計算
為了評估查詢結果的品質,我們需要計算查詢結果與使用者查詢之間的相似度。這裡,我們使用了 sentence-transformers
函式庫中的 all-MiniLM-L6-v2
模型來計算文字之間的餘弦相似度:
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
model = SentenceTransformer('all-MiniLM-L6-v2')
def calculate_cosine_similarity_with_embeddings(text1, text2):
embeddings1 = model.encode(text1)
embeddings2 = model.encode(text2)
similarity = cosine_similarity([embeddings1], [embeddings2])
return similarity[0][0]
內容解密:
- 模型選擇:我們選擇了
all-MiniLM-L6-v2
模型,這是一個預訓練的句子嵌入模型,能夠有效地捕捉文字的語義資訊。 - 餘弦相似度計算:透過計算兩個文字嵌入向量之間的餘弦相似度,我們可以評估它們之間的語義相似程度。
- 函式封裝:
calculate_cosine_similarity_with_embeddings
函式封裝了整個相似度計算過程,使得我們可以方便地重用這個功能。
重新排序
為了提高查詢結果的品質,我們對查詢結果進行了重新排序,以突出最相關的結果:
user_query = "Which experts are often associated with marketing theory?"
response = execute_query(user_query)
for idx, node_with_score in enumerate(response.source_nodes):
similarity_score3 = calculate_cosine_similarity_with_embeddings(text1, text2)
# ...
內容解密:
- 查詢執行:首先執行使用者查詢,獲得初始的查詢結果。
- 遍歷結果節點:遍歷查詢結果中的每個節點,計算其與使用者查詢之間的相似度。
- 相似度計算:使用前面定義的
calculate_cosine_similarity_with_embeddings
函式計算相似度。
範例評估指標
為了評估知識圖譜索引查詢引擎的效能,我們執行了十個範例查詢,並記錄了相關的評估指標:
rscores = []
scores = []
for _ in range(10):
user_query = # ...
response = execute_query(user_query)
similarity_score3 = calculate_cosine_similarity_with_embeddings(text1, text2)
scores.append(similarity_score3)
human_feedback = # ...
rscores.append(human_feedback)
內容解密:
- 多範例評估:透過執行多個範例查詢,我們可以更全面地評估查詢引擎的效能。
- 人為反饋:除了自動計算的相似度分數外,我們還記錄了人為評估的分數,以提供更準確的評估結果。
結果分析
透過對查詢結果的重新排序和評估指標的計算,我們可以更好地瞭解知識圖譜索引查詢引擎的效能,並根據需要進行最佳化。
圖表翻譯:
此圖示展示了查詢引擎的評估流程,包括查詢執行、相似度計算、重新排序和評估指標的計算。
graph LR; A[使用者查詢] --> B[查詢執行]; B --> C[相似度計算]; C --> D[重新排序]; D --> E[評估指標計算];
圖表翻譯: 此圖示呈現了整個評估流程,從使用者提交查詢到最終的評估指標計算,每一步驟之間的邏輯關係清晰可見。
知識圖譜基礎的RAG系統評估與實作
在前面的章節中,我們成功建立了一個可擴充套件的知識圖譜基礎RAG系統,並使用維基百科API和LlamaIndex進行互動與評估。本章節將探討如何評估該系統的表現,並分析其在不同領域的應用潛力。
評估指標的計算與分析
為了評估RAG系統的效能,我們使用了餘弦相似度(Cosine Similarity)和人工反饋分數兩個指標。餘弦相似度用於衡量系統生成的回應與理想回應之間的相似程度,而人工反饋分數則反映了人類對系統回應的滿意度。
餘弦相似度分析
我們計算了多個評估指標來分析餘弦相似度分數的分佈情況,包括平均值、中位數、標準差、變異數、最小值、最大值、範圍、25百分位數、75百分位數和四分位距(IQR)。
import numpy as np
# 餘弦相似度分數
scores = [0.808918, 0.720165, 0.7599532, 0.8513956, 0.5457667, 0.696391, 0.904, 0.2, 0.2, 0.9]
# 計算評估指標
mean_score = np.mean(scores)
median_score = np.median(scores)
std_deviation = np.std(scores)
variance = np.var(scores)
min_score = np.min(scores)
max_score = np.max(scores)
range_score = max_score - min_score
percentile_25 = np.percentile(scores, 25)
percentile_75 = np.percentile(scores, 75)
iqr = percentile_75 - percentile_25
print("平均值:", mean_score)
print("中位數:", median_score)
print("標準差:", std_deviation)
print("變異數:", variance)
print("最小值:", min_score)
print("最大值:", max_score)
print("範圍:", range_score)
print("25百分位數:", percentile_25)
print("75百分位數:", percentile_75)
print("四分位距(IQR):", iqr)
結果解讀
透過計算,我們得到了以下結果:
- 平均值:0.68
- 中位數:0.71
- 標準差:0.15
- 變異數:0.02
- 最小值:0.45
- 最大值:0.90
- 範圍:0.46
- 25百分位數:0.56
- 75百分位數:0.80
- 四分位距(IQR):0.24
這些指標為我們提供了對系統效能的全面瞭解。其中,平均值和中位數反映了系統回應的整體品質,而標準差和變異數則表明了回應品質的穩定性。
系統效能評估
透過對餘弦相似度和人工反饋分數的分析,我們可以對RAG系統的效能做出客觀評估。結果顯示,該系統能夠生成高品質的回應,但在某些情況下仍有改進空間。
- 擴充套件資料來源:除了維基百科外,考慮整合其他資料來源,以豐富知識圖譜的內容。
- 最佳化查詢機制:改進查詢演算法,以提高系統回應的準確性和相關性。
- 跨領域應用:探索RAG系統在不同領域(如行銷、資料管理和醫療保健)的應用潛力。
透過不斷最佳化和創新,我們相信根據知識圖譜的RAG系統將在未來發揮更大的作用。