【初心者向け】Bedrock+Difyでお手軽にLLMアプリを作ってみる

# Bedrock+Difyでお手軽にLLMアプリを作ってみる

DifyはオープンソースのLLMアプリ開発プラットフォームです。

Difyを使うことでアプリ開発の専門知識がなくても簡単にLLMアプリを作ることができます。

今回はEC2インスタンス上にDifyをインストールし、
EC2からAmazon Bedrockの基盤モデルを呼び出すことでLLMアプリを作ってみました。


## システム構成

構築するシステムの構成は以下の通り。

![overview.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880214/c11e63cd-4e36-0538-27f9-9f2408b47740.png)


ALBでクライアントからのHTTPSリクエストを受け付け、
後段のEC2インスタンスにHTTPでリクエストを転送します。
(DifyにはNginxが内蔵されているのでALBは必ずしも必要ではないです。証明書周りの設定を簡単にするためにALBを立てています。)

EC2インスタンスにはDifyと、Difyの実行に必要なDockerとDocker Composeをインストールしておきます。

EC2インスタンスからBedrockのAPIを叩けるように、
EC2には`bedrock:InvokeModel*`を許可ポリシーに加えたIAMロールをアタッチします。

[公式のガイド](https://docs.dify.ai/getting-started/install-self-hosted/docker-compose#prerequisites)によると、Difyのインストールには

> CPU >= 2 Core
> RAM >= 4 GiB

が必要になるので、EC2のインスタンスタイプはt3.mediumとします。

## 構築手順

### AWSリソースのデプロイ

構築するリソースは全てCloudformationで作成しました。
以下のテンプレートを用いて各種スタックを作成していきます。

https://github.com/OchiShuji/llm_app/tree/master/cfn

DifyについてはEC2インスタンスを起動する際に
以下のユーザデータを実行してインストールするようにしています。

```sh
#!/bin/bash

# Install Docker
yum install docker git -y
usermod -a -G docker ec2-user
systemctl enable docker
systemctl start docker

# Install docker-compose
mkdir -p /usr/local/lib/docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

# Install Dify
cd /usr/local
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d
```
インストール手順は以下を参照しました。

https://docs.dify.ai/getting-started/install-self-hosted/docker-compose

一点、注意点として、上記コマンドを実行すると
- Nginx
- PostgreSQL
- Redis
- Webaviate

といった複数のサービスがコンテナ上で起動します。

各種サービスの起動に用いられる環境変数は`dify/docker/.env`に記載されています。
実際にアプリケーションを公開・運用する際は`dify/docker/.env`に記載された変数を適宜チューニングする必要がありそうです。

### Bedrockでの基盤モデルの有効化
AWSのマネジメントコンソールからBedrockの基盤モデルを有効化します。

Bedrockのコンソール画面から
Bedrock configurations > モデルアクセス
を選択します。

モデルアクセスをリクエストしたのち、アクセスのステータスが
「アクセスが付与されました」の表示になるまで数分待ちます。

![スクリーンショット 2024-09-29 18.24.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880214/82fe1b9a-f98e-8e90-08c9-efccc4c2722f.png)

コンソールの左ペインの
基盤モデル > ベースモデル
を選択すると、ベースモデルの詳細が表示されます。

各モデルについてModel IDが表示されています。利用したいモデルのModel IDをコピーしておきます。

![スクリーンショット 2024-09-29 18.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880214/2df63bfa-5244-9771-bdd4-9d6ac377ced8.png)

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

ALBのエンドポイントにアクセスしてDifyの管理者コンソールを開きます。

「設定」画面から「モデルプロバイダー」を選択し、
「Bedrock」を追加します。

![スクリーンショット 2024-09-29 18.45.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880214/37a79d80-8ade-0c19-bd1c-7816a929fcbe.png)

セットアップ画面が開くので
- AWS Region: Asia Pacific (Tokyo)
- Available Model Name: マネジメントコンソール上で確認したModel ID
を入力して保存します。

![スクリーンショット 2024-09-29 18.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880214/1d545c23-067d-21d8-bef2-b3a79d4e2f61.png)

:::note
今回はEC2インスタンスにIAMロールを設定しているため、Access KeyおよびSecret Access Keyは空欄でOKです。
:::

### LLMアプリの作成＆公開

Difyのコンソールからお好きなアプリを作成して公開します。

![スクリーンショット 2024-09-29 18.51.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880214/49334b22-f37f-fbc0-141c-4ad00b4208ac.png)

![スクリーンショット 2024-09-29 19.04.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880214/f09801dd-3ee2-df38-d6b4-fefd3a916a73.png)

## まとめ

AWSのリソースの作成から初めてわずか数時間でLLMアプリを作成することができました。

さらに作り込むなら

- DB周りのサービスをAWSのマネージドサービスに置き換える
  - PostgreSQL: Amazon Aurora PostgreSQL
  - Redis: ElastiCache for Redis
  - Webaviate: Amazon Aurora PostgreSQL + pg_vector
- DifyのサーバをPrivate Subnetに配置し、BedrockにはVPCエンドポイント経由でアクセスする
- Knowledge base for Amazon Bedrockを使ってRAGぽいものを作ってみる

などができそうです。また、Webサーバ(nginx)やベクターDB(Webaviate)は外部サービスを利用するならDify内蔵のものは止めた方が良さそうです。