Anthropic Contextual Retrieval

Anthropic 推出了 Contextual Retrieval,這是一種用於檢索增強生成 (RAG) 的預處理技術。當結合上下文嵌入 (contextual embeddings) 與 BM25 時,它能將檢索失敗率降低 49%;若進一步結合重排序 (reranking),則能降低 67%。此方法解決了「上下文困境」(context conundrum),即傳統 RAG 的分塊 (chunks) 會失去必要的背景資訊,導致無法被 AI 模型準確檢索或利用。

The Context Conundrum in Traditional RAG

傳統 RAG 系統通常將文件拆分為小的分塊 (chunks)(通常為幾百個 tokens)以維持效率。然而,這個過程往往會破壞關鍵的上下文。例如,一個聲稱「該公司的營收增長了 3%」的分塊,如果系統無法判斷該分塊是指哪家公司或哪個時段,那麼它就是無用的,這會導致使用者在詢問特定實體的問題時發生檢索失敗。

How Contextual Retrieval Works

Contextual Retrieval 透過在每個分塊被嵌入或索引之前,在其前面加上一段簡短、精煉的解釋性上下文(通常為 50-100 tokens),來解決上下文丟失的問題。

Implementation via Claude

為了避免手動標註,Anthropic 使用 Claude 3 Haiku 來自動生成此上下文。模型會獲得整份文件以及特定的分塊,然後被要求提供一段簡短的上下文,以便在搜尋檢索時將該分塊置於整份文件的脈絡中。

The Preprocessing Pipeline

  1. Context Generation: Claude 會根據整份文件為每個分塊生成一個精煉的上下文。
  2. Contextual Embeddings: 帶有上下文的分塊會被轉換為向量嵌入 (vector embedding)。
  3. Contextual BM25: 帶有上下文的分塊會使用 BM25 (Best Matching 25) 進行詞彙匹配索引。
  4. Hybrid Search: 系統結合語義嵌入與 BM25 的結果,並使用排序融合 (rank fusion) 來尋找最相關的分塊。

Performance Benchmarks

Anthropic 在多個領域進行了測試,包括程式碼庫、小說和科學論文。使用 1 減去 recall@20 作為指標(衡量無法被檢索到的相關文件百分比),他們發現了以下改進:

  • Contextual Embeddings: 將 top-20-chunk 檢索失敗率降低了 35%(從 5.7% 降至 3.7%)。
  • Contextual Embeddings + Contextual BM25: 將失敗率降低了 49%(從 5.7% 降至 2.9%)。
  • Contextual Retrieval + Reranking: 將上述方法與重排序步驟(使用 Cohere reranker)結合,將失敗率降低了 67%(從 5.7% 降至 1.9%)。

Cost and Latency Optimization

Prompt Caching

生成每個分塊的上下文可能會很昂貴。Anthropic 利用 prompt caching 來降低這些成本。透過一次性快取參考文件並在處理每個分塊時引用它,生成上下文化分塊的一次性成本約為 每百萬個文件 tokens 約 $1.02(基於 800 token 分塊與 8k token 文件)。

Reranking Trade-offs

雖然重排序能顯著提升準確度,但它會增加執行時的步驟,從而增加延遲與成本。開發者必須在重排序的分塊數量(例如,檢索 150 個並重排序至 20 個)與所需的響應速度之間取得平衡。

Key Implementation Recommendations

根據其廣泛的測試,Anthropic 提供了以下準則以最大化 RAG 性能:

  • Use Hybrid Search: 結合嵌入與 BM25 優於單獨使用嵌入。
  • Select High-Performing Embeddings: 研究發現 Gemini 與 Voyage embeddings 特別有效。
  • Optimize Chunk Volume: 將前 20 個分塊傳遞給模型,其表現通常比傳遞 5 或 10 個更好。
  • Stack Techniques: 透過結合上下文嵌入、上下文 BM25 與重排序步驟,可以達到最高的性能。

Sources

相關

  • Dispatch
  • Dispatch
  • 專案
  • Dispatch
  • Dispatch