自動運転AIチャレンジ2024専用AIアシスタントを作ってみよう！　～ Dify編 ～

# はじめに
前回記事（[NotebookLM編](https://qiita.com/soyaoki/items/e9752ba307fa25ebd851)）の続編です！

[NotebookLM](https://notebooklm.google/) は、
構築が容易という大きなメリットがある反面、拡張性が低いことがデメリットでした。
また個人アシスタントとしては使い勝手が良いですが、チームでの利用時にはやや不便さを感じます。

そこで今回は [Dify](https://dify.ai/) を使用して、

 - LLM / Embeddingモデル / Rerankerモデル を柔軟に変更しつつ、
 - Webクローリングで知識の自動収集を行い、
 - さらにはSlackボットとして機能する、チームでも使用可能な、

AIアシスタントを作ってみます。

なお難易度が上がりますので、中級者～上級者向けの内容となります。

# アーキテクチャ

外部知識を活用する手法 Retrieval-Augmented Generation(RAG) を使った以下構成とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/ab2ec42c-e8a3-f81c-decd-ca3bd27a0154.png)

以下を組み合わせて実現します。
 - [Dify](https://dify.ai/jp)：LLMアプリ開発プラットフォーム
 - [Firecrawl](https://www.firecrawl.dev/)：webクローリングサービス（Dify連携サポート済み）
 - [Ollama](https://ollama.com/)：LLM / Text Embedding プロバイダ（Dify連携サポート済み）
 - [Xinference](https://inference.readthedocs.io/en/latest/)：Text Embedding / Reranker プロバイダ（Dify側で連携サポート済み）
 - [Dify Bot](https://github.com/crazywoola/dify-bot)：Slack↔Dify接続

※ Dify は クラウド版Freeプラン だと制限が多かったため、オンプレでホストします。
　　OS：Windows 11 Pro
　　CPU：Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz   3.70 GHz
　　GPU：NVIDIA GeForce RTX 3060
　　RAM：64GB

※ PC本体代 / 電気代 / 通信費 **以外** の費用が発生しない構成を目指しました。

# 手順

ほぼ既存記事に沿って実施しただけなので、参照記事だけ列挙して詳細は割愛します。
[Dify Bot](https://github.com/crazywoola/dify-bot) だけ、日本語の情報が少なかったので詳細を記載します（といっても大したことないです）。

## １．準備
１． (Windowsの場合) WSL2を設定します
２．Dockerをインストールします

https://qiita.com/Jazuma/items/9274d90167a3b61791fa

## ２．アプリ構築 on Dify
１．Ollama で LLM / Text Embedding を設定します

https://qiita.com/Tadataka_Takahashi/items/ba832511bd4fd5cd46f1

２．Xinference で Text Embedding / Reranker を設定します

https://qiita.com/orca13/items/93431d9d1e8c1129be69

３．Firecrawl を設定して Knowledge を準備します

https://zenn.dev/satto_sann/articles/d177f4cdc02755?redirected=1

:::note warn
必ずクローリング先のサイト規約を確認してください。
クローリング/スクレイピングを禁止しているサイトもあります。
:::

４．Dify で チャットボット(Chatflow)を作成します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/33a57b54-74c6-50a2-5f1a-fa71d4c932c5.png)
    
「知識取得」は以下のように設定しました、マルチパスリトリーバルを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/e388a432-d809-0c37-0590-f68e7f99183e.png)

「LLM」は以下のように設定しました、前段「知識取得」の `result` を渡し忘れないように注意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/eb121a14-16b5-8eb6-c83a-610ee8d7134d.png)

５．デバッグとプレビューで動作確認します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/422b0832-fe4c-0511-188d-ae5d6d79f807.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/25c4f200-3dfe-e607-4fca-a5660994c749.png)
    外部知識を活用して回答してくれていそうです。

## ３．Dify↔Slack連携
１．Dify Bot で Slack連携を設定します

https://github.com/crazywoola/dify-bot

Dify と Dify bot が接続できるように、以下のように設定変更してDockerコンテナを起動します。

```.env
DEBUG=debug
MODE=chat # chat or completion
DIFY_API_BASE_URL=http://host.docker.internal/v1
# slack discord feishu/lark
ADAPTER=slack
# Dify 
DIFY_API_BASE_URL=http://host.docker.internal/v1
DIFY_API_KEY=app-xxxxxxxxxxxxxxxxxxxxxxxx
# Slack
SLACK_BOT_TOKEN=xoxb-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx
SLACK_APP_TOKEN=xapp-x-xxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Discord
DISCORD_TOKEN=MTExMjAyMTMxOxxxxxxxxxxxxx.GkPR5t.xIrYZxxxxxxxxxxxxxBN1jqkxxxxxxxxxxxxx
DISCORD_ID=1112021318955708487
```
    
```docker-compose.yaml
version: '3'
services:
  bot:
    image: pinkbanana/bot:latest
    env_file:
      - ./.env
    extra_hosts:
      - "host.docker.internal:host-gateway"
```

Dify APIキーやSlack APIトークンの取得などの設定方法は以下が参考になると思います。

https://qiita.com/bathtimefish/items/63c00e637e8dc9b090fe

https://tech.nri-net.com/entry/created_a_slack_bot_that_links_dify_and_slack

https://zenn.dev/kiwichan101kg/articles/8f1b1a5b44774b


# 使用例

実際に使ってみるとこのような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/cc2538e9-1e49-04b6-feb8-e089d264fe97.png)

今回はローカルで動く軽量なLLMを選択したため、回答性能にはやや課題が残ります。
ただ、DifyはChatGPTやClaudeとも連携ができるので、モデルを差し替えることでさらなる性能向上が期待できると思います。Geminiの無料枠なら費用も増加せず性能が引き上げられるかもしれません。

https://note.com/rcat999/n/nd5ba96256858


# おわりに

Dify は LLM / Embedding / Reranker / Knowledge の 組み合わせ自由度が高いので、
状況に合わせたAIアシスタントが作成可能と思います。
またSlackと連携することでチーム内展開も容易になります。

「Autowareのパラメータについて知りたい」「どんなモジュールがあるのか教えてほしい」「こんな問題に直面しているんだけどどうしたらいいの？」「サンプルコード書いてほしい」などなど、開発中の疑問に答えてくれるAIアシスタントがチーム内に居てくれたら…　とっても心強いですよね。

[自動運転AIチャレンジ2024](https://www.jsae.or.jp/jaaic/2024ver/) の予選も残りわずか！
AIアシスタントの力を借りながら、最後まで楽しんで走り切りたいです！

つづく

この記事は、AI文章校正ツール「ちゅらいと」で校正されています。