返回文章列表

增強RAG檢索準確性之假設性問題生成

本文探討如何利用大語言模型(LLM)生成假設性問題,以增強問答系統(RAG)的檢索準確性。透過將文字分塊並為每個分塊生成多個假設性問題,我們可以建立更豐富的向量嵌入表示,從而提升系統對使用者問題的理解和匹配能力,有效解決語義對齊問題。

機器學習 自然語言處理

大語言模型(LLM)的快速發展為自然語言處理領域帶來了新的可能性。在問答系統(RAG)中,如何有效地檢索相關資訊一直是一項關鍵挑戰。傳統方法直接比較使用者問題和文字片段的向量嵌入,但由於文字片段的多樣性,這種方法容易受到語義對齊問題的影響。本文提出了一種利用 LLM 生成假設性問題的策略,藉由豐富文字分塊的向量嵌入表示,提升 RAG 的檢索準確性。具體方法是將原始文字分割成小塊,並利用 LLM 為每個分塊生成多個假設性問題,再將這些問題的向量嵌入與原始文字分塊關聯起來。當使用者提出問題時,系統會將使用者問題的向量嵌入與資料函式庫中所有假設性問題的向量嵌入進行比較,找到最相似的問題,並傳回其關聯的文字分塊作為答案。這種方法可以更精準地捕捉文字的語義資訊,從而提高檢索的準確性和效率。

解決方案

首先,需要將資料分割成小塊,這個過程稱為分塊(chunking)。然後,對於每個小塊,生成五個假設性的問題。接下來,為每個假設性的問題生成嵌入(embedding),並將這些問題和嵌入儲存在資料函式庫中。每個問題都連結到原始的文字小塊,這是後續搜尋過程中的關鍵步驟。

步驟

  1. 載入資料:載入資料並將其分割成小塊。遞迴分塊是一個好的起點。
  2. 生成假設性的問題:遍歷每個小塊,並為每個小塊生成五個假設性的問題。
  3. 生成嵌入:為每個假設性的問題生成嵌入。
  4. 推播到資料函式庫:將假設性的問題和其嵌入儲存在資料函式庫中,每個問題連結到原始的文字小塊。

目的

這個過程的目的是增強搜尋步驟。當使用者提出一個問題時,系統會使用這些假設性的問題和嵌入來找到最相關的搜尋結果。這種方法可以幫助系統更好地理解使用者的需求,並提供更準確的搜尋結果。

圖2-6:使用LLM生成假設性的問題

這個圖表示了使用LLM生成假設性的問題的過程。首先,系統載入資料並將其分割成小塊。然後,對於每個小塊,生成五個假設性的問題。接下來,為每個假設性的問題生成嵌入,並將這些問題和嵌入儲存在資料函式庫中。最終,系統可以使用這些假設性的問題和嵌入來找到最相關的搜尋結果。

圖表翻譯:

圖2-6展示瞭如何使用LLM生成假設性的問題。這個過程包括載入資料、分割資料、生成假設性的問題、生成嵌入和推播到資料函式庫等步驟。最終,系統可以使用這些假設性的問題和嵌入來找到最相關的搜尋結果。這種方法可以幫助系統更好地理解使用者的需求,並提供更準確的搜尋結果。

生成假設性問題:利用大語言模型(LLM)建立相關問題

在開發聊天機器人或問答系統時,生成假設性問題是一個重要的步驟。這些問題可以幫助我們評估系統的能力,確保它能夠正確地回答使用者的提問。以下是生成假設性問題的步驟:

步驟1:載入聊天記錄

首先,我們需要載入一段聊天記錄。這段記錄可以是兩個使用者之間的對話,也可以是單一使用者的自問自答。載入聊天記錄後,我們可以開始生成假設性問題。

步驟2:生成假設性問題

利用大語言模型(LLM),我們可以生成假設性問題。為了幫助LLM生成相關問題,我們可以提供額外的上下文,例如檔案型別、檔案域或其他相關資訊。這些上下文可以幫助LLM更好地理解聊天記錄的內容。

步驟3:定義預期輸出

為了確保我們收到的假設性問題是以Python列表的形式呈現,我們可以使用結構化輸出的功能。定義預期輸出的結構可以幫助我們更好地控制輸出的格式。

範例:使用LLM生成假設性問題

以下是使用OpenAI的GPT-4模型生成假設性問題的範例:

import os
from openai import OpenAI
from pydantic import BaseModel

import textwrap

# 載入聊天記錄
file_path = "../../datasets/text_files/AI_in_factories_chat.txt"
with open(file_path, "r") as file:
    text = file.read()

# 建立OpenAI客戶端
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

# 定義提示
prompt = textwrap.dedent(
    f"""
    Below you can find a chat history between two students.
    
    Please generate 5 hypothetical questions that could be 
    answered using the information from the discussion.
    The questions should focus on key details, definitions, and 
    information present in the text.
    Chat History:
    
    {text}
    """
)

# 傳送請求並接收回應
response = client.create_completion(prompt=prompt)

# 處理回應
hypothetical_questions = response["choices"][0]["text"]
print(hypothetical_questions)

在這個範例中,我們使用OpenAI的GPT-4模型生成假設性問題。模型接收到聊天記錄和提示後,會生成5個假設性問題。這些問題可以幫助我們評估系統的能力,確保它能夠正確地回答使用者的提問。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 增強RAG檢索準確性之假設性問題生成

package "RAG 假設性問題生成" {
    package "文字處理" {
        component [文字分塊] as chunk
        component [遞迴分割] as split
        component [內容解析] as parse
    }

    package "問題生成" {
        component [LLM 生成] as llm
        component [假設性問題] as hypo
        component [結構化輸出] as struct
    }

    package "向量檢索" {
        component [問題嵌入] as embed
        component [語義對齊] as align
        component [相似度匹配] as match
    }
}

chunk --> split : 原始文字
split --> parse : 文字小塊
parse --> llm : 上下文
llm --> hypo : 5 個問題/塊
hypo --> struct : Python 列表
struct --> embed : 向量嵌入
embed --> align : 語義表示
align --> match : 檢索結果

note right of llm
  LLM 應用:
  - OpenAI GPT-4
  - 問題生成
  - 語義理解
end note

note right of align
  語義對齊優勢:
  - 豐富向量表示
  - 橋接語義鴻溝
  - 提升檢索精準度
end note

@enduml

這個圖表展示了生成假設性問題的流程。首先,我們載入聊天記錄,然後使用LLM生成假設性問題。接下來,我們定義預期輸出的結構,然後傳送請求並接收回應。最後,我們處理回應並輸出假設性問題。

內容解密:

在這個範例中,我們使用OpenAI的GPT-4模型生成假設性問題。模型接收到聊天記錄和提示後,會生成5個假設性問題。這些問題可以幫助我們評估系統的能力,確保它能夠正確地回答使用者的提問。

每個步驟都很重要,因為它們都貢獻於生成高品質的假設性問題。首先,載入聊天記錄提供了模型所需的上下文。然後,生成假設性問題利用了模型的語言理解能力。接下來,定義預期輸出的結構幫助我們控制輸出的格式。最後,傳送請求並接收回應讓我們得到最終的結果。

這個過程展示瞭如何使用LLM生成假設性問題。透過這個過程,我們可以建立出高品質的假設性問題,幫助我們評估系統的能力,確保它能夠正確地回答使用者的提問。

文字分割與嵌入生成

在開發一個可靠的問答系統(RAG)時,提高檢索步驟的準確性至關重要。基本的RAG架構直接比較使用者問題和文字片段,但由於這些文字片段可能包括程式碼片段、文欄位落或表格等多種形式,導致向量嵌入可能無法完美對齊,即使底層資訊匹配良好。這個問題通常被稱為語義對齊問題。

從提升問答系統檢索效能的視角來看,本文提出的利用大語言模型(LLM)生成假設性問題並結合嵌入技術的方案,展現了其在解決語義對齊問題上的潛力。透過將文字分塊後,針對每個小塊生成多個假設性問題,系統得以從不同角度捕捉文字的深層含義。此方法不僅豐富了文字的向量表示,更能有效橋接使用者提問與文字內容之間的語義鴻溝,進而提升檢索的精準度。然而,此方案仍面臨一些挑戰。LLM生成的假設性問題的品質直接影響系統效能,如何確保問題的相關性和多樣性是關鍵。此外,大量的假設性問題和嵌入也會增加儲存和計算成本,需要權衡效能提升與資源消耗。展望未來,隨著LLM技術的持續發展以及向量搜尋技術的日益成熟,預期此方案將在更廣泛的RAG應用場景中發揮重要作用。對於追求高精確度問答系統的開發者而言,探索如何最佳化假設性問題的生成策略以及嵌入技術的應用,將是提升系統效能的關鍵所在。玄貓認為,此方法雖增加了系統複雜度,但在提升檢索精準度方面具有顯著優勢,值得深入研究和應用。