在現今的資訊爆炸時代,快速有效地取得知識至關重要。本文介紹如何利用維基百科 API、Chroma、Hugging Face Llama 和 ONNX Runtime 建構動態 RAG 知識函式庫,實作即時資訊擷取和問答。我們以 SciQ 資料集為例,示範如何將動態資訊整合至 Python 實時決策流程,並探討如何使用 spaCy 計算準確度。此外,我們也探討了 ONNX、ONNX Runtime 和 Hugging Face 的整合應用,如何最佳化模型佈署和執行效能,以及如何透過調整嵌入模型、相似度計算方法和查詢結果數量來提升系統效能。
解鎖 RAG 的力量:建構客製化增強生成式 AI 知識函式庫
流程圖與系統架構
在建構客製化增強生成式 AI 知識函式庫的過程中,我們首先需要了解整個系統的運作流程。以下是一個展示根據知識圖譜的問答系統運作流程的
圖表翻譯:
此流程圖清晰地呈現了從使用者查詢到最終效能分析的每個步驟。使用者查詢首先被送到知識圖譜索引,接著擷取相關資訊並生成回覆。最後,系統會計算評估指標並進行效能分析,以確保資料擷取的準確性和效率。
系統架構圖
接下來,我們來看看知識圖譜問答系統的主要組成部分及其之間的互動關係:
圖表翻譯:
此架構圖展示了使用者介面與知識圖譜問答系統之間的互動。使用者輸入查詢後,查詢引擎會與知識圖譜索引互動,並利用維基百科 API 來擷取相關資訊,最終將結果顯示給使用者。
Pipeline 設計與動態知識圖譜建構
我們利用維基百科 API 自動化擷取特定主題的內容,並將其嵌入到 Deep Lake 向量資料函式庫中。然後,我們使用 LlamaIndex 從嵌入的資料中自動建構知識圖譜索引,以視覺化方式呈現不同資訊片段之間的關係。
程式碼範例:
# 從維基百科 API 擷取資料並嵌入到 Deep Lake 向量資料函式庫
import wikipediaapi
from deeplake import VectorStore
wiki = wikipediaapi.Wikipedia('en')
page = wiki.page('Marketing')
content = page.text
vector_store = VectorStore()
vector_store.embed(content)
內容解密:
此程式碼範例展示瞭如何使用維基百科 API 擷取特定主題的內容,並將其嵌入到 Deep Lake 向量資料函式庫中。首先,我們使用 wikipediaapi 函式庫來擷取特定頁面的內容。接著,我們建立一個 VectorStore 物件,並將擷取到的內容嵌入其中。這樣,我們就可以將大量資料整合到結構化向量資料函式庫中,方便後續處理和查詢。
動態 RAG 與 Chroma 和 Hugging Face Llama 的整合
在快速發展的環境中,決策者需要即時且相關的資料。因此,我們提出了一種創新方法,利用 Chroma 和 Hugging Face Llama 來處理動態資料。
動態 RAG 的架構
想像一下,每天早上收集一批新的問題和答案,並在會議期間快速有效地存取這些資訊。以下是一個展示動態 RAG 流程的
圖表翻譯:
此流程圖展示了動態 RAG 的運作流程。每天收集新資料後,建立 Chroma 集合。使用者可以在會議前查詢以驗證資料,或在會議中即時查詢以取得動態抽認卡。
將動態資訊融入 Python 實時決策流程
我們將探討如何在 Python 中將動態資訊高效整合至實時決策流程,例如每日會議。以下是一個展示系統架構的
圖表翻譯:
此流程圖展示了動態 RAG 系統的資料處理和實時查詢流程。首先,系統收集並嵌入相關資料至 Chroma 向量資料函式庫。在會議前,系統會驗證資料的準確性。會議期間,使用者提問將觸發資料函式庫查詢,並由 Llama 模型生成答案,最後顯示結果。
環境建置
本環境著重於可在本地機器或免費 Google Colab 帳戶上執行的開源和免費資源。我們將在 Google Colab 上使用 Hugging Face 和 Chroma 執行這些資源。
Hugging Face 安裝
首先安裝 Hugging Face,以使用其開源資源下載 Llama 模型的資料集。
# 安裝 Hugging Face 函式庫
!pip install transformers
# 登入 Hugging Face 帳戶
from huggingface_hub import login
login(token='your_hugging_face_token')
內容解密:
此程式碼範例展示瞭如何安裝 Hugging Face 函式庫並登入 Hugging Face 帳戶。首先,我們使用 pip 安裝 transformers 函式庫。接著,我們使用 huggingface_hub 函式庫的 login 方法登入 Hugging Face 帳戶,需要提供有效的 API token。登入後,我們就可以使用 Hugging Face 的開源資源下載 Llama 模型的資料集。
深入解析 ONNX、ONNX Runtime 與 Hugging Face 的整合應用
在人工智慧模型佈署的過程中,如何確保模型能夠跨不同框架和硬體高效執行,一直是業界關注的焦點。ONNX(Open Neural Network Exchange)作為一種開放的模型交換格式,有效地解決了這個問題。本文將探討 ONNX、ONNX Runtime 和 Hugging Face 的整合應用,並以 SciQ 資料集為例,展示如何構建一個動態 RAG(Retrieval Augmented Generation)系統。
ONNX Runtime:跨平台模型加速引擎
ONNX Runtime 是一款高效能的 ONNX 模型執行引擎,其跨平台特性使其能夠在各種硬體組態(CPU、GPU 和其他加速器)上最佳化模型執行。透過整合硬體特定的函式庫,ONNX Runtime 能夠充分發揮硬體效能,加速模型推理。
Hugging Face:模型生命週期管理框架
Hugging Face 提供了完整的模型生命週期管理工具,從預訓練模型的存取和佈署,到模型的訓練和微調,都能在其生態系統中完成。Hugging Face 的 Transformers 函式庫支援將模型轉換為 ONNX 格式,使得模型的佈署更加靈活。
ONNX 與 Hugging Face 的協同作用
在模型訓練完成後,可以將 Hugging Face 訓練的模型轉換為 ONNX 格式,以便使用 ONNX Runtime 進行更廣泛與最佳化的佈署。這種協同工作流程確保了模型的相容性和高效執行。
圖表翻譯: 此圖示展示了 Hugging Face 訓練的模型如何轉換為 ONNX 格式,並透過 ONNX Runtime 在不同硬體平台上進行佈署的流程。
使用 spaCy 計算準確度
在動態 RAG 系統中,我們可以使用 spaCy 來計算向量儲存函式庫查詢結果與原始完成文字之間的準確度。以下指令安裝了一個中等大小的 spaCy 英文語言模型 en_core_web_md,適用於一般的 NLP 任務:
python -m spacy download en_core_web_md
內容解密:
此指令下載並安裝 en_core_web_md 模型,該模型可用於詞性標注、命名實體識別等 NLP 任務,有助於提升文書處理的準確性。
動態 RAG 的時間考量
在實際應用中,時間是動態 RAG 的關鍵因素。例如,如果每日決策會議在上午 10 點舉行,RAG 準備團隊可能需要在上午 8 點開始準備,以便收集線上資料、處理公司資料批次或執行其他必要任務。
以下程式碼用於測量整個程式執行時間:
import time
# Start timing before the request
session_start_time = time.time()
# ... your code here ...
session_end_time = time.time()
print(f"Total session time: {session_end_time - session_start_time} seconds")
內容解密:
這段程式碼透過 time.time() 紀錄程式執行的起始和結束時間,並計算總執行時間,用於評估系統效能。
下載和準備 SciQ 資料集
SciQ 資料集包含 13,679 道多項選擇科學題,可用於訓練 NLP 模型。我們將使用 question、correct_answer 和 support 欄位來構建我們的 RAG 系統。
from datasets import load_dataset
import pandas as pd
# Load the SciQ dataset
dataset = load_dataset("sciq", split="train")
# Filter the dataset
filtered_dataset = dataset.filter(lambda x: x["support"] != "" and x["correct_answer"] != "")
# Convert to DataFrame
df = pd.DataFrame(filtered_dataset)
# Drop unnecessary columns
columns_to_drop = ['distractor3', 'distractor1', 'distractor2']
df.drop(columns=columns_to_drop, inplace=True)
# Create completion column
df['completion'] = df['correct_answer'] + " because " + df['support']
# Remove NaN values
df.dropna(subset=['completion'], inplace=True)
print(df.shape)
print(df.columns)
內容解密:
這段程式碼首先載入 SciQ 資料集,接著過濾出 support 和 correct_answer 非空的資料,並將其轉換為 DataFrame。然後,刪除不必要的欄位,並建立一個新的 completion 欄位,用於儲存答案及其對應的解釋。
將資料嵌入和上傳到 Chroma 集合
import chromadb
client = chromadb.Client()
collection_name = "sciq_supports6"
collections = client.list_collections()
collection_exists = any(collection.name == collection_name for collection in collections)
if not collection_exists:
collection = client.create_collection(collection_name)
else:
print(f"Collection {collection_name} exists")
results = collection.get()
for result in results:
print(result)
內容解密:
這段程式碼建立了一個 Chroma client 並定義了集合名稱。它檢查集合是否存在,如果不存在則建立一個新集合。最後,它顯示了新建立集合的結構,用於儲存和管理嵌入向量。
圖表翻譯: 此圖示展示了從載入 SciQ 資料集到將資料嵌入並上傳到 Chroma 集合的整個流程。
上傳資料到 Chroma
embeddings = collection.get(include=['embeddings'])['embeddings']
documents = df["completion"][:nb].astype(str).tolist()
model_name = "all-MiniLM-L6-v2"
ldf = len(df)
nb = ldf
start_time = time.time()
if not collection_exists:
collection.add(
ids=[str(i) for i in range(0, nb)],
documents=documents,
metadatas=[{"type": "completion"} for _ in range(0, nb)],
)
response_time = time.time() - start_time
print(f"Response Time: {response_time:.2f} seconds")
內容解密:
這段程式碼首先檢查集合是否存在,如果不存在,則將處理好的資料嵌入並上傳到 Chroma 集合中。它記錄了上傳資料所需的時間,用於評估系統的效能。
提取與分析嵌入向量
# 從集合中提取包含嵌入向量的結果
result = collection.get(include=['embeddings'])
# 從結果中提取第一個嵌入向量
first_embedding = result['embeddings'][0]
# 如果需要處理第一個嵌入向量的長度或進行操作
embedding_length = len(first_embedding)
print("第一個嵌入向量:", first_embedding)
print("嵌入向量長度:", embedding_length)
#### 內容解密:
1. `result = collection.get(include=['embeddings'])`:從集合中取得包含嵌入向量的結果。
2. `first_embedding = result['embeddings'][0]`:提取結果中的第一個嵌入向量。
3. `embedding_length = len(first_embedding)`:計算第一個嵌入向量的長度。
4. 程式碼用於檢查和驗證嵌入向量的內容和屬性。
## 查詢與回應時間測量
```python
start_time = time.time()
results = collection.query(
query_texts=df["question"][:nb],
n_results=1
)
response_time = time.time() - start_time
print(f"回應時間:{response_time:.2f} 秒")
#### 內容解密:
1. `start_time = time.time()`:記錄查詢開始的時間。
2. `collection.query`:執行查詢操作,尋找與給定問題最相似的結果。
3. `response_time = time.time() - start_time`:計算查詢所需的總時間。
4. 程式碼用於評估查詢操作的效能。
## 使用 spaCy 進行文字相似度計算
```python
import spacy
import numpy as np
# 載入預訓練的 spaCy 語言模型
nlp = spacy.load('en_core_web_md')
def simple_text_similarity(text1, text2):
doc1 = nlp(text1)
doc2 = nlp(text2)
vector1 = doc1.vector
vector2 = doc2.vector
if np.linalg.norm(vector1) == 0 or np.linalg.norm(vector2) == 0:
return 0.0
else:
return np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))
內容解密:
nlp = spacy.load('en_core_web_md'):載入中型英文 spaCy 模型。simple_text_similarity函式:計算兩個文字之間的相似度。- 使用向量點積和範數計算餘弦相似度,若任一向量範數為零則傳回 0。
- spaCy 模型提供詞向量,用於評估文字之間的語義相似性。
玄貓的專業分析與建議
程式碼功能概述
以上程式碼展示瞭如何使用 Chroma 和 spaCy 建立簡單的動態 RAG 系統。主要步驟包括:
- 使用 all-MiniLM-L6-v2 模型將檔案嵌入到 384 維向量空間。
- 利用 Chroma 儲存和查詢嵌入向量。
- 使用 spaCy 計算查詢結果與原始完成之間的相似度。
效能最佳化建議
- 使用更強大的嵌入模型:對於更大的資料集,可以考慮使用
text-embedding-ada-002等更強大的模型來提升效能。 - 嘗試不同的相似度計算方法:除了餘弦相似度,也可以嘗試歐幾裡得距離等其他方法來評估相似性。
- 調整查詢結果數量:根據需求調整
n_results引數,以控制傳回的結果數量。
實務應用場景
此程式碼可應用於多種問答和資訊檢索場景,例如:
- 構建聊天機器人:利用相似度比對提供更準確的回應。
- 搜尋引擎最佳化:提升搜尋結果的相關性和準確性。
- 知識函式庫構建:幫助組織和管理大量文字資訊。
Plantuml 圖表說明
以下是一個簡單的 Plantuml 圖表,用於展示系統流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam sequenceArrowThickness 2
title 動態RAG知識函式庫建構與效能最佳化
actor "客戶端" as client
participant "API Gateway" as gateway
participant "認證服務" as auth
participant "業務服務" as service
database "資料庫" as db
queue "訊息佇列" as mq
client -> gateway : HTTP 請求
gateway -> auth : 驗證 Token
auth --> gateway : 認證結果
alt 認證成功
gateway -> service : 轉發請求
service -> db : 查詢/更新資料
db --> service : 回傳結果
service -> mq : 發送事件
service --> gateway : 回應資料
gateway --> client : HTTP 200 OK
else 認證失敗
gateway --> client : HTTP 401 Unauthorized
end
@enduml圖表翻譯:
- 輸入查詢文字,系統首先將其轉換為嵌入向量。
- 使用 Chroma 資料函式庫進行查詢,找出最相關的專案。
- 利用 spaCy 計算查詢結果與原始文字之間的相似度。
- 傳回最終結果,提供給使用者。