Anthropic提出Contextual Retrieval讓RAG再進(jìn)化,大幅降低檢索失敗率
在知識(shí)庫(kù)問答等場(chǎng)景中,RAG已經(jīng)成為當(dāng)下最流行的LLM應(yīng)用范式,為L(zhǎng)LM提供又全又準(zhǔn)的上下文信息是眾多RAG技術(shù)努力的方向。在傳統(tǒng)的 RAG 解決方案中,編碼信息時(shí)往往會(huì)丟失上下文,這導(dǎo)致系統(tǒng)無(wú)法從知識(shí)庫(kù)中檢索到相關(guān)信息,如何能夠更好地保留上下文信息成為了問題關(guān)鍵。
Anthropic 研究團(tuán)隊(duì)提出了“Contextual Retrieval(上下文檢索)”的創(chuàng)新方法在此領(lǐng)域取得了顯著進(jìn)展。近日,他們發(fā)表文章[1]可披露了這一技術(shù)的細(xì)節(jié),他們通過上下文嵌入(Contextual Embeddings)和上下文 BM25(Contextual BM25)(文本檢索)可以將檢索失敗率減少 49%,聯(lián)合重排序(reranking),失敗率可減少 67%。
我們一起來(lái)了解這一方法的核心內(nèi)容。
上下文檢索的創(chuàng)新點(diǎn)
傳統(tǒng)的 RAG 系統(tǒng)在分割文檔時(shí)會(huì)破壞上下文,導(dǎo)致檢索到的信息分塊缺乏足夠的背景信息。
例如,假設(shè)你有一個(gè)包含財(cái)務(wù)信息的知識(shí)庫(kù),并收到以下問題:“ACME 公司在 2023 年第二季度的收入增長(zhǎng)是多少?”一個(gè)相關(guān)的分塊可能包含這樣的文本:“公司的收入比上一季度增長(zhǎng)了 3%。”然而,這個(gè)分塊本身并沒有指定是哪家公司或相關(guān)的時(shí)間段,導(dǎo)致難以檢索到正確的信息或有效地使用這些信息。
研究團(tuán)隊(duì)嘗試過一些業(yè)內(nèi)流行的改進(jìn)措施,諸如:分塊中添加文檔摘要(adding generic document summaries to chunks)[2],假設(shè)文檔嵌入(hypothetical document embedding)[3],以及索引摘要(summary-based indexing)[4],但都效果不佳。
他們通過大量實(shí)驗(yàn)摸索,采用上下文檢索時(shí)通過在嵌入前為每個(gè)分塊添加特定的解釋性上下文(Contextual Embeddings)和創(chuàng)建 BM25 索引(Contextual BM25)來(lái)解決這個(gè)問題。例如:
原始分塊 = "公司的收入比上一季度增長(zhǎng)了3%。"
上下文化分塊 = "這個(gè)分塊來(lái)自ACME公司在2023年第二季度的SEC文件;上一季度的收入為3.14億美元。公司的收入比上一季度增長(zhǎng)了3%。"
圖片
這種方法顯著提高了檢索的準(zhǔn)確性,特別是在處理包含特定標(biāo)識(shí)符或技術(shù)術(shù)語(yǔ)的查詢時(shí)。
如何實(shí)現(xiàn)上下文檢索
手動(dòng)為知識(shí)庫(kù)中的成千上萬(wàn)個(gè)分塊添加上下文顯然是不現(xiàn)實(shí)的。為此,研究團(tuán)隊(duì)使用了 Claude 模型,通過一個(gè)特定的提示生成每個(gè)分塊的簡(jiǎn)潔上下文,生成的上下文通常為 50-100 個(gè) token,然后在嵌入和創(chuàng)建 BM25 索引之前將其添加到分塊中。
這是官方 prompt 示例:
<document>
{{WHOLE_DOCUMENT}}
</document>
Here is the chunk we want to situate within the whole document
<chunk>
{{CHUNK_CONTENT}}
</chunk>
Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else.
以下是詳細(xì)的實(shí)現(xiàn)步驟:
- 生成上下文
首先,研究團(tuán)隊(duì)使用 Claude 為每個(gè)分塊生成上下文。通過設(shè)計(jì)一個(gè)特定的提示,Claude 可以為每個(gè)分塊生成簡(jiǎn)潔而有意義的上下文。
例如,假設(shè)我們有一個(gè)分塊:
“公司的收入比上一季度增長(zhǎng)了3%。”
我們可以設(shè)計(jì)一個(gè)提示,讓 Claude 生成上下文:
“請(qǐng)為以下分塊生成一個(gè)簡(jiǎn)潔的上下文:‘公司的收入比上一季度增長(zhǎng)了3%。’”
Claude 可能會(huì)生成以下上下文:
“這個(gè)分塊來(lái)自ACME公司在2023年第二季度的SEC文件;上一季度的收入為3.14億美元。公司的收入比上一季度增長(zhǎng)了3%。”
- 添加上下文到分塊
生成上下文后,將其添加到原始分塊中。這樣,每個(gè)分塊都包含了足夠的背景信息,便于后續(xù)的檢索和使用。
上下文化分塊 = "這個(gè)分塊來(lái)自ACME公司在2023年第二季度的SEC文件;上一季度的收入為3.14億美元。公司的收入比上一季度增長(zhǎng)了3%。"
- 創(chuàng)建嵌入
接下來(lái),使用嵌入模型將上下文化分塊轉(zhuǎn)換為向量嵌入。向量嵌入是高維空間中的點(diǎn),表示文本的語(yǔ)義含義。常用的嵌入模型包括 Voyage 和 Gemini,它們?cè)趯?shí)驗(yàn)中表現(xiàn)出色。
嵌入向量 = 嵌入模型(上下文化分塊)
- 創(chuàng)建 BM25 索引
除了生成嵌入,還需要為上下文化分塊創(chuàng)建 BM25 索引。BM25 是一種基于詞頻和逆文檔頻率的檢索算法,能夠有效地衡量文本分塊與查詢之間的相關(guān)性。
BM25索引 = BM25模型(上下文化分塊)
- 存儲(chǔ)和檢索
將生成的嵌入向量和 BM25 索引存儲(chǔ)在向量數(shù)據(jù)庫(kù)和 BM25 索引庫(kù)中。這樣,當(dāng)用戶輸入查詢時(shí),系統(tǒng)可以同時(shí)使用嵌入向量和 BM25 索引進(jìn)行檢索,從而找到最相關(guān)的上下文化分塊。
向量數(shù)據(jù)庫(kù).存儲(chǔ)(嵌入向量)
BM25索引庫(kù).存儲(chǔ)(BM25索引)
- 重排序
在檢索到相關(guān)分塊后,使用重排序技術(shù)對(duì)分塊進(jìn)行過濾和排序,確保只有最相關(guān)的分塊被傳遞給生成模型。重排序可以顯著提高檢索的準(zhǔn)確性和相關(guān)性。
相關(guān)分塊 = 向量數(shù)據(jù)庫(kù).檢索(查詢)
重排序分塊 = 重排序模型(相關(guān)分塊)
在實(shí)現(xiàn)上下文檢索時(shí),研究團(tuán)隊(duì)特別指出需要考慮以下幾點(diǎn):
- 分塊策略:考慮如何將文檔分割成分塊。分塊大小、邊界和重疊的選擇會(huì)影響檢索性能。
- 嵌入模型:選擇合適的嵌入模型,對(duì)提高上下文檢索性能幫助更大,Gemini[5]和Voyage[6]在測(cè)試中表現(xiàn)更好。
- 自定義上下文提示:雖然通用提示效果良好,但仍然可能需要針對(duì)一些場(chǎng)景定制提示來(lái)獲得更好的結(jié)果。
- 分塊的數(shù)量:將更多的塊添加到上下文窗口中,增加了包含相關(guān)信息的可能性。然而,過多的信息可能會(huì)使模型分心,因此存在一個(gè)限制。研究團(tuán)隊(duì)嘗試了提供 5、10 和 20 塊,發(fā)現(xiàn)使用 20 塊在這三個(gè)選項(xiàng)中表現(xiàn)最佳,但仍然在一些具體場(chǎng)景中進(jìn)行實(shí)驗(yàn)選擇。
- 持續(xù)評(píng)估:通過將上下文化的語(yǔ)塊傳遞給響應(yīng)生成器,并區(qū)分上下文和語(yǔ)塊,可以改進(jìn)響應(yīng)生成。
效果如何
研究團(tuán)隊(duì)的實(shí)驗(yàn)結(jié)果顯示:
- 上下文嵌入將前 20 個(gè)分塊的檢索失敗率減少了 35%(從 5.7%降至 3.7%)。
- 結(jié)合上下文嵌入和上下文 BM25 將前 20 個(gè)分塊的檢索失敗率減少了 49%(從 5.7%降至 2.9%)。
同時(shí),利用提示緩存技術(shù)降低了使用成本。通過提示緩存,您不需要為每一塊都傳遞參考文檔。您只需將文檔加載到緩存中一次,然后引用之前緩存的內(nèi)容即可。假設(shè)每塊有 800 個(gè) token,8k 個(gè) token 的文檔,50 個(gè) token 的上下文指令,以及每塊 100 個(gè) token 的上下文,生成上下文化塊的一次性成本為每百萬(wàn)文檔 token1.02 美元。
聯(lián)合重排序進(jìn)一步提升性能
在傳統(tǒng) RAG 中,AI 系統(tǒng)會(huì)從知識(shí)庫(kù)中檢索到大量潛在相關(guān)的信息分塊。對(duì)于大型知識(shí)庫(kù),這一初始檢索往往會(huì)返回大量分塊,有時(shí)多達(dá)數(shù)百個(gè),且相關(guān)性和重要性各不相同。重排序是一種常用的過濾技術(shù),確保只有最相關(guān)的分塊被傳遞給模型。實(shí)驗(yàn)結(jié)果顯示,重排序后的上下文嵌入和上下文 BM25 將前 20 個(gè)分塊的檢索失敗率減少了 67%(從 5.7%降至 1.9%)。
同時(shí)注意,由于重排序在運(yùn)行時(shí)增加了額外的步驟,即使所有分塊都是并行評(píng)分,也必然會(huì)增加一小部分延遲,在重排序大量分塊時(shí)表現(xiàn)更加明顯。重排序在使用更多分塊以獲得更好性能與更少分塊以降低延遲和成本之間存在取舍,這需要在具體的場(chǎng)景下嘗試不同的設(shè)置,以找到合適的平衡點(diǎn)。
總結(jié)
研究團(tuán)隊(duì)通過大量的實(shí)驗(yàn),為大家指出了一個(gè)新的提升 RAG 性能的方法,為開發(fā)者指出了實(shí)踐新方向。
同時(shí),研究團(tuán)隊(duì)基于大量實(shí)驗(yàn)的結(jié)果,給出了一些關(guān)鍵的經(jīng)驗(yàn)總結(jié):
- 嵌入+BM25 比單獨(dú)使用嵌入效果更好(向量檢索與文本檢索相結(jié)合);
- Voyage 和 Gemini 是測(cè)試中效果最好的嵌入模型;
- 將前 20 個(gè)分塊傳遞給模型比僅傳遞前 10 個(gè)或前 5 個(gè)分塊更有效;
- 為分塊添加上下文顯著提高了檢索準(zhǔn)確性;
- 重排序比不重排序效果更好;
- 所有這些改進(jìn)措施可以疊加:結(jié)合上下文嵌入(Voyage 或 Gemini)、上下文 BM25 和重排序步驟,并將前 20 個(gè)分塊添加到提示中,可以最大化性能提升。
對(duì)于該方法感興趣的讀者,可以在cookbook[7]指導(dǎo)下上手體驗(yàn)。
參考資料
[1]文章: https://www.anthropic.com/news/contextual-retrieval
[2]分塊中添加文檔摘要(adding generic document summaries to chunks): https://aclanthology.org/W02-0405.pdf
[3]假設(shè)文檔嵌入(hypothetical document embedding): https://arxiv.org/abs/2212.10496
[4]索引摘要(summary-based indexing): https://www.llamaindex.ai/blog/a-new-document-summary-index-for-llm-powered-qa-systems-9a32ece2f9ec
[5]Gemini: https://ai.google.dev/gemini-api/docs/embeddings
[6]Voyage: https://www.voyageai.com/
[7]cookbook: https://github.com/anthropics/anthropic-cookbook/tree/main/skills/contextual-embeddings
本文轉(zhuǎn)載自 ??AI工程化??,作者: ully
