請啟用JavaScript來查看內容

Query Transformations 技巧幫助 RAG 優化問題,提升檢索效果

    前言

    藉由我之前 介紹 RAG (Retrieval Augmented Generation,檢索增強生成) 的文章 可以了解,RAG 是一種結合檢索搜尋和生成的自然語言處理架構。讓 LLM (大型語言模型)在生成回覆以前,從外部知識庫搜尋相關資料,並使用這些資訊生成更準確、更全面的答案。

    簡單來說,就是在 LLM 回答我們的問題之前,它會先找出相關資料的小抄,這樣 LLM 能生成更符合我們問題的回覆。


    但是我們的 "問題" 會不會太爛?像是提問不夠精確、太模糊、甚至詞不達意,造成 AI 找不出相關資料,甚至找到錯誤的資料,造成回應結果不一定靠譜呢?
    又或者 "問題" 太過精確,反而在知識庫中找不太到相關資料?

    這都是有可能的,所以在把 "問題" 交給 AI 找相關資料前,可以先將問題做 "改寫",讓 AI 能夠更好地掌握我們的 "言外之意",這就叫「查詢轉換 (Query Transformations)」。


    準備好,讓我們一起來學習這些技巧,讓你的查詢不再迷路,找到更精準的答案吧!


    圖片來源:Unsplash
    圖片來源:Unsplash


    為何需要「查詢轉換 (Query Transformations)」

    我們都知道,人類自然語言是非常複雜的,同一個詞在不同的情境下會有不同的意思,而且我們常常會用一些省略或模糊的表達方式。這對 AI 來說可是個大挑戰!如果 AI 直接拿我們的原始問題去搜尋,很可能會找出一堆牛頭不對馬嘴的資料。

    就像我們在前言說的,如果給 RAG 的 "問題" 太爛,可能會造成 AI 找不出相關資料,甚至找到錯誤的資料,導致最終 LLM 的回覆不如我們的意。

    1. "問題" 不夠精確、太模糊、詞不達意:可能找到錯誤的資料。
    2. "問題" 太過精確:可能反而找不到相關資料。

    查詢轉換 (Query Transformations) 幫助我們調整問題,將問題做個「升級」,提升後續的檢索效果。

    這項技術的核心目標就是透過修改或擴展查詢內容,讓系統能夠更精準地從資料庫中找到相關資訊。
    幫助系統聽懂我們的「真實」意圖,調整查詢內容,可以更貼合我們的需求。


    「查詢轉換 (Query Transformations)」方法


    本文主要介紹其中的四種方法:

    • Query Rewriting (查詢重寫):重新撰寫問題以改善檢索。
    • Step-back Prompting (後退提示):產生更廣泛的問題以更好地進行檢索 (退一步看看有沒有新天地)。
    • Sub-query (子查詢):將複雜問題分解為更簡單的子查詢 (將複雜的問題拆成小塊,一塊一塊來找)。
    • Multi-query (多查詢):將原始問題產生多個不同角度、描述的問題。 (從多個面向回答問題)。

    (後續如果我有時間,再來介紹更多其他查詢轉換的方法)


    我會給出查到的範例 Prompt,及實際使用 ChatGPT 4o 以「如何去阿里山?」問題來比較轉換後的差異。


    Query Rewriting (查詢重寫)

    目的:將問題做改寫,使其更具體、更詳細,提高檢索相關資訊的可能性。

    範例 Prompt:

    You are an AI assistant tasked with reformulating user queries to improve retrieval in a RAG system. 
    Given the original query, rewrite it to be more specific, detailed, and likely to retrieve relevant information.
    
    Original query: {original_query}
    
    Rewritten query:
    

    結果與比較:

    • 原始問題:「如何去阿里山?」
    • 經 4o LLM 調整後的問題:「從台北出發前往阿里山的最佳交通方式是什麼?有哪些選擇,包括火車、巴士或自駕?需要多少時間,以及有沒有推薦的路線或景點可以沿途參觀?」
    Query Rewriting (查詢重寫)
    Query Rewriting (查詢重寫)

    Step-back Prompting (後退提示)

    目的:退一步思考,產生更廣泛、更通用的問題,以更好地進行檢索相關資訊。
    後退提示:

    範例 Prompt:

    You are an AI assistant tasked with generating broader, more general queries to improve context retrieval in a RAG system.
    Given the original query, generate a step-back query that is more general and can help retrieve relevant background information.
    
    Original query: {original_query}
    
    Step-back query:
    

    結果與比較:

    • 原始問題:「如何去阿里山?」
    • 經 4o LLM 調整後的問題:「台灣有哪些著名的旅遊景點及如何抵達?」
    Step-back Prompting (後退提示)
    Step-back Prompting (後退提示)

    Sub-query (子查詢)

    目的:將複雜查詢分解為更簡單的多個子查詢,以實現更全面的檢索。

    範例 Prompt:

    You are an AI assistant tasked with breaking down complex queries into simpler sub-queries for a RAG system.
    Given the original query, decompose it into 2-4 simpler sub-queries that, when answered together, would provide a comprehensive response to the original query.
    
    Original query: {original_query}
    
    example: What are the impacts of climate change on the environment?
    
    Sub-queries:
    1. What are the impacts of climate change on biodiversity?
    2. How does climate change affect the oceans?
    3. What are the effects of climate change on agriculture?
    4. What are the impacts of climate change on human health?
    

    結果與比較:

    • 原始問題:「如何去阿里山?」
    • 經 4o LLM 調整後的問題:
      1. 有哪些前往阿里山的交通方式?
      2. 從台北到阿里山需要多長時間?
      3. 前往阿里山的最佳旅遊季節是什麼時候?
      4. 阿里山附近有哪些著名景點值得一遊?
    Sub-query (子查詢)
    Sub-query (子查詢)

    五個問題可以分別檢索出對應最相關的段落,可以再將這些相關段落與原始問題給 LLM,請它總結回答。


    Multi-query (多查詢)

    目的:跟 Sub-query (子查詢) 有點像,也是將原始問題猜成多個,但它是產生多個不同角度、描述的問題,來進行更廣泛的檢索。我覺得像是結合 Query Rewriting (查詢重寫),

    範例 Prompt:

    You are an intelligent assistant. Your task is to generate 5 questions based on the provided question in different wording and different perspectives to retrieve relevant documents from a vector database.
    By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines.
    
    Original query: {original_query}
    

    結果與比較:

    • 原始問題:「如何去阿里山?」
    • 經 4o LLM 調整後的問題:
      1. 從台北到阿里山的最佳交通方式是什麼?
      2. 如何搭乘公共交通工具前往阿里山?
      3. 自駕去阿里山有哪些推薦的路線?
      4. 阿里山附近有哪些交通接駁選項?
      5. 從嘉義市區到阿里山要怎麼去比較方便?
    Multi-query (多查詢)
    Multi-query (多查詢)

    其他

    還有一個跟 Sub-query Decomposition (子查詢分解) 很像的,叫做 Least-to-Most Prompting (最少到最多提示)。

    跟 Sub-query Decomposition 一樣是將複雜的問題分解為多個子問題,但 Least-to-Most Prompting 的差異在於,模型解決了第一個子問題後,繼續處理下一個子問題時,會同時保留先前的子問題及其答案,依序下去直到解決最終問題。

    這也跟 Chain-of-thought prompt (CoT 思維鏈) 很像,但細部又不太一樣。

    Least-to-Most Prompting Enables Complex Reasoning in Large Language Models (https://arxiv.org/abs/2205.10625)
    Least-to-Most Prompting Enables Complex Reasoning in Large Language Models (https://arxiv.org/abs/2205.10625)

    RAG Fusion 方法也是像 Multi-query (多查詢) 從不同的角度產生多個問題,只是 RAG Fusion 還多了將檢索到的文章進行排序 (使用 Reciprocal Ranking Fusion,RRF) 這個動作,可以讓後續給 LLM 當上下文參考時,確保最相關的資訊被優先考慮。

    RAG-Fusion: a New Take on Retrieval-Augmented Generation (https://arxiv.org/abs/2402.03367)
    RAG-Fusion: a New Take on Retrieval-Augmented Generation (https://arxiv.org/abs/2402.03367)

    HyDE (Hypothetical Document Embeddings) 方法是先將問題透過 LLM 生成一個假設的回答後,再將這個回答丟進去 RAG 裡找相關段落,這樣比較容易找出相似的文件。

    Precise Zero-Shot Dense Retrieval without Relevance Labels (https://arxiv.org/abs/2212.10496)
    Precise Zero-Shot Dense Retrieval without Relevance Labels (https://arxiv.org/abs/2212.10496)


    結語

    以上主要介紹了四種「查詢轉換 (Query Transformations)」的技巧,也稍微提到了其他方法,不妨各位都可以試試看,提升 RAG 檢索相關文件的能力。

    簡單來說:

    • Query Rewriting (查詢重寫):讓問題更「精準」。
    • Step-back Prompting (後退提示):讓問題更「廣泛」。
    • Sub-query (子查詢):讓問題更「簡單」。
    • Multi-query (多查詢):讓問題更「多元」。

    其他:Least-to-Most Prompting、RAG Fusion、HyDE


    不過我發現,有時候轉換後的問題會有點脫離原始問題的意思,這也是要注意的地方。

    說實在的,有些方法我也是懵懵懂懂,如果有讀者發現說明有錯誤,歡迎在底下留言讓我知道~



    如果對於 Metabase 有興趣的讀者,記得『IT空間』FB 粉專要追蹤起來,才不會錯過最新的發文通知哦~🔔




    參考:
    Advanced RAG Techniques: Elevating Your Retrieval-Augmented Generation Systems 🚀
    Query Transform Cookbook | LlamaIndex
    Query Transformations | LlamaIndex
    Query Transformation - Learn RAG with Langchain
    RAG 優化技巧| 7 大挑戰與解決方式 | 增進你的 LLM


    Never stop asking questions and seeking answers. Curiosity fuels progress.
    永遠不要停止問問題以及找答案。好奇心是推動進步的關鍵。

    —— 黃仁勳 (NVIDIA 共同創辦人暨執行長)


    🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
    分享

    Jia
    作者
    Jia
    軟體工程師