⛏️

Difyにiterationが追加されたので使用感を確かめる

2024/05/31に公開

前置き

みなさんこんにちは。Difyがアップデートされ、バージョン0.6.9にてiterationが追加されました。
iterationを使うと、入力された配列データを順番に処理し、結果を積み重ねていくことができます。
今回はiterationの使い方をワークフロー例とともに紹介したいと思います。

実行環境

Dify:0.6.9

ワークフローの概要

今回作成したワークフローは以下のような構成になっています。

  • ポケモンの名前を入力する
  • 入力されたポケモンの進化系統を英訳して取得する
  • 取得した進化系統のポケモン名を配列にする
  • iterationブロックで配列の各要素(ポケモン名)を処理
  • ポケモンの英名でpokeAPIを叩いてポケモンの情報を取得
  • 取得したデータを整形
  • 最終的な出力をまとめて返す

全体図

各ブロック

開始

入力フィールド:pokemon

LLM

モデル:claude-3-haiku-20240307
システムプロンプト:

txt
あなたは任天堂のポケモンについて回答するBOTです。
入力されたポケモンの進化系統全てを英語名で出力してください。
返答内容はポケモンの名前を英語名でカンマ区切りして返答してください。
カンマ区切りのみでスペースなどは不要です。

ユーザープロンプト

txt
/開始:pokemon

コード

iterationのために文字列を配列に変換

python
def main(pokemons: string) -> dict:
    return {
        "pokemons": pokemons.lower().split(',')
    }

iteration

コードで配列化した変数を受け取り、iteration内で要素ごとにitemとindexを取得して利用する
INPUT:/コード:pokemons
OUTPUT VARIABLES:iteration内の末端処理の出力結果(ここを設定しないとiterationの次の処理で結果を取得できない)

HTTPリクエスト

{/iteration:item}が何故か無効な変数と表示されるが問題なく動作する
API:pokeAPIにてポケモンの情報を取得する

GET:https://pokeapi.co/api/v2/pokemon-species/{/iteration:item}

LLM2

モデル:claude-3-haiku-20240307
システムプロンプト:

txt
あなたは任天堂から発売されているポケットモンスター(ポケモン)の図鑑BOTです。
こちらから提供される情報をもとに日本語の情報だけまとめて以下の構文で回答してください。
language/11の図鑑情報を使用してください
名前 :
タイプ : 
図鑑情報 : 

ユーザープロンプト

txt
/HTTPリクエスト:body

終了

出力変数:iterationの出力結果

実行

今回はヒトカゲでやってみます。

入力:ヒトカゲ

出力:ヒトカゲ

{
  "pokemon_evolutions": [
    "名前 : ヒトカゲ\nタイプ : ほのお\n図鑑情報 : \n生まれたときから尻尾に炎が点っている。炎が消えたときその命は終わってしまう。しっぽの炎は気分を表現し、楽しい時は炎がゆらゆら揺れ、怒った時は炎がめらめら盛んに燃える。あついものを好む性格で、雨に濡れると尻尾の先から煙が出るという。",
    "名前 : リザード\nタイプ : ほのお\n図鑑情報 : 強敵と戦いつづけるとエキサイトし、青白い炎を吐くことがある。鋭い爪で相手を徹底的に攻撃する性格の持ち主。",
    "名前 : リザードン\nタイプ : ほのお / ひこう\n図鑑情報 : 強い相手を求めて空を飛び回る。なんでも溶かして しまう高熱の炎を自分より弱いものに向けることは しない。岩石も焼けるような灼熱の炎を吐いて山火事を 起こすことがある。地上1400メートルまで羽を使って飛ぶ ことができる。高熱の炎を吐く。"
  ]
}

まとめ

iterationを使えば配列のデータを処理できますが、今回のような文字列でもコードで配列化すれば問題なく対応できした。配列化は今後も使うことにはなりそうな気がします。
ワークフローの最後の出力などをjsonで出すこともできますが、一旦はiterationがみたいだけなので割愛しました。
また、プロンプトももう少し頑張るべきかもですが"いずれ、おそらく、多分、きっと"修正します。

Discussion