【最新LLM情報/Dify】オープンソースLLM開発プラットフォーム

みなさんこんにちは。最近話題となっているDifyというツールについて調べてみました。

# Difyとは
オープンソースの大規模言語モデル（LLM）アプリケーション開発プラットフォームで、Backend-as-a-ServiceとLLMOpsの概念が組み合わさったソフトウェアです。通常LLMの開発には複雑なコード作成が必要になりますが、技術者ではない開発者でも、本番レベルの生成AIアプリケーションをすばやく構築できるのが一番の特徴になります。

## Difyを使うと何ができるの？
* ノーコードでAIアプリケーションを直感的に構築
* 50以上の組み込みツールを使ったAIエージェントを数クリックで構築できる
* GPT-4、Claude、Llama3など、アプリケーションの作成に使うことができる多様なLLMモデルをサポート
* RAG(Retrieval-Augmented Generation)エンジンにより、関連情報の検索・取得と高品質な回答生成が可能
* ワークフロー機能を使用し、グラフィカルな処理フローの設計が可能

## サポートされる主要LLMモデルのプロバイダーとモデル

* OpenAI
    * gpt3.5-turbo
    * gpt4
    * gpt4-Turbo
    * gpt4-vision
* Azure OpenAI
* Anthropic
    * claude-opus
    * claude-sonnet
    * claude-haiku
* Google
    * gemini-1.5-pro
    * gemini-pro
    * gemini-pro-vision
* Cohere
    * command-r
    * command-r-plus
* Bedrock
    * titan-text-g1
* Hugging Face

※上記に記載がない項目についても、たくさんのモデルをサポートしています
※LLMモデルについては、更新が早いためドキュメント化はされていません
※LLMプロバイダについては下記ページを参照のこと

https://docs.dify.ai/getting-started/readme/model-providers

## 利用方法
Difyを使うには、以下の2つの方法があります。

* クラウド版のDify Cloudを利用する方法
    * セットアップ不要ですぐに使えるクラウドサービス。プランによって異なるが、ストレージ容量やチームで使うかどうかなどで、利用できるプランが変わる
* セルフホスティング（ローカル環境）でDifyを利用する
    * Dockerを使ってローカル環境にDifyをインストールして利用する
    * DockerDesktopが動作する環境、DockerVMが2vCPU、8GBメモリを利用できる環境

※料金ページについては、下記を参照ください

https://dify.ai/pricing

※ローカル環境のスペックについては、下記のローカル環境へのセットアップの項にあるURLを参照ください

### ローカル環境へのセットアップ
#### セットアップ環境
* linuxの場合
    * Docker 19.03 以降がインストールされていること
    * Docker Compose 1.25.1 以降がインストールされていること
    * Python 3.10 の環境が動作すること（手順ではAnacondaを利用）
    * Node.js v18.x がインストールされていること
    * NPM version 8.x.x がインストールされていること

※基本的には下記手順に沿って設定作業を実施しています

https://docs.dify.ai/getting-started/install-self-hosted/local-source-code

#### 1. dockerタスク実行
レポジトリからファイルを取得して、dockerタスクを起動

```
git clone https://github.com/langgenius/dify.git

cd docker
docker compose -f docker-compose.middleware.yaml up -d
```

#### 2. APIサーバの構築
##### Python環境の構築
anacondaでpython環境を新規作成

```
conda create --name dify python=3.10
```

※以前作成した環境に何か作業を行う場合は以下のコマンドを使用

```
conda activate dify
```

##### 環境変数の設定
APIフォルダへ移動し、作成した秘密鍵を`.env`ファイルに保存する

※openssl rand -base64 42の出力結果を<your_value>と置き換えて次のコマンドを実行する

```
cd api

openssl rand -base64 42
sed -i 's/SECRET_KEY=.*/SECRET_KEY=<your_value>/' .env
```
##### Python環境の設定
依存関係のモジュールをセットアップする
```
pip install -r requirements.txt
```

##### APIサーバの起動

```
flask db upgrade
flask run --host 0.0.0.0 --port=5001 --debug
```

#### 3. フロントエンドサーバの構築
##### npmのインストール
下記コマンドでインストールする

```
cd web
npm install
```

##### 環境変数の設定
必要に応じて環境変数を設定します

* NEXT_PUBLIC_DEPLOY_ENV
    * 開発環境の場合は "DEVELOPMENT"、本番環境の場合は "PRODUCTION" に設定
* NEXT_PUBLIC_EDITION
    * セルフホスティングの場合は "SELF_HOSTED"、クラウドサービスを使用する場合は "CLOUD" に設定
* NEXT_PUBLIC_API_PREFIX
    * コンソールアプリケーションのベースURLを設定します
    * APIやWebアプリのドメインがコンソールのドメインと異なる場合は、WEBサービスのコンソールベースURLを指定
    * 例) `http://cloud.dify.ai/console/api`
* NEXT_PUBLIC_PUBLIC_API_PREFIX
    * WebアプリのURLを設定します。WebアプリのドメインがコンソールやAPIのドメインと異なる場合は、WEBサービスのWebアプリベースURLを指定
    * 例) `http://udify.app/api`
* NEXT_PUBLIC_SENTRY_DSN
    * Sentryを使用する場合は、SentryのDSN（Data Source Name）を設定
    * Sentryを使用しない場合は空のまま
* NEXT_PUBLIC_SENTRY_ORG
    * Sentryを使用する場合は、Sentryのオーガニゼーション名を設定
    * Sentryを使用しない場合は空のまま
* NEXT_PUBLIC_SENTRY_PROJECT
    * Sentryを使用する場合は、Sentryのプロジェクト名を設定
    * Sentryを使用しない場合は空のまま


```
# For production release, change this to PRODUCTION
NEXT_PUBLIC_DEPLOY_ENV=DEVELOPMENT
# The deployment edition, SELF_HOSTED or CLOUD
NEXT_PUBLIC_EDITION=SELF_HOSTED
# The base URL of console application, refers to the Console base URL of WEB service if console domain is
# different from api or web app domain.
# example: http://cloud.dify.ai/console/api
NEXT_PUBLIC_API_PREFIX=http://localhost:5001/console/api
# The URL for Web APP, refers to the Web App base URL of WEB service if web app domain is different from
# console or api domain.
# example: http://udify.app/api
NEXT_PUBLIC_PUBLIC_API_PREFIX=http://localhost:5001/api

# SENTRY
NEXT_PUBLIC_SENTRY_DSN=
NEXT_PUBLIC_SENTRY_ORG=
NEXT_PUBLIC_SENTRY_PROJECT=
```
##### フロントエンドサーバの起動
コードをビルドし、Web サービスを開始する

```
npm run build
npm run start
```

## アプリケーション実行
difyにログインすると下記のような画面が表示されます。ここでオリジナルのアプリケーションを構築するか、すでに登録してあるアプリケーションを動かすこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/05902cc9-e9b3-5466-ccc3-dbc909af9eeb.png)


登録済みアプリケーションは探索の画面から探すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/8a8ca651-6afc-faba-6fbf-d2aa4ce8009a.png)

#### 余談な話ですが・・
レポジトリからファイルを取得して、以下のコマンドでdockerタスクを起動するだけでも動作しました。
現実的にはこちらの方がよさそうですネ。。

```
git clone https://github.com/langgenius/dify.git

cd docker
docker compose up -d
```

## まとめ
軽く触ってみた感じ、色々出来そうな雰囲気があります。自分で開発するよりは、すでにアプリケーションとして登録されているものを使う方がより早く自分がやりたいことをできそうですね。次はもう少しアプリケーションを触ってみて、その内容をまとめられればと思います。