隨著大語言模型的興起,檢索增強生成技術日益重要。本文將介紹如何利用 Python 在 Google Colab 環境下建構一個混合式自適應 RAG 系統,並結合人機互動及自動化評估機制,以提升生成式 AI 模型的輸出品質和可靠性。系統核心包含檢索器,負責從維基百科等來源取得相關資料;生成器,根據 T5 等預訓練模型生成回應;以及評估器,利用餘弦相似度等指標評估回應的相關性。透過人機互動回饋,系統能動態調整策略,例如依據使用者評分決定是否啟用 RAG、使用人類專家回饋或僅依賴模型輸出。

建構混合式自適應RAG系統於Python環境

在現代人工智慧(AI)系統中,檢索增強生成(Retrieval-Augmented Generation, RAG)扮演著關鍵角色。為了提升RAG系統的可靠性和效率,本章將探討如何建構一個混合式自適應RAG系統,並透過Python程式語言於Google Colab上實作。

自適應RAG生態系統

自適應RAG生態系統是一種能夠根據使用者查詢和反饋進行動態調整的系統。如圖5.1所示,該系統包含多個關鍵元件,包括檢索器(Retriever)、生成器(Generator)和評估器(Evaluator)。

檢索器元件

  • D1:收集並處理維基百科上關於大語言模型(LLM)的文章,進行資料擷取和清理。
  • D4:檢索查詢,用於查詢檢索資料集。

生成器元件

  • G1:使用者輸入的初始查詢。
  • G2:透過人機互動(Human Feedback, HF)增強的使用者輸入,並進行提示工程以組態GPT-4o模型的提示。
  • G4:生成和輸出,用於執行生成式AI模型並獲得回應。

評估器元件

  • E1:應用餘弦相似度(Cosine Similarity)測量指標。
  • E2:人機互動,用於取得和處理最終的系統評估,透過使用者和專家反饋。

建構混合式自適應RAG系統

本章將透過實作一個混合式自適應RAG系統來闡述其運作原理。該系統將結合人機互動和自動化技術,以提升生成式AI模型的回應品質。

程式碼實作

# #### 安裝檢索器環境
!pip install wikipedia
!pip install transformers

# #### 匯入必要的函式庫
import wikipedia
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

# #### 定義檢索器功能
def retriever(query):
    # 查詢維基百科並擷取相關文章
    search_results = wikipedia.search(query)
    # 清理和處理擷取的資料
    # ...
    return processed_data

# #### 定義生成器功能
def generator(input_text):
    # 載入預訓練模型和tokenizer
    model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
    tokenizer = AutoTokenizer.from_pretrained("t5-base")
    
    # 進行提示工程和生成回應
    input_ids = tokenizer.encode("generate response: " + input_text, return_tensors="pt")
    output = model.generate(input_ids)
    response = tokenizer.decode(output[0], skip_special_tokens=True)
    return response

# #### 定義評估器功能
def evaluator(response, query):
    # 計算回應與查詢之間的餘弦相似度
    # ...
    similarity_score = cosine_similarity(response, query)
    return similarity_score

# #### 結合檢索器、生成器和評估器
def adaptive_rag(query):
    retrieved_data = retriever(query)
    generated_response = generator(retrieved_data)
    evaluation_score = evaluator(generated_response, query)
    # 根據評估結果進行調整
    # ...
    return generated_response

內容解密:

上述程式碼展示瞭如何建構一個基本的混合式自適應RAG系統。首先,我們定義了檢索器功能,用於從維基百科擷取相關資料。接著,生成器功能利用預訓練的T5模型生成回應。最後,評估器功能透過計算餘弦相似度來評估生成回應的品質。整個系統透過結合這三個元件來實作自適應調整。

圖表翻譯:

此圖示展示了自適應RAG系統的架構,包括檢索器、生成器和評估器三個主要元件,以及它們之間的互動流程。

  graph LR;
    A[使用者輸入] -->|G1|> B[生成器];
    B -->|G2|> C[增強輸入];
    C -->|G4|> D[生成回應];
    D -->|E1|> E[評估器];
    E -->|E2|> F[人機互動];
    F -->|Feedback|> B;

圖表翻譯: 此圖表展示了自適應RAG系統的工作流程,從使用者輸入到生成回應的整個過程,以及人機互動在其中的角色。

從零開始建立RAG驅動的生成式人工智慧模型

在建立RAG驅動的生成式人工智慧模型的過程中,我們首先需要下載必要的資源。以下將詳細介紹如何下載grequests.py檔案以及安裝所需的套件。

下載grequests.py檔案

我們將從GitHub儲存函式庫的commons目錄下載grequests.py檔案。這個檔案包含了一些通用的資源,可以避免重複。

url = "https://raw.githubusercontent.com/Denis2054/RAG-Driven-Ge/master/commons/grequests.py"
output_file = "grequests.py"

下載過程標準且根據請求實作。

安裝必要的套件

對於檢索器,我們只需要安裝兩個套件:

  1. requests:用於檢索Wikipedia檔案的HTTP函式庫。

    !pip install requests==2.32.3
    
  2. beautifulsoup4:用於從網頁中擷取資訊。

    !pip install beautifulsoup4==4.12.3
    

準備資料集

1.2.1. 資料集準備

對於這個概念驗證,我們將透過URL擷取Wikipedia檔案。資料集將包含自動或人工標註的標籤,這是向資料集索引邁出的第一步。

import requests
from bs4 import BeautifulSoup
import re

# 將Wikipedia文章的URL對映到關鍵字
urls = {
    "prompt engineering": "https://en.wikipedia.org/wiki/Prompt_engineering",
    "artificial intelligence": "https://en.wikipedia.org/wiki/Artificial_intelligence",
    "llm": "https://en.wikipedia.org/wiki/Large_language_model",
    "llms": "https://en.wikipedia.org/wiki/Large_language_model"
}

1.2.2. 資料處理

我們首先對要檢索的檔案套用標準的擷取和文字清理功能:

def fetch_and_clean(url):
    # 擷取URL的內容
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    # 找到文章的主要內容,忽略側邊欄
    content = soup.find('div', {'class': 'mw-parser-output'})
    # 移除較不相關的部分,如「參見」、「參考文獻」等
    for section_title in ['References', 'Bibliography', 'External links']:
        section = content.find('span', {'id': section_title})
        if section:
            for sib in section.parent.find_next_siblings():
                sib.decompose()
            section.parent.decompose()
    # 從段落標籤中提取和清理文字
    paragraphs = content.find_all('p')
    cleaned_text = ' '.join(paragraph.get_text(separator=' ', strip=True) for paragraph in paragraphs)
    cleaned_text = re.sub(r'\[\d+\]', '', cleaned_text)  # 移除參考文獻標記
    return cleaned_text

#### 內容解密:

  1. fetch_and_clean函式的作用:該函式負責從指定的URL擷取內容,並清理HTML標籤,提取純文字內容。
  2. 移除參考文獻標記:使用正規表示式移除文字中的參考文獻標記,如[1][2]等。
  3. 提取主要內容:透過BeautifulSoup解析HTML,找到主要內容區域並移除不相關的部分。
  4. 清理文字:將段落文字合併並清理空白字元。

檢索過程

1.3. 使用者輸入的檢索過程

import textwrap

def process_query(user_input, num_words):
    user_input = user_input.lower()
    # 檢查輸入中是否包含指定的關鍵字
    matched_keyword = next((keyword for keyword in urls if keyword in user_input), None)
    
    if matched_keyword:
        print(f"Fetching data from: {urls[matched_keyword]}")
        cleaned_text = fetch_and_clean(urls[matched_keyword])
        # 限制顯示的文字數量
        words = cleaned_text.split()
        first_n_words = ' '.join(words[:num_words])
        
        # 將文字格式化以便顯示
        wrapped_text = textwrap.fill(first_n_words, width=80)
        print("\nFirst {} words of the cleaned text:".format(num_words))
        print(wrapped_text)
        
        # 生成GPT-4提示
        prompt = f"Summarize the following information about {matched_keyword}: {first_n_words}"
        wrapped_prompt = textwrap.fill(prompt, width=80)
        print("\nPrompt for Generator:", wrapped_prompt)
        
        return first_n_words
    else:
        print("No relevant keywords found. Please enter a query related to our database.")
        return None

#### 內容解密:

  1. process_query函式的作用:根據使用者輸入的查詢,找出相關的關鍵字,並擷取對應的文字內容。
  2. 限制文字數量:透過num_words引數控制傳回的文字數量。
  3. 生成GPT-4提示:將擷取的文字內容格式化為GPT-4模型的輸入提示。
  4. 傳回結果:傳回指定數量的文字內容。

生成器

生成器生態系統包含多個元件,其中一些與檢索器功能和使用者介面重疊。後續將詳細介紹自適應RAG系統的實作。

自適應RAG系統

自適應RAG系統將根據使用者面板的評分進行選擇。在實際的生產環境中,這個功能可以是一個獨立的程式。

RAG系統流程

  graph LR
    A[使用者輸入] --> B[關鍵字匹配]
    B --> C[擷取資料]
    C --> D[清理資料]
    D --> E[生成GPT-4提示]
    E --> F[生成回應]

圖表翻譯: 此圖示展示了RAG系統的流程,從使用者輸入到生成回應的整個過程。

整合 HF-RAG 以增強檔案輸入

資訊檢索的動態特性以及生成式人工智慧模型中對上下文相關資料增強的需求,需要一個能夠適應不同輸入品質的靈活系統。我們引入了一個自適應的 RAG 選擇系統,該系統使用 HF 分數來決定在 RAG 生態系統中實施檔案的最佳檢索策略。自適應功能使我們超越了簡單的 RAG,構成了一個混合的 RAG 系統。

人工評估與 RAG 觸發機制

人工評估者根據檔案的相關性和品質給予 1 至 5 的平均分數。這些分數會觸發不同的操作模式,如下圖所示:

此圖示顯示了自動化的 RAG 觸發機制。 圖表翻譯: 圖中呈現了根據不同的評分觸發不同的 RAG 操作模式的流程。

  • 評分為 1 至 2 表示 RAG 系統缺乏補償能力,建議需要進行維護或可能需要對模型進行微調。RAG 將被暫時停用,直到系統得到改進。使用者輸入將被處理,但不會進行檢索。
  • 評分為 3 至 4 時,將啟動僅有人類專家回饋的增強,利用 flashcard 或片段來改進輸出。根據檔案的 RAG 將被停用,但人類專家的回饋資料將增強輸入。
  • 評分為 5 時,將啟動關鍵字搜尋 RAG,並在必要時利用之前收集的 HF 進行增強,利用 flashcard 或目標資訊片段來改進輸出。使用者無需提供新的回饋。

輸入與模擬

公司 C 的使用者被提示輸入一個問題:

# 請求使用者輸入以進行關鍵字解析
user_input = input("請輸入您的查詢:").lower()

在這個範例和程式中,我們將重點放在一個問題和主題上:什麼是 LLM?這個問題出現並被模型記憶:

請輸入您的查詢:什麼是 LLM?

內容解密:

這段程式碼的作用是接收使用者的輸入,並將其轉換為小寫,以便進行後續的關鍵字解析和處理。

平均排名模擬情境

為了這個程式,讓我們假設人類使用者回饋小組已經使用第 3.2 節和第 3.3 節中提供的功能對混合自適應 RAG 系統進行了一段時間的評估。使用者回饋小組多次對回應進行排名,這些排名會自動更新,透過計算評分的平均值並將其儲存在名為 ranking 的變數中。ranking 分數將幫助管理團隊決定是否降低檔案的排名、升級或透過手動或自動功能抑制檔案。

# 選擇 1 到 5 之間的分數以執行模擬
ranking = 1

內容解密:

這段程式碼的作用是設定一個模擬的分數,用於決定觸發哪種 RAG 操作模式。根據 ranking 的值,將決定是否啟用 RAG 或人類專家回饋增強。

排名 1–2:無 RAG

生成式人工智慧模型的輸出排名非常低。所有 RAG 功能都被停用,直到管理團隊能夠分析和改進系統。在這種情況下,text_input 等於 user_input

if ranking >= 1 and ranking < 3:
    text_input = user_input

內容解密:

這段程式碼的作用是根據 ranking 的值決定是否將 user_input 直接指定給 text_input,在排名較低時不啟用 RAG 功能。

排名 3–4:人類專家回饋 RAG

在這種情況下,人類專家回饋(見第 3.4 節)是由使用者回饋評分較低時觸發的,自動化的 RAG 檔案(ranking=5)和無 RAG(ranking=1-2)。人類專家小組填寫了一張 flashcard,現在已儲存為專家級別的 RAG 檔案。

hf = False
if ranking > 3 and ranking < 5:
    hf = True

內容解密:

這段程式碼的作用是根據 ranking 的值決定是否啟用人類專家回饋(HF)。當 ranking 在 3 至 4 之間時,hf 被設為 True,表示將使用人類專家回饋來增強輸出。

內容生成

在不同的 ranking 值下,生成式人工智慧模型的輸出將有所不同。讓我們來看看在不同評分類別下的輸出結果。

無 RAG 時的輸出

ranking 為 1 時,RAG 功能被停用,生成式人工智慧模型(此例中為 GPT-4o)將生成如下輸出:

GPT-4 回應:
---------------
看起來你正在詢問 "LLM",它代表 "語言模型"。
LLM 是一種設計用來理解和生成人類語言的人工智慧模型。
LLM 的例子包括 OpenAI 的 GPT(生成式預訓練變壓器)。
---------------

內容解密:

這段輸出是生成式人工智慧模型在未啟用 RAG 功能時的回應。它提供了對 LLM 的基本解釋,但可能無法滿足公司 C 使用者面板的特定需求。