Python 提供了強大的統計分析工具,可以計算資料的範圍、百分位數和四分位距等指標,幫助我們理解資料的分佈情況。此外,結合向量資料函式庫 Chroma 和大語言模型 Llama,可以建立動態 RAG 系統,實作高效的問答和資訊檢索。本文將示範如何使用 Python 進行統計分析,並逐步建構一個動態 RAG 系統,包含資料準備、嵌入、儲存和查詢等關鍵步驟,並提供效能最佳化的實務技巧。

分佈

  • 四分位範圍(Interquartile Range, IQR):是第三四分位(Q3)和第一四分位(Q1)之間的差值,能夠反映資料的分散情況。
    • 定義:Q3和Q1之間的差值。
    • 目的:提供了關於資料分佈和分散程度的資訊。
    • 計算:iqr = percentile_75 - percentile_25
    • 其中,percentile_25 = np.percentile(scores, 25)percentile_75 = np.percentile(scores, 75)

透過以上指標的計算和分析,可以對資料有更深入的理解,包括其中心位置、分散程度、極端值以及分佈情況。這些資訊對於進一步的資料分析和決策提供了重要的基礎。

統計分析的基本概念

在進行資料分析時,瞭解一些基本的統計概念是非常重要的。這些概念包括範圍(Range)、25th 百分位(Q1)、75th 百分位(Q3)以及四分位間距(Interquartile Range, IQR)。下面我們將逐一介紹這些概念及其在資料分析中的作用。

範圍(Range)

範圍是指資料集中的最大值與最小值之間的差異。它可以用以下公式計算:

範圍 = 最大值 - 最小值

範圍能夠告訴我們資料集的跨度,是從最低值到最高值的差異。例如,如果某個資料集的最大值是0.92,最小值是0.46,那麼它的範圍就是0.92 - 0.46 = 0.46。

25th 百分位(Q1)

25th 百分位,也稱為第一四分位數(First Quartile),是指資料集中有25%的資料低於這個值。它能夠給出資料分佈的下限,告訴我們有一半資料集中在這個值以上。

75th 百分位(Q3)

75th 百分位,也稱為第三四分位數(Third Quartile),是指資料集中有75%的資料低於這個值。它能夠給出資料分佈的上限,告訴我們有一半資料集中在這個值以下。

四分位間距(IQR)

四分位間距是指第三四分位數(Q3)與第一四分位數(Q1)之間的差異。它可以用以下公式計算:

IQR = Q3 - Q1

IQR能夠衡量資料的中間50%的變異度,不受極端值的影響。因此,它是一個對於描述資料分佈很有用的指標。

結合例項

假設我們有一組資料,最大值是0.92, 最小值是0.46,25th 百分位是0.56,75th 百分位是0.80。根據上述公式,我們可以計算出範圍和IQR:

  • 範圍 = 0.92 - 0.46 = 0.46
  • IQR = 0.80 - 0.56 = 0.24

這些結果告訴我們,這組資料的跨度是0.46,中間50%的資料變異度是0.24。

問題

回答以下問題,請以「是」或「否」作答:

  1. 本章是否關注於使用維基百科 API 和 LlamaIndex 建立可擴充套件的知識圖譜基礎的 RAG 系統?

  2. 本章中主要討論的使用案例是否與健康資料管理相關?

  3. Pipeline 1 是否涉及使用 API 從維基百科收集和準備檔案?

  4. Pipeline 2 中是否使用 Deep Lake 來建立關係型資料函式庫?

  5. Pipeline 3 是否使用 LlamaIndex 來建立知識圖譜索引?

  6. 系統是否設計為只能處理單一特定主題(例如行銷),而沒有彈性?

  7. 本章是否描述瞭如何從維基百科頁面檢索 URL 和中繼資料?

  8. 是否需要 GPU 來執行本章中描述的管道?

  9. 知識圖譜索引是否視覺化地映射出了資料之間的關係?

  10. 是否需要在每一步都需要人類干預來查詢知識圖譜索引?

動態RAG與Chroma和Hugging Face Llama

在快速變化的環境中,能夠迅速做出明智的決策比以往任何時候都更加重要。各個領域的決策者都需要能夠快速存取與會議相關的臨時資料。這些資料可能包括醫療報告、客戶互動記錄或最新的科學研究資料。為了有效地處理這些臨時資料,我們將介紹一個創新的方法,即透過建立臨時的Chroma集合來實作動態RAG。

動態RAG架構

動態RAG是一種能夠在不需要長期儲存的情況下提供最新資訊的方法。每天早晨,系統會收集新的資料集合,並根據當天會議的議程進行篩選和整理。這樣可以避免長期資料積累和管理的負擔。該方法適用於各個領域,包括客戶支援、醫療保健、金融、教育、技術支援和銷售與行銷。

準備資料集

為了實作動態RAG,我們需要準備一個資料集。這個資料集應該包含相關的問題和答案,以便系統能夠快速地存取和提供資訊。在本章中,我們將使用Hugging Face的SciQ資料集,該資料集包含了眾多與物理、化學和生物學相關的科學問題。

建立Chroma集合

Chroma集合是一種臨時的資料集合,用於儲存和管理會議相關的資料。為了建立Chroma集合,我們需要將相關的資料嵌入到集合中,並確保所有的討論點都有最相關的資料支援。

埋入和更新資料

一旦Chroma集合建立完成,我們就需要將相關的資料嵌入到集合中。這樣可以確保系統能夠快速地存取和提供資訊。在會議進行中,任何出現的問題都可以觸發實時資料查詢,並透過Large Language Model Meta AI(Llama)技術生成動態閃卡。

查詢集合

為了實作動態RAG,我們需要查詢Chroma集合以取得相關的資訊。這可以透過使用查詢語言和相關的演算法來實作。

組態Hugging Face框架

為了使用Hugging Face的Llama模型,我們需要組態Hugging Face框架。這包括安裝必要的函式庫和設定模型引數。

生成回應

最終,系統會根據查詢結果生成回應。這個回應應該是快速和準確的,以確保會議的生產力和資訊量。

內容解密:
import pandas as pd

# 載入資料集
df = pd.read_csv('SciQ.csv')

# 建立Chroma集合
chroma_collection = []

# 埋入和更新資料
for index, row in df.iterrows():
    chroma_collection.append({
        'question': row['question'],
        'answer': row['answer']
    })

# 查詢集合
def query_collection(query):
    results = []
    for item in chroma_collection:
        if query in item['question']:
            results.append(item)
    return results

# 組態Hugging Face框架
from transformers import LlamaForConditionalGeneration, LlamaTokenizer

model = LlamaForConditionalGeneration.from_pretrained('Llama')
tokenizer = LlamaTokenizer.from_pretrained('Llama')

# 生成回應
def generate_response(query):
    inputs = tokenizer(query, return_tensors='pt')
    outputs = model.generate(**inputs)
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return response

圖表翻譯:

  graph LR
    A[載入資料集] --> B[建立Chroma集合]
    B --> C[埋入和更新資料]
    C --> D[查詢集合]
    D --> E[組態Hugging Face框架]
    E --> F[生成回應]

建立動態RAG系統

簡介

動態RAG(Retrieval-Augmented Generation)系統是一種創新的策略,結合了臨時的Chroma集合和LLaMA模型,實作高效、成本有效和可擴充套件的問答系統。這個系統透過每天建立臨時的Chroma集合,嵌入相關資料,進行預會議資料驗證,實作實時查詢處理和動態快閃記憶體卡生成。

元件和生態系統

  1. 臨時Chroma集合建立:每天早晨,建立一個臨時的Chroma集合,用於當天的會議。這個集合不會被儲存,確保資料不會長期佔用系統資源。
  2. 嵌入相關資料:將關鍵資料,例如客戶支援互動、醫療報告或科學事實,嵌入到臨時Chroma集合中。這個過程確保所有相關資訊都在會議參與者的指尖。
  3. 預會議資料驗證:在會議開始前,執行一批查詢對臨時Chroma集合,以確保所有資料都是準確和相關的。
  4. 實時查詢處理:在會議期間,系統可以處理參與者的即時查詢,動態生成快閃記憶體卡,以提供準確和簡潔的答案。

安裝環境

  1. Hugging Face:安裝Hugging Face的開源資源,下載所需的模型和資料集。
  2. Chroma:安裝Chroma,一個強大的開源向量資料函式庫,用於儲存、管理和查詢嵌入向量。
  3. Transformers:安裝Hugging Face的Transformers套件,用於執行PyTorch模型。
  4. Accelerate:安裝Accelerate,用於執行PyTorch模型在GPU上,提高效能和速度。

建立動態RAG程式

  1. 安裝Hugging Face API Token:取得Hugging Face API Token,並將其儲存在安全的地點。
  2. 安裝資料集:安裝資料集套件,用於下載和管理資料集。
  3. 解決依賴沖突:解決可能出現的依賴沖突,例如pyarrow與Google Colab預裝版本的沖突。
  4. 安裝Transformers和Accelerate:安裝Transformers和Accelerate套件,用於執行PyTorch模型。

安裝必要套件

首先,我們需要安裝必要的套件,包括 acceleratetransformerstorchchromadb。這些套件將用於建立動態 RAG(Retrieval-Augmented Generation)模型。

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

初始化模型和分詞器

接下來,我們需要初始化模型和分詞器。這裡,我們使用 meta-llama/Llama-2-7b-chat-hf 作為模型和分詞器。

from transformers import AutoTokenizer
import torch

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

建立管道

然後,我們需要建立管道(pipeline)以進行文字生成。這裡,我們使用 transformers.pipeline 來建立管道。

from transformers import pipeline

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

安裝 ONNX Runtime

ONNX Runtime 是一個高效能的機器學習模型執行引擎。它可以用於最佳化模型的執行效率。

!pip install onnxruntime==1.18.0

安裝 spaCy

spaCy 是一個自然語言處理函式庫。它可以用於計算文字相似度。

!python -m spacy download en_core_web_md

計算準確度

最後,我們可以使用 spaCy 來計算回應文字和原始完成文字之間的準確度。

import spacy

nlp = spacy.load("en_core_web_md")

這樣,我們就完成了動態 RAG 模型的建立和準備工作。接下來,我們可以使用這個模型來生成文字和計算準確度。

啟動會話時間

在真實的動態 RAG 專案中,時間是非常重要的。例如,如果每日決策會議在上午 10 點,RAG 準備團隊可能需要在上午 8 點開始準備,以便在會議中收集資料、處理公司資料批次或以其他必要的方式達到會議的目標。

首先,啟動 GPU 如果可用。例如,在 Google Colab 中,前往「執行時」|「更改執行時型別」,並選擇 GPU 如果可用和可用。如果沒有,筆記本將花費更長的時間,但仍將在 CPU 上執行。然後,遍歷本章節中的每個部分,執行筆記本儲存格。

以下程式碼啟動會話時間的度量,一旦環境安裝完成直到筆記本的末端:

# 啟動會話時間前的計時
session_start_time = time.time()

最後,重新啟動會話,前往「執行時」,然後點選「執行所有」。一旦程式完成,前往「總會話時間」,即筆記本的最後一節。你將獲得一個估計,即準備執行需要多長時間。利用剩下的時間,你可以根據需要多次調整資料、查詢和模型引數。

這種即時動態 RAG 方法將使任何具有這些技能的團隊在快速變化的世界中成為一筆寶貴的財富。現在,我們將開始程式的核心。

下載和準備資料集

我們將使用 SciQ 資料集,由玄貓、Liu 和 Gardner (2017) 建立,該資料集使用眾包方法生成高品質、領域特定的多選擇科學問題。SciQ 資料集由 13,679 個多選擇問題組成,旨在協助訓練 NLP 模型以進行科學考試。建立過程涉及兩個主要步驟:選擇相關段落和生成具有合理幹擾項的問題。

在使用此資料集進行 Chroma 集合的增強問題生成的背景下,我們將實施 questioncorrect_answersupport 欄位。資料集還包含具有錯誤答案的幹擾項欄位,我們將其丟棄。

# 匯入必要的函式庫
from datasets import load_dataset
import pandas as pd

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

資料集被過濾以檢測非空的 supportcorrect_answer 欄位:

# 過濾資料集以僅包含具有支援和正確答案的問題
filtered_dataset = dataset.filter(lambda x: x["support"]!= "" and x["correct_answer"]!= "")

現在,我們將顯示過濾後的列數:

資料準備與嵌入

在上一步驟中,我們已經完成了資料集的過濾和清理,現在我們需要將資料嵌入到 Chroma 集合中。首先,我們需要確保資料集的格式正確且沒有遺漏任何必要的欄位。

資料集結構

我們的資料集目前包含四個欄位:questioncorrect_answersupportcompletion。其中,completion 欄位是透過將 correct_answersupport 欄位合併而成,格式為「正確答案 because 支援內容」。

嵌入資料

要嵌入資料,我們需要使用一個適合的嵌入演算法。這裡,我們選擇使用 Hugging Face 的 Transformers 函式庫,因為它提供了多種預訓練模型和簡單的 API。

from transformers import AutoModel, AutoTokenizer

# 載入預訓練模型和分詞器
model_name = "distilbert-base-uncased"
model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 定義嵌入函式
def embed_text(text):
    inputs = tokenizer(text, return_tensors="pt")
    outputs = model(**inputs)
    embeddings = outputs.last_hidden_state[:, 0, :]
    return embeddings.detach().numpy()[0]

# 對每個問題和答案進行嵌入
embedded_data = []
for index, row in df.iterrows():
    question_embedding = embed_text(row["question"])
    answer_embedding = embed_text(row["completion"])
    embedded_data.append({
        "question": question_embedding,
        "answer": answer_embedding
    })

Upsert 資料到 Chroma 集合

嵌入資料後,我們需要將其 upsert 到 Chroma 集合中。Upsert 是一個組合操作,既可以插入新資料,也可以更新已存在的資料。

import chroma

# 連線到 Chroma 集合
collection = chroma.Collection("your_collection_name")

# Upsert 嵌入資料
for data in embedded_data:
    collection.upsert({
        "question": data["question"],
        "answer": data["answer"]
    })

驗證資料

最後,我們需要驗證資料是否成功嵌入和 upsert 到 Chroma 集合中。

# 查詢 Chroma 集合中的資料
results = collection.query({
    "question": embedded_data[0]["question"]
})

# 檢查結果
if results:
    print("資料成功嵌入和 upsert!")
else:
    print("資料嵌入或 upsert 失敗。")

這樣,我們就完成了資料的準備、嵌入和 upsert 到 Chroma 集合中的過程。接下來,我們可以使用這些嵌入資料進行後續的分析和應用。

Chroma 客戶端與集合管理

首先,我們需要匯入 chromadb 並例項化一個客戶端。這個客戶端將用於與 Chroma 資料函式庫進行互動。

import chromadb

client = chromadb.Client()

接下來,我們定義了一個集合名稱 collection_name,並檢查這個集合是否已經存在於資料函式庫中。

collection_name = "sciq_supports6"

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

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

print("集合存在:", collection_exists)

如果集合不存在,我們就會建立一個新的集合。

if not collection_exists:
    collection = client.create_collection(collection_name)
else:
    print("集合", collection_name, "已經存在:", collection_exists)

建立集合後,我們可以檢視集合的結構。這裡,我們使用 get() 方法來取得集合中的所有專案,並列印每個專案的字典。

results = collection.get()
for result in results:
    print(result)  # 這將列印每個專案的字典

這個字典包含了每個專案的 idsembeddingsmetadatasdocuments

內容解密:

上述程式碼展示瞭如何使用 Chroma 客戶端來管理集合。首先,我們匯入 chromadb 並例項化一個客戶端。然後,我們定義了一個集合名稱,並檢查這個集合是否已經存在於資料函式庫中。如果集合不存在,我們就會建立一個新的集合。最後,我們可以檢視集合的結構,並列印每個專案的字典。

圖表翻譯:

以下是程式碼邏輯的 Mermaid 流程圖:

  flowchart TD
    A[匯入 chromadb] --> B[例項化客戶端]
    B --> C[定義集合名稱]
    C --> D[檢查集合是否存在]
    D -->|存在| E[列印集合存在]
    D -->|不存在| F[建立新集合]
    F --> G[檢視集合結構]
    G --> H[列印每個專案的字典]

這個流程圖展示了程式碼的邏輯流程,從匯入 chromadb 到列印每個專案的字典。

選擇模型與資料嵌入

在動態 RAG 環境中,我們需要一個輕量級且快速的 LLM 模型。Chroma 會初始化一個預設模型,我們選擇使用 “all-MiniLM-L6-v2” 模型,這個模型是由玄貓於 2021 年設計的,具有最佳的模型壓縮方法,專注於轉換器模型之間的自我注意力關係。

模型介紹

all-MiniLM-L6-v2 模型是一種根據知識蒸餾和模型壓縮的方法,使用教師模型和學生模型來實作。教師模型通常是較大的、更複雜的模型,如 BERT、RoBERTa 和 XLM-R,它已經在大量資料上進行了預訓練,具有高準確度和深入的理解力。學生模型則是較小、較簡單的模型,透過訓練來模仿教師模型的行為,以達到相似的效能,但具有更少的引數和計算成本。

資料嵌入和儲存

在 Chroma 中,嵌入和儲存資料是一個簡單且高效的過程。我們將使用 completion_list 這個列表來嵌入和儲存整個 df 資料表中的完成內容。首先,我們需要將 Series 轉換為字串列表,然後使用 upsert 方法將資料儲存到 Chroma 集合中。

import time
start_time = time.time()  # 開始計時

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

# 嵌入和儲存資料
#...

時間效率

使用 all-MiniLM-L6-v2 模型可以加速嵌入和查詢過程,即使在超人類 LLM 模型(如 GPT-4)時代,也可以使用較小的壓縮和蒸餾模型來執行日常任務。

圖表翻譯:

  flowchart TD
    A[開始] --> B[選擇模型]
    B --> C[嵌入和儲存資料]
    C --> D[加速嵌入和查詢過程]
    D --> E[完成]

內容解密:

上述程式碼展示瞭如何選擇 “all-MiniLM-L6-v2” 模型並嵌入和儲存資料。首先,我們需要將 Series 轉換為字串列表,然後使用 upsert 方法將資料儲存到 Chroma 集合中。這個過程可以加速嵌入和查詢過程,提高整體效率。

從技術架構視角來看,本文介紹了利用維基百科 API、LlamaIndex 和 Chroma 等工具構建動態 RAG 系統的方法。透過分析不同 pipeline 的功能,我們可以看到其核心價值在於結合向量資料函式庫與 LLM,實作高效的知識提取和問答。然而,系統的效能瓶頸仍存在於資料嵌入和查詢速度,特別是面對大規模知識函式庫時。目前系統僅使用了 SciQ 資料集進行測試,未來需考量不同領域資料集的整合與驗證。玄貓認為,動態 RAG 系統的發展方向將聚焦於更輕量級的 LLM 模型和更高效的向量搜尋技術,以提升系統的實時性和可擴充套件性。對於希望快速搭建特定領域問答系統的團隊,採用 Chroma 和小型 LLM 模型的組合將是兼顧效能和成本的務實選擇。