返回文章列表

動態RAG整合Chroma與Llama應用

本文探討動態檢索增強生成(RAG)系統,結合 Chroma 向量資料函式庫與 Hugging Face Llama 模型,實作高效的資訊檢索與生成。文章以 SciQ 科學問答資料集為例,示範如何建構臨時 Chroma 集合,並利用 Llama

機器學習 Web 開發

在資訊爆炸的時代,快速取得精準資訊對於決策至關重要。本文介紹一種動態 RAG 系統,結合 Chroma 向量資料函式庫與 Hugging Face Llama 模型,實作高效的資訊檢索與問答。系統每日建立臨時 Chroma 集合,儲存當日會議所需資訊,避免大量資料累積。會議中,系統可即時查詢 Chroma 資料函式庫,並利用 Llama 模型產生動態資訊卡,提供精確答案。此方法適用於資訊快速變動的場景,例如客戶支援、醫療診斷或科學研究,可提升決策效率。透過 SciQ 科學問答資料集的實作範例,展示瞭如何利用 Python 建構此係統,包含 Chroma 集合建立、資料嵌入、Llama 模型設定與查詢等步驟,展現其在動態環境下的應用潛力。

動態RAG與Chroma及Hugging Face Llama的整合應用

在當今快速變化的環境中,迅速做出明智決策的能力比以往任何時候都更加重要。從醫療保健、科學研究到客戶服務管理,各個領域的決策者越來越需要即時且相關的資料。會議可能只需要臨時但高度準備的資料。因此,資料永續性的概念正在轉變。並非所有資訊都必須無限期儲存;相反,在許多情況下,重點正轉向使用精確、相關的資料,以滿足特定時間的特定需求,例如每日簡報或關鍵會議。

本章介紹了一種創新且有效的方法,透過嵌入和建立臨時的Chroma集合來處理這些資料。每天早上,會組裝一個新的集合,其中包含當天會議所需的重要資料,有效避免了長期的資料累積和管理開銷。這些資料可能包括醫療團隊討論患者治療的醫療報告、服務團隊制定即時問題策略的客戶互動,或研究人員進行日常實驗決策的最新科學研究資料。然後,我們將構建一個Python程式,以支援日常會議中的動態和高效決策,使用硬科學(任何自然或物理科學)資料集進行每日會議。這種方法將突顯現代資料管理的靈活性和效率。

動態RAG的架構

想像一下,你身處一個資訊每天都在變化的動態環境中。每天早上,你收集一批來自全球的10,000多個問題和經過驗證的答案。挑戰在於如何在會議期間快速有效地存取這些資訊,而無需長期儲存或複雜的基礎設施。

這種動態RAG方法使我們能夠保持一個精簡、回應迅速的系統,提供最新的資訊,而無需承擔持續的資料儲存負擔。它非常適合資料相關性短暫但對決策至關重要的環境。

我們將把這種方法應用於硬科學資料集。然而,這種動態方法並不限於我們的具體例子。它具有跨多個領域的廣泛應用,例如:

  • 客戶支援:可以實時存取每日更新的常見問題,以快速回應客戶查詢。
  • 醫療保健:在會議期間,醫療團隊可以使用最新的研究和患者資料來回答複雜的健康相關問題。

程式碼實作:建立Chroma集合

import chromadb

# 初始化Chroma客戶端
client = chromadb.Client()

# 建立一個新的集合
collection = client.create_collection(name="daily_science_data")

# 新增資料到集合中
collection.add(
    documents=["科學問題1:...", "科學問題2:..."],
    metadatas=[{"source": "SciQ"}, {"source": "SciQ"}],
    ids=["id1", "id2"]
)

內容解密:

此程式碼段展示瞭如何使用Chroma客戶端建立一個新的集合,並將資料新增到該集合中。首先,我們初始化Chroma客戶端,然後建立一個名為daily_science_data的集合。接著,我們將包含科學問題的檔案新增到集合中,同時附上後設資料和唯一ID。

準備動態RAG的資料集

我們將使用Hugging Face的SciQ資料集,該資料集包含數千個眾包的科學問題,例如與物理、化學和生物學相關的問題。這個資料集非常適合我們的動態RAG系統,因為它提供了豐富的科學資訊,可以用於會議中的實時查詢。

程式碼實作:下載SciQ資料集

from datasets import load_dataset

# 載入SciQ資料集
dataset = load_dataset("sciq")

# 檢視資料集的結構
print(dataset)

內容解密:

此程式碼段展示瞭如何從Hugging Face載入SciQ資料集。load_dataset函式用於下載資料集,並傳回一個Dataset物件。我們可以列印預出資料集的結構,以瞭解其包含的內容。

嵌入和更新Chroma集合中的資料

為了使我們的動態RAG系統能夠實時回應查詢,我們需要將資料嵌入到Chroma集合中,並在每天早上更新這些資料。

程式碼實作:嵌入和更新資料

import chromadb
from sentence_transformers import SentenceTransformer

# 初始化Chroma客戶端和SentenceTransformer模型
client = chromadb.Client()
model = SentenceTransformer('all-MiniLM-L6-v2')

# 建立或取得集合
collection = client.get_or_create_collection(name="daily_science_data")

# 嵌入資料
documents = ["科學問題1:...", "科學問題2:..."]
embeddings = model.encode(documents)

# 更新集合中的資料
collection.upsert(
    documents=documents,
    embeddings=embeddings,
    metadatas=[{"source": "SciQ"}, {"source": "SciQ"}],
    ids=["id1", "id2"]
)

內容解密:

此程式碼段展示瞭如何使用SentenceTransformer模型將資料嵌入,並更新Chroma集合中的資料。首先,我們初始化Chroma客戶端和SentenceTransformer模型。然後,我們建立或取得名為daily_science_data的集合。接著,我們使用SentenceTransformer模型將檔案嵌入,並將嵌入向量、檔案、後設資料和ID更新到集合中。

查詢Chroma集合

使用者可以在會議前查詢集合,以確認其準確性並與當天的目標保持一致。在會議進行過程中,任何產生的問題都可以觸發實時資料檢索,透過大語言模型Meta AI(Llama)技術進行增強,以生成動態閃卡。

程式碼實作:查詢集合

# 查詢集合
results = collection.query(
    query_texts=["物理學中的關鍵問題是什麼?"],
    n_results=2
)

# 列印查詢結果
print(results)

內容解密:

此程式碼段展示瞭如何查詢Chroma集合。我們使用query方法,傳入查詢文字和所需的結果數量。查詢結果包含相關的檔案和後設資料,可以用於生成動態閃卡,以支援會議中的討論。

組態Hugging Face的Llama模型

為了增強輸入資料並生成根據檢索資訊的回應,我們將組態Hugging Face的Llama模型。

程式碼實作:組態Llama模型

from transformers import AutoModelForCausalLM, AutoTokenizer

# 載入Llama模型和分詞器
model_name = "meta-llama/Llama-2-7b-chat-hf"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 使用模型生成回應
input_text = "請根據最新的科學研究,回答以下問題:..."
inputs = tokenizer(input_text, return_tensors="pt")
output = model.generate(**inputs)
response = tokenizer.decode(output[0], skip_special_tokens=True)

# 列印生成的回應
print(response)

內容解密:

此程式碼段展示瞭如何組態Hugging Face的Llama模型,並使用它生成根據輸入文字的回應。首先,我們載入Llama模型和相應的分詞器。然後,我們將輸入文字編碼,並使用模型生成回應。最後,我們解碼生成的輸出,並列印預出回應。

動態RAG系統的實作與應用

動態檢索增強生成(RAG)系統在現代企業環境中具有廣泛的應用潛力,尤其是在需要即時資料支援的決策過程中。本章節將探討動態RAG系統的架構設計、關鍵技術以及實作細節,並透過具體的Python程式碼範例來展示如何構建一個高效、靈活且可擴充套件的RAG系統。

動態RAG系統的架構設計

動態RAG系統的核心在於其能夠根據每日的會議議程建立臨時的Chroma集合,用於儲存和管理當日所需的關鍵資料。這些資料包括客戶支援互動記錄、醫療報告或科學事實等,透過嵌入過程轉化為向量形式,以便於高效檢索。

關鍵元件與流程

  1. 臨時Chroma集合建立(D1, D2, D3, E2):每天早上為當天的會議建立一個臨時的Chroma集合,該集合僅用於當日的會議需求,會議結束後即被丟棄,以避免資料冗餘。

  2. 相關資料嵌入(D1, D2, D3, E2):將關鍵資料嵌入到Chroma集合中,這些資料根據會議議程進行定製,確保與會者能夠即時取得相關資訊。

  3. 會前資料驗證(D4):在會議開始前,系統會對臨時Chroma集合中的資料進行查詢驗證,以確保資料的準確性和與會議目標的一致性。

  4. 即時查詢處理(G1, G2, G3, G4):會議期間,系統能夠處理與會者的即時查詢,透過檢索相關資訊並利用Llama模型生成動態的flashcards,提供簡潔準確的答案。

Chroma向量資料函式庫的應用

Chroma是一個強大、開源的AI原生向量資料函式庫,專門用於儲存、管理和搜尋嵌入向量。由於其高效性和靈活性,Chroma非常適合用於構建臨時、成本效益高且實時的RAG系統。

Chroma的主要優勢

  • 效率與成本效益:使用Chroma進行臨時儲存,結合Llama模型進行回應生成,確保系統輕量且無需持續的儲存成本。

  • 靈活性:系統的臨時性質允許每天整合新的資料,確保資訊的時效性,特別適用於資訊快速變化的環境。

  • 可擴充套件性:該方法可擴充套件到其他類別似的資料集,只要這些資料集能夠被有效地嵌入和查詢,使其適應於多種領域。

  • 使用者友好性:系統設計直觀,對於非技術使用者也易於使用,能夠快速提供可靠的答案,從而提高使用者滿意度。

環境設定與安裝

本章節將使用開源且免費的資源,在Google Colab環境中進行實作。首先,我們需要安裝Hugging Face的相關資源。

安裝Hugging Face

  1. 取得Hugging Face API Token:首先需要在Hugging Face官網註冊並取得API Token。然後,可以選擇將Token儲存在Google Drive中或手動輸入。
# 使用Google Drive儲存Token
from google.colab import drive
drive.mount('/content/drive')
f = open("drive/MyDrive/files/hf_token.txt", "r")
access_token = f.readline().strip()
f.close()

# 或者手動輸入Token
# access_token = "YOUR_HF_TOKEN"

import os
os.environ['HF_TOKEN'] = access_token
  1. 安裝datasets套件:接下來,我們安裝datasets套件,但需要注意與Google Colab預裝版本的相容性問題。
!pip install datasets==2.20.0

可能會出現與pyarrow版本的衝突,這是因為Hugging Face的套件更新可能與Google Colab的預裝版本不相容。不過,這些衝突通常不會阻礙我們下載所需的資料集。

  1. 安裝transformers套件:最後,我們安裝Hugging Face的transformers套件,這是實作RAG系統的關鍵元件。
!pip install transformers

內容解密:

上述程式碼首先透過Hugging Face取得必要的API Token,並將其儲存在環境變數中,以確保後續操作的安全性和便捷性。接著,透過安裝datasetstransformers套件,為構建RAG系統奠定基礎。需要注意的是,在實際操作過程中,可能會遇到版本相容性問題,需要根據具體情況進行調整。

動態RAG系統的實作

在完成環境設定後,我們可以開始構建動態RAG系統。具體步驟包括建立臨時Chroma集合、資料嵌入、會前資料驗證以及即時查詢處理等。

建立臨時Chroma集合

from chromadb import Client

# 初始化Chroma客戶端
client = Client()

# 建立臨時集合
temporary_collection = client.create_collection("temporary_meeting_data")

內容解密:

這段程式碼展示瞭如何使用Chroma客戶端建立一個臨時的集合,用於儲存當日的會議資料。臨時集合的使用確保了資料的時效性,並避免了長期儲存的成本。

資料嵌入與查詢

# 嵌入相關資料
def embed_data(data):
    # 實作資料嵌入邏輯
    pass

# 會前資料驗證
def validate_data(collection, queries):
    # 實作資料驗證邏輯
    pass

# 即時查詢處理
def handle_query(collection, query):
    # 實作查詢處理邏輯
    pass

內容解密:

上述函式定義了資料嵌入、會前資料驗證和即時查詢處理的邏輯。具體實作細節需要根據實際資料和查詢需求進行定製。

  1. 擴充套件資料來源:整合更多樣化的資料來源,以滿足不同領域和場景的需求。

  2. 最佳化查詢效率:透過改進資料嵌入和檢索演算法,進一步提高系統的查詢效率和準確性。

  3. 增強使用者互動:開發更友好的使用者介面,提供更直觀的操作體驗和更豐富的互動功能。

透過不斷最佳化和擴充套件,動態RAG系統有望在更多實際應用中發揮重要作用,為使用者提供更高效、更智慧的資訊檢索和生成服務。

動態RAG系統建置與實作

環境建置與必要套件安裝

在建置動態RAG系統之前,我們需要安裝必要的Python套件。以下指令將安裝transformers、accelerate和chromadb等關鍵套件:

!pip install transformers==4.41.2
!pip install accelerate==0.31.0
!pip install chromadb==0.5.3

安裝內容解密:

  1. transformers==4.41.2:安裝Hugging Face的transformers函式庫,用於載入預訓練模型。
  2. accelerate==0.31.0:安裝加速套件,能夠在GPU上執行PyTorch模型,提高運算效率。
  3. chromadb==0.5.3:安裝Chroma向量資料函式庫,用於儲存和查詢向量化資料。

初始化Llama-2-7b-chat-hf模型

接下來,我們將初始化meta-llama/Llama-2-7b-chat-hf模型作為我們的聊天模型和tokenizer。

from transformers import AutoTokenizer
import transformers
import torch

model = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model)

pipeline = transformers.pipeline(
    "text-generation",
    model=model,
    torch_dtype=torch.float16,
    device_map="auto",
)

程式碼解析:

  1. 載入模型和tokenizer:使用Hugging Face的AutoTokenizer載入Llama-2-7b-chat-hf模型的tokenizer。
  2. 設定pipeline:建立一個text-generation的pipeline,使用指定的模型和引陣列態。
    • torch_dtype=torch.float16:將PyTorch張量的資料型別設定為float16,減少記憶體消耗並加速運算。
    • device_map="auto":自動選擇最佳的運算裝置(CPU、GPU等),並最佳化模型的佈署。

Chroma向量資料函式庫安裝與ONNX Runtime整合

Chroma是一個開源的向量資料函式庫,能夠與ONNX Runtime緊密整合,提供高效的模型執行效能。

!pip install chromadb==0.5.3

安裝完成後,系統會顯示相關套件的安裝資訊,包括ONNX Runtime。

安裝內容解密:

  1. Chroma安裝:安裝Chroma向量資料函式庫,用於高效的向量儲存和查詢。
  2. ONNX Runtime:ONNX是一個開放的機器學習模型表示格式,能夠跨不同的框架和硬體執行模型。ONNX Runtime是一個效能導向的引擎,用於執行ONNX模型,提供跨平台的加速能力。

安裝spaCy進行文字相似度計算

為了評估RAG系統的準確性,我們使用spaCy的中型英文模型來計算文字相似度。

!python -m spacy download en_core_web_md

安裝內容解密:

  1. en_core_web_md模型:下載並安裝spaCy的中型英文模型,用於文字相似度計算。
  2. 用途:該模型能夠有效地計算查詢結果與原始文字之間的相似度,評估RAG系統的效能。

啟動GPU加速與執行時間監控

在實際的RAG專案中,執行時間是關鍵因素。建議啟用GPU加速運算,並監控整個執行過程的時間。

# 啟動時間監控
import time
session_start_time = time.time()

程式碼解析:

  1. 時間監控:記錄程式執行的起始時間,用於計算整個session的執行時間。
  2. GPU加速:在Google Colab中,可以透過Runtime > Change runtime type選擇GPU加速。

下載與準備SciQ資料集

我們將使用SciQ資料集來進行RAG系統的實作。SciQ是一個包含13,679個多選題的科學題函式庫。

# 下載並準備SciQ資料集
# 詳情請參閱後續章節的資料集處理步驟

資料集內容解密:

  1. SciQ資料集:該資料集包含多選題及其正確答案和相關的支援資訊。
  2. 用途:用於訓練和評估RAG系統在科學題目上的表現。

流程圖示:RAG系統建置流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 動態RAG整合Chroma與Llama應用

package "機器學習流程" {
    package "資料處理" {
        component [資料收集] as collect
        component [資料清洗] as clean
        component [特徵工程] as feature
    }

    package "模型訓練" {
        component [模型選擇] as select
        component [超參數調優] as tune
        component [交叉驗證] as cv
    }

    package "評估部署" {
        component [模型評估] as eval
        component [模型部署] as deploy
        component [監控維護] as monitor
    }
}

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

圖表翻譯: 此圖示呈現了RAG系統建置的主要流程,從環境建置開始,逐步完成模型初始化、向量資料函式庫安裝、文字相似度計算工具安裝、GPU加速、資料集準備,最終進行RAG系統的實作與評估。每一步驟都為後續的工作奠定了基礎。