DifyをIBM Cloud Virtual Serverで動かして、IBM Cloudについて質問できる基本のチャットボットを作るまで

# 概要
この記事では、学生や企業の従業員、自治体の職員などが、自分達で生成AIを活用したサービスやAPIを作成できる「Dify（ディファイ）」をIBM Cloud Virtual Serverを使って構築します。複数人がWebサービスとして共同利用する生成AIサービスを作成することができます。
今回は、Difyを使った基本的なチャットボットを作り、IBM Cloudについて質問できるようにします。

# Difyのインストール準備
## サーバーの用意（例 IBM Cloud Virtual Server）
BM Cloud Virtual Serverを使っており、IBM Cloud Virtual Server for VPCとIBM Cloud Virtual Server for Classic、どちらでも構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/05a3f83b-39a3-d1e9-5c7a-cddb133e6b2f.png)
IBM Cloudは、商用利用可能なオープンソースソフトウェアを多く使っているとされ、自宅サーバー等で確認した動作を再現しやすく、素直な挙動が特徴とされています。短期間の使用は、IBM Cloud Virtual Server for ClassicのTransient ServerでVMを作成にすることで、運用コストを低く抑えることができます。

使用したサーバーのスペック
本資料は、以下のスペックのVM（仮想サーバー）を用意しました。

- OSは、Ubuntu Server 24.04(2024年8月現在)
- vCPUは、2つ以上
- メモリは、4GB以上
- 80番と22番ポートでアクセス可能にする

今回使う「Dify」には環境構築不要のパブリッククラウド版がありますが、自分で環境構築する場合は、CPUが２コア以上、メモリが4GB以上必要になります。Difyの公式の[Readme](https://github.com/langgenius/dify/blob/main/README.md)に、最小構成時のスペックの記載があります。

## 作業用ユーザの作成
用意したVMは、rootユーザーしかないので、作業用のユーザーを作成します。

``` 
adduser workuser1
```
sudo権限を追加します。
```
usermod -aG sudo workuser1
```
exitコマンドを実行し、ログアウトします。作成したユーザーでログインします。
```
exit
```
作成した作業用ユーザーで、SSH接続して作業を再開します。

## タイムゾーン設定
時刻設定を日本時間に合わせるため、次のコマンドを実行します。
```
sudo apt update -y
sudo apt upgrade -y
sudo timedatectl set-timezone Asia/Tokyo
```

## Dockerのインストール
DifyをインストールするためにDockerを使います。アプリケーションコンテナとして動作するので、Dockerをインストールします。
```
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```
VMの作業用ユーザーでDockerを実行できるように、次のコマンドを実行します。
```
getent group docker
sudo gpasswd -a $USER docker
```
ログアウトします。
```
exit
```
ログアウト後、再度SSH接続します。

# Difyのインストールと動作確認
## Dify のインストール
### 作業に必要なソフトウェアのインストール
gitコマンドを使うので、gitコマンドを使用可能にしておきましょう。また、後々日本語も扱うので、日本語フォントも忘れずにインストールしておきます。
```
sudo apt-get install -y curl gcc git make fonts-ipafont language-pack-ja
```
### コンテナとして仮想サーバー内でDifyを起動
公式ドキュメント[Deploy with Docker Compose](https://docs.dify.ai/getting-started/install-self-hosted/docker-compose)の通り、次のコマンドを実行します。
```
git clone https://github.com/langgenius/dify.git
```
Githubから取得したソースコード一式から、Docker Compose の定義ファイルがあるディレクトリに移動し、Dify用の環境変数を複製します。
```
cd dify/docker
cp .env.example .env
```
環境変数を確認するには、次のコマンドを実行します。
```
cat .env
```
それぞれの環境にあわせて、.envファイルを編集します。
```
vi .env
```
Difyを起動するには、次のコマンドを実行します。
```
docker compose up -d
```
実行結果
```
[+] Running 71/9
 ? redis Pulled                                                                        3.2s
 ? ssrf_proxy Pulled                                                                  22.8s
 ? db Pulled                                                                          24.7s
 ? worker Pulled                                                                      61.4s
 ? nginx Pulled                                                                       19.3s
 ? sandbox Pulled                                                                     34.1s
 ? web Pulled                                                                         30.9s
 ? api Pulled                                                                         61.4s
 ? weaviate Pulled                                                                     4.6s
[+] Running 11/11
 ? Network docker_default             Created                                          0.1s
 ? Network docker_ssrf_proxy_network  Created                                          0.0s
 ? Container docker-redis-1           Started                                          5.0s
 ? Container docker-web-1             Started                                          4.8s
 ? Container docker-weaviate-1        Started                                          4.5s
 ? Container docker-ssrf_proxy-1      Started                                          7.1s
 ? Container docker-db-1              Started                                          4.9s
 ? Container docker-sandbox-1         Started                                          5.0s
 ? Container docker-worker-1          Started                                          6.1s
 ? Container docker-api-1             Started                                          6.1s
 ? Container docker-nginx-1           Started                                          8.1s
```
## Difyの管理者アカウントの登録
Webブラウザで、IPアドレスもしくはFQDN（ホスト名.ドメイン名）にhttp接続します。管理者アカウントの設定画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/1efe99c3-c713-b671-93a1-1821d41b6e74.png)
画面内の「English(United States)」をクリックすることで、任意の言語に表示を変更することができます。日本語を選べば、画面が下記のように日本語表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/4eed5feb-8c71-d661-edc2-f38dbe621b76.png)
管理者アカウントを登録します。「メールアドレス」「ユーザー名」「パスワード」の3項目を入力し、「セットアップ」をクリックします。
(例 メールアドレス : useradmin1@example.com , ユーザー名 useradmin1 , パスワード zxcvfr45user1 )

# Difyによる生成AIサービスの作成
## Dify の管理画面にログイン
登録した管理者アカウントのメールアドレスとパスワードでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/f2ee681d-ed0b-d1ba-cd6e-b8e41e658b8c.png)
「メールアドレス」と「パスワード」を入力後、「サインイン」をクリックします。
## スタジオ画面
ログイン後、Difyのスタジオ画面が表示されます。スタジオ画面から、生成AIを用いたサービスを構築することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/e10b8bff-b770-474a-1c74-f68429e5cee5.png)
## モデルの設定
例として、OpenAIの「GPT-4o mini」を呼び出せるようにしましょう。
画面右上のユーザー名をクリックすることで表示される「設定」にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/2d93a7f9-ef3f-f69f-d203-cf70090b430c.png)
「ワークスペース（Dify環境）」の「モデルプロバイダー」を表示します。
「モデルプロバイダー」で、「OpenAI」を探し、「セットアップ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/a79770fb-cff5-a2d1-f1ac-defb5deb6a55.png)
「API Key」には、[OpenAI Platform](https://platform.openai.com/docs/overview)のChatGPT APIから取得した「API secret key」を入力、「Oraganization」には「Organization ID」の文字列を入力します。入力後、「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/bbe01a6c-d38a-b688-b734-5d70f34d72cc.png)
「モデルプロバイダー」の表示のうち、「OpenAI」の「API-KEY」表示が緑色になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/74fc2923-0455-a9d8-aad8-8eec5f2c6034.png)
「○○のモデル」と表示されている文字をクリックすると、「gpt-4o-mini」や「gpt-4-turbo」「gpt-3.5-turbo」などの使用可能なモデルが表示されます。

#### OllamaによるLLMの呼び出し
「モデルプロバイダー」で「Ollama」を呼び出すことで、「Ollama」で扱えるLLM、たとえばIBM社の「Granite Code」やMeta社の「Llama 3.1」などをDifyで活用することができます。参考資料 [OllamaをAPI経由で接続するための環境構築](https://mydocument.atlassian.net/wiki/spaces/support4textbook/pages/1864761359/Ollama+API)

### システムモデル設定
「モデルプロバイダー」で、「システムモデル設定」をクリックします。
表示された各項目について、各項目をクリックし、モデルを指定します。「システム推論モデル」と「埋め込みモデル」は複数選択することができます。
各モデルを選択後、「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/367a37dc-649d-f6c1-d1c2-b8283775290a.png)

画面の再読み込みを行います。画面の再読み込みを行うことで、「モデルプロバイダー」の警告表示が消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/e8e1307b-19f6-34e3-8fcd-29dad4bd205f.png)

この状態になれば、Difyで生成AIモデルを使ったサービスを作成できるようになります。必要に応じて、OpenAI以外の生成AIモデルを設定し、利用可能にすることができます。

# 基本のチャットボットを作る
## アプリ作成
設定画面を閉じ、「スタジオ」で「最初から作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/22b5cfbd-c56c-38c9-150e-cf1bfb15c16f.png)

「最初から作成」画面で、下図のように「チャットボット」、「基本」の２つを選び、アプリ名を「1st chatbot app」として、「作成する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/23f71b61-23f1-3824-a639-97e5c2f24351.png)

## 作成したアプリの設定（オーケストレーション画面）
最低限、画面右上にモデル名が表示されていることを確認します。
画面右上に表示されるモデルは、Difyの「設定」の「ワークスペース」の「モデルプロバイダー」で、「システムモデル設定」で指定したモデルが表示されます。モデルをしたい場合は、表示されているモデル名をクリックすると切り替え可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/6a6e55c6-c26b-1973-c797-9f10742d3ab2.png)

画面下の「＋機能を追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/9b293270-6395-eae6-a02d-d7b8006d7a9d.png)
「会話の開始」と「フォローアップ」のトグルボタンをクリックし、上図のようにオンの状態にします。その後、「X」をクリックして、「機能を追加」を閉じます。
「会話の開始」はこの後、「会話開始」の表示で設定します。「フォローアップ」は、特に設定する必要はありません。チャットボット中に自動で、次の質問が３つ提案される仕組みです。

画面内に「会話開始」が表示されます。「オープナーを書く」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/18f0e01f-c2bc-1b05-492a-b27be79b9697.png)

チャットボット起動時に表示される挨拶メッセージを入力します。また、「開始質問」の項目に、最大５つまで、質問例を設定することができます。設定後、「保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/7385427c-163d-ded6-e6c6-4324250575c0.png)

画面右側の「プレビュー」に、表示されたものを確認しましょう。チャットボットの最初に挨拶文と、よくある質問が表示されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/a4dacfca-f65f-5552-2bcf-f2d976f89bc8.png)

質問すると返信が生成されます。「フォローアップ」機能により、返信に対して３つの質問候補が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/418a481a-766f-c276-ffd4-1d2c0245dad6.png)

画面右上の「公開する」をクリックします。次に「更新」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/f68194c3-1b2c-3d17-c3b6-4cb810722706.png)

「アプリを実行」をクリックすると、新規タブでチャットボットアプリが表示されます。「Start Chat」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/730d1adf-e91e-21e2-0377-fafead4009e2.png)

このように、チャットボットサービスとして動かすことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/1e420c38-fa77-b79f-6b04-61e39fdb63c5.png)

「IBM CloudとAWSの違いを教えてください。」をクリックすると、回答が表示されます。その後、続きの質問候補が３つ表示されます。質問の候補をクリックして続けても良いですし、手動入力で続きの質問をしても良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/290b2754-e1c0-454c-e767-e6c19c8a5b1d.png)

# 次はどうするべきか
Difyでは、RAG(検索拡張生成)を使うことができるので、文書データを用意しチャットボットが生成する回答の精度を高めるようにしましょう。

# 終わりに
本記事では、生成AIサービス開発ツールの「Dify（ディファイ）」を使って、IBM Cloud上に環境構築と基本のチャットボットを作る手順について書きました。
生成AIのモデルに、ChatGPTのAPIを使っていますが、自社でLLMを運用するような場合や閉じたネットワークで構築する場合、RAGを使う場合、APIとしてDifyを呼び出すような場合は下記のドキュメントをご覧ください。大学の授業用に作成した教材です。

- [OllamaをAPI経由で接続するための環境構築](https://mydocument.atlassian.net/wiki/spaces/support4textbook/pages/1864761359/Ollama+API)
- [Dify 入門：環境構築とチャットボット作成](https://mydocument.atlassian.net/wiki/spaces/support4textbook/pages/1860403430/Dify)
- [Difyの公式ドキュメント](https://docs.dify.ai/)