在這篇文章中,筆者將討論以下幾個(gè)問(wèn)題:
為什么要進(jìn)行 query 理解在 RAG 系統(tǒng)中,進(jìn)行 query 理解是非常關(guān)鍵的一步。query 理解指的是對(duì)用戶提出的問(wèn)題進(jìn)行深入分析,提取出關(guān)鍵信息,從而更準(zhǔn)確地從知識(shí)庫(kù)中檢索出與用戶查詢最相關(guān)的信息,進(jìn)而生成高質(zhì)量的回答。 在 RAG 系統(tǒng)中,對(duì)用戶 query 進(jìn)行理解,包括但不限于以下原因: 1、用戶表達(dá)的模糊性 由于自然語(yǔ)言的復(fù)雜性,相同的詞匯在不同的上下文中可能有不同的含義,query 理解可以幫助系統(tǒng)識(shí)別并糾正這些錯(cuò)誤,確保準(zhǔn)確地理解用戶的真正需求。 比如,用戶輸入「我想知道子龍是誰(shuí)?」這里的「子龍」可能指代多種含義,如歷史人物趙子龍或者某個(gè)昵稱。又比如,用戶輸入 「book」,而 book 有多種含義,可能指一本書,也可能指預(yù)訂一個(gè)座位。 通過(guò) query 理解,系統(tǒng)可以分析上下文,判斷用戶的意圖,從而檢索到相關(guān)的正確信息。 2、query 和 doc 不在同一個(gè)語(yǔ)義空間 用戶的 query 通常是非結(jié)構(gòu)化的,可能使用非正式或口語(yǔ)化的語(yǔ)言進(jìn)行自由表達(dá),而文檔則可能采用正式的書面表達(dá)。query 理解可以幫助將用戶的表述轉(zhuǎn)換為文檔中術(shù)語(yǔ),從而提高召回率。 比如,用戶輸入「手機(jī)壞了怎么辦」,而文檔中可能使用的是「手機(jī)維修步驟」這樣的表述。又比如,用戶可能問(wèn)「如何讓網(wǎng)站更快」,而文檔內(nèi)容可能是「提高網(wǎng)站性能的方法」。 當(dāng)用戶的 query 和文檔不在同一個(gè)語(yǔ)義空間時(shí),這增加了檢索系統(tǒng)的復(fù)雜性,因?yàn)樗枰诓煌谋磉_(dá)方式、術(shù)語(yǔ)使用、上下文信息等方面建立聯(lián)系。 3、用戶的 query 可能比較復(fù)雜 用戶的 query 有時(shí)可能涉及多個(gè)子問(wèn)題或包含多個(gè)步驟,需要將復(fù)雜的 query 分解成更易處理的部分,逐一進(jìn)行處理,以便提供準(zhǔn)確和完整的答案。 比如,用戶 query:「如何用 Python 分析數(shù)據(jù),并生成預(yù)測(cè)報(bào)告?」,而文檔內(nèi)容可能是「使用 Python 分析股票數(shù)據(jù)的方法包括數(shù)據(jù)獲取、數(shù)據(jù)清洗、特征提取等步驟」、「生成預(yù)測(cè)報(bào)告的方法包括建立預(yù)測(cè)模型、進(jìn)行模型訓(xùn)練和測(cè)試、生成報(bào)告」。在這個(gè)例子,用戶的 query 涉及數(shù)據(jù)分析和報(bào)告生成兩個(gè)主要部分。通過(guò) query 理解,系統(tǒng)可以將復(fù)雜的 query 分解為兩個(gè)子問(wèn)題:「如何用 Python 分析數(shù)據(jù)?」和「如何生成預(yù)測(cè)報(bào)告?」,然后分別進(jìn)行處理和回答。 處理復(fù)雜 query 時(shí),RAG 系統(tǒng)需要能夠識(shí)別并分解用戶的查詢,將其拆分為更小、更具體的子問(wèn)題。這樣不僅可以提高檢索的準(zhǔn)確性,還可以使生成的回答更加精確和相關(guān)。 query 理解有哪些技術(shù)在 RAG 系統(tǒng)中,query 理解技術(shù)是提高信息檢索效率和準(zhǔn)確性的關(guān)鍵。我把當(dāng)前常用的 query 理解技術(shù)分為三大類:query 改寫、query 增強(qiáng)和 query 分解,如圖所示。當(dāng)然,也還有很多其他技術(shù),這里先介紹下面這幾種。 上下文信息補(bǔ)全在多輪對(duì)話中,用戶的當(dāng)前輸入往往包含隱含的指代關(guān)系和省略的信息。例如,用戶在對(duì)話中提到的「它」可能指代之前對(duì)話中提到的某個(gè)具體事物。如果缺乏這些上下文信息,系統(tǒng)無(wú)法準(zhǔn)確理解用戶意圖,從而導(dǎo)致語(yǔ)義缺失,無(wú)法有效召回相關(guān)信息。 在這種情況下,我們可以使用上下文信息補(bǔ)全,這里的上下文不僅僅是指多輪對(duì)話的信息,還包含當(dāng)前對(duì)話的背景信息,比如時(shí)間、地點(diǎn)等。我們可以通過(guò)使用大型語(yǔ)言模型(LLM),對(duì)當(dāng)前的 query 進(jìn)行重寫,將上下文中隱含的信息納入到新生成的 query 中。 下面是一段多輪對(duì)話的示例: User:最近有什么好看的電視??? 在這個(gè)例子,用戶的問(wèn)題「我想看第一季」包含了隱含的指代信息,沒(méi)有上下文信息的補(bǔ)全,系統(tǒng)無(wú)法知道具體指的是哪部電視劇。通過(guò)采用上下文信息補(bǔ)全,我們把前面的對(duì)話信息也納入其中,對(duì) query 進(jìn)行改寫,可以生成類似「我想看慶余年第一季」的完整 query,從而提高后續(xù)檢索的清晰度和相關(guān)性。 上下文信息補(bǔ)全可以提高 query 的清晰度,使系統(tǒng)能夠更準(zhǔn)確地理解用戶意圖,不過(guò),因?yàn)樾枰嗾{(diào)用一次 LLM,會(huì)增加整體流程的 latency 問(wèn)題。因此,我們也需要權(quán)衡計(jì)算復(fù)雜度和延遲的問(wèn)題。 RAG-FusionRAG Fusion 旨在提升搜索精度和全面性,它的核心原理是根據(jù)用戶的原始 query 生成多個(gè)不同角度的 query ,以捕捉 query 的不同方面和細(xì)微差別。然后通過(guò)使用逆向排名融合(Reciprocal Rank Fusion,RRF)技術(shù),將多個(gè) query 的檢索結(jié)果進(jìn)行融合,生成一個(gè)統(tǒng)一的排名列表,從而增加最相關(guān)文檔出現(xiàn)在最終 TopK 列表的機(jī)會(huì)。 RAG Fusion 的整體流程如圖所示,工作流程如下 1、多查詢生成:直接使用用戶輸入的 query 進(jìn)行查詢,查詢結(jié)果可能太窄導(dǎo)致無(wú)法產(chǎn)生較為全面的結(jié)果。通過(guò)使用 LLM 將原始查詢擴(kuò)展成多樣化的查詢,從而增加搜索的視野和深度。 2、逆向排名融合(RRF):RRF 是一種簡(jiǎn)單而有效的技術(shù),用于融合多個(gè)檢索結(jié)果的排名,以提高搜索結(jié)果的質(zhì)量。它通過(guò)將多個(gè)系統(tǒng)的排名結(jié)果進(jìn)行加權(quán)綜合,生成一個(gè)統(tǒng)一的排名列表,使最相關(guān)的文檔更有可能出現(xiàn)在結(jié)果的頂部。這種方法不需要訓(xùn)練數(shù)據(jù),適用于多種信息檢索任務(wù),且在多個(gè)實(shí)驗(yàn)中表現(xiàn)優(yōu)于其他融合方法。 3、生成性輸出:將重新排名的文檔和查詢輸入到 LLM ,生成結(jié)構(gòu)化、富有洞見(jiàn)的答案或摘要。
Multi-Query跟 RAG Fusion 類似,MultiQuery 是一種通過(guò)生成多種視角的查詢來(lái)檢索相關(guān)文檔的方法。它使用 LLM 從用戶輸入的查詢生成多個(gè)不同的查詢視角,然后為每個(gè)查詢檢索一組相關(guān)文檔,并合并這些結(jié)果以獲得更全面的文檔集合。 跟 RAG Fusion 不同的是,MultiQuery 沒(méi)有使用 RRF 來(lái)融合多個(gè)搜索結(jié)果列表的排名,而是將多個(gè)搜索結(jié)果放到 context 中。這樣做的好處是能夠在上下文中保留更多的檢索結(jié)果,提供更豐富的信息源,同時(shí)減少了在排名融合上的復(fù)雜性。通過(guò)這種方法,用戶可以獲得更加多樣化和全面的信息集合,有助于更好地理解和回答復(fù)雜的問(wèn)題。
HyDE通常,RAG 向量檢索通過(guò)使用內(nèi)積相似度來(lái)度量查詢(query)和文檔(doc)之間的相似性。事實(shí)上,這里存在一個(gè)挑戰(zhàn):query 和 doc 不在同一個(gè)語(yǔ)義空間(前面已經(jīng)介紹),通過(guò)將 query 和 doc 向量化,然后基于向量相似性來(lái)檢索,檢索的精度有限而且噪聲可能比較大。為了解決這個(gè)問(wèn)題,一種可行的方法是通過(guò)標(biāo)注大量的數(shù)據(jù)來(lái)訓(xùn)練 embedding 函數(shù)。 而 HyDE(假設(shè)性文檔嵌入,Hypothetical Document Embeddings)技術(shù)是一種無(wú)監(jiān)督的方法,它基于這樣一個(gè)假設(shè):與 query 相比,假設(shè)性回答(LLM 直接對(duì) query 生成的答案)與文檔共享更相似的語(yǔ)義空間。 HyDE 具體是怎么工作的呢? 首先,HyDE 針對(duì) query 直接生成一個(gè)假設(shè)性文檔或者說(shuō)回答(hypo_doc)。然后,對(duì)這個(gè)假設(shè)性回答進(jìn)行向量化處理。最后,使用向量化的假設(shè)性回答去檢索相似文檔。 經(jīng)過(guò)這么一頓操作,以前的 query - doc 檢索就變成了 query - hypo_doc - doc 的檢索,而此時(shí) hypo_doc 和 doc 可能在語(yǔ)義空間上更接近。因此,HyDE 可以在一定程度上提升文檔檢索的精準(zhǔn)度和相關(guān)度。 舉個(gè)例子,假設(shè)用戶提問(wèn)「如何提高睡眠質(zhì)量?」,HyDE 首先生成一個(gè)假設(shè)性回答,比如「提高睡眠質(zhì)量的方法包括保持規(guī)律的睡眠時(shí)間、避免咖啡因和電子設(shè)備等?!梗@個(gè)假設(shè)回答經(jīng)過(guò)編碼后,可能與提供的知識(shí)庫(kù)中的文檔內(nèi)容(如不喝咖啡,不玩手機(jī)等電子設(shè)備)更接近,從而更容易找到相關(guān)文檔。 HyDE 的核心優(yōu)勢(shì)在于:
然而,因?yàn)?HyDE 強(qiáng)調(diào)問(wèn)題的假設(shè)性回答和查找內(nèi)容的相似性,因此也存在著不可避免的問(wèn)題,即,假設(shè)性回答的質(zhì)量取決于大型語(yǔ)言模型的生成能力,如果模型生成的回答不準(zhǔn)確或不相關(guān),會(huì)影響檢索效果。例如,如果討論的主題對(duì) LLM 來(lái)說(shuō)比較陌生,這種方法就無(wú)效了,可能會(huì)導(dǎo)致生成錯(cuò)誤信息的次數(shù)增加。
Step-back promptingStep-back prompting 技術(shù)旨在提高 LLM 進(jìn)行抽象推理的能力,它引導(dǎo) LLM 在回答問(wèn)題前進(jìn)行深度思考和抽象處理,將復(fù)雜問(wèn)題分解為更高層次的問(wèn)題。 Step-Back Prompting 包含兩個(gè)主要步驟:
研究者在多個(gè)挑戰(zhàn)性推理密集型任務(wù)上測(cè)試了 Step-Back Prompting,包括 STEM、知識(shí)問(wèn)答(Knowledge QA)和多跳推理(Multi-Hop Reasoning)。實(shí)驗(yàn)涉及 PaLM-2L、GPT-4 和 Llama2-70B 模型,并觀察到在各種任務(wù)上的性能顯著提升。例如,在 MMLU(物理和化學(xué))上,PaLM-2L 的性能分別提高了 7% 和 11%,在 TimeQA 上提高了 27%,在 MuSiQue 上提高了 7%。 Step-Back Prompting 適用于需要復(fù)雜推理的領(lǐng)域,如:
IR-CoTIR-CoT(Interleaving Retrieval with Chain-of-Thought Reasoning),是一種用于解決多步驟問(wèn)題(Multi-Step Questions)的技術(shù)。IR-CoT 通過(guò)交替執(zhí)行檢索(retrieval)和推理(reasoning)步驟來(lái)提高大型語(yǔ)言模型(LLMs)在處理復(fù)雜問(wèn)題時(shí)的性能,如圖所示。 IR-CoT 的核心思想是將檢索步驟與推理步驟相結(jié)合,以指導(dǎo)檢索過(guò)程并反過(guò)來(lái)使用檢索結(jié)果來(lái)改進(jìn)推理鏈(Chain-of-Thought, CoT)。論文作者認(rèn)為,對(duì)于多步 QA 任務(wù),單純基于問(wèn)題的一次性檢索是不夠的,因?yàn)楹罄m(xù)檢索的內(nèi)容取決于已經(jīng)推導(dǎo)出的信息。 IR-CoT的工作流程如下:
這里,我們以論文中的一個(gè)例子來(lái)進(jìn)行說(shuō)明: 如圖所示,
IR-CoT 通過(guò)交替進(jìn)行 CoT 生成和檢索步驟,使得每一步的檢索過(guò)程都受到前一步的推理結(jié)果指導(dǎo),從而可以更精確地定位相關(guān)信息。 這相比于傳統(tǒng)的單次檢索方法,即只使用初始問(wèn)題作為查詢的方式,能夠獲得更多相關(guān)且精確的信息,提高了最終答案的準(zhǔn)確性。
Least-to-MostLeast-to-Most prompting 也可以用于解決多步推理的問(wèn)題,它將復(fù)雜問(wèn)題分解為一系列更簡(jiǎn)單的子問(wèn)題,并按順序解決這些子問(wèn)題。 Least-to-Most prompting 包括兩個(gè)主要階段:
這種方法的核心思想是將問(wèn)題分解為可管理的步驟,并利用逐步構(gòu)建的答案來(lái)指導(dǎo)模型解決更復(fù)雜的問(wèn)題。 這里,我們以論文中的一個(gè)例子來(lái)進(jìn)行說(shuō)明: 如圖所示,展示了如何通過(guò)兩階段的方法使用 LLM 解決一個(gè)數(shù)學(xué)題。 問(wèn)題:Amy 爬到滑梯頂部需要4分鐘,從滑梯滑下需要1分鐘。水滑梯將在15分鐘后關(guān)閉。她在關(guān)閉之前可以滑多少次? 階段 1:將問(wèn)題分解為子問(wèn)題 LLM 將復(fù)雜問(wèn)題分解為更小的子問(wèn)題:為了回答「她在關(guān)閉之前可以滑多少次?」,我們需要先解決「每次滑行需要多長(zhǎng)時(shí)間?」的問(wèn)題。 階段 2:依次解決子問(wèn)題 子問(wèn)題1: 問(wèn):每次滑行需要多長(zhǎng)時(shí)間?答:Amy 爬上滑梯需要4分鐘,滑下來(lái)需要1分鐘。因此每次滑行需要5分鐘。 子問(wèn)題2: 問(wèn):她在關(guān)閉之前可以滑多少次?答:水滑梯將在15分鐘后關(guān)閉。每次滑行需要5分鐘。因此 Amy 可以滑15 ÷ 5 = 3次。
各種 query 理解技術(shù)的實(shí)現(xiàn)知道了各種 query 理解技術(shù)的原理,我們就可以嘗試使用 LangChain 來(lái)實(shí)現(xiàn)了。筆者將所有實(shí)現(xiàn)代碼放在jupyter notebook 中了,需要的讀者,請(qǐng)關(guān)注公眾號(hào),然后發(fā)消息 在代碼中,我使用了
另外,讀者還需要去 DeepSeek 官網(wǎng)(https://platform./usage)申請(qǐng) API Key,剛注冊(cè)的時(shí)候,會(huì)送 500 萬(wàn) token。 這里,給大家展示下
from langchain_openai import ChatOpenAI 結(jié)果如下: 總結(jié)構(gòu)建一個(gè)高效的 RAG 系統(tǒng),不僅僅是技術(shù)上的挑戰(zhàn),更是對(duì)我們理解和應(yīng)對(duì)信息復(fù)雜性的考驗(yàn)。本文詳細(xì)闡述了 Query 理解的重要性、原理和技術(shù)實(shí)現(xiàn),揭示了在 RAG 系統(tǒng)中,精確的 Query 理解是提升信息檢索與生成質(zhì)量的關(guān)鍵。 Query 理解作為連接用戶需求和知識(shí)庫(kù)的橋梁,其核心在于能夠準(zhǔn)確捕捉用戶的意圖,并在海量信息中找到最相關(guān)的內(nèi)容。 一個(gè)性能優(yōu)良的 RAG 系統(tǒng),離不開對(duì) Query 理解的持續(xù)優(yōu)化。這一過(guò)程不僅是技術(shù)的迭代,更是對(duì)用戶需求的深刻理解。還是那句話:提高 RAG 系統(tǒng)性能是一個(gè)持續(xù)的過(guò)程,需要不斷地評(píng)估、優(yōu)化和迭代。 |
|