こんにちは、機械学習チーム YAMALEX の駿です。
YAMALEX は Acroquest 社内で発足した、会社の未来の技術を創る、機械学習がメインテーマのデータサイエンスチームです。
(詳細はリンク先をご覧ください。)
最近は GPT-4o や Claude 3 を使ったアプリを、せっせと実装したりしていたのですが、Difyの登場により「もう、これでいいじゃん」という気持ちが抑えきれていません。
今回はそんなDifyを使って、「LLM自体の知識が足りないときにGoogle検索を行って回答するチャットボット」を作ってみました。
Google検索して答えてくれる
1. 概要
1.1. Difyとは
Difyは、大規模言語モデル(LLM)を活用したアプリケーションを開発するためのオープンソースプラットフォームです。
注目するべき特徴として、以下の4点があると考えます。
- GUIを使って複雑なタスクを実行するAIエージェントを簡単に作成することができる
- 複数モデル(ChatGPT、Bedrock、Llamaなど)を包括的に利用できる
- 作成したエージェントをAPIとして公開し、既存のアプリケーションに組み込むことができる
- LLMOps 機能が組み込まれている
今回は特に 1. 、 2. に注目します。
2. 環境構築
DifyはSaaSのサービスとしても提供されていますが、今回はDockerコンテナを利用して、ローカルにサーバを立てて実行してみます。
docker-compose.yaml が用意されているため、簡単にローカルで起動できます。
Githubからコードを取得する
git clone https://github.com/langgenius/dify.git
適宜、 docker/docker-compose.yaml を編集する
name: dify
を追加するのがおすすめです。サーバを Docker Compose で立ち上げる
docker compose -f docker/docker-compose.yaml up -d
http://localhost
にアクセスユーザ作成画面が開くので、ユーザを作成する
3. アプリ作成
「スタジオ」>「アプリを作成する」>「最初から作成」を押下
最初から作成「チャットボット」>「Chatflow」を選択し、アプリの名前を入力
Chatflow を選択ブロックをつないでアプリを作成
ブロックをつないでアプリを作る
3.1. 各ブロックの簡単な説明
質問分類器「質問分類」
LLMを使って、ユーザの質問をいくつかのクラスに分類します。
この分類結果によって、後続の処理を切り替えることで複数の役割を持つエージェントを作成することができます。LLM「チャット」「Q&A」「履歴要約」「回答生成」
モデル、システムプロンプト、ユーザ入力などを指定して、LLMを呼び出します。
ブロックごとにモデルを指定することができるのがいいですね。
今回は裏側の処理はGPT-3.5-Turboを使い、高速化・安価化を狙いつつ、
最終的にユーザに返答する部分ではGPT-4oを使って、ベストな出力ができるようにしています。パラメーター抽出「クエリ抽出」
ユーザ入力から、後続のブロックで必要なパラメータを抽出することができます。
Function calling のような機能です。「ツールからインポート」するオプションがあるため、基本的に自分でパラメータを設定する必要はありません。
楽です。GoogleSearch
見たまんま、Googleで検索して、結果をLLMが読み込める形で返してくれます。
出力
チャットボットの返答として返却する文字列を指定します。
4. 動かしてみる
「デバッグとプレビュー」機能を使って、実際に想定通りの分岐をたどっているか、検索ができているかを確認します。
下の図で線が青くハイライトされている部分が、分岐の結果、実際に実行されているフローを表しています。
一般的な知識を質問してみる
User: ワインを発酵させると酢になるってホント? Q&A: はい、部分的には本当です。 ワインが酵素に長時間さらされると、酵母や細菌がアルコールを酢酸に変えることで、ワインビネガー(酢)になります。 これは、アセトバクターという最近の働きによるものです。 ただし、通常のワインの発酵は、アルコールを生成するプロセスですので、適切に管理された環境では酢にはなりません。
一般的な知識各ブロックの実行時間
# ブロック 実行時間(秒) 1 Start 0.001 2 質問分類 1.317 3 Q&A 1.693 4 出力 0.004 計 3.076
専門知識について質問してみる
User: Amazon Bedrockについて教えて GoogleSearch: content: What is Amazon Bedrock? ... Using Amazon Bedrock, you can easily experiment with and evaluate top FMs for your use case, privately customize them with your data ... link: https://aws.amazon.com/bedrock/ content: With this new capability, AWS makes it easy for organizations to choose a combination of Amazon Bedrock models and their own custom models via ... link: https://www.aboutamazon.com/news/aws/amazon-bedrock-new-innovations-generative-ai-applications <略> 回答生成: Amazon Bedrockは、AWSが提供するフルマネージドサービスで、 主要なAI企業からの基盤モデル(Foundation Models, FMs)を利用可能にします。 ユーザーは自身のユースケースに合わせて、これらのモデルを簡単に実験し評価することができ、 さらに自分のデータを使ってプライベートにカスタマイズすることもできます。 このサービスはAPIを通じてアクセスでき、組織がAmazon Bedrockモデルとカスタムモデルを組み合わせて使用することを容易にします。 詳細については、こちらをご覧ください。
専門知識各ブロックの実行時間
# ブロック 実行時間(秒) 1 Start 0.001 2 質問分類 1.141 3 履歴要約 2.708 4 クエリ抽出 0.818 5 GoogleSearch 1.050 6 回答生成 3.799 7 出力 0.002 計 9.612
質問以外のチャットをしてみる
User: 今日もジムに行って疲れちゃった チャット: お疲れ様!それだけ頑張った証拠だね。どんなトレーニングしてきたの?
チャットする各ブロックの実行時間
# ブロック 実行時間(秒) 1 Start 0.001 2 質問分類 1.117 3 チャット 0.578 4 出力 0.001 計 1.732
ちゃんとLLMの知識を使ったQ&AとGoogle検索を使ったRAGが切り替えられています。
また、質問ではない入力については、気さくに返答するように指示したので、他の2例のように事務的な返答ではなく、楽しい会話ができそうです。
マウスでブロックをつなげて、簡単な指示を日本語で入力するだけで、これだけのAIエージェントが作れてしまうのは、強力ですね。
また、今回はGPT-3.5-TurboとGPT-4oしか使っていませんが、 Bedrock と接続して Claude 3 を使うこともできます。
それもプルダウンで選択するモデルを変更するだけ、という手軽さなので、そのタスクに応じて適切なモデルを指定する、などを気軽に行えます。
5. まとめ
さて、今回はDifyを使って、「知識が足りないときにGoogle検索を行って回答するチャットボット」を作成しました。
繰り返しになりますが、Difyを使うと、GUIのみで複雑なAIエージェントを簡単に作成することができます。
これを使わない手はないですね。
さらに、今回は扱っていませんが、 Custom ToolやAPI公開など、魅力的な機能がDifyにはまだまだあります。
全部使いこなして最高のAIエージェントを作りたいですね。
Acroquest Technologyでは、キャリア採用を行っています。少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長