LoginSignup
1
5

Dify(ディファイ)on WSL2でgpt-4oを実験

Last updated at Posted at 2024-05-25

1.はじめに

Difyの登場で今まで生成AIのLLMの評価に時間を費やしていた企業などは、Difyの利用により、その時間を短縮し、より効率的な開発作業に注力することが可能となりました。
Difyの利用によって、開発者はAIの評価にかかる時間を大幅に削減し、開発作業の効率化が可能となります。
また、生成AIがマルチモーダルへの進化を遂げていく中で、Difyのようなローコードプラットフォームを活用することで、短時間でのサービス立ち上げが可能となり、開発の効率化が更に進むと思われます。

2.Difyとは

Dify(Do It For Yourselves)は、Luyu Zhang氏がCEOの米国のデラウェア州のLangGenius, Inc.が展開するクラウドサービスのローコードLLM(大規模言語モデル)アプリケーション開発プラットフォームです。
Difyはオープンソースのため、Apache License 2.0で商用利用も可能です。
DifyはBaaS(Backend-as-a-Service)とLLMOpsの概念を組み合わせ、開発者が簡単に本番グレードの生成AIアプリケーションを構築できるようにしています。
プロンプト編集インターフェース、高品質なRAGエンジン、柔軟なエージェントフレームワークなどの主要技術スタックを統合しており、数百のモデルをサポートしています。開発者は再発明の手間を省き、イノベーションとビジネスニーズに集中できます。
公式の初心者向けのチュートリアル動画がありますので、以下にリンクを貼ります。

2.1. Difyの構造

Dify-0.6.8よりdocker-ssrf_proxy-1が増えたため、現在は9つのマイクロサービスで構成されています。
docker-nginx-1ではリバースプロキシーのような働きで外部80ポート(HTTP)を内部80ポート(HTTP)に中継しているようです。
サーバ証明書をnginxに導入すればTLS化も容易にできそうです。
WSL2で動かすと、VM+Dockerと多段構成になるので、かなり動作が重いです。
本番運用するならば、物理LinuxサーバやAWS EC2などで動かした方が現実的かもしれません。

3.特徴

langgenius/dify(GitHub)のREADME_JA.mdより引用

No 機能 説明 備考
ワークフロー ビジュアルキャンバス上で強力なAIワークフローを構築してテストし、以下の機能を活用してプロトタイプを超えることができます。
2 包括的なモデルサポート 数百のプロプライエタリ/オープンソースのLLMと、数十の推論プロバイダーおよびセルフホスティングソリューションとのシームレスな統合を提供します。GPT、Mistral、Llama3、およびOpenAI API互換のモデルをカバーします。サポートされているモデルプロバイダーの完全なリストはhttps://docs.dify.ai/getting-started/readme/model-providersをご覧ください。
3 プロンプトIDE チャットベースのアプリにテキスト読み上げなどの追加機能を追加するプロンプトを作成し、モデルのパフォーマンスを比較する直感的なインターフェース。
4 RAGパイプライン 文書の取り込みから取得までをカバーする幅広いRAG機能で、PDF、PPTなどの一般的なドキュメント形式からのテキスト抽出に対するアウトオブボックスのサポートを提供します。
5 エージェント機能 LLM関数呼び出しまたはReActに基づいてエージェントを定義し、エージェント向けの事前構築済みまたはカスタムのツールを追加できます。Difyには、Google検索、DELL·E、Stable Diffusion、WolframAlphaなどのAIエージェント用の50以上の組み込みツールが用意されています。
6 LLMOps アプリケーションログとパフォーマンスを時間の経過とともにモニタリングおよび分析します。本番データと注釈に基づいて、プロンプト、データセット、およびモデルを継続的に改善できます。
7 BaaS(Backend-as-a-Service) Difyのすべての提供には、それに対応するAPIが付属しており、独自のビジネスロジックにDifyをシームレスに統合できます。

Release v0.6.8 GPT-4o is available now in Dify · langgenius/dify · GitHub

4.Difyのホスティング

Docker Composeでホスティングするのが簡単でお勧めです。
私の動作実績ではAWSのEC2、WSL2+Docker Composeで動作実績があります。
まだ試せていませんがAWS Amazon LightsailやACI(Azure Container Instances)などのマルチコンテナーに対応したクラウド環境でも動かせそうです。
Difyはマイクロサービスが9つも動作するのでIaaSのセキュリティ対策コストを感が無ければ、IaaSで立ち上げた方が安価にすむかもしれません。
そのうちACIなどでも動かしてコスト比較してみます。

No ホスティング環境 確認状況 備考
1 Windows Docker 未テスト
2 Linux Docker EC2 UbuntuのDocker環境で動作実績あり
3 Windows+WSL2+Docker 動作実績あり、但しかなりもっさり
4 Windows+Node.js+Python 未テスト どのようにAPIサーバなどが動作するのか興味あります

5.Difyの起動

Difyの構築はGitHubのソースコードからの構築とDocker Composeでの構築の2つの方法があります。
DifyはGitHubで最新版を取得します。

[root@Ardbeg ~]# git clone https://github.com/langgenius/dify.git
[root@Ardbeg ~]# cd dify/docker
[root@Ardbeg docker]# docker-compose up -d
WARN[0000] /root/dify/docker/docker-compose.yaml: `version` is obsolete
[+] Running 13/27
 ⠴ api Pulling                                                                                                     8.5s
 ⠴ web [⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀] Pulling                                                                                     8.5s
 ⠴ sandbox [⠀⠀⠀⠀⠀⠀] Pulling                                                                                        8.5s
 ⠴ worker [⣿⣿⣿⣿⣿⣿⣦⣀⣿⣿⣿] 266.8MB / 526.7MB Pulling                                                                  8.5s
 ⠴ ssrf_proxy [⠀⠀⠀] Pulling                                                                                        8.5s
 
 ...
 ✔ Network docker_ssrf_proxy_network  Created                                                                      0.0s
 ✔ Container docker-db-1              Started                                                                      0.0s
 ✔ Container docker-redis-1           Started                                                                      0.0s
 ✔ Container docker-weaviate-1        Started                                                                      0.0s
 ✔ Container docker-ssrf_proxy-1      Started                                                                      0.4s
 ✔ Container docker-worker-1          Started                                                                      0.6s
 ✔ Container docker-api-1             Started                                                                      0.6s
 ✔ Container docker-sandbox-1         Started                                                                      0.5s
 ✔ Container docker-web-1             Started                                                                      0.4s
 ✔ Container docker-nginx-1           Started                                                                      0.1s
[root@Ardbeg docker]# docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED          STATUS                            PORTS                               NAMES
ea63d3c898a3   nginx:latest                       "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes                      0.0.0.0:80->80/tcp, :::80->80/tcp   docker-nginx-1
59e9eb40c84e   langgenius/dify-sandbox:0.2.0      "/main"                  3 minutes ago    Up 3 minutes                                                          docker-sandbox-1
50f638446767   langgenius/dify-api:0.6.8          "/bin/bash /entrypoi…"   3 minutes ago    Up 3 minutes                      5001/tcp                            docker-worker-1
303d312d24f3   langgenius/dify-web:0.6.8          "/bin/sh ./entrypoin…"   3 minutes ago    Up 3 minutes                      3000/tcp                            docker-web-1
d1d021de753e   ubuntu/squid:latest                "entrypoint.sh -f /e…"   3 minutes ago    Restarting (134) 35 seconds ago                                       docker-ssrf_proxy-1
c6719c81e47b   langgenius/dify-api:0.6.8          "/bin/bash /entrypoi…"   3 minutes ago    Up 3 minutes                      5001/tcp                            docker-api-1
daf0f2add025   redis:6-alpine                     "docker-entrypoint.s…"   42 minutes ago   Up 3 minutes (healthy)            6379/tcp                            docker-redis-1
6415130266ef   postgres:15-alpine                 "docker-entrypoint.s…"   42 minutes ago   Up 3 minutes (healthy)            5432/tcp                            docker-db-1
01ba4d124fe9   semitechnologies/weaviate:1.19.0   "/bin/weaviate --hos…"   42 minutes ago   Up 3 minutes                                                          docker-weaviate-1

※私の環境では、docker-composeがすでに導入されているため、docker-composeを使用しています。docker composeコマンドでも動作は可能です。

※既にDify-0.6.7以前のバージョンをお使いの方

Dify-0.6.7を導入済みの方は2024年5月13日にローンチされたDifyの0.6.8の docker-compose.yamlファイル にアップデートが必要です。
アップデート手順は「v0.6.8 GPT-4o is available now in Dify」を参照してください。

[root@Ardbeg dify]# git checkout main
[root@Ardbeg dify]# git pull origin main
[root@Ardbeg dify]# cd docker
[root@Ardbeg docker]# docker-compose up -d
WARN[0000] /root/dify/docker/docker-compose.yaml: `version` is obsolete
[+] Running 35/27
 ⠋ api Pulling                                                                                                   107.0s
 ⠋ web [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 17.82MB / 25.44MB Pulling                                                                 107.0s
 ✔ sandbox Pulled                                                                                                 22.9s
 ⠋ worker [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 517.2MB / 526.7MB Pulling                                                                107.0s
 ✔ ssrf_proxy Pulled                                                                                              15.9s

6.Difyへのアクセス

WSL2を使用して構築したDifyにはlocalhostでアクセス可能です。

http://localhost/

Dify_Screen.png

起動したらバージョンがGPT-4oに対応する0.6.8になっていることを確認しましょう。
GitHubの「v0.6.8 GPT-4o is available now in Dify」ページ参照

Dify_version.png

7.Azure OpenAIのgpt-4oには未対応

GitHubの「v0.6.8 GPT-4o is available now in Dify」ページには「Introduced OpenAI GPT-4o by @Yeuoly in #4346.」とあり、OpenAI GPT-4oと明示的に記載されていますので、Azure OpenAIのGPT-4oは対応してなさそうです。
v0.6.9 Workflow as Toolによればv0.6.9にて正式にAzure OpenAI Serviceに対応したようです。

以下はv0.6.9の機能エンハンス

Other New Features
GPT-4o for Azure: Added support for GPT-4o on Azure by @leslie2046 in #4568.
Vertex AI Support: Added support for Vertex AI by @patryk20120 in #4586 and @miendinh in #4641.
Gemini Flash: Added Gemini Flash by @QuietRocket in #4616.
Doubao LLM and Embedding Models: Added support for Doubao LLM and embedding models by @sinomoe in #4431.
Amazon Titan V2: Added support for Amazon Titan V2 and updated pricing for Titan V1 by @longzhihun in #4643.
Ernie-Character-8k of Wenxin: New LLM Ernie-Character-8k added by @jiaqianjing in #4448.
Claude Stream Tool Call: Enhanced Claude stream tool call by @Yeuoly in #4469.
Chat Custom Disclaimer: You can add custom disclaimers in WebApp by @patryk20120 in #4306.
MiniMax Mode Sensitive Info Masking: Added parameter config for masking sensitive info in MiniMax mode by @zhangever in #4294.
Jina Search & Reader CSS Selectors: Added CSS selectors for Jina Search & Reader by @rennokki in #4523.
Images and Tables Extraction from DOCX: Now supports extracting images and tables from DOCX files by @JohnJyong in #4619.

OpenAI Service

OpenAIではgpt-4oに対応しています。
Dify_OpenAI_LLMs.png

Azure OpenAI Service
予想どうり、Difyの0.6.8ではAzure OpenAIのgpt-4oには対応していないようです。
Dify_AOAI_LLMs.png

8.gpt-4oの設定

2024年5月25日(土)時点ではgpt-4oは前途のようにOpenAI Serviceでしか導入できないため、OpenAIでのAPIキー設定例を以下に貼り付けます。
OrganizationやAPI Baseなどは空欄で大丈夫です。

Setting_gpt4o.png

9.使ってみる

Difyで作成したフローを「公開する」で公開し、「アプリを実行」とすると以下のようなアプリのURLが生成されブラウザが開くので、ここが一般ユーザがアクセスするサイトとなります。
チャットボットをローコードで作成して、URLを生成して一般公開という流れになります。

http://localhost/chat/DR5cAM133kvpxxqJ

9.1. 写真の説明

image_recognition.png

この画像には、バーのカウンターに並べられた飲み物のボトルとショットグラスが写っています。
中央には「Sauza Hacienda Tequila Silver」と明記された大きなテキーラのボトルがあり、その前に冷えたショットグラスが置かれています。
背景には他のアルコール飲料のボトルが見え、左上にオレンジ色の装飾物が少し写っています。
ボトルの裏側には「ALCOOL」や「STOLICHNAYA」のラベルが確認でき、おそらくリキュールやウォッカの一部です。
また、背景には「WORLD'S No.1 BO」の文字も確認できます。このシーンはバーかパブの一部と思われます。

9.2. 構成図の解説

システムプロンプト

あなたは優秀なAIアシスタントです。
ユーザーからの質問をStep-By-Stepで考えて、適切で分かりやすい回答をしてください。
回答できない場合は無理に回答せず、「知識が無くて回答できません。」と答えてください。
回答を作成する際は根拠となるホームページや情報のエビデンスを[1](https://yahoo.com/)形式で文章の最後に追加してください。

GPT-4-Visionで試してみたところ、アップロードボタンが表示され画像がアップロードできるようになった。

画像はpng、jpg、jpeg、webp、gifに対応している模様

試しに「すべてのファイル」にしてMarkdownをアップロードしてみたがアップロードは受け付けられなかった。)

Dify_upload_file.png

Dify_gpt4o_explain_image.png

10.気に入った点

  • LLMの対応が早いこと
    OpenAIのSpring Updateは2024年5月13日 10時 現地時間(2024年5月14日 2時 日本時間)に開催されましたが、Difyはv0.6.8を2024年5月13日にローンチしました。
    v0.6.8 GPT-4o is available now in Dify
  • 画像限定ですがマルチモーダルが直ぐに試せること
    最近はPlayGroundの対応も早いですが
  • ollamaに対応していること
    ローカル環境でLLMを動作させるollmaのAPIを設定できるため、MetaのLlama3やMicrosoftのPhiにも直ぐに対応できます。
    Open WebUIでもよいかもしれませんが、他のLLMと環境を共存できます。
  • フローを組めること
    LLMは多様な特性を持つため、フローを使用してマルチLLM環境で特性を活かしたチャットボットを作成できます。

11.気になった点

11.1. GUIがかなりプア

会話のスレッド管理や画像アップロードなど、最低限の機能しかありません。

具体的にはMarkdown上のMermaidコードブロック等が表示できません。

  • Markdownの表の表示
    Dify_Markdown_table.png

  • Markdownのコードブロック
    Dify_Markdown_codeblock.png

  • MarkdownのMermaidコードブロック
    Dify_Markdown_mermaid_codeblock.png

11.2. 画像ファイル以外アップロードできない

Word、ExcelやPowerPoint、PDFファイル、markdownをアップロードできません。
※markdownはプロンプトのコンテキスト部分に入力すれば受け取ってはくれますが、バイナリファイルは正直サポートしてほしいですね。
Dify_upload_filetypes.png

11.3. チャット履歴のイメージ画像

アップロードしたファイルはブラウザセッションを開き直した時にチャット履歴に表示されません。(これは困る)
Dify_reconnection.png

12.使い方のアイデア

12.1. 埋め込みの活用

埋め込みでのチャットボットなどは簡単に作成できるので、RAGやRerankを使用した埋め込み型の問い合わせシステムを構築するにはよさそうです。

12.2. BaaS(Backend-as-a-Service)を活用

GUIがリッチなChatbot UIなどのカスタムLLMを使用して、Difyで作成したフローをChatbot UIのGUIから利用する。

13.参考サイト

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5