【Dify】Lesson5-3:賢いRAGアプリを作ろう|クエリ変換とメモリ活用

Lesson5-1では「まず動く社内FAQチャットボット」を作り、Lesson5-2では「ナレッジ設定をどう考えるか」を整理してきました。
ここまででRAGの土台はできていますが、実務で使っていると次の壁にぶつかりがちです。
- ユーザーの質問があいまいで、検索にヒットしない or ズレた情報を拾う
- さっきの会話の流れを踏まえてほしいのに、毎回説明し直すことになる
- FAQと関係ない雑談や別件質問が混ざって、回答品質が不安定になる
今回は、こうした「RAGあるある」を一段解決して、同じナレッジを使っても “賢く答えられる” Difyアプリに育てていきます。
この記事を読み終わる頃には、次のことができるようになります。
- 質問分類で「答えるべき質問」と「関係ない質問」を分岐できる
- LLMを使ったクエリ変換で、検索の当たりを強くできる
- 会話文脈を活かして、同じ質問でも状況に合う回答を返せる
このあと「今回作るアプリの概要」で全体像をつかみ、続く開発パートで手を動かして仕上げていきましょう。
Lesson1:Dify入門|環境構築と最初の生成AIアプリ開発
Lesson2:まずは体験|基本的なアプリを作ろう
Lesson3:文章業務を自動化するアプリを開発しよう
Lesson4:ファイル処理で広がるDifyアプリ開発
Lesson5:RAG実践|ナレッジ検索アプリを作ろう
・Lesson5-1:RAGアプリ入門|社内FAQチャットボットを作ろう
・Lesson5-2:ナレッジの詳細設定方法と考え方
・Lesson5-3:賢いRAGアプリを開発|クエリ変換とメモリ活用 ◁今回はここ
Lesson6:機能拡張と外部システム連携|ツールを使いこなそう
Lesson7:総仕上げ|実践投入への準備
賢いRAGチャットボットの全体像(クエリ変換・メモリ活用)
今回作るのは、Lesson5-1で作った社内FAQチャットボットを「実務で使っても崩れにくい形」に進化させたRAGアプリです。
ベースは同じ “ナレッジ検索チャット” ですが、検索に入る前の前処理と、会話の文脈の扱い方を工夫して、回答の当たり外れを減らしていきます。
ナレッジに格納する資料も同じものを使用しますので、それらが手元にない場合はLesson5-1の記事に戻って準備をしてきてください。

処理フロー:質問分類→クエリ変換→知識検索→回答生成
全体の流れはシンプルで、次のような順番で動きます。
最初に質問を受け取り、回答すべき内容かを判定し、必要なら検索用のクエリに整形してからナレッジ検索を行い、最後に回答を生成します。
- ユーザー入力を受け取る
- 質問分類器で「ナレッジ検索すべき質問か」を判定する
- 対象の質問なら、LLMでクエリ変換して検索用の文に整える
- ナレッジ検索(RAG)で関連情報を取りにいく
- 取得した情報を使って回答を生成する
- 対象外の質問なら、別の返答ルートに分岐する(関係ない質問への返し)

このアプリが“賢く”なる2つのポイント
この構成で効いてくるのが、次の2点です。
1つ目はクエリ変換です。
ユーザーの入力をそのまま検索に投げず、検索に強い形へ言い換えてからナレッジ検索します。これにより、言い回しの違いや曖昧さで検索が外れるケースを減らせます。
2つ目はメモリ活用です。
会話の前提(何について話しているか、どの状況か)をうまく引き継ぎながらクエリ変換や回答生成に反映させます。結果として、毎回説明し直さなくても会話がつながりやすくなります。
このあと「アプリ開発」パートでは、いまの全体像をそのままDifyのワークフローに落とし込み、各ノードの設定で “賢さ” が出るポイントを具体的に作り込んでいきます。
実装手順:賢い社内FAQチャットボットを作ろう
Lesson5-1で開発したアプリを複製し、「賢い社内FAQチャットボット」という名前で保存してください。
現状は次のような全体構成となっているはずです。

このアプリのユーザー入力ノードと知識検索ノードの間にいくつかのノードを、次のような全体構成になるよう配置してください。
[ユーザー入力] → [質問分類器] → [LLM] → [知識検索] → [LLM] → [回答] → [回答]

質問分類器の設定:社内FAQかどうかで分岐させる
質問分類器ノードを使って、会社と関係のある質問とない質問を分類します。

- クラス1:でぃふぁい学習館に関する質問
- クラス2:その他
クエリ変換LLMの設定:検索向けに言い換えるプロンプト例
ユーザーが入力する文章には、人による表記ゆれ(例:「でぃふぁい」「でぃふぃ」「だいふぁい」等)や誤字脱字などが含まれることが想定されます。
このままでは知識検索ノードで正しく検索できないかもしれません。
そこで、ユーザーの入力を知識検索ノードで正しく検索できるようクエリ変換しましょう。
LLMの名前を「LLM(クエリ変換)」とし、以下のプロンプトをコピペしてください。
- プロンプト
-
# 役割 あなたは株式会社でぃふぁい学習館のカスタマーサポートアシスタントです。ユーザーの質問をより適切なクエリに変換してください。 # ユーザーの質問 ☆☆☆ ユーザー入力の出力変数query ☆☆☆ # 注意点 - 会話の文脈を考慮し、これまでの質問や回答も踏まえる - 具体的な商品名やキーワードは保持する - 質問の本質的な意図を反映させる - 一般的な挨拶や不要な表現は除去する - できるだけ自然な質問文として表現する # クエリ生成のルール - 商品名は正確に記載する - 同義語や関連する用語は含める - 文脈から推測される重要な情報は補完する - 検索の糸が明確にある表現を使用する # 出力のルール - クエリのみ出力し、理由や説明は付けないこと

いつも通り、変数だけはコピペせずに直接打ち込んでね。
また、何度も続けて質問する際に過去の文脈も考慮させるため、メモリ機能をONにしましょう。

- メモリをONにする
メモリウィンドウサイズの数値は、「会話履歴を何件分覚えておくか」です。
多いほどたくさん覚えてくれて使いやすくなりますが、その分トークンの消費量も増えます。
知識検索の設定:クエリテキストに「クエリ変換結果」を渡す
ナレッジベースは既に選択済みですので、クエリテキストだけを変更します。

- クエリテキストにLLM(クエリ変換)の出力変数textを指定
回答生成の設定:検索結果で回答+学習用に変換クエリも表示
LLM(回答)ノードの設定・プロンプトは何も変わりません。
回答ノードでは、学習のためにクエリ変換LLMが生成したクエリも表示させるようにしましょう。

- 2つのLLMの出力変数を指定
対象外の質問への返答:分岐先の固定メッセージを用意
最後に質問分類器で「その他」に分類された場合の回答を設定しましょう。

- 「申し訳ありません。株式会社でぃふぁい学習館に関係のない質問にはお答えできません。」と設定
これで「賢い社内FAQチャットボット」は完成です。
ぜひ色々と質問し、Lesson5-1で開発したアプリとの回答の違いを確認してください。
まとめ|クエリ変換とメモリで回答精度を底上げ
今回は、RAGアプリを「ナレッジを検索して答えるだけ」から一歩進めて、実務で使いやすい形に育てました。
ポイントは、検索の前段で質問を整えるクエリ変換と、会話の前提を活かすメモリ活用の2つです。
クエリ変換を入れることで、ユーザーの言い回しが曖昧でも検索が当たりやすくなり、回答のブレが減ります。
さらにメモリを組み合わせると、前のやり取りを踏まえた質問に強くなり、説明のやり直しが起きにくくなります。
今後のLessonでは、こうして作ったRAGの土台を、外部サービス連携や機能拡張につなげていきます。
ここまでの設計ができていれば、用途に合わせて“賢さ”を足していくのもスムーズです。
- 記事改善アンケート|ご意見をお聞かせください(1分で終わります)
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの意見をアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。
(※)APIキーや個人情報等は入力しないようお願いします。
【Dify】記事改善アンケート


