Difyのコードブロックの書き方(Python)
1. はじめに
DifyとはLangGenius社が開発・運営する生成AIアプリケーション開発プラットフォームで、最近話題のChatGPTやGeminiといったLLM(大規模言語モデル)を活用したアプリケーションを、コーディングなしで誰でも簡単に構築できる点が特徴です。プログラミング知識がなくとも誰でもAIアプリを簡単につくれるのが大きな利点となっていますが、その反面、ノーコードなので例えば下記のようなことを実現しようとするとなかなか実現するのは難しいです。
- 「外部の天気予報サイトの情報を、リアルタイムでAIの回答に含めたい…」
- 「ユーザーが入力した数値を使って、独自の複雑な料金計算をさせたい…」
- 「もっと細かい条件で、AIの応答内容をガラッと変えたい…」
そんな、ノーコードの枠を少しだけ超えた「あと一歩」を実現するために役立つのが「コードブロック」機能です。コードブロックを使うと、Difyのワークフロー内にソースコードを組み込むことができ、機能が増えるだけでなく、AIアプリケーション開発がもっと便利でスマートになります。
この記事では、「コードブロック」について、プログラミング初心者の方でも安心して使いこなせるように、基本から丁寧に解説していきます。
2.コードブロックとは
「コードブロック」とは、「Difyのワークフローの中に、プログラミング言語のコードを直接書き込んで実行できる機能」のことです。
Difyのワークフローでは、「開始」や「LLM」、「回答」といった様々な機能を持った「ノード」を線で繋いで処理の流れを作りますが、コードブロックもそれらと同じワークフローを構成する「部品(ノード)」の一つとして機能します。
現在コードブロックは、PythonとJavaScriptの二言語に対応しています。
このコードブロックという部品は、ワークフローの中で以下のような専門的な役割を担ってくれます。
【コードブロックでできることの例】
-
外部APIとの連携:
Difyに標準搭載されていないツールや、自社で開発したAPIと連携できます。(例:天気予報APIから最新の天気情報を取得する、特定のデータベースから顧客情報を取得する) -
複雑なデータ加工・計算:
ユーザーからの入力や前のステップで得られたデータを、LLMが扱いやすいように加工したり、複雑な計算を行ったりできます。(例:長い文章を段落ごとに分割する、料金計算を行う) -
動的なプロンプト生成:
ユーザーの入力や状況に応じて、LLMに与える指示(プロンプト)を動的に変更し、より柔軟で精度の高い応答を生成できます。 -
独自のロジック実装:
特定の条件に応じて処理を分岐させたり、繰り返し処理を行ったりといった、プログラミングならではのロジックを組み込めます。
【コードブロックを使うメリット】
- 柔軟性と拡張性の向上: アイデア次第で、Difyの標準機能だけでは作れない独自のAIアプリケーションを開発できます。
- ワークフローの効率化: 複数のツールを組み合わせなくても、Dify内で処理が完結し、管理が楽になります。
- コスト削減: 外部サービスへのAPIコールを減らすなど、処理を最適化することでコストを削減できる場合があります。
今回はPythonを使った場合を例に、プログラミング初心者の方でも安心してコードブロックを使いこなせるように、基本から応用までを分かりやすく解説していきます。
3. まずはここから!コードブロックのためのPython関数入門
Difyのコードブロックを使いこなす鍵は、Pythonの「関数」を理解することです。
実はPythonって関数を使わなくても処理を書くことはできます。ではなぜDifyでは「関数」という形式が求められるのか、簡単な例を見ながらその理由を説明していきます。
なぜ「関数」が必要なの? "部品"としてのコード
例えば、「山田
さんのための挨拶文を作る」という簡単な処理を考えてみましょう。
【関数を使わない場合(通常のPythonスクリプト)】
Python
# 変数を定義する
name = "山田"
# 文字列を組み立てる
message = f"{name}さん、こんにちは!"
# 結果を出力する
print(message)
# 実行結果 -> 山田さん、こんにちは!
これは非常にシンプルで分かりやすいコードです。上から順番に実行され、期待通りの結果が得られます。
しかし、このコードをDifyのワークフローに組み込もうとすると、Difyは困ってしまいます。
name = "山田"
の"山田"
の部分を、ワークフローの前のステップ(例えばユーザー入力)から受け取った値に変えたいけど、どうやって渡せばいいの?- 処理結果の
message
を、ワークフローの次のステップ(例えばLLMへの指示)で使いたいけど、どこから受け取ればいいの?
このように、ただ処理が書かれているだけでは、Difyのワークフローという大きな流れの中で「どこからデータを受け取り、どこへデータを渡せばいいのか」という出入り口が不明確なのです。
そこで「関数」の出番です。
【関数を使う場合】
同じ処理を「関数」として書いてみましょう。関数とは、一連の処理をひとまとめにした「命令の箱(部品)」のようなものです。
Python
# 挨拶文を作成する関数を定義する
def create_greeting(person_name):
message = f"{person_name}さん、こんにちは!"
return message
# 関数を呼び出して、結果を受け取る
greeting_for_yamada = create_greeting("山田")
print(greeting_for_yamada)
# 実行結果 -> 山田さん、こんにちは!
greeting_for_suzuki = create_greeting("鈴木")
print(greeting_for_suzuki)
# 実行結果 -> 鈴木さん、こんにちは!
この「関数」という形式には、Difyにとって都合の良い3つの特徴があります。
-
名前(
create_greeting
): Difyが呼び出すべき処理の塊を名前で特定できます。 -
引数(
person_name
): 関数にデータを渡すための明確な「入り口」です。Difyはここから前のステップのデータを渡します。 -
戻り値(
return message
): 処理結果を関数の外に返すための明確な「出口」です。Difyはここから出てきたデータを次のステップで利用します。
このように、コードを「関数」という**再利用可能な「部品」**にすることで、Difyのワークフローにスムーズに組み込むことができるのです。
Difyコードブロックの「作法」
DifyのコードブロックでPythonコードを書く際には、いくつかの作法(ルール)があります。
- 関数名は必ず
main
にする。 - DifyのUI上で設定した「入力変数」を、そのまま関数の引数として設定する。
- 処理結果は
return
を使って返す。この結果が、次のステップで使える「出力変数」になる。
【Difyコードブロックのテンプレート】
Python
# DifyのUIで入力変数として `variable_name_1` と `variable_name_2` を設定した場合
def main(variable_name_1, variable_name_2):
# --- 1. 入力を受け取る ---
# Difyが引数に直接値をセットしてくれるので、特別な処理は不要!
# --- 2. 処理を行う ---
# 受け取った変数をそのまま使って、自由に処理ができる
processed_result = f"受け取った値は「{variable_name_1}」と「{variable_name_2}」です。"
# --- 3. 結果を返す ---
# 複数の結果を返す場合は、辞書(Dictionary)形式で返すのがおすすめ
return {
"output_variable": processed_result
}
Difyの画面で設定した入力変数の「変数名」と、main
関数の「引数名」を完全に一致させるだけで、Difyが自動的に値をセットしてくれます。これにより、コードが非常にスッキリして、Pythonの関数として自然な形で記述できるようになりました。
4. Difyでの実践 コードブロック応用例
実際にDifyのワークフローでコードブロックを使ってみましょう。
応用例1:ユーザーに合わせた挨拶を生成する
ユーザーの名前と時間帯(朝/昼/夜)を受け取り、状況に合わせた挨拶文を動的に生成するワークフローです。
【ワークフローの流れ】
-
開始ノード: ユーザーからの入力として
user_name
とtime_of_day
を受け取る。 -
コードブロック:
user_name
とtime_of_day
を元に、挨拶文を生成する。 - LLMノード: コードブロックが生成した挨拶文を使って、ユーザーに話しかける。
【コードブロックの設定】
-
入力変数:
user_name
,time_of_day
- コード:
Python
# 引数で user_name と time_of_day を直接受け取る
def main(user_name, time_of_day):
# もし名前が入力されなかった場合、「ゲスト」という名前を使う
name = user_name if user_name else "ゲスト"
# 時間帯に応じて挨拶文を変える
if time_of_day == '朝':
greeting = f"おはようございます、{name}さん!今日も一日頑張りましょう。"
elif time_of_day == '昼':
greeting = f"こんにちは、{name}さん!お昼休憩はとりましたか?"
else:
greeting = f"こんばんは、{name}さん。今日もお疲れ様でした。"
# 生成した挨拶文を出力変数として返す
return {
"greeting_message": greeting
}
-
出力変数:
greeting_message
このコードブロックを挟むだけで、LLMは {{greeting_message}}
という形で、状況に応じた挨拶文をプロンプトに組み込めるようになります。
応用例2:外部APIを使って天気情報を取得する
地名を受け取り、外部の天気予報APIを呼び出して、その場所の天気を取得し、LLMが使いやすいように情報を整形します。
【ワークフローの流れ】
-
開始ノード: ユーザーからの入力として
location
(地名)を受け取る。 -
コードブロック:
location
を元に天気予報APIを呼び出し、結果を整形する。 - LLMノード: 天気情報を受け取り、その日の服装などをアドバイスする。
【コードブロックの設定】
-
入力変数:
location
- **コード:**Difyのコードブロックでは、外部と通信するための
requests
ライブラリが利用できます。
Python
import requests
import json
# 引数で location を直接受け取る
def main(location):
if not location:
return {"weather_summary": "地名が入力されていません。"}
# 無料で使える天気APIの例 (OpenWeatherMapなど)
# 実際の利用にはAPIキーの取得と設定が必要です
api_key = "YOUR_API_KEY" # ←実際には自分のAPIキーを入れる
api_url = f"http://api.openweathermap.org/data/2.5/weather?q={location}&appid={api_key}&units=metric&lang=ja"
try:
response = requests.get(api_url)
response.raise_for_status() # エラーチェック
data = response.json()
# 必要な情報を抽出
weather_description = data['weather'][0]['description']
temperature = data['main']['temp']
# LLMが解釈しやすいテキストに整形
summary = f"{location}の天気は{weather_description}、現在の気温は{temperature}度です。"
return {
"weather_summary": summary
}
except requests.exceptions.RequestException as e:
return {"weather_summary": f"申し訳ありません。天気情報の取得に失敗しました。エラー: {e}"}
except KeyError:
return {"weather_summary": f"申し訳ありません。「{location}」の天気情報が見つかりませんでした。"}
-
出力変数:
weather_summary
このワークフローにより、ユーザーは「東京の天気は?」と聞くだけで、AIから「東京の天気は晴れ、現在の気温は25度です。今日は半袖で快適に過ごせそうですね。」といった、具体的なデータに基づいた応答を受け取れるようになります。
5. まとめ
今回は、Difyのコードブロック機能について、その基本から応用までを解説しました。
- コードブロックは、Difyの可能性を大きく広げる強力な機能。
- 基本は
main
関数と、Difyの画面で設定した入力変数をそのまま引数として設定、return
による出力というルールを覚えるだけ。 - Pythonの力を借りることで、外部API連携や複雑なデータ加工も自由自在。
- まずは簡単な挨拶文の生成など、身近な例から試してみるのがおすすめ。
コードブロックを使いこなせれば、自由度が格段に上がります。ぜひこの記事を参考に、自分だけの高機能なAIアプリケーション開発に挑戦してみてください。
Discussion