RAGとは、外部の情報を検索し、その情報を基に大規模言語モデル(LLM)が回答を生成する技術です。このアプローチは、生成AIが持つ知識の限界を補うために設計されており、特に信頼性の高い情報を提供することが可能です。
DifyでRAGを設定するデータファイルの準備
RAGを設定するために2つのPDFファイルを用意しました。PDFは論文でRAGとファインチューニングについて書かれたものです。
一応リンクを貼っておきます。下記からPDFをダウンロードできます。
RAGとファインチューニングについて質問をしたらリンク先の論文を参照し、引用付きで回答するチャットボットを作っていきます。
DifyでRAGに利用できるデータファイル形式
DifyでRAGとして利用できるテキストファイルの拡張子はTXT, MARKDOWN, PDF, HTML, XLSX, XLS, DOCX, CSV, EML, MSG, PPTX, PPT, XML, EPUB。
その他にもNotionやウェブサイトからもRAGにできます。
DifyでRAGを利用する時の最も適した設定方法
Difyにログイン後、上部からナレッジを選択、左の「ナレッジを作成」をクリックします。

「テキストファイルからのインポート」が選択されているのを確認してテキストファイルをアップロードします。「次へ」をクリックします。
今回はPDFファイルをアップしていますが、拡張子「.txt」 「.csv」などにも対応しています。会社のお問い合わせ内容とその返信やQ&Aなどをテキストエディタで編集したものをアップロードすれば専用のRAGを作成できます。

この画面が表示されたら、いよいよRAGの設定になります。

「カスタム」を選択します。
「セグメント識別子」
「セグメント識別子」は、データを効果的に分割(チャンク)し、検索精度を向上させるための重要な要素です。セグメント識別子は、テキストデータ内で特定の区切りを示すために使用され、これによりモデルが情報をより効率的に処理できるようになります。画像では「\n\n」となっていますが、これは改行が2回続いたことを表しているので段落をチャンクにしています。RAGが認識しやすいテキストデータにする場合、1つのお問い合わせ内容とその返信のあとダブル改行を入れたりすることでチャンクが明確となり、認識しやすいものとなります。
「最大チャンク長」
データを分割(チャンク)する最大の長さになります。長さはトークンによって決まります。画像では「500」としていますが、これは今回、使用する論文の言語が英語だからです。
英語のトークン
英語の場合、1トークン1単語となっています。これを文字数で表すと1トークン平均4文字程度となります。
マイクロソフトが行った研究では、RAGが最高のパフォーマンスを発揮するのは「512」オーバーラップは最大チャンク長の「25%」となっています。
今回は英語の論文をチャンクするので、「最大チャンク長」を「500」、チャンクのオーバーラップを「125」に設定しました。
ただ、これは英語の場合の設定です。
日本語のトークン
英語と日本語ではトークンの認識が異なります。GPT-4oでは日本語は1文字1トークンとなっています。これを英語と同じ「最大チャンク長」を「500」で設定した場合、情報量として4分の1となってしまいます。会社などのお問い合わせのチャットボットを作成しようとする場合は4倍の「最大チャンク長」を「2000」、チャンクのオーバーラップを「500」と設定することで最高のパフォーマンスを発揮することが出来ます。
今後、モデルがバージョンアップすればトークンの認識も変わります。モデルのトークンの認識が変われば、最高のパフォーマンスを発揮する数値も変わってきます。
トークンを理解することとモデルのトークンの認識を知っておくと今後、役に立つと思います。

Tokenizer
OpenAIのTokenizerで主要モデルのトークンの認識を体験することが出来ます。
当ブログではトークンの利用料金を今の為替で計算できるツールを提供しています。
「ハイブリット検索」を選択します。
ベクトル検索
ベクトル検索は質問の意味が近いものを検索します。柔軟な反面、単語そのものを検索することが苦手です。
全文検索
全文検索は質問のキーワードが含まれているチャンクを検索します。キーワードは拾ってくれますが、意味を理解することが苦手です。
ハイブリット検索
ベクトル検索と全文検索の苦手を補い合うことで高い精度の回答ができるようになります。
設定が完了したら「保存して処理」をクリックします。

「ナレッジが作成されました」と表示されたらRAGの設定完了です。

しばらくするとアップロードしたファイルの処理が「100%」となり、RAGとして利用可能になります。

「ドキュメントに移動」をクリックして、利用可能か確認します。

実際にRAGを利用したチャットボットを作成します。
ここでは簡単なプロンプトを入力します。

チャットボットの作成はこちらで解説しています。
「コンテキスト」の「追加」をクリックし、先ほどナレッジで作成したものを選択します。
選択したら「追加」をクリックします。

コンテキストにナレッジで作成したものが表示されていることを確認します。
RAGの設定は以上となります。

実際に「RAGとファインチューニングの論文データチャットボット」を動かしてみた

会社でチャットボットを導入する場合、最高のものを望むのであればRAGとファインチューニングを組み合わせることが良さそうですね。
それぞれの会社で取り扱うデータにもよりますが、ほとんどの場合、ファインチューニングのコストを考えるとRAGのみでプロンプトで制限をかけるというので十分な気がします。