在現今的資訊爆炸時代,快速有效地取得知識至關重要。本文介紹如何利用維基百科 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 模型。我們將使用 questioncorrect_answersupport 欄位來構建我們的 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 資料集,接著過濾出 supportcorrect_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))

內容解密:

  1. nlp = spacy.load('en_core_web_md'):載入中型英文 spaCy 模型。
  2. simple_text_similarity 函式:計算兩個文字之間的相似度。
  3. 使用向量點積和範數計算餘弦相似度,若任一向量範數為零則傳回 0。
  4. spaCy 模型提供詞向量,用於評估文字之間的語義相似性。

玄貓的專業分析與建議

程式碼功能概述

以上程式碼展示瞭如何使用 Chroma 和 spaCy 建立簡單的動態 RAG 系統。主要步驟包括:

  • 使用 all-MiniLM-L6-v2 模型將檔案嵌入到 384 維向量空間。
  • 利用 Chroma 儲存和查詢嵌入向量。
  • 使用 spaCy 計算查詢結果與原始完成之間的相似度。

效能最佳化建議

  1. 使用更強大的嵌入模型:對於更大的資料集,可以考慮使用 text-embedding-ada-002 等更強大的模型來提升效能。
  2. 嘗試不同的相似度計算方法:除了餘弦相似度,也可以嘗試歐幾裡得距離等其他方法來評估相似性。
  3. 調整查詢結果數量:根據需求調整 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

圖表翻譯:

  1. 輸入查詢文字,系統首先將其轉換為嵌入向量。
  2. 使用 Chroma 資料函式庫進行查詢,找出最相關的專案。
  3. 利用 spaCy 計算查詢結果與原始文字之間的相似度。
  4. 傳回最終結果,提供給使用者。