4
4

はじめに

技術チャレンジ部のとも(Tomo)です。チームTPACで自動運転AIチャレンジ2024参加中です。
チームTPACの参加メンバーを盛り上げるべく、DifyでDiscordのボットを作ってみました。
…と言ってもこちらの記事を実行しただけ(記事を書かれた方、ありがとうございます!)。

せっかくなので、AI経験0な素人の私がつまづいたところ、チーム盛り上げに効きそう点などを交えてお伝えできればと思います。
素人なので、変なことを言っていたらすいません!

きっかけ

たまたま生成AIのワークショップに参加する機会があり、そこでDifyを使ったAIアプリケーションのデモがありました。
また、技術チャレンジ部のLT会で、Difyを使ったAIアプリケーションで新生活をスタートされた方のお話を聞きました(感動!)。
TPACはチームも大きくなって、メンバーと大会を盛り上げていきたい!
AIアプリケーションで盛り上げ、もしかしたら私にもできるのでは…?

環境

PC環境は、自動運転AIチャレンジに使用している環境そのものを使いました。

  • PC: ZBOX E
  • OS: Ubuntu 22.04 Desktop
  • モデルプロバイダー: OpenAI

構成要素

  • Discord: エンドユーザーのUIとなるグループチャットアプリ。APIサービスあり
  • OpenAI API: AIアプリケーションの中核となるLLMのAPIサービス。Difyから使用
  • Dify: AIアプリケーションを簡単に作れるプラットフォーム。APIサービスあり
  • Pythonスクリプト: DiscordとDifyをつなぐスクリプト。DiscordとDifyのAPIを使用

OpenAIでのAPIキーの作成

  • OpenAIにログインし、APIを選択。ChatGPTとは別…とは知らなかったくらいの素人です
  • 画面右上のSettings -> Billing -> Add to credit balanceで課金。ChatGPTとは別課金…とは知らなかったくらいの素人です
  • 画面左上のDefault prject -> Create projectで、プロジェクトを作成
  • 作成したプロジェクトを選択し、画面左のAPI keys -> 画面右上のCreate new secret keyで、プロジェクトのAPIキーを作成し、メモ
  • 各種パラメーターは一旦デフォルトのまま

Dify

Difyのインストール

自動運転AIチャレンジ2024の環境構築にて、Dockerのインストールを行っているため、これをこのまま活用し、docker compose上のself hostedな運用としました。
インストールは、公式手順をそのまま実行しました。迷う点はありませんでした。

  • githubからDifyをclone
  • dify/dockerで.env.exampleを.envにコピー
  • docker compose up -dで起動

気分的に、.env.exampleに入っていたデフォルトっぽいパスワードは、.envにてランダム生成したものに変更しました。

モデルプロバイダーの設定

WebブラウザーでDifyにアクセスし、画面右上の自分のアイコン -> 設定 -> 画面左のモデルプロバイダーで、OpenAIを選択、セットアップで先ほどメモしたOpenAIのAPIキーを入力し、OpenAIのモデルを有効化しました。緑ランプが点灯すれば有効化完了。新しめのDifyなら(?)噂のgpt-4o-miniも使用できるようです。

チャットボットの作成

WebブラウザーでDifyにアクセスし、以下を実施しました。

  • チャットボット -> テンプレートから、チャットボットを作成。テンプレートはどれが良いかわからなかったものの、Knowledge Retreival + Chatbotであれば、本大会独自の知識も埋め込めるかなと思い、選択
  • 色々試した結果、Knowledge Retreivalは後回しにしようと判断、一旦Knowledge Retreivalのブロックを削除し、STARTとLLMを直接接続
  • LLMブロックでは、モデルにgpt-4o-miniを選択。SYSTEMからは、Knowlegdを与える<context>〜</context>のくだりを削除。SYSTEMには日本語で「高度な命令」をこのような感じで設定(ここがボットのキャラクターの味付けに)

dify.png

  • デバッグとプレビューで質問すると、いい感じでアツい回答が得られたので、画面右上の「公開する」ボタンでチャットボットを公開

ここまでが一瞬すぎて笑ってしまうほどでした。

チャットボットができたので、画面左のAPIアクセス -> 画面右上のAPIキーで、新しいシークレットキーを生成し、メモしておきます。

Discordでのボットの作成

Difyはワークショップで見たのでなんとなく感覚が分かっていましたが、Discordのボット作成は未知の世界。改めてこちらの記事を読みながら以下を実施しました。

  • Discord Developer PortalのMy Applicationsから、New Applicationでアプリケーションを作成。アイコンも設定できるので、TPACのアイコンを設定。ボットっぽくなる気がしてきました
  • 作ったアプリケーション(ボットのアイコン)を選択し、BotのReset Tokenでトークンを取得し、メモ。また、Presence IntentとMessage Content Intentを有効化。これは、画面下にあるたくさんのチェックボックスではなく、画面中程のスライドスイッチでした。ちょっと迷子になりました
  • OAuth2のOAuth2 URL Generatorで、画面下のたくさんのチェックボックスからbotを選択し、画面を下にスクロールして現れるGenerated URLをコピーし、ブラウザでアクセス。ここもちょっと迷子になりました
  • Generated URLにアクセスして現れる認証画面では「サーバーに追加」部分に追加したいサーバーが現れるはずですが、現れず。Discordサーバーにボットを追加できる権限を持っていなかったようです。Discordのサーバー管理者に権限を追加してもらって、改めてDiscordサーバーにボットを追加。結果、テキストチャンネルの一般に、ボットのtpacさんが現れました、わーい!

後で分かったのですが、プライベートチャンネルでボットを使うには、そのチャンネルのロールが必要そうです。作成したボットにロールを付与しました。

DiscordとDifyをつなぐPythonスクリプトの作成

Pythonアプリケーションも、こちらの記事のPythonアプリケーションをそのまま使用させていただきました。
Pythonスクリプトは、Difyに対してもDiscordに対しても、クライアントとして動作するようです。ポートフォワーディングが不要なので、一般のご家庭でも動作が容易な接続形態かと思います。
.envにDifyとDiscordのAPIキーを設定した上で、Pythonスクリプトを実行します。

.env
TOKEN="Discordのトークン"
DIFY_API_KEY="DifyのAPIキー"

何点かつまづきポイントがありました。

pipでの依存Pythonパッケージのインストール

自動運転AIチャレンジ2024ではpip環境も設定されるため、これをそのまま活用しました。
結果的にpip install aiohttp discord python-dotenvが必要でした。
最初、pip install dotenvで失敗していたのですが、python-dotenvだと成功しました。

Discordからのボット呼び出し名の変更

デフォルトではDiscordから!chatでボットが呼び出せます。これを!tpacに変える方法をChatGPTに聞いたところ、以下のようにすればよいとのことで、実際動作しました。

python
@client.command(name='tpac')

Discordからのボットの呼び出し

絵文字も交えた応援メッセージがアツい!

discord-chat-bot.png

ここが良かった!

  • 自分が疑問に思ったことと、AIからの応答の両方が、チーム全体と共有できる
    • 他のメンバーが言葉にできていなかった疑問や思いに対して寄り添ったり、新たな気づきにつながる可能性
  • gpt-4o-miniの応答の速さと、普段使いのアプリケーション上のボットの組み合わせが、ユーザー体験の向上につながる
  • ボットのキャラクターの味付けを、Dify上にて自然言語で簡単に設定できる

今後に向けて

長い応答が途切れる

あとちょっと、というところで会話が途切れる場合があります。
DifyのLLMブロックのモデルを押すと、Max Tokensという設定があり、これがデフォルトで512になっていたので、768にして様子をみようと思います。
max-tokens.png

ナレッジの活用

Difyでは、外部からナレッジを注入できます。本大会に特化した知識での応答もできそうです。
実際、元々のテンプレートにあったKnowledge Retrievalを使って、こんな応答が得られました。
チャンクの切り方の工夫やRerankerを用いて、精度を上げられればと思っています。
knowledge.png

FirecrawlのためのDockerネットワーク設定

LinuxのDockerで、DifyのコンテナからFirecrawlのコンテナのAPIへアクセスするURLにhost.docker.internalを使用するには、extra_hostsで"host.docker.internal:host-gateway"を指定する必要がありそうです。
これをDifyのどのサービスに適用すればよいか(どのサービスからFirecrawlにアクセスするか)、調べられていません。
とりあえずdocker-compose.override.yamlにて適当に複数指定したら動作したのですが、絞り込めればと思っています。

Slack化

本大会ではSlackが活用されているため、Slack化もしたいと思っています。
ほぼ同じタイミングで、こちらの記事が公開となりました! しかもSlack編!
是非参考にさせていただき、大会を盛り上げていければと思っています!

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4