最近の業務でRAGの精度向上に取り組む中、Anthropicの以下の記事に出会いました。この手法を今後試す予定ですので、皆さんにも共有したいと思います。
1. TF-IDF encodings:
この記事の中で、AnthropicはRAGの精度を向上するために2つの方法を紹介しています。その1つは、embeddingと並行してBM25(TF-IDF)を追加することで精度を高める方法です。
BM25の特徴:
文書の長さと単語の使用頻度を考慮し、使用頻度が高い単語から結果を支配することを防いで、固有識別子や専門用語を見つける際に非常に効果的な手法
処理の手順は以下の流れに変化します⇩
従来のRAG: chunking → embedding → topkを返す
ここのRAG: chunking → embedding → rerank → topkを返す
→ BM25(TF-IDF) →
2. Contextual Retrieval:
Contextual Retrievalとは説明コンテキストをchunkに追加することでoutput生成精度を高める手法です。
処理流れは以下となります。
①文書全体とチャンクをプロンプトで渡して、説明コンテキストを生成させる
②コストが課題になるが、Prompt Cachingを活用することでコストを抑えることができる
実際anthropicが使われたContextual Retrievalのprompt⇩:
この手法の課題は、すべてのチャンクに対して文書全体を用いて説明コンテキストを生成するため、コストが高くなることです。対策として、上記②のPrompt Cachingを活用し、文書全体を保存した上で、新規追加部分のみを処理する方法が考えています。
anthropicが定義したprompt caching⇩
3. 評価結果とチュートリアル
評価結果は以下のグラフの通りで、これを見る限り非常に高い効果が得られているようです。(5.7⇒3.7)
ちなみに、LangChainのgithubで簡単なチュートリアルコードも見つけました。興味ある方試してみてください: