Difyを使ってLeSS用語回答Bot(RAG)を実現
きっかけ
およそ1年前ぐらい会社の目標設定でチャレンジ項目を設定した時にAIを学習してなんとかするという項目を設定しました。結局会社のサービスに搭載するのがハードルが高くて実現できなかったです。色々模索してRAG機能が視野に入って、まず簡易のRAGを作りたいというアイデアが頭に浮かんできました。
Why RAG
今の時代はまさに生成AIの時代と言っても過言ではありません!ただし、企業にとって最も実用的なAIの機能は何ですか?ChatGPTに聞いたら、一番上に表示されたのは「自動化・業務効率化/チャットボット・バーチャルアシスタント(RAG活用)例: カスタマーサポート、社内ヘルプデスク、FAQ対応」となっています。そのため RAGを活用して「カスタマーサポート、社内ヘルプデスク、FAQ対応」を自動化できれば実用価値が生まれると信じています!!
また、この中で社内で使える用語回答Botを実現してPoCを検証し、その後実用的なサービスを作るのがよりスムーズになりそうじゃないかと思っています。更に自分が所属している部署は近年日本最大級の業界特化型SaaS「カイポケ」のフルリニューアルを行っており、LeSS(*)という大規模スクラムを採用して開発しています。そのLeSSの用語を回答するBotを先に作って実用する価値が高いですのでDifyを使ってLeSS用語回答Botを実現したいと思いました。
(*LeSSとは:https://www.atlassian.com/ja/agile/agile-at-scale/less)
簡単の機能紹介
Difyを使ってLeSS用語回答Bot(RAG)を作りました。現在PoCとして作った下記のイメージのような感じでLeSSに関する用語を回答できるBotです。LeSS の基本知識(一部)をナレッジとしています。
- LeSS のナレッジに検索対象をヒットしたら自然言語で結果を出力されます
- 完全に関係ない検索内容だとヒットせず Gemini (LLM は Gemini を利用)の回答ではなく「知識が足らず分かりません。」と表示されます
- ナレッジは日本語ですが、質問は日本語、英語、中国語(他の言語をテストしていない)どちらもサポートできます
作り方
Dify とは
今回の開発ではDifyというオープンソースのAIアプリ開発プラットフォームを利用しています。
Difyはクラウドサービスとコミュニティ版があります。コミュニティ版はオープンソース版でローカルで動作できますが、クラウドサービスだと構築手間を省けて開発ハードルが下がるため今回はクラウドサービスの無料プランを使います。
初期設定
まずはアカウントを作成します。Difyのクラウドサービスを利用するには、GitHubまたはGoogleアカウントが必要です。
- Difyクラウドサービスにログインし、新しいワークスペースを作成します。
- モデルプロバイダーを設定します
LLMには、ChatGPT、Claude、Gemini、Amazon Bedrockを始めとして、ollamaを使ったOSSのLLM利用もできます。更に最近話題になった DeepSeekも入っています。好きな LLM を設定してください。自分は一旦無料プランが利用できる Gemini を設定しています。
ナレッジ設定
RAGで検索する対象データをナレッジと呼びます。このデータを複数の形で Dify へインポートできます。まずは画面上部にあるナレッジを選択して、ナレッジを作成
を押してデータソースを選択する画面が表示されます:
そして、今回はテキストファイルをアップロード
を使いますが、下記のようなフォーマットがサポートしています:
事前に用意したcsvファイル(less-basic.csv/less-done-dataset.csv)をアップロードします。複数のファイルをアップロードでき、各ファイルのフォーマットが異なっても問題ないです。
- less-basic.csv:3列のデータ(id/用語/説明)があります(例↓)。
id,用語,説明
1,LeSSフレームワーク,LeSSはスクラムの原則を拡張し、大規模環境に適用するためのフレームワークであり、シンプルさと透明性を重視する。
2,Doneの定義,製品インクリメントが「完了」と見なされるための基準を明確にし、品質の保証やリリース可能な状態を担保する指標となる。
3,システム思考,組織を一つのシステムとして捉え、部分最適ではなく全体最適を目指すことで、複雑な問題をより良く解決するための思考方法。
- less-done-dataset.csv:より多い列があります
concept_id,category,concept_name,description,related_concepts,example,importance_level
1,fundamental,透明性と進捗測定,Doneの定義を正式に定めることで、タスクの状態(DoneかUndone)が明確になり、進捗状況を正確に測定できるようになる,done_definition;progress_tracking,スプリントの進捗状況をバーンダウンチャートで可視化する,high
2,definition,完璧なDoneの定義,顧客にプロダクトを提供するために必要な全ての作業を含む定義。これは組織の理想的なゴール,potentially_shippable;done_criteria,全ての自動テスト、手動テスト、ドキュメント作成、デプロイメントが含まれる定義,high
3,concept_clarification,受入条件との違い,Doneの定義は全てのPBIに一律に適用される条件であり、個別のPBIごとに設定される受入条件とは異なる,acceptance_criteria;definition_of_done,ログイン機能の特定の動作確認は受入条件、セキュリティテストの実施はDoneの定義,medium
ファイルをアップロードした後に下記のような設定をおすすめます:
しばらくすると、下記のように「🎉 ナレッジが作成されました」が表示されて完成です!
Chat Bot を作成
ナレッジを設定完了したら、いよいよ Chat Bot を作ります!
まずは画面上部にあるナレッジを選択して、チャットボット
を押すと下記のような画面が表示されます。そこから 最初から作成
を選びます。
アプリの種類を選択
でチャットフロー
(デフォルト)を選択します。「アプリのアイコンと名前」を好きなように設定してください。
作成する
ボタンをクリックすると下記のような画面が表示されます
LLM の設定でモデルを設定できます。ここでは Gemini 1.5 Pro を選択した状態です。
これから先に登録したナレッジを使います。開始とLLMの間の+ボタンを押して、知識習得のノードを追加します。
そして、「知識取得・ナレッジ」右側の+をクリックして、「参照する知識を選択」ダイアログで使いたナレッジを選択できます。
ナレッジノードを設定完了したら、LLMノードを選択してコンテキストを設定します。下記のキャプチャのようにプルダウンの項目から「知識取得/result」を選択します。
続いて、SYSTEM
でプロンプトを入力して、クエリ(質問)に対してコンテキストから回答を作るルールを作成します。ここは回答の質に特に影響する内容です。例:
クエリに対して、与えられたコンテキストから適切な情報を抽出してください。コンテキスト内にクエリに対する情報が存在しない場合は、「知識が足らず分かりません」と回答してください。回答は簡潔に、そしてクエリの内容に的確に答えるようにしてください。推測やコンテキストにない情報を付け加えてはいけません。
以下の手順に従ってタスクを実行してください。
1. クエリの内容を理解します。
2. コンテキストを注意深く読み、クエリに関連する情報を探します。
3. 関連情報が見つかった場合は、その情報を簡潔にまとめて回答します。
4. コンテキスト内にクエリに対する情報が全くない場合は、「知識が足らず分かりません」と回答します。
クエリ: {{#sys.query#}}
コンテキスト: {{#context#}}
公開
完成したイメージは下記のような感じです!「公開する」ボタンを押すと公開できます。
「アプリを実行」ボタンを押すと冒頭の「簡単の機能紹介」のような Chat Bot の画面が表示されてチャットできるようになります!
PoC 検証結果
下記のことを検証できたため、今後 RAG を活用して「カスタマーサポート、社内ヘルプデスク、FAQ対応」を自動化できると思われる。セキュリティの考慮が必要な場合 OSS の LLM や開発プラットフォームを使うと無難でしょう。
- LLM 学習外の情報も回答に組み込むことができるた
- 最新の信頼できる事実にアクセス可能。LLMはある時点での知識に基づいた回答になるが、RAGにより最新の情報を与えるすることができる。
- ユーザーが情報ソースを確認可能。LLMの場合、何が情報源かを特定することはできないが、RAGでは何を情報ソースとして回答したか明示することができる。
- 継続的な再学習の必要性を削減。LLMを独自開発もしくはFine-Tunningする場合、新しい情報を取り入れる場合に再学習が必要になるが、再学習のコストと手間を削減できる。
考察
いかがでしょうか!ノーコードで簡単に Chat Bot を作成できました!LLMというマジックな技術を1個実用てきな機能を作ってより身近なものになったじゃないでしょうか!初めての Chat Bot を作って下記のような感想がありました。
ナレッジの設定
ナレッジの「検索テスト」ではデータセットのquestionをそのまま入力してもヒットしないことがある。「インデックス方法」を「高品質」に変えても変わらない。そのあと、「検索設定」を「ハイブリッド検索」にしたらヒットできた!
バリデーション LLM の追加
RAGは偶に間違った回答もしてくれます(LeSS以外のナレッジを使って試した時に起きました)。それを避けるために、LLMにバリデーション用のステップか、Workflowにバリデーション用のLLMを追加して回避できます(他にナレッジの分析精度を高めることやより良いLLMを使うことで避けられるかもがまだ試していない)。
バリデーション:モデルに指示(プロンプト(Prompt)で)して回答内容が常識外れかどうか判断してもらう。常識外れだったら「知識が足らず、事実じゃない回答を避けます」と明言すれば良い。そうでなければそのまま回答にする
- バリデーション:モデルに指示(プロンプト(Prompt)で)して回答内容が常識外れかどうか判断してもらう。常識外れだったら「知識が足らず分かりません」と回答します。そうでなければそのまま回答にする
- プロンプトの例:
コンテキストの内容が常識であるかどうか判断してください。
- 明らかに事実じゃない回答を捨てて「知識が足らず分かりません」と回答してください。
- コンテキストの内容が概ね事実だったらそれを回答にしてください。
- バリデーション用LLMを使うworkflowの例
その他
-
LLMの回答ルールを事前にプロンプトで設定できて、どう設定するか決まったルールが無いし、自然言語で書くため技が必要です。あと1回で完璧なルールを書くのが難しく、チューニングしながら改善すると良いでしょう。
-
Difyはlow codeであり、IaCと違う。設定を変更したらdiffが確認するのが難しいかと思ったら、変更履歴を確認できるし、変更を復元することもできるので助かります!
今後の展望
RAGは今後さらに発展が期待される技術です。現在のRAGは主にテキストデータを扱っていますが、将来的には画像、音声、動画など、さまざまな種類のデータを統合的に処理できる「マルチモーダルRAG」の開発が進むと考えられています。これにより、より多様な情報源から知識を取得し、より自然で高度な対話の生成が可能になるでしょう。
Discussion