大模型面經(jīng):RAG與Long context“相愛相殺”背景下,如何設(shè)計(jì)最優(yōu)解決方案? 原創(chuàng)
本篇分享RAG與long context結(jié)合的實(shí)踐方案。
本篇始于一個(gè)老生常談的話題,“一旦大模型的Context Length變大,RAG還有沒有存活的必要?”
RAG主要通過問題從知識(shí)庫中找相關(guān)答案,然后把檢索到的內(nèi)容再用大模型總結(jié);Long context相當(dāng)于把全部文本內(nèi)容輸入給大模型,利用大模型查找或總結(jié)。
這兩者評(píng)估的維度包括成本、是否使模型變得更智能、是否可以混合檢索和推理、是否可以緩存、推理時(shí)間等等。
其實(shí)兩者之爭也相當(dāng)于左右手之爭,最近在工作場景中遇到越來越多兩者不同的場景,本篇就來分享一下目前是如何結(jié)合兩種方法。
下面是一個(gè)具體示例。
目前有5M token量級(jí)的私有化醫(yī)療知識(shí)庫,需要搭建智能問診系統(tǒng),如何巧妙結(jié)合RAG與Long context設(shè)計(jì)你的最優(yōu)方案?
1. 思路
首先來梳理一下需求:醫(yī)療場景對(duì)準(zhǔn)確性要求非常高,另外知識(shí)更新頻繁,并且需要處理病史、檢查報(bào)告等長文本。
那么現(xiàn)在來分析一下這兩種技術(shù)起到的作用:
- RAG優(yōu)勢:可以精準(zhǔn)定位最新知識(shí),降低幻覺風(fēng)險(xiǎn)
- Long context優(yōu)勢:可以結(jié)合推理理解復(fù)雜癥狀關(guān)聯(lián),處理多輪對(duì)話上下文
另外基于現(xiàn)狀進(jìn)行分析,首先如果只用LLM,5M token的文檔全量輸入LLM從哪個(gè)角度考慮都是不現(xiàn)實(shí)的,成本高,性能還差;如果單純使用RAG又可能遺漏跨文檔關(guān)聯(lián)推理。
2. 方案
首先設(shè)計(jì)一個(gè)動(dòng)態(tài)路由層,主要需要做三件事,包括相關(guān)文檔查找,潛在文檔關(guān)聯(lián)以及深度語義關(guān)聯(lián)。
第一層:相關(guān)文檔查找
基于輕量級(jí)Embedding模型快速檢索,篩選Top5相關(guān)文檔,這里還有一些顯得比較專業(yè)的trick,比如Embedding模型是如何選擇的?BAAI or bge-small?是否合理?有沒有做query rewriting?等等。
第二層:潛在文檔關(guān)聯(lián)
可以構(gòu)建文檔關(guān)系圖譜,通過Graph RAG識(shí)別潛在關(guān)聯(lián)文檔;也可以自建一個(gè)知識(shí)圖譜架構(gòu)進(jìn)行識(shí)別。
第三層:深度語義關(guān)聯(lián)
對(duì)精選的3-5份文檔使用Long context窗口進(jìn)行深度語義關(guān)聯(lián)分析。
另外建立緩存也是必須的,緩存優(yōu)化策略包括直接建立癥狀-診斷pair的向量緩存庫,長尾查詢,動(dòng)態(tài)模型切換等等。
更精細(xì)的調(diào)整還包括:
- 漸進(jìn)式的上下文注入:首次響應(yīng)的時(shí)候使用RAG精準(zhǔn)片段和關(guān)鍵元數(shù)據(jù),在追問階段采用滑動(dòng)窗口機(jī)制(不無限制增加上下文,需要保留最相關(guān)的部分),逐步注入關(guān)聯(lián)文檔的全文。
- 多重驗(yàn)證:使用輸出結(jié)果反向檢索知識(shí)庫,進(jìn)行實(shí)時(shí)校驗(yàn);后期構(gòu)建診斷邏輯鏈的可視化追溯校驗(yàn)。
從上面的步驟基本可以完成整個(gè)方案的設(shè)計(jì),如果更細(xì)節(jié)的話面試官可能會(huì)讓寫一個(gè)動(dòng)態(tài)路由的代碼,下面是一個(gè)示例
class MedicalReasoner:
def __init__(self):
self.retriever = HybridRetriever(knowledge_graph) # 結(jié)合向量+圖檢索
self.llm = MedPaLM(chunk_size=8192) # 定制醫(yī)療長文本處理模型
def diagnose(self, query):
# 階段1:精準(zhǔn)檢索
base_docs = self.retriever.search(query)
# 階段2:上下文增強(qiáng)
extended_context = self._expand_context(base_docs)
# 階段3:長文本推理
return self.llm.generate(
prompt=build_prompt(query, extended_context),
max_tokens=2048
)
最后如果還需要更深度的表達(dá),還有一些細(xì)節(jié)內(nèi)容可以去潤色,比如:
建立快速檢索的過程中,用fasis進(jìn)行索引還是自研了召回機(jī)制,采用了什么壓縮策略?如何評(píng)估召回好不好?有沒有對(duì)RAG prompt進(jìn)行優(yōu)化,進(jìn)行引導(dǎo)式摘要、多段拼接、answer-aware檢索等等...
文轉(zhuǎn)載自公眾號(hào),作者:喜歡瓦力的卷卷
原文鏈接:???https://mp.weixin.qq.com/s/LLipYnSBWC-I0dC_ZZS3UA???
