在需要快速決策的場景中,如何有效利用最新資料至關重要。本文介紹的動態 RAG 方法,透過每日建立臨時 Chroma 集合,並嵌入當天所需資料,避免了大量資料的長期儲存和管理成本。此方法適用於資料時效性強的場景,例如醫療團隊的病患討論、客服團隊的即時問題處理,以及研究人員的實驗決策等。搭配 Hugging Face Llama 模型,系統能根據查詢動態生成資訊,提升決策效率。此方法尤其適用於資料相關性高但時效性短的應用,例如每日簡報或重要會議。透過 Python 程式碼範例,示範如何使用 Chroma 建立和查詢集合,以及如何組態 Llama 模型進行動態資料檢索和回應生成。

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

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

本章節介紹了一種創新且有效的方法,透過嵌入和建立臨時的Chroma集合來處理這類別資料。每天早上,都會組裝一個新的集合,其中包含當天會議所需的所有必要資料,有效避免了長期資料累積和管理開銷。這些資料可能包括醫療團隊討論患者治療方案的醫療報告、服務團隊為立即問題制定策略的客戶互動資訊,或研究人員進行日常實驗決策的最新科學研究資料。

動態RAG的架構

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

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

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

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

準備動態RAG的資料集

首先,我們需要準備一個適合動態RAG的資料集。在本例中,我們將下載來自Hugging Face的SciQ資料集,該資料集包含數千個由眾包得來的科學問題,例如與物理、化學和生物學相關的問題。然後,程式將嵌入當天所需的相關資料,確保所有討論點都得到最新、最相關資料的支援。

建立Chroma集合

import chromadb

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

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

# 將相關資料新增到集合中
# 這裡假設我們已經下載了SciQ資料集並將其載入到`data`變數中
collection.add(documents=data)

內容解密:

  1. 我們首先匯入chromadb函式庫並初始化一個Chroma客戶端。
  2. 然後,我們建立一個名為daily_science_data的新集合,用於儲存當天的科學資料。
  3. 最後,我們將下載的SciQ資料集新增到這個集合中。

查詢Chroma集合

使用者可以在會議前查詢這個集合,以確認其準確性和與當天目標的一致性。在會議進行過程中,任何出現的問題都可以觸發實時資料檢索,透過大語言模型Meta AI(Llama)技術進行增強,以生成動態閃卡。這些閃卡提供快速、精確的回應,以確保討論既高效又明智。

查詢集合

# 查詢集合
results = collection.query(query_texts=["什麼是光合作用?"])

# 輸出查詢結果
for result in results:
    print(result)

內容解密:

  1. 我們使用query方法查詢集合,傳入一個包含查詢文字的列表。
  2. 查詢結果將被輸出到控制檯。

組態Hugging Face框架以使用Meta Llama

為了增強輸入並生成根據查詢輸出的回應,我們需要組態Hugging Face框架以使用Meta Llama模型。

組態Meta Llama

from transformers import AutoModelForCausalLM, AutoTokenizer

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

# 使用模型生成回應
input_ids = tokenizer.encode("什麼是光合作用?", return_tensors="pt")
output = model.generate(input_ids)

# 解碼生成的回應
response = tokenizer.decode(output[0], skip_special_tokens=True)
print(response)

內容解密:

  1. 我們匯入必要的類別並載入Meta Llama模型和分詞器。
  2. 然後,我們使用模型生成對輸入文字的回應。
  3. 最後,我們解碼生成的回應並輸出到控制檯。

透過本章節,您已經學會瞭如何使用開源工具實作動態RAG,包括準備資料集、建立Chroma集合、查詢集合以及使用Meta Llama模型生成回應。這些技能將使您能夠在各種領域中應用動態RAG,以提高決策效率和準確性。

動態RAG生態系統的實作與應用

動態檢索增強生成(RAG)生態系統在多個領域展現出其強大的應用潛力,包括金融、教育、技術支援以及銷售和市場行銷等。

動態RAG生態系統的多領域應用

  • 金融領域:金融分析師可以查詢最新的市場資料,以便對投資和策略做出明智的決定。
  • 教育領域:教育工作者可以存取最新的教育資源和研究,以回答問題並提高學習效果。
  • 技術支援:IT團隊可以使用更新的技術檔案來解決問題並有效地指導使用者。
  • 銷售和市場行銷:團隊可以快速存取最新的產品資訊和市場趨勢,以回答客戶查詢並制定策略。

本章節將實作一種動態RAG生態系統,並探討如何將其應用於不同的專案中。首先,讓我們看看動態RAG元件如何融入第1章中描述的RAG生態系統。

動態RAG系統的元件與運作

圖8.1:動態RAG系統架構

動態RAG系統涉及以下關鍵元件:

  1. 暫時性Chroma集合建立(D1, D2, D3, E2):每天早上,為當天的會議建立一個臨時的Chroma集合。這個集合僅供當天使用,不會被儲存,以確保系統不會被長期資料雜亂無章。

  2. 嵌入相關資料(D1, D2, D3, E2):將關鍵資料(如客戶支援互動、醫療報告或科學事實)嵌入到集合中。這個嵌入過程根據會議議程量身定做,確保所有相關資訊都能在會議參與者隨手可得。

  3. 會議前資料驗證(D4):在會議開始前,對臨時Chroma集合執行一批查詢,以確保所有資料準確且符合會議目標,從而促進順暢和明智的討論。

  4. 即時查詢處理(G1, G2, G3, G4):在會議期間,系統設計用於處理參與者的即時查詢。單個問題可以觸發特定資訊的檢索,然後用於增強Llama的輸入,使其能夠動態生成閃卡。這些閃卡用於在會議期間提供簡潔、準確的回應,從而提高討論的效率和生產力。

Chroma向量資料函式庫的應用

本章節將使用Chroma,一個功能強大、開源、AI原生向量資料函式庫,來儲存、管理和搜尋嵌入向量。Chroma非常適合涉及LLM的應用,且能夠在本地機器上執行,非常適合用於臨時、成本效益高且即時的RAG系統。

動態RAG架構的關鍵優勢

  • 效率和成本效益:使用Chroma進行臨時儲存,並結合Llama進行回應生成,確保了系統的輕量級且不會產生持續的儲存成本。
  • 靈活性:系統的短暫性質允許每天整合新的資料,確保始終有最新的資訊可用。
  • 可擴充套件性:只要資料能夠被有效地嵌入和查詢,該方法就能夠擴充套件到其他類別似的資料集,使其能夠適應多種領域。
  • 使用者友好性:系統設計簡單直接,使得非技術使用者也能夠快速獲得可靠的答案。

環境設定與安裝

本章節將使用開源和免費資源,在Google Colab上執行。首先,需要安裝Hugging Face並取得API token。

# 安裝Hugging Face transformers套件
!pip install transformers

Hugging Face API Token設定

# 從Google Drive讀取Hugging Face 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()

# 設定Hugging Face token環境變數
import os
os.environ['HF_TOKEN'] = access_token

安裝資料集

# 安裝特定版本的datasets套件
!pip install datasets==2.20.0
圖表翻譯:

此圖示展示了動態RAG系統的架構,包括暫時性Chroma集合建立、嵌入相關資料、會議前資料驗證以及即時查詢處理等關鍵元件。該架構使得系統能夠根據會議議程提供相關資訊,並即時回應參與者的查詢,從而提高會議的效率和生產力。

隨著技術的不斷進步,動態RAG系統有望在更多領域展現其價值。未來的研究可以關注於進一步提高系統的可擴充套件性、降低成本,並探索新的應用場景,以滿足不斷變化的市場需求。

安裝與設定動態RAG環境

在開始動態RAG專案之前,我們需要安裝必要的軟體套件與函式庫。首先,安裝transformers套件,這是Hugging Face提供的強大工具,用於自然語言處理任務。

!pip install transformers==4.41.2

接著,安裝accelerate以便在GPU上執行PyTorch套件,這對於加速運算至關重要。

!pip install accelerate==0.31.0

內容解密:

  1. transformers套件提供了豐富的預訓練模型和簡易的介面,用於各種NLP任務。
  2. accelerate套件可以最佳化PyTorch模型的運算,特別是在GPU上,提供混合精確度運算和加速處理時間。

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

我們將使用Meta AI開發的Llama系列模型中的meta-llama/Llama-2-7b-chat-hf作為我們的聊天模型。

from transformers import AutoTokenizer
import transformers
import torch

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

內容解密:

  1. AutoTokenizer用於自動下載並初始化指定模型的tokenizer。
  2. from_pretrained方法載入預訓練模型的tokenizer,用於將文字轉換為模型可接受的輸入格式。

設定Hugging Face的pipeline

使用Hugging Face的pipeline函式建立文字生成pipeline。

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

內容解密:

  1. text-generation指定了pipeline的任務型別為文字生成。
  2. torch_dtype=torch.float16將PyTorch張量的資料型別設定為float16,以減少記憶體消耗並加速運算。
  3. device_map="auto"讓pipeline自動選擇最佳的運算裝置(CPU、GPU等)。

安裝Chroma向量資料函式庫

Chroma是一個開源的向量資料函式庫,我們將使用它來儲存和查詢向量化資料。

!pip install chromadb==0.5.3

內容解密:

  1. Chroma與ONNX Runtime緊密整合,ONNX是一種開放標準,用於表示機器學習模型,使其能在不同框架和硬體上執行。

安裝spaCy語言模型

使用spaCy來計算向量儲存查詢結果與原始完成文字之間的準確度。

!python -m spacy download en_core_web_md

內容解密:

  1. en_core_web_md是一個中型英語語言模型,適用於一般的NLP任務,能有效計算文字相似度。

啟動session計時

在實際的動態RAG專案中,時間管理至關重要。我們需要記錄整個session的執行時間。

# Start timing before the request
session_start_time = time.time()

內容解密:

  1. 記錄session開始時間,以便後續計算總執行時間。

下載與準備SciQ資料集

我們將使用SciQ資料集來進行增強生成問題的實驗。

# SciQ資料集介紹
SciQ資料集由Welbl, Liu, 和Gardner (2017)建立,用於生成高品質的、特定領域的多選題。

內容解密:

  1. SciQ包含13,679個多選題,旨在輔助NLP模型在科學考試中的訓練。
  2. 我們將使用該資料集中的questioncorrect_answersupport欄位。

整合準備好的資料集到檢索系統

我們將把準備好的資料集整合到一個檢索系統中,該系統利用查詢增強技術來增強根據特定科學主題或問題格式的相關問題檢索,供Hugging Face的Llama模型使用。這將允許動態生成增強的、實時的Llama完成度,如本章程式中實作的那樣。

載入和清理資料

程式從sciq資料集載入訓練資料:

# 匯入所需的函式庫
from datasets import load_dataset
import pandas as pd

# 從HuggingFace載入SciQ資料集
dataset = load_dataset("sciq", split="train")

內容解密:

  • load_dataset("sciq", split="train")用於從Hugging Face的資料集函式庫中載入sciq資料集的訓練部分。
  • split="train"指定了我們要載入資料集的訓練部分。

接下來,資料集被過濾以偵測非空的supportcorrect_answer列:

# 過濾資料集以包含只有具有support的問題
filtered_dataset = dataset.filter(lambda x: x["support"] != "" and x["correct_answer"] != "")

內容解密:

  • dataset.filter()用於過濾資料集,保留滿足條件的樣本。
  • lambda x: x["support"] != "" and x["correct_answer"] != ""確保sciencecorrect_answer欄位不為空。

然後,我們顯示過濾後的列數:

# 列印具有support的問題數量
print("具有support的問題數量: ", len(filtered_dataset))

輸出顯示我們有10,481個檔案:

  具有support的問題數量: 10481

資料清理和準備

為了聚焦於所需的欄位,我們需要清理DataFrame。首先,丟棄幹擾項(錯誤的答案):

# 將過濾後的資料集轉換為pandas DataFrame
df = pd.DataFrame(filtered_dataset)

# 要丟棄的欄位
columns_to_drop = ['distractor3', 'distractor1', 'distractor2']

# 從DataFrame中丟棄欄位
df.drop(columns=columns_to_drop, inplace=True)

內容解密:

  • pd.DataFrame(filtered_dataset)將過濾後的資料集轉換為pandas DataFrame。
  • df.drop()用於丟棄指定的欄位,以簡化DataFrame。

接下來,我們合併correct_answersupport內容:

# 透過合併'correct_answer'和'support'建立一個新的欄位'completion'
df['completion'] = df['correct_answer'] + " 因為 " + df['support']

# 確保'completion'欄位中沒有NaN值
df.dropna(subset=['completion'], inplace=True)

內容解密:

  • df['completion'] = df['correct_answer'] + " 因為 " + df['support']建立了一個新的欄位,將正確答案和支援內容合併。
  • df.dropna()用於刪除completion欄位中包含NaN值的行。

資料嵌入和上傳到Chroma集合

首先,我們建立Chroma客戶端並定義一個集合名稱:

# 匯入Chroma並例項化客戶端。預設的Chroma客戶端在記憶體中執行。
import chromadb
client = chromadb.Client()
collection_name = "sciq_supports6"

內容解密:

  • chromadb.Client()建立了一個Chroma客戶端。
  • collection_name定義了我們要建立或存取的集合名稱。

在建立集合和上傳資料之前,我們需要檢查集合是否已經存在:

# 列出所有集合
collections = client.list_collections()

# 檢查特定的集合是否存在
collection_exists = any(collection.name == collection_name for collection in collections)
print("集合存在:", collection_exists)

如果集合不存在,我們將建立它:

# 建立一個新的Chroma集合來儲存支援證據
if not collection_exists:
    collection = client.create_collection(collection_name)
else:
    print("集合 ", collection_name, " 存在:", collection_exists)

內容解密:

  • client.list_collections()取得客戶端下的所有集合列表。
  • any(collection.name == collection_name for collection in collections)檢查我們感興趣的集合是否存在。

選擇模型和嵌入資料

我們選擇all-MiniLM-L6-v2作為我們的輕量級模型,用於動態RAG環境:

model_name = "all-MiniLM-L6-v2"  # 要使用的模型名稱

然後,我們嵌入並儲存df中的completion欄位:

ldf = len(df)
nb = ldf  # 要嵌入和儲存的問題數量

import time
start_time = time.time()  # 在請求之前開始計時

# 將Series轉換為字串列表
completion_list = df["completion"][:nb].astype(str).tolist()

內容解密:

  • df["completion"][:nb].astype(str).tolist()將DataFrame中的completion欄位轉換為字串列表,以便嵌入和儲存。