【ツール紹介】あなたのQiita記事は何点？？AWS上でDifyを今すぐ動かしてみよう！

# １. はじめに
こんにちは。

私は情報システムやサービスの運用の研究開発業務を担当するグループに所属している**初級エンジニア**です。

今回は初級エンジニアでも簡単に生成AIアプリケーションを開発できるツールである、「**Dify**」について実際に触ってみました。

環境については、[前回記事（OpenLIT紹介）](https://qiita.com/melhts/items/a3d9d4c82a5712e73e21)に引き続き、AWSサービスである「EC2」のインスタンス上で構築しました。
また、同じくAWSサービスの生成AIプラットフォームである「Bedrock」も活用してみました！

本記事は初級エンジニアの私が、**生成AIアプリケーション開発ツールであるDifyを導入し、アプリ作成までの工程をまとめた**ものになります。
今回は例として、生成AIアプリ『**Qiita記事レビューさん**』を作成してみました。このアプリは、添付されたQiita記事を採点してくれます。

まずはDifyについて説明した後に、導入方法について説明します。

# ２. Difyってなに？
Difyは**ノーコードで生成AIアプリを作成できるOSS**です。

https://dify.ai/jp

近年、「**生成AI**」はビジネスや日常生活のさまざまな場面で利用されており、最も勢いのある技術といっても過言ではありません。
しかし、その生成AIを用いて何かアプリケーションを作りたい！となったとしても、実用的なアプリケーションを作成できるまでに至るには、学習のコストがかかってしまいます。

「**Dify**」はプログラミング知識なし（ノーコード）で、いくつものLLMモデルを用いた生成AIアプリケーションを開発することができるツールです。

以下に主な特徴についてまとめます。

:::note info
Difyには「Webアプリ版」と「ローカル版」が存在しますが、今回はローカル版の導入をしていきます。
:::

:::note warn
本記事の情報は2025年4月時点、``v1.1.3``の情報です。
:::

## 主な特徴
### 特徴１：多様な生成AIアプリケーションを作成できる
Difyでは、あらかじめ設定されたアプリケーションの種類から選択する方式を採用しています。ユーザーは、自分が作成したいアプリケーションに最も適した種類を選択することができます。
以下にアプリの種類を示します。

**アプリの種類**
- **チャットボット**：簡単なLLMベースのチャットボット
- **エージェント**：推論と自律的なツールの使用を備えたインテリジェントエージェント
- **テキスト ジェネレーター**：テキスト生成タスクのためのAIアシスタント
- **チャットフロー**（Beta）：メモリを使用した複雑なマルチターン対話のワークフロー
- **ワークフロー**（Beta）：シングルターンの自動化タスクのオーケストレーション

また、テキストファイル（TXT、PDF、DOCXなど）をアップロードすることで、RAGシステムを構築することも可能です。

さらに、いくつもの外部ツールに対応しており、APIキーなどの情報を入力するだけで自由自在にLLMと外部ツールを結合できます！

### 特徴２：ノーコードで簡単に開発できる
通常、アプリケーションを作成するためにはPythonやTypeScriptなどの言語を用いてソースコードを書く必要があります。
しかし、DifyではGUIを操作するだけで簡単に生成AIアプリケーションを作成することができます。

コーディングなしで生成AIアプリ開発ができるため、まだ**プログラミングに馴染みのない方やIT知識のない方にもおすすめ**です！

### 特徴３：多くのLLMモデルプロバイダーに対応している
有名なLLMモデルプラットフォームであるOpenAIやAnthropicはもちろん、最近話題となっているDeepSeekなど、多くのモデルに対応しています。

![dify_models.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/9f03a175-66a5-8349-eec0-54007f76e602.png)
引用元：[DifyのGitHubリポジトリ](https://github.com/langgenius/dify/blob/release/1.1.3-fix1/images/models.png)

API等の初期設定を行うだけで、いくつものモデルを1つの画面上で選択して使用できるため、それぞれのモデルの特徴を活かして**役割を分担させたアプリケーションを作成したい方にとてもおすすめ**です！

:::note info
60種類ものLLMモデルプロバイダーに対応
参考情報：[List of Model Providers](https://docs.dify.ai/getting-started/readme/model-providers)
:::

### 特徴４：簡単にデプロイできる
わずか数ステップで生成AIアプリケーションの開発ができるようになります。

詳細は本記事の３章で説明します。

# ３. 前提環境の構築
Difyを動作させるための環境を構築します。
前提環境については、**前回のOpenLITの記事の３章**とほとんど同様であるため詳細は以下を参照してください！

https://qiita.com/melhts/items/a3d9d4c82a5712e73e21#%EF%BC%93-%E5%89%8D%E6%8F%90%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89

## 利用サービス
- 開発環境：AWSのEC2インスタンス
- LLMモデルサービス：Amazon Bedrock

## AWSマネジメントコンソール上の準備
### Amazon Bedrock上でモデルの有効化
Amazon Bedrockのモデルを使用するために、モデルを有効化する必要があります。
過去に有効化を実施した場合、この手順は不要です。

リージョンによって使用できるモデル数が大きく異なりますが、今回は動作確認程度ですので、東京リージョン（`ap-northeast-1`）でモデルを有効にしてください。
今回は`Claude 3.5 Sonnet`を使用します。

![bedrock modelaccess.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/ab727fab-35a3-f00f-19ff-45ca04f59a49.jpeg)


:::note warn
さらに多くのモデルを使用したい場合はバージニア北部（`us-east1`）もしくはオレゴン（`us-west2`）を選択しましょう。
:::

### EC2インスタンスの立ち上げ
EC2インスタンスを以下の設定で立ち上げます。

**インスタンスの設定**
- 名前とタグ：任意（今回は`dify-server`）
- AMI（OS）：Amazon Linux 2023
- インスタンスタイプ：CPU ≧ 2Core, RAM ≧ 4 GB（今回は`t3.medium`）
- キーペア：任意
- ネットワーク：セキュリティグループを作成（詳細は後述）
- ストレージ：任意（今回は16 GB）

:::note info
AMIに関して、他の候補でも問題ありませんが、この後のCLI上の操作に影響を与える可能性があります。
インスタンスタイプやストレージに関して、基本任意ですが、スペックが低すぎるとDifyが動作しない可能性があります。そのため、今回は「t3.medium」および「16 GB」としました。
:::

### セキュリティグループの設定
セキュリティグループを以下の設定で編集します。

**インバウンドルールの設定**
- タイプ：カスタムTCP
- プロトコル：TCP
- ポート範囲：80
- ソース：マイIP（他のPCから受け付けたい場合は、範囲を広くする必要があります）
- 説明：任意

### EC2インスタンスにIAMロールをアタッチ
以下の設定でIAMロールを作成し、インスタンスにアタッチします。

**IAMロールの設定**
- 信頼されたエンティティタイプ：AWSのサービス
- ユースケース：EC2
- 許可ポリシー：`AmazonBedrockFullAccess`
- ロールの詳細：任意（今回はロール名を`AmazonBedrockFullAccess`）

これでAWSマネジメントコンソール上での準備は完了です！
インスタンスに接続できましたら、次はインスタンス上の準備です。

## EC2インスタンス上での準備
`Amazon Linux 2023`の環境に前提となるツールやライブラリを導入していきます。
こちらに関しては、**以下記事の３章**と全く同じ内容となっています。

https://qiita.com/melhts/items/a3d9d4c82a5712e73e21#ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E4%B8%8A%E3%81%A7%E3%81%AE%E6%BA%96%E5%82%99

導入ツールは次の６つです。
- Docker
- Docker compose
- Python
- pip
- Boto3
- Git

```:前提ツールインストールの手順
# パッケージをアップデート
$ sudo dnf update

# dockerインストール
$ sudo dnf install -y docker

# dockerデーモン起動
$ sudo systemctl start docker

# ユーザーグループの追加
$ sudo gpasswd -a $(whoami) docker

# dockerに書き込み権限の付与
$ sudo chgrp docker /var/run/docker.sock

# dockerデーモンの再起動
$ sudo service docker restart

# dockerデーモンの自動起動
$ sudo systemctl enable docker

# docker composeのインストール
$ sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 実行権限の付与
sudo chmod +x /usr/local/bin/docker-compose
```

バージョンを確認して、正しくバージョンが確認できれば成功です！
```:バージョン確認
$ docker -v
Docker version 25.0.5, build 5dc9bcc

$ docker-compose -v
Docker Compose version v2.32.1
```

これでDifyを導入する準備が全て整いました！

# ４. Difyの導入とモデル設定

ここからはDifyの導入に入ります。
以下の公式ページを参考に導入します。

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

## 導入手順
### Difyの導入
```:difyをクローン
$ git clone https://github.com/langgenius/dify.git
```

### Difyの起動
```:dify起動の手順
# ディレクトリを移動
$ cd dify/docker

# 環境は位置ファイルをコピー
$ cp .env.example .env

# dockerコンテナを起動
$ sudo docker-compose up -d
```
これでDifyの導入が完了し、生成AIアプリケーションを作成する準備がととのいました！

次は、Difyに接続して実際にアプリケーションを作成してみます。

## Difyに接続
``http://[インスタンスのパブリック IPv4 アドレス]:80``を確認すると、アカウント作成画面が表示されます。

ご自身のメールアドレスと名前、パスワードを入力し、アカウントを作成します。

![dify登録画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/5380cf27-8985-44e0-bcc7-393aeeb9b34b.png)


すると、ログイン画面が表示されますので、先ほどのメールアドレスとパスワードを入力してサインインします。

![Dify_login.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/ff9944c9-31fb-7968-9fa5-f8912a847247.jpeg)

サインインに成功すると、アプリケーション作成画面が表示されます。

![difyホーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/8d408e79-b459-4d06-a773-2a9c8b22cbef.png)


### LLMモデルプロバイダーの設定
このままアプリの作成に入りたいところですが、使用するLLMモデルを設定する必要があります。
右上の名前アイコンから、``設定``を選択します。
「モデルプロバイダー」のタブから、使用したいモデルプロバイダーを選択して設定していきます。

![モデルプロバイダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/07d8530e-e232-4fed-b805-5be3540aa542.png)


今回は「Amazon Bedrock」を使用します。
Amazon Bedrockを選択し、インストールします。

![モデルインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/a4c32686-112b-4ea8-ac2f-291c61bd4f99.png)

その後、AWSのセットアップとして以下設定値を入力します。
- Access Key：入力不要
- Secret Access Key：入力不要
- AWS Region：`Asia Pacific（Tokyo）`
- Bedrock Endpoint URL：入力不要
- Available Model Name：`anthropic.claude-3-5-sonnet-20240620-v1:0`

![Bedrock設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/cb45ef20-3f9d-4836-bd59-ef983c418152.png)

本来はAWSユーザーのアクセスキーなどを入力する必要がありますが、今回はEC2インスタンスに``AmazoBedrockFullAccess``のポリシーが入ったIAMロールをアタッチしてあるため、入力不要です。
また、``Available Model Name``には、アクセスを許可したモデルであれば何を入力しても構いません。

以上の設定により、Bedrock上のモデルが使えるようになりました。

![Bedrockモデル一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/4c1bf538-9ac7-4b20-96b0-843c77465db9.png)

これにより、事前設定は完了です！
Bedrockを用いて生成AIアプリケーションを作成することができるようになりました。

# ５．『Qiita記事レビューさん』を作ってみた！！
今回は、**Qiita記事を採点するための生成AIアプリケーション**を作成してみます。
せっかく頑張って技術ブログを書きあげても、
> 「内容に漏れはないかな？」
> 「ちゃんと伝わる文章になってる？」
> 「閲覧数伸びる？？」

.....などの不安、ありますよね？
そこで活躍するのが、今回作成するQiita記事採点アプリです！
（ついでにQiita記事要約機能も追加しています。）
以下に作成手順を示します。

## アプリの作成手順
まずは、ホーム画面の「スタジオ」タブより「最初から作成」を選択し、アプリの種類は「チャットフロー」を選択します。
アプリ名は『Qiita記事レビューさん<辛口>』にします。

![アプリ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/b53738ec-4dc0-4181-949a-dca899d7b7d4.png)

「チャットフロー」は、会話の流れをブロックで組み立てられる機能です。
「質問する」「外部データを取ってくる」「回答する」などのやりとりを順番に並べるだけで、複雑なチャットボットが簡単に作成できます。
公式ドキュメントにて、各ブロックの詳細が説明されています。

https://docs.dify.ai/ja-jp/guides/workflow/node

![ブロック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/d2965c39-4b86-435b-b30c-76fdb8a25f09.png)


今回使用するブロックは以下の６種類です。
- **開始**：アプリ実行時の入力。チャットフローに必ず１つ必要
- **回答**：チャットの応答内容を定義。フローの最後に必須
- **LLM**：LLMを呼び出して自然言語を処理
- **IF/ELSE**：条件に基づいてフローを分割
- **テキスト抽出**：ドキュメントをテキストに変換
- **質問分類器**：質問の分類条件を定義

紹介したブロックを組み合わせて、以下のようなフロー図を組みます。
LLMにはすべて「Claude 3.5 Sonnet」を使用しました。

![Qiita記事レビューさん チャットフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/5c044142-7f80-4384-a61c-2aea92246d5a.png)

これでアプリの作成は完了です。
次は実際にこのアプリケーションを使用してみます。

### [補足] アプリの詳細
各ブロックの詳細な設定について以下に示します。

<details><summary>開始</summary>

![開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/d4731f6c-f4ed-481d-b98c-a2b885914fee.png)

</details>

<details><summary>IF/ELSE</summary>

![IFELSE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/d6f90684-be5b-4718-b8d3-dcaf1789b9f2.png)

</details>

<details><summary>選択</summary>

![選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/ac4fddd0-2c88-401b-a804-80f25d9649e2.png)

> 以下どちらかを選択してください。
① 要約をする
② 辛口レビューを受ける

</details>

<details><summary>読み込み中</summary>

![読み込み中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/644d689b-a8b4-4749-bf13-1bbdd1ab4d4d.png)

> 承知いたしました。
ドキュメント内容を読み込んでいます...........。

</details>

<details><summary>テキスト抽出ツール</summary>

![テキスト抽出ツール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/9865c794-7c5f-4d4d-9e6b-cfafb252d9be.png)

</details>

<details><summary>フロー終了</summary>

![フロー終了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/cb2123e7-625f-411b-8a2d-28d6a64596b2.png)

> ​「新しいチャット」を開いて別の資料を入力してください。

</details>

<details><summary>サマリー OR レビュー</summary>

![サマリー or レビュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/a1e9a8cb-df89-447d-85c4-cc993596f480.png)

> クラス１
①記事内容の要約

> クラス２
②記事内容を辛口レビュー

</details>

<details><summary>サマリー</summary>

![サマリー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/8790cef4-0d09-4975-b3ac-6c3f5aee5774.png)

> SYSTEM
あなたはサマリー作成者です。

> USER
添付されたPDF（テキスト抽出ツール/text）は、Qiitaという技術者向けブログサイトに掲載予定の資料です。資料の構成に従い、要約をお願いします。

</details>

<details><summary>辛口レビュー</summary>

![辛口レビュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/86a5c306-512d-4ac2-a35e-1c607b234b92.png)

> SYSTEM
あなたは辛口で厳格ながら、部下の成長を本気で考える公正な上司です。

> USER
添付されたPDF（テキスト抽出ツール/text）は、Qiitaという技術者向けブログサイトに掲載予定の資料です。この資料をレビューしてください。レビューの目的は、資料の質を高め、読者にとって技術的・実用的に価値ある投稿を実現することです。
指示
・技術ブログとしての点数を100点満点で太字で文字の大きさを大きく目立つように最初に示してください。
・点数は資料ごとに有意差が出るように、広い範囲（0~100）で点数をつけてください。
・批評は長くなりすぎないように、要点をまとめてください。
・部下が具体的に「何を直せばよいか」を理解できるようにフィードバックしてください。
・実際にQiitaに投稿された場合の読者の反応を予測し、それを踏まえたアドバイスも記載してください。
・改善点は具体的に場所を示してください。
評価の観点
1.技術的な正確性: 内容に誤りや曖昧さがないか、根拠が適切か。
2.分かりやすさ: 初心者にも直感的に理解でき、説明が明確か。
3.構成: 情報が論理的で適切に整理されているか。
4.読者の興味を引きつける表現力: タイトルや文章がキャッチーか。
5.不足情報や改善点: 読者に混乱を与える箇所がないか。
出力フォーマット
1.全体の評価（辛口で総評）: 点数と資料全体の印象を簡潔に。
2.改善が必要なポイント: 問題点と具体的な改善案（箇条書きで詳細に）。
3.良かった点: 評価すべき部分を短く記載し、モチベーション向上に繋げる。

</details>

<details><summary>サマリー出力</summary>

![サマリー出力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/c7aac979-df44-4c80-9afa-4daec5f9607d.png)

</details>

<details><summary>辛口レビュー出力</summary>

![辛口レビュー出力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/135500d7-eabf-4f7d-8476-674fe0d7670e.png)

</details>

## アプリの使い方
### Qiita記事を要約する
ホーム画面の「探索」タブより、先ほど作成したアプリを選択します。

![探索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/0a49bb2a-4768-4568-83a9-efce36426273.png)

「ローカルアップロード」より、Qiita記事を選択します。
今回は以前執筆した記事である
『[【ツール紹介】その生成AI、ちゃんと働いてる？OpenLITで見守ろう！！](https://qiita.com/melhts/items/a3d9d4c82a5712e73e21)』
をPDF化したものを選択しました。

![Qiita記事レビュー実践１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/20aa4c8c-13e3-4c26-a5cc-d3cbab74568d.png)

「チャット開始」を選択し、会話を始めると、
1. 要約をする
2. 辛口レビューを受ける

を選択するよう促されます。

![Qiita記事レビュー実践２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/1bbfe848-41de-4f7a-b5a0-50a96562d887.png)

まずは要約から試します。
> 「要約をお願いします」
> 「１」

などと入力することで、Qiita記事の要約をしてくれます。
以下に要約内容を示します。

![要約実践.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/1adbf52f-c981-4411-9197-313883a117ec.png)

要約内容には、「OpenLITの導入と使用方法について解説している」との記載があり、**記事の内容と一致**しています！
その他の細かい内容についても完全に一致しており、かなり精度の高い要約が可能です。

また、追加で話かけると以下のような回答が返ってくるため、別資料の要約やレビューをする場合は「新しいチャット」を開く必要があります。

![要約実践２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/347112dc-c54d-4e0a-a792-9b8950ec5609.png)

### Qiita記事を辛口レビューする
「新しいチャット」を選択し、先ほどと同じQiita記事を選択します。
今回は「②辛口レビュー」を選択します。
以下にレビュー内容を示します。

![レビュー実践.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/45340296-94a5-4c33-978a-3d45869f3474.png)

なかなかに耳が痛いコメントですね.....
特に読者層の想定は意識したいと思っている部分ですので、とても勉強になりました。

以上のようにQiita記事の要約およびレビューができる**生成AIアプリを簡単に作成する**ことができました！
Qiita記事を執筆した後に使用することで、改善の参考になるかと思います。

### [補足] 生成AIアプリを配布する
ホーム画面の「スタジオ」タブより、特定のアプリを選択します。
ページ左のタブから「監視」を選択すると公開URLが記載されています。

![URL配布.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/43475e1a-70ee-4440-803a-ceeff9f7d208.png)

このURLおよびQRコードを共有することで、アプリを使用することができます。

:::note warn
アプリを共有する場合は、EC2インスタンスに紐づけたセキュリティグループのインバウンドルールを適切に設定する必要があります。
:::

# ６. おわりに
今回は初級エンジニアの私が、**生成AIアプリケーション開発ツールであるDifyを導入し、アプリ作成までの工程をまとめ**ました。

Difyでは、本当に簡単に生成AIアプリを作ることができるので、「まったくコーディングできないです」という方もぜひ触ってみてほしいです！！
[Dify公式ドキュメント](https://docs.dify.ai/ja-jp)には、生成AIアプリ作成のための情報が日本語でわかりやすく解説されているため、ぜひ参考にしながら進めてください。

ただ、アプリを作ったあとには
> 「これってちゃんと動いてるの？」
> 「リクエスト数やトークンの消費ってどうなってるの？」

といった、運用面での不安や疑問も出てくるかもしれません。
次回は、そんな“作ったあとの不安”を解消するためのツールとして「**LangSmith**」を使用した記事を投稿する予定です。

最後までお読みいただき、ありがとうございました。