現場直結!Difyで始めるプロダクションレディなエージェントワークフロー入門
(現場は薄暗い取り調べ室。刑事役の私と、容疑者役のDifyが向かい合っています)
私(刑事)
さて、Difyくん。キミは一体何者なんだ?「Production-ready platform for agentic workflow development」… ソフトウェアエンジニアにとって、どういう意味があるのか、正直に話してもらおうか!
Dify (落ち着いた様子で)私の本質は、AIエージェントを開発し、それを組み合わせた複雑な処理の流れ(ワークフロー)を、本番環境で動かせる形で提供するためのプラットフォームです。プログラミングの知識と、AIの力を最大限に引き出すためのGUI(グラフィカルユーザーインターフェース)が私の中にあります。
私(刑事)
フム、なるほど。しかし、既存のフレームワークで十分じゃないのか? なぜキミが必要なんだ?
Dify
既存のフレームワークも素晴らしいですが、私は特に以下の点で、開発者の皆さんの生産性と可能性を劇的に高めます。
メリット
複数のAI処理(例えば、文書の要約、特定の情報抽出、その結果に基づく外部ツールの実行など)をノードとしてドラッグ&ドロップで繋げられます。コードで全てを記述するよりも、設計の意図が視覚的に分かりやすく、試行錯誤が格段に速くなります。
例
「ユーザーの質問を受け付ける」 → 「外部データベースで情報を検索する」 → 「検索結果と質問から回答を生成する」 → 「回答を整形して返す」という一連の流れを、数クリックで構築できます。
メリット
AIに外部の機能(ツール)を使わせるための「エージェント」開発が容易です。例えば、天気予報APIや社内システムAPIなどをツールとして登録し、AIが状況に応じて適切に判断し利用するように仕込めます。
Pythonでこれらのツールを簡単に定義し、DifyのGUIから組み込めるため、柔軟なカスタマイズが可能です。
メリット
開発したワークフローやエージェントは、すぐにAPIエンドポイントとして公開できます。これにより、本番のアプリケーション(Webサービス、モバイルアプリなど)からPythonなどのコードを使って簡単に呼び出せます。
監視やバージョン管理の機能もあり、デプロイ後の運用もサポートされています。
私(刑事)
結構だ。では、キミを私のアプリケーションに組み込むにはどうすればいい?具体的な手順と、Pythonでの呼び出し例を見せてみろ!
Dify環境の構築
SaaS版を利用するか、GitHubリポジトリからDockerを使ってセルフホストします。
アプリケーションの作成
DifyのGUIで「ワークフロー」または「チャットボット」アプリを作成し、ロジック(ノード)をデザインします。
APIキーの発行
作成したアプリの設定画面から、APIアクセス用のシークレットキーを生成します。
発行したAPIキーとエンドポイントを使って、外部からDifyワークフローを実行するPythonコードは以下のようになります。
import requests
import json
import os
# --- 環境変数からAPI情報を取得する(推奨) ---
# DifyのAPIエンドポイントURL (例: "https://api.dify.ai/v1/workflows/run")
DIFY_API_URL = "あなたのDifyワークフロー実行URL"
# Difyで発行したシークレットキー
DIFY_API_KEY = "あなたのAPIキー"
# 実行したいワークフローへの入力
user_query = "今日の東京の天気と、それに合う服装を提案してください。"
# リクエストヘッダー
headers = {
"Authorization": f"Bearer {DIFY_API_KEY}",
"Content-Type": "application/json"
}
# リクエストデータ(ワークフローの入力と設定)
payload = {
# ワークフローの入力データ。キー名(例: "text")はDifyで設定したものに合わせます。
"inputs": {
"user_input": user_query
},
# ブロッキングモード(レスポンスを待機)かストリーミングモードかを指定
"response_mode": "blocking",
# ユーザー識別子 (任意)
"user": "SoftwareEngineer_001"
}
try:
print("Difyワークフローを実行中...")
response = requests.post(DIFY_API_URL, headers=headers, data=json.dumps(payload))
response.raise_for_status() # HTTPエラーがあれば例外を発生させる
result_data = response.json()
# ワークフローの最終結果(Difyの「終了」ノードの出力)を取得
# 結果の構造はワークフローのデザインによって異なります
if result_data.get("status") == "succeeded":
print("\n--- ワークフロー結果 ---")
# 'data'キーの中に最終結果が含まれることが多いです
print(result_data.get("data", {}).get("text", "結果なし"))
else:
print(f"\nワークフロー実行失敗: {result_data.get('error')}")
except requests.exceptions.RequestException as e:
print(f"API呼び出しエラーが発生しました: {e}")
私(刑事)
完璧だ。これでキミが、AIを活用した複雑なロジックを迅速に作り、既存システムに簡単に組み込むための強力なツールであることがよく分かったよ。