こんにちは、K.Oです。
今回は、オープンソースのAIアプリケーション開発プラットフォームであるDifyを使い、チャットフロー機能を活用して簡単にアプリケーションを構築する方法をご紹介します。
AIアプリケーションを効率的に構築したい方に向け、直感的なUIを使ってインタラクティブなAIアプリを簡単に作成するヒントをお伝えできれば幸いです。
Difyとは
基本機能と特長
Difyは、AIアプリケーションを効率的に構築・展開できるオープンソースのプラットフォームです。その主な特長は以下の通りです。
- 直感的なUI:コードなしでも、ドラッグ&ドロップでアプリケーションを設計できます。
- 多彩な機能:チャットフロー、ワークフロー、ナレッジベース、LLMを活用した応答生成など、豊富な機能が搭載されています。
- 拡張性:外部ツールやサービスとの連携が容易で、機能を柔軟に拡張できます。
本記事で扱うチャットフロー機能の概要
チャットフロー機能は、ユーザーとの対話型アプリケーションを簡単に作成できる機能です。ドラッグ&ドロップでノードをつなぎ、ユーザーの入力に応じてフローを変化させることで、インタラクティブな応答を提供できます。たとえば、ユーザーが特定の質問を入力すると、その質問に応じて異なる処理や応答を行うことができます。
作成するサンプルアプリケーションの概要
AIの発展に伴い、AIが提案するテストケースやシナリオを人間がレビューする機会が増えています。今回は、JSTQB Advanced Level テストアナリストの資格の勉強をすることで、テストケースのレビュー能力が向上すると考え、Difyを使って練習問題を生成するアプリケーションを構築しました。
具体的には、ユーザーのリクエストに応じて、以下の4つの条件に分岐し、それぞれに適した返答を生成するアプリケーションを目指します。
- JSTQB Advanced Levelの練習問題を生成
- 問題への回答に対するフィードバックを提供
- ソフトウェアテストに関する質問・相談への返答
- その他の情報に対する適切な返答
環境構築
必要なツールのインストール
以下のツールをインストールします。
- Docker
- Visual Studio Code(VSCode)
- Git ※GitHubからリポジトリをクローンするために使用します。
Dockerを利用してVSCodeのターミナルからDifyを立ち上げる
- リポジトリのクローン
git clone https://github.com/langgenius/dify.git
- クローンしたリポジトリ内の docker ディレクトリに移動
cd dify/docker
- Dockerコンテナの起動
docker compose up -d
これらのコマンドをVSCodeのターミナルから実行します。これでDifyがローカル環境で立ち上がります。
参考:Dify
Difyを利用できる状態にする
次にブラウザで http://localhost/install にアクセスし、アカウントを作成してログインしたらDifyを利用できる状態になります。
Difyでアプリケーションを構築する準備設定
LLMのAPIキーをセットアップする
Difyでは、OpenAIやAnthropicなどのさまざまなAIモデルを利用できますが、今回は毎日一定回数まで無料で利用できるGeminiモデルのセットアップ方法をご紹介します。
- APIキーを取得する
GoogleのAIプラットフォームであるGoogle AI Studioにアクセスし、GeminiのAPIキーを取得します。 - Difyにて、APIキーを設定する方法
画面右上のユーザーメニューから設定画面を開き、「モデルプロバイダー」タブを選択します。利用可能なモデルプロバイダーの一覧から「Gemini」を選択し、取得したGeminiのAPIキーを設定します。
RAGを利用する
RAGとは
RAG(Retrieval-Augmented Generation)は、AIモデルが応答を生成する際に、外部のナレッジベースから情報を取得し、その情報を活用して回答を生成する技術です。これにより、モデルは最新かつ正確な情報を提供できるようになります。
RAGのメリット
- 最新情報の提供:ナレッジベースを更新することで、常に最新の情報をユーザーに提供できます。
- 専門知識の活用:特定の分野に特化した情報を取り入れることで、専門的な質問にも対応可能です。
- 応答の精度向上:外部データを参照することで、モデルの回答の正確性と信頼性が向上します。
DifyでのRAGの活用方法
Difyではナレッジ機能を使って、RAGを簡単に設定できます。
ナレッジに必要な情報をアップロードし、チャットフロー内で「知識取得ノード」を利用することで、ユーザーの質問に対して適切な情報を提供できます。
チャットフロー機能の基礎知識
Difyを使ったチャットフローの作成は、簡単で直感的に行うことができます。いくつかの基本的なポイントを紹介します。
直感的なUIとノード(ブロック)でフローを構築
- ドラッグ&ドロップでフローを作成
Difyのチャットフローエディタでは、ノードをドラッグ&ドロップで簡単に配置し、フローを構築できます。視覚的にわかりやすく、複雑な設定が必要なく、手軽にチャットフローを作成可能です。
- ノード間のシームレスなデータ連携
各ノードはユーザーの入力や処理結果を次のノードに自動的に渡す仕組みが組み込まれています。これにより、ユーザーのリクエストに応じて適切に応答を生成できるフローを簡単に作成可能です。必要に応じて、データの受け渡しの設定も調整できます。
ノードの設定
今回、チャットフローを作成する際に使用したノードについて、基本的な役割を紹介します。
- 開始
チャットフローのスタート地点であり、ユーザーからの入力を受け取ります。基本的に特別な設定は不要ですが、必要に応じて開始時のメッセージを設定することもできます。 - 質問分類器
ユーザーの入力を解析し、意図や質問の種類に応じてフローを分岐させます。分類条件は曖昧にならないよう、明確ないくつかのクエリを定義して設定します。各カテゴリーには対応する次のノードを指定します。 - 知識取得
- 事前にアップロードしたナレッジを指定して関連情報を検索し、応答生成に活用します。これにより、RAGを実現します。ナレッジの情報が最新かつ正確であることを確認し、定期的な更新を行うことが応答の信頼性を維持するために重要です。
- LLM
- 大規模言語モデル(LLM)を使用して、ユーザーへの応答を生成します。使用するAIモデル選択し、モデルの振る舞いを指定するシステムプロンプトの設定を行うことができます。
- 回答
- LLMノードで生成された応答をユーザーに返します。LLMノードからの出力をそのまま表示するか、必要に応じて追加の情報を含めることができます。
※2024年10月現在の情報に基づいて記載しています。チャットフロー機能は現在BETA版であり、日々アップデートされています。最新の情報や詳細な機能については、Dify公式ドキュメントをご確認ください。
サンプルアプリケーションを実行する
最後に、プレビュー機能を使ってアプリケーションを実行し、動作確認を行います。ユーザーが送信した情報に基づき、質問分類器を通して処理が分岐し、それに応じた適切な回答が返されることを確認します。
RAGに基づいたJSTQB Advanced Levelの練習問題を生成
テスト設計に関する問題をリクエストしたところ、想定通りに処理が分岐し、回答が生成されました。
チャットプレビューウィンドウでは、次のように回答が返ってきました。
回答の最後に『引用』が表示され、RAGのプロセスを通じて生成された情報に基づいていることを確認できます。これにより、生成された回答が信頼できる外部のデータソースを参照していることがわかります。
ユーザーの回答へのフィードバックを生成
次に、生成された問題に対する回答として選択肢を送信すると、想定通りに処理が分岐し、新たな回答が生成されました。
チャットプレビューウィンドウでは、次のように正誤判定とその説明が返ってきました。
念のため、誤りとなる選択肢も送信してみたところ、正しく判定され、その根拠も返してくれています。
他の選択肢もすべて試してみたところ、期待通りに正しく判定され、さらに説明も返ってきました。
また、「質問・相談への返答」や「その他の情報への返答」は、例外的なリクエストにも対応するよう設定していました。
たとえば、不適切な内容を送信した場合には、
その他の情報を処理するフローに分岐し、次のような返答が得られました。
所感
実際にアプリケーションを動かしてみたところ、想定通りに機能しました。特に、設定したLLMモデルによって生成される練習問題の質に差がある点が興味深かったです。より高性能なモデルを使用することで、正確な条件分岐や高品質な応答を得ることができました。
まとめ
チャットフロー機能を使うことで、ユーザーとのインタラクティブな対話とタスクの自動化を両立したアプリケーションを効率的に開発できます。Difyを活用することで、自然言語で実用的なアプリケーションを作成できるのが大きなメリットです。
例えば、法律相談やカスタマーサポートの自動応答など、さまざまな用途に応用可能です。また、DifyはPerplexityやNotionなどの外部サービスとも連携でき、さらに機能を拡張して幅広い場面で活用することができます。
最後までお読みいただき、ありがとうございました。この記事が、皆さんのアプリケーション開発に少しでも役立てば幸いです。