Difyって何?
少し前から話題の、プログラミングなしで生成AIアプリケーションを開発できるOSSです。
「Dify すごい」 でSNSを検索すると、驚き屋さんがみんな驚いています。このゴールデンウィークはAmazon BedrockとDifyの話題でもちきりでしたね。
元々は「GPTビルダーのOSS版ね。はい解散」という感じだったのですが、最近追加された「ワークフロー」機能がすごく便利のようです。
ちょっとしたアプリなら、ローコードで簡単に作れてしまうとのこと。
最近は自分でPCやサーバー準備して動かさなくても、SaaS版が公式から準備されたようです。無料プランもあります。
やってみた
サインアップ
公式サイト右上の「Get Started」からサインアップします。
GitHub連携すると、いきなり開発画面に辿り着きました!いいUX。
「(いち?)から作成」よりワークフローを作ってみましょう。まだベータ版のようです。
アプリ名は「ワイのかわりに検索くん」にしてみます。
ワークフロー作り
最初に配置されている「開始」というモジュールをクリックして、「入力フィールド」に Input
という名前の変数を定義しておきます。
これによって、まずアプリの開始時にユーザーから質問を受け取れるようにします。
次に、開始モジュール右側の「+」ボタンから新しいコンポーネントを追加します。
ユーザーの質問をもとに、まずGoogle検索をさせたいので「GoogleSearch」を追加しましょう。
最初にSerpApiのAPIキーが必要なので、アカウントがない方はGoogleアカウント連携などでサインアップしてください。一定は無料で使えます。
入力変数に、先ほど「開始」モジュールで設定した Input
を指定し、Result typeをURLではなく text
に設定しておきましょう。
その後、検索結果を受け取って推論する「LLM」モジュールを追加します。
モデルは、無料で選べる中で高性能な gpt-3.5-turbo-16k-0613
を選択し、Systemプロンプトに以下を入力します。
以下の「ユーザーの質問」に対して、「Google検索結果」を用いて回答してください。
「ユーザーの質問」:{{#1714964227074.input#}}
「Google検索結果」:{{#1714964362288.text#}}
※変数部分は /
を入力してサジェストから選択できます。
最後に「終了」モジュールを追加すれば完成です。
LLMの回答が出力されるように、出力変数に LLM / text
を設定しておきましょう。
いざ、テスト!
それでは実際に使ってみます。
画面右上の「実行」を押して、テストウィンドウの入力に「Difyって何?」と入力してみます。素のGPTはまだ知らない知識なので、Google検索しないと正しく回答できない質問です。
すると、ワークフローが流れて正しい回答が出力されました!これでアプリの完成が確認できました。
アプリを公開して使ってもらおう!
画面右上の「公開する」を押すと、誰でもブラウザからこのアプリケーションにアクセス可能なURLが発行されます。
超便利ですね!
※残念ながら、入力欄は日本語変換の「Enter」を押すとチャットが送信されてしまう、海外アプリあるあるなバグ持ちのようです。
PythonからAPIを使ってみよう
さらに、APIからの利用にも対応しています。アプリの公開ボタンより、APIリファレンスにアクセスできます。
これを丸々Claude 3 Opusに食わせて、「試しにPythonのサンプルコードを生成して」と頼んでみました。
Claudeくんと一緒に少しトラブルシュートすると、動くコードが完成しました👏
import requests
import json
API_KEY = "app-XXXXXXXXXXXXX" # DifyのAPIキーを入れてください
BASE_URL = "https://api.dify.ai/v1"
# ワークフローの実行
def run_workflow(inputs, response_mode, user):
url = f"{BASE_URL}/workflows/run"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
data = {
"inputs": inputs,
"response_mode": response_mode,
"user": user
}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
if response_mode == "blocking":
result = response.json()
if "data" in result and "outputs" in result["data"] and "text" in result["data"]["outputs"]:
return result["data"]["outputs"]["text"]
else:
print("Error: 'text' not found in the API response.")
elif response_mode == "streaming":
for chunk in response.iter_content(chunk_size=None):
if chunk:
print(chunk.decode())
else:
print(f"Request failed with status code {response.status_code}")
# ワークフローの停止
def stop_workflow(task_id, user):
url = f"{BASE_URL}/workflows/{task_id}/stop"
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
data = {"user": user}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
return response.json()
else:
print(f"Request failed with status code {response.status_code}")
# アプリケーション情報の取得
def get_parameters(user):
url = f"{BASE_URL}/parameters?user={user}"
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
else:
print(f"Request failed with status code {response.status_code}")
# サンプル実行
if __name__ == "__main__":
inputs = {"input": "Bedrockって何?"} # ここに質問を入れる
response_mode = "blocking"
user = "example_user"
result = run_workflow(inputs, response_mode, user)
print(result)
実行結果👇
❯ python dify.py
「Bedrock」とは、複数の意味があります。
1つ目の意味は、マインクラフトのバージョンに関連しています。マインクラフトには「Java版」と「Bedrock版(統合版)」という2つのバージョンがあります。Bedrock Editionは、鮮やかなグラフィックや改良された地形、アイテム、公式のアドオンシステムなど、Java Editionとは異なる特徴を持っています。
2つ目の意味は、Amazon Bedrockというサービスです。これは、APIを通じて主要な基盤モデルを利用できるフルマネージド型のサービスで、生成系AIアプリケーションを構築することができます。
3つ目の意味は、地学の用語で、地表下に存在する固い岩石層を指します。この岩石層は、土壌や堆積物の下にあり、地球の表面を形成する基盤となります。
以上が「Bedrock」の意味の一部です。詳細な情報や他の意味については、提供されたリンク先を参照してください。
めでたくPythonから、自分のDifyアプリのAPIを利用することができました!
おまけ
AWSのMarketplaceにもDifyがありました。AMIとして提供されているので、EC2インスタンスでDifyをホストできるようです。
最後に宣伝ですが、AWSで生成AIアプリ開発に入門できる本を書きました!すでにアマゾン等で予約可能です✌️