こんにちは!今月から生成AI活用事業に復帰したなーがです。前回から少し時間が空いてしまいましたが、今回はDifyのチャットフローでRAGを実装する方法について書こうと思います。チャットボットによるRAGの構築はこちらの記事で作成方法を解説していますが、ここではチャートフローを使用します。
Difyの環境構築やアプリ公開方法等については下記の記事で紹介しているので、Difyについて詳しくない方は是非見てみて下さい。
作成手順
完成図
中央に「質問分類器」があります。これはユーザーの入力を区別して関係性のある入力に対してはナレッジから回答分を生成し、無関係な入力に対しては決まった文章を返すようにしています。

ワークフロー作成
画面上部の「スタジオ」タブから「最初から作成」を選択します。

「アプリの種類を選択」で「チャットフロー」を選択して「アプリのアイコンと名前」に「チャットフローRAG」と入力し、「作成する」をクリックします。「名前」は自由に設定して大丈夫です。

まず「質問分類器」を追加します。「開始」と「LLM」を繋ぐ線の上で「+」をクリックします。

ポップアップが表示されるので、「質問分類器」を選択します。

「質問分類器」を選択し、「クラス1」と「クラス2」にそれぞれ以下のように入力します。
クラス1
ユーザーが就業規則に関連した質問をする
クラス2
ユーザーが無関係な質問をする

まず、「クラス1」の「関係性のある入力」に対してのパターンを作成します。「クラス1」の「+」をクリックし、「知識取得」を選択します。


「ナレッジ」の「+」をクリックします。

参照したいドキュメントを追加するために「作成に進む」をクリックします。

ナレッジの追加
ローカルファイルを登録したいので、「データソース」で「テキストファイルからインポート」を選択し、「参照」からファイルを選択して「次へ」をクリックします。


「チャンク設定」と「検索設定」は初期設定で行います。「インデックス方法」で「経済的」を選択し、「保存して処理」をクリックします。

「ドキュメントへ移動」をクリックします。

ドキュメントがアップロードされたことが確認出来たら、「スタジオ」をクリックします。

ちなみに、アップロードされたファイルを選択するとどのように分割して保存されているか確認できます。

「有給休暇」で検索してみると、4か所の関連個所があることが分かります。

作成中のアプリをクリックします。

再度「ナレッジ」の「+」をクリックします。

追加したドキュメントが表示されるので、選択して「追加」をクリックします。

LLMの接続
「知識取得」の「+」をドラッグして「LLM」の入力に接続します。

「LLM」を選択し、「コンテキスト」の「変数を設定」で「知識取得」の[x] result
を選択します。

「SYSTEM」に以下を入力します。
あなたは{{#context#}}に基づいて{{#sys.query#}}に回答してください。

「クラス2」の「無関係な入力」に対してのパターンを作成します。「クラス2」の「+」をクリックし、「回答」を選択します。


回答の作成
「回答」に以下のように入力します。
申し訳ありませんが、ご質問にはお答えできません。もっと助けが必要な場合は、[help documentation](<https://docs.dify.ai>)をチェックしてください。

公開
完成したのでアプリをデプロイします。右上の「公開する」から「公開する」をクリックします。

アプリの実行
「アプリを実行」をクリックしてチャットボットを開きます。

チャットボットが開くので、「チャットを開始」をクリックします。

それでは質問をしてみます。まずは無関係な入力として「明日の天気」を訊いてみます。
無関係な入力として設定した「クラス2」の「回答」に設定した文章が出力されました。

次に関係性のある入力をしてみます。「有給休暇」について訊いてみます。アップロードしたドキュメントを基に回答を作成してくれていることが分かります。

さいごに
今回はチャットフローでRAGを実装する方法について書きました。チャットボットで作成するよりは手順が多いですが、詳細なフローを指定することが出来ます。今後もDifyを活用した内容ついて発信していこうと思います。