こんにちは、OSS よろず相談室の鹿島です。
はじめに
今回は、DifyとAmazon Bedrockを連携させて、チャットボットとRAG(検索拡張生成)を構築する手順の4回目、最終回です。
- 【実践】Dify + Amazon Bedrockで、ゼロからチャットボットと RAG を作る①
- 【実践】Dify + Amazon Bedrockで、ゼロからチャットボットと RAG を作る②
- 【実践】Dify + Amazon Bedrockで、ゼロからチャットボットと RAG を作る③
- 【実践】Dify + Amazon Bedrockで、ゼロからチャットボットと RAG を作る④ ←本記事
前回までで、構築したDify環境とAmazon Bedrockを連携させ、チャットボットを作成しました。
今回は、RAGを作ってみます。
DifyのRAGは、PDFやテキストなどの社内文書を知識ベースとしてAIに組み込むことができる機能です。
これにより、AIはインターネット上にない社内情報や専門的な質問にも、正確な根拠を持って回答できるようになります。
ステップ1 ナレッジを作成する
以下のURLにアクセスします。
http://[DifyをインストールしたマシンのIPアドレス]
【実践】Dify + Amazon Bedrockで、ゼロからチャットボットと RAG を作る①でアカウントを作成してログインしていますので、ホームのページが表示されます。
①「ナレッジ」②「ナレッジを作成」を選択します。

ステップ2 ナレッジを登録する
ナレッジとして登録するサンプルとして、厚生労働省が公開しているモデル就業規則をダウンロードしましょう。
以下のページから「モデル就業規則」のPDF版をダウンロードしてください。
https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/zigyonushi/model/index.html
ナレッジのデータソースの選択画面で、①「テキストファイルからインポート」②「テキストファイルをアップロード」を選択します。
ダウンロードしたPDFファイルを選択してアップロードします。最後に「次へ」を選択します。

ステップ3 ナレッジの設定をする
はじめに、チャンクの設定をします。
チャンクとは、RAG(検索拡張生成)において、AIが扱いやすいようにドキュメントや知識ベースを分割した小さな情報の塊のことです。
長文をそのままAIに入力すると、重要な情報を見落としたり、処理の負荷が高くなったりする問題が発生します。
このチャンク単位で情報を検索し、質問に関連性の高い部分だけをAIに渡すことで、回答の精度と効率を向上させます。
チャンクの詳細については「弊社ブログ(チャンキング)」を参照してください。
ここではデフォルトのまま進めます。
次に「インデックス方法」という選択肢があります。
「経済的」は無料で使用できますが、キーワード検索が中心となります。
今回は、「【実践】Dify + Amazon Bedrockで、ゼロからチャットボットと RAG を作る②」でAmazon Bedrockでの設定/本記事で利用するモデルで、RAG用に以下のモデルを有効にしました。
- Titan Text Embeddings V2
- Rerank 1.0
これらのモデルを活用して高精度な検索を実現するため、今回は「高品質」を選んでみましょう。
高品質を選択すると、「埋め込みモデル」を選択できます。
注意点として、ここの選択肢には、Amazon Bedrockの設定で有効にしなかったモデルも表示されます。
有効にしていないモデルを選択すると、ここではエラーになりませんが、後にナレッジベースの作成でエラーになります。
有効にしたモデル、ここでは「amazon.titan-embed-text-v2:0」を選択します。

次に、「検索設定」を選択します。
検索方法には3種類あり、「ベクトル検索」は文章の意味の近さで探し、「全文検索」はキーワードの一致で探します。そして、両方を組み合わせた「ハイブリッド検索」が最も精度が高いとされ、推奨されています。
ここでは推奨の「ハイブリッド検索」を選択します。
検索設定では、「rerankモデル」を選択します。
ここでも、Amazon Bedrockの設定で有効にしなかったモデルも選択肢に表示されますが、有効にしたモデルを選択します。
ここでは、「amazon.rerank-v1:0」を選択します。
最後に「保存して処理」をクリックします。

「ナレッジベースが作成されました」「埋め込みが完了しました」と表示され、緑のチェックが付けば成功です。

なお、先述の通り、Bedrockで有効にしていないモデルを選択すると以下のように、赤く表示されます。

AccessDeniedException: You don't have access to the model with the specified model ID
」と表示され、モデルへのアクセス権がないことが分かります。
処理が成功したら「ドキュメントに移動」を選択します。
以下のように、ステータスが「利用可能」になっていればナレッジの作成は成功です。

なお、検索設定やrerankの詳細については、Dify公式マニュアルもあわせて参照してください。
参考:Dify公式マニュアルー検索方法の指定
ステップ4 チャットボットにナレッジを適用する
【実践】Dify + Amazon Bedrockで、ゼロからチャットボットと RAG を作る③と同様に、チャットボットを作成しましょう。
チャットボットの設定画面で、コンテキストの「追加」を選択します。

すると、先ほど作成したナレッジが表示されます。

ステップ3で作成したナレッジを選択します。
次に、オーケストレーションのプロンプトを編集します。
今回は以下のように入力してみましょう。
「あなたはコンテキストに基づいて回答するチャットボットです。コンテキストに無い質問には「コンテキストに回答がありません」とのみ回答してください」と入力しておきます。

設定が完了したら、実際に質問してみましょう。
まずはナレッジに含まれる内容について、「有給休暇について教えて」と質問します。
すると、アップロードした就業規則のコンテキストに基づいて回答してくれます。

回答の下には根拠となった引用コンテキストが表示され、クリックすると関連度のスコアなどを確認することができます。

次にコンテキストと関係のない質問をします。
「サンシャインコーストはどこにありますか」と入力すると、プロンプトの指示通り、まずコンテキストに情報がない旨が表示され、その後にLLM自身の知識から回答が生成されます。

このように、ナレッジ(コンテキスト)がある場合はそれを優先して回答し、ない場合はLLMが直接回答するといった制御が、簡単な設定だけで実現できました。
以上、4回にわたり、DifyとAmazon BedrockのLLMを使用して、RAGアーキテクチャを採用したチャットボットを構築する手順をご紹介しました。
弊社の記述ブログには、Difyに関連する記事が複数ありますので、あわせてご参照ください。