設(shè)計(jì)與實(shí)踐)
你肯定遇到過這種情況問一個(gè)大模型一個(gè)具體問題它要么給你一個(gè)看似正確但其實(shí)是胡編亂造的答案要么給你一個(gè)過于籠統(tǒng)、缺乏細(xì)節(jié)的回復(fù)。比如你問“2024年最新的糖尿病治療指南有什么更新”模型可能會基于它訓(xùn)練時(shí)學(xué)到的舊知識給你一個(gè)過時(shí)的答案或者干脆自己“腦補(bǔ)”一些不存在的信息。這背后其實(shí)是當(dāng)前大模型應(yīng)用面臨的一個(gè)核心矛盾模型自身記憶的知識參數(shù)化知識與外部檢索到的實(shí)時(shí)、精確知識非參數(shù)化知識之間到底該聽誰的是相信模型“腦子里”記得的東西還是相信它“臨時(shí)查到”的資料最近一篇名為《MedRGAG大模型該信查到的還是自己記得的以知識需求驅(qū)動統(tǒng)一檢索與生成》的論文在WWW 2024會議上獲得了最佳論文獎。這個(gè)標(biāo)題本身就點(diǎn)出了問題的要害。它沒有停留在“檢索增強(qiáng)生成RAG”這個(gè)熱門概念的表層而是直接切入最棘手的決策層如何根據(jù)用戶問題的“知識需求”類型智能地決定何時(shí)檢索、檢索什么、以及如何將檢索結(jié)果與模型自身知識融合。這篇文章我們就來深入拆解一下“MedRGAG”這篇論文的核心思想并把它從一個(gè)學(xué)術(shù)概念落地成我們開發(fā)RAG系統(tǒng)時(shí)可以借鑒的實(shí)用框架。你會發(fā)現(xiàn)一個(gè)優(yōu)秀的RAG系統(tǒng)遠(yuǎn)不止是“向量檢索提示詞拼接”那么簡單其真正的靈魂在于對“知識需求”的精準(zhǔn)判斷與路由。1. 從“有問必查”到“按需檢索”RAG系統(tǒng)的核心進(jìn)化傳統(tǒng)的RAG流程可以概括為一個(gè)相對固定的“三板斧”檢索用戶提問 - 將問題轉(zhuǎn)換為向量 - 去向量數(shù)據(jù)庫里找最相似的N個(gè)文檔片段。增強(qiáng)把找到的片段和原始問題一起拼接成一個(gè)長長的提示詞Prompt。生成把拼接好的提示詞喂給大模型讓它基于這些“上下文”生成答案。這個(gè)流程簡單有效解決了大模型“幻覺”和知識陳舊的問題。但它有一個(gè)致命的“懶政”思維無論什么問題都默認(rèn)需要去外部知識庫查一遍。這會導(dǎo)致幾個(gè)典型問題資源浪費(fèi)對于模型本身就知道的常識性問題如“水的化學(xué)式是什么”檢索是多余的增加了延遲和成本。噪聲干擾檢索到的片段質(zhì)量參差不齊如果檢索結(jié)果不相關(guān)或包含錯(cuò)誤反而會“污染”模型的生成導(dǎo)致答案質(zhì)量下降。決策僵化當(dāng)檢索到的信息與模型記憶的知識沖突時(shí)模型應(yīng)該以誰為準(zhǔn)傳統(tǒng)RAG通常假設(shè)檢索到的信息更可靠但這并非總是成立。MedRGAG這篇論文的突破點(diǎn)就在于它引入了一個(gè)“知識需求分類器”Knowledge Demand Classifier。這個(gè)分類器像一個(gè)智能調(diào)度中心在流程的最前端先對用戶的問題進(jìn)行診斷“嘿這個(gè)問題是需要我動用自己的‘畢生所學(xué)’參數(shù)知識來回答還是需要我立刻去‘翻書查資料’非參數(shù)知識或者需要我把‘記憶’和‘查到的資料’結(jié)合起來綜合判斷”這個(gè)“診斷”動作將RAG從一種固定的技術(shù)流程升級為一種動態(tài)的、基于需求的決策系統(tǒng)。這是理解這篇論文價(jià)值的第一把鑰匙。1.1 三類知識需求清晰定義決策邊界論文將用戶的問題根據(jù)其知識需求分為了三類。這個(gè)分類本身就極具工程指導(dǎo)意義參數(shù)化知識需求Parametric Knowledge Demand特征問題涉及通用、常識、或模型訓(xùn)練數(shù)據(jù)中高度覆蓋的知識。例子“Python中如何定義一個(gè)函數(shù)”、“牛頓第一定律是什么”、“請寫一首關(guān)于春天的詩?!毕到y(tǒng)決策不檢索。直接讓大模型基于自身參數(shù)化知識生成答案。這樣可以獲得最快響應(yīng)并避免無關(guān)檢索結(jié)果的干擾。非參數(shù)化知識需求Non-Parametric Knowledge Demand特征問題涉及具體的、實(shí)時(shí)的、私有的或高度專業(yè)化的知識這些知識不太可能存在于模型的原始訓(xùn)練數(shù)據(jù)中。例子“我司2024年Q3的財(cái)報(bào)關(guān)鍵數(shù)據(jù)是什么”、“根據(jù)最新醫(yī)保目錄某藥品是否被納入”、“我昨天上傳的文檔《項(xiàng)目規(guī)劃》里下一步行動計(jì)劃是什么”系統(tǒng)決策必須檢索。從外部知識庫如向量數(shù)據(jù)庫、傳統(tǒng)數(shù)據(jù)庫中獲取相關(guān)信息并以此為主要依據(jù)生成答案?;旌现R需求Hybrid Knowledge Demand特征問題同時(shí)需要通用知識和特定知識。通常通用知識用于理解、推理或搭建框架特定知識用于填充細(xì)節(jié)、提供證據(jù)。例子“請用通俗易懂的方式對比一下傳統(tǒng)機(jī)器學(xué)習(xí)與深度學(xué)習(xí)在醫(yī)療影像診斷中的優(yōu)劣并舉例說明?!毙枰ㄓ肕L/DL知識 具體的醫(yī)療影像診斷案例知識系統(tǒng)決策先檢索再融合。這是最復(fù)雜也最體現(xiàn)價(jià)值的一類。系統(tǒng)需要檢索相關(guān)特定知識并讓模型將其與自身通用知識進(jìn)行有機(jī)融合、推理生成最終答案。這個(gè)分類框架為我們設(shè)計(jì)RAG系統(tǒng)提供了最頂層的設(shè)計(jì)原則不是所有問題都值得檢索檢索的目標(biāo)和方式也因問題而異。2. MedRGAG系統(tǒng)架構(gòu)一個(gè)可落地的決策與執(zhí)行框架理解了“知識需求分類”這個(gè)核心思想后我們來看MedRGAG是如何將其實(shí)現(xiàn)為一個(gè)可運(yùn)行系統(tǒng)的。其整體架構(gòu)如下圖所示此處為概念描述幫助理解流程用戶問題 | v [知識需求分類器] ---(決策)--- 參數(shù)化需求 ---- [大模型直接生成] -- 最終答案 | | | v | 非參數(shù)化需求 ---- [檢索器] - [生成器基于檢索內(nèi)容] -- 最終答案 | | | v | 混合需求 -------- [檢索器] - [知識融合生成器] -- 最終答案 | v 分類結(jié)果我們可以把這個(gè)架構(gòu)拆解為三個(gè)核心模塊每個(gè)模塊都有其技術(shù)實(shí)現(xiàn)要點(diǎn)和工程化考量。2.1 模塊一知識需求分類器——系統(tǒng)的“大腦”這是系統(tǒng)的調(diào)度核心。它的目標(biāo)是準(zhǔn)確判斷輸入問題的類型。如何實(shí)現(xiàn)監(jiān)督學(xué)習(xí)論文中使用標(biāo)注好的問題數(shù)據(jù)集標(biāo)注為上述三類來訓(xùn)練一個(gè)分類模型。這個(gè)模型可以是一個(gè)輕量級的文本分類模型如BERT微調(diào)。零樣本/少樣本提示在實(shí)際工程中如果沒有標(biāo)注數(shù)據(jù)可以利用大模型本身的判斷能力。設(shè)計(jì)精妙的提示詞讓大模型如GPT-4對問題進(jìn)行自省和分類。例如“請判斷以下問題主要依賴于A) 通用常識和公開知識B) 特定的、實(shí)時(shí)的或私有信息C) 兩者都需要。請只回答A、B或C。問題{用戶問題}”啟發(fā)式規(guī)則可以結(jié)合一些簡單規(guī)則作為快速通道或后備方案例如包含“我司”、“根據(jù)文檔XXX”、“最新數(shù)據(jù)”等關(guān)鍵詞的問題大概率是非參數(shù)化或混合需求。工程落地要點(diǎn)準(zhǔn)確性優(yōu)先分類錯(cuò)誤會導(dǎo)致后續(xù)全鏈路錯(cuò)誤。例如把參數(shù)化問題誤判為非參數(shù)化會引發(fā)不必要的檢索增加延遲和成本反之則會因缺乏關(guān)鍵信息導(dǎo)致幻覺。性能與成本如果使用大模型進(jìn)行零樣本分類需要考慮其延遲和API成本。對于高頻場景訓(xùn)練一個(gè)專用的輕量級分類器通常是更經(jīng)濟(jì)高效的選擇。不確定性處理分類器可能對某些邊界問題給出不確定的結(jié)果如置信度低。系統(tǒng)需要設(shè)計(jì)回退機(jī)制例如當(dāng)置信度低于閾值時(shí)默認(rèn)走“混合需求”或更保守的路徑如執(zhí)行檢索。2.2 模塊二檢索器——系統(tǒng)的“手腳”當(dāng)分類器判定需要檢索時(shí)檢索器被激活。它的任務(wù)是根據(jù)問題從海量知識庫中精準(zhǔn)找到最相關(guān)的信息片段。超越簡單的向量檢索MedRGAG強(qiáng)調(diào)對于混合需求問題檢索的目標(biāo)不是找到“最相似”的片段而是找到能補(bǔ)充模型知識缺口的片段。這意味著查詢改寫對于混合需求原始的提問方式可能不適合直接檢索。例如“解釋深度學(xué)習(xí)在醫(yī)療診斷中的應(yīng)用”這個(gè)混合需求問題直接檢索可能得到一堆科普文章。更好的方式是讓模型先基于自身知識分解問題“我知道深度學(xué)習(xí)的基本原理但我需要最新的、具體的醫(yī)療診斷如肺結(jié)節(jié)CT識別成功案例和性能數(shù)據(jù)?!比缓笥眠@個(gè)更具體的描述去檢索?;旌蠙z索策略不要只依賴向量檢索語義相似度。結(jié)合關(guān)鍵詞檢索如BM25可以更好地抓住具體實(shí)體、術(shù)語和數(shù)字。例如對于“2024年糖尿病指南更新”關(guān)鍵詞“2024”、“糖尿病”、“指南”、“更新”的匹配權(quán)重應(yīng)該很高。檢索粒度控制是檢索整篇文檔還是段落、句子對于需要精確證據(jù)的問題如法律條款、藥品劑量句子級檢索可能更合適對于需要背景知識的問題段落級檢索可能更好。工程落地要點(diǎn)索引質(zhì)量是天花板檢索結(jié)果的好壞首先取決于知識庫的構(gòu)建質(zhì)量。文檔清洗、分塊策略、元數(shù)據(jù)豐富度如來源、時(shí)間、類型都至關(guān)重要。重排序Re-ranking初步檢索出Top K個(gè)結(jié)果后使用一個(gè)更精細(xì)的交叉編碼器模型Cross-Encoder對它們進(jìn)行重排序可以顯著提升最相關(guān)片段排在前列的概率。多路召回與融合同時(shí)使用向量檢索、關(guān)鍵詞檢索甚至基于知識圖譜的檢索然后將各路結(jié)果融合、去重、重排序是提升召回率的有效手段。2.3 模塊三生成器——系統(tǒng)的“口才”生成器負(fù)責(zé)產(chǎn)出最終答案。根據(jù)不同的知識需求其工作模式也不同。三種生成模式直接生成模式對應(yīng)參數(shù)化需求無需特殊處理使用標(biāo)準(zhǔn)的對話提示詞即可。檢索增強(qiáng)生成模式對應(yīng)非參數(shù)化需求采用經(jīng)典RAG提示詞模板如“基于以下上下文{檢索到的上下文}。請回答問題{用戶問題}。如果上下文不包含答案請說‘根據(jù)提供的信息無法回答’?!?重點(diǎn)是嚴(yán)格忠實(shí)于檢索內(nèi)容抑制模型幻想。知識融合生成模式對應(yīng)混合需求這是最具挑戰(zhàn)性的一環(huán)。提示詞需要精心設(shè)計(jì)以引導(dǎo)模型進(jìn)行“思考”和“融合”。例如“你是一個(gè)專家。首先基于你的通用知識簡要闡述一下{某個(gè)通用概念}。然后結(jié)合以下提供的具體資料{檢索到的上下文}詳細(xì)分析{具體問題}并給出一個(gè)綜合性的回答。請確保你的回答清晰地區(qū)分通用知識和來自資料的具體信息?!惫こ搪涞匾c(diǎn)提示詞工程不同的模式需要不同的提示詞。提示詞中應(yīng)明確指令如“基于以下上下文”、“首先…然后…”、角色設(shè)定和格式要求。引用與溯源對于非參數(shù)化和混合需求要求模型在答案中引用來源如【文檔1】對于構(gòu)建可信系統(tǒng)至關(guān)重要。沖突解決當(dāng)檢索到的信息與模型記憶沖突時(shí)例如舊指南 vs 模型記憶的新療法混合生成模式需要有一套解決策略。論文中可能涉及更復(fù)雜的注意力機(jī)制或推理模塊而在工程上可以在提示詞中強(qiáng)調(diào)“以提供的最新資料為準(zhǔn)”或在檢索時(shí)優(yōu)先選擇時(shí)間戳更新的文檔。3. 從論文到實(shí)踐構(gòu)建你自己的“需求驅(qū)動型”RAG系統(tǒng)理解了MedRGAG的原理我們?nèi)绾螌⑵渌枷霊?yīng)用到實(shí)際項(xiàng)目中下面是一個(gè)從零開始構(gòu)建的簡化版行動框架。3.1 第一步定義你的知識領(lǐng)域與問題類型在寫任何代碼之前先進(jìn)行領(lǐng)域分析你的知識庫內(nèi)容是什么公司文檔、產(chǎn)品手冊、科研論文、客服問答對你的用戶會問哪幾類問題嘗試收集一批真實(shí)或模擬的用戶問題并手動為它們打上標(biāo)簽A類參數(shù)化關(guān)于通用概念、基礎(chǔ)操作、公開標(biāo)準(zhǔn)的問題。B類非參數(shù)化關(guān)于知識庫內(nèi)具體數(shù)據(jù)、案例、條款、私有信息的問題。C類混合需要通用知識解釋特定案例或用特定案例驗(yàn)證通用理論的問題。 這個(gè)分類將成為你訓(xùn)練分類器或設(shè)計(jì)提示詞的黃金標(biāo)準(zhǔn)。3.2 第二步實(shí)現(xiàn)知識需求分類器方案A推薦有數(shù)據(jù)如果你有幾百個(gè)標(biāo)注好的問題微調(diào)一個(gè)輕量級文本分類模型如bert-base-chinese。它速度快、成本低、可離線部署。# 偽代碼示例使用 transformers 庫微調(diào)BERT進(jìn)行分類 from transformers import BertForSequenceClassification, Trainer, TrainingArguments # 加載預(yù)訓(xùn)練模型指定分類數(shù)為3 model BertForSequenceClassification.from_pretrained(bert-base-chinese, num_labels3) # 準(zhǔn)備訓(xùn)練數(shù)據(jù) (train_encodings, train_labels) ... # 定義訓(xùn)練參數(shù) ... # 使用Trainer進(jìn)行微調(diào) ...方案B快速啟動無數(shù)據(jù)使用大模型API進(jìn)行零樣本分類。定義清晰的提示詞和解析邏輯。# 偽代碼示例使用大模型API進(jìn)行分類 def classify_knowledge_demand(question): prompt f 請判斷以下問題主要依賴于哪類知識 1. 參數(shù)化知識通用常識、公開概念。 2. 非參數(shù)化知識具體、實(shí)時(shí)、私有信息。 3. 混合知識同時(shí)需要1和2。 請只回答數(shù)字1、2或3。 問題{question} response call_llm_api(prompt) # 調(diào)用你的大模型 # 解析response返回類別 return int(response.strip())方案C混合用方案B生成一批弱監(jiān)督數(shù)據(jù)再用方案A訓(xùn)練一個(gè)更魯棒的分類器。3.3 第三步搭建檢索與生成流水線根據(jù)分類結(jié)果路由到不同的處理管道class DemandDrivenRAG: def __init__(self, retriever, llm_generator, classifier): self.retriever retriever # 檢索器 self.llm_generator llm_generator # 大模型生成器 self.classifier classifier # 知識需求分類器 def answer(self, question): # 1. 分類 demand_type self.classifier.predict(question) if demand_type parametric: # 2A. 參數(shù)化需求直接生成 prompt f請回答以下問題{question} return self.llm_generator.generate(prompt) elif demand_type non-parametric: # 2B. 非參數(shù)化需求檢索后嚴(yán)格基于上下文生成 contexts self.retriever.search(question, top_k5) prompt self._build_strict_context_prompt(question, contexts) return self.llm_generator.generate(prompt) elif demand_type hybrid: # 2C. 混合需求檢索后進(jìn)行知識融合生成 contexts self.retriever.search(question, top_k5) # 這里可以對query進(jìn)行改寫以更好地檢索“知識缺口” refined_query self._rewrite_for_gap(question) contexts self.retriever.search(refined_query, top_k5) prompt self._build_fusion_prompt(question, contexts) return self.llm_generator.generate(prompt) def _build_strict_context_prompt(self, question, contexts): # 構(gòu)建嚴(yán)格基于上下文的提示詞 context_str \n\n.join([f[片段{i1}]: {ctx} for i, ctx in enumerate(contexts)]) return f基于以下上下文信息請回答問題。如果上下文沒有提供足夠信息請明確說明。 上下文 {context_str} 問題{question} 答案 def _build_fusion_prompt(self, question, contexts): # 構(gòu)建鼓勵知識融合的提示詞 context_str \n\n.join([f[來源{i1}]: {ctx} for i, ctx in enumerate(contexts)]) return f你是一個(gè)善于綜合信息的專家。請先運(yùn)用你的通用知識理解問題再結(jié)合以下提供的具體資料給出一個(gè)全面、準(zhǔn)確的回答。 問題{question} 具體資料 {context_str} 請開始你的回答并在適當(dāng)處提及資料中的信息3.4 第四步迭代優(yōu)化與評估系統(tǒng)搭建完成后評估和優(yōu)化是關(guān)鍵。評估指標(biāo)分類準(zhǔn)確率你的分類器是否把問題分對了檢索相關(guān)性對于需要檢索的問題返回的片段是否真的相關(guān)可用NDCG等指標(biāo)答案質(zhì)量最終答案是否準(zhǔn)確、完整、有用這需要人工或使用強(qiáng)大的LLM如GPT-4作為裁判進(jìn)行評測。端到端延遲從提問到獲得答案的總時(shí)間。分類錯(cuò)誤導(dǎo)致的無效檢索會顯著增加延遲。優(yōu)化方向分類器收集更多邊界案例持續(xù)優(yōu)化分類模型或提示詞。檢索器優(yōu)化分塊策略、嘗試混合檢索、引入重排序模型、過濾低質(zhì)量片段。生成器針對不同需求類型A/B測試不同的提示詞模板找到效果最好的那個(gè)。沖突處理在混合生成中如果發(fā)現(xiàn)模型更傾向于自己的記憶而忽略檢索內(nèi)容可以在提示詞中加強(qiáng)指令如“請優(yōu)先依據(jù)提供的資料進(jìn)行回答”。4. 總結(jié)RAG的未來在于精細(xì)化與智能化MedRGAG這篇最佳論文給我們最大的啟示是RAG技術(shù)的下一階段不再是粗放地“檢索一切”而是走向精細(xì)化、智能化的知識調(diào)度。它告訴我們不是所有問題都需要RAG。區(qū)分問題的知識需求能節(jié)省資源、提升響應(yīng)速度、避免噪聲。檢索的目標(biāo)是填補(bǔ)知識缺口。對于混合型問題檢索的Query需要被精心設(shè)計(jì)以瞄準(zhǔn)模型不知道的那部分信息。生成策略需要因“需”而異。用同一種提示詞模板應(yīng)對所有問題是對模型能力的浪費(fèi)。為參數(shù)化、非參數(shù)化、混合需求設(shè)計(jì)不同的生成邏輯才能最大化輸出質(zhì)量。在實(shí)際開發(fā)中你或許不需要完全復(fù)現(xiàn)論文中復(fù)雜的模型結(jié)構(gòu)但一定要將“需求分類-決策路由”這一核心思想融入你的系統(tǒng)設(shè)計(jì)。從一個(gè)簡單的、基于規(guī)則或提示詞的分類器開始逐步迭代你就能構(gòu)建出一個(gè)比傳統(tǒng)“一刀切”RAG更聰明、更高效、更可靠的知識問答系統(tǒng)。最終我們追求的是讓大模型像一個(gè)經(jīng)驗(yàn)豐富的專家一樣懂得何時(shí)該憑借經(jīng)驗(yàn)快速決斷何時(shí)該謹(jǐn)慎查閱資料何時(shí)又該將兩者融會貫通給出一個(gè)既有深度又有依據(jù)的答案。這才是檢索增強(qiáng)生成真正邁向成熟應(yīng)用的標(biāo)志。