Dify入門ガイド:複数のLLMを並列実行!パラレルランで実現する高精度な情報生成

Dify入門ガイド:複数のLLMを同時実行!パラレルランで実現する高精度な情報生成

挨拶

ども!今日は朝の冷え込みに耐えられず、普段の自分からは信じられない時間に起床した龍ちゃんです。寝る前に天気予報は確認したほうが良いですね。薄着で寝ていて後悔です。

本日の内容はDifyで「複数のLLM」を同時に実行する方法とメリットという部分について記載していきたいと思います。内容としては、「一つの【開始ノード】から複数のLLMに入力を行い、一つの【終了ノード】にLLMごとのJSON構造化されたデータを返答」となります。

Difyでは並列実行はパラレル構造(パラレルラン)という名前がついています。公式の情報はこちらを参考にしてください。

前提条件:仮ユースケース

仮のユースケースとして「Dify入門ガイド:LLM出力を構造化する!JSONデータ作成の具体的手順」で使用した「架空のユーザー作成」をベースに進めていきます。このワークフローでは、架空の人物情報(名前・年齢・職業・説明)をuesrというJSON形式で返答します。

今回使用する仮ユースケースは「キーワードを入力して、キーワードとの関連度合いが高・中・低の3人の情報を作成し、それぞれuser1・user2・user3というJSON形式で返答」です。以下がイメージ図になります。

複数のLLMを同時に実行する:パラレルラン

全体としては、以下のようなシンプルな形のワークフローとなっています。

3つに処理が分岐していますが、「LLM→パラメータ抽出→コード」という流れは同一になっています。こちらの詳細に関しては、「Dify入門ガイド:LLM出力を構造化する!JSONデータ作成の具体的手順」で詳細に解説しています。

開始ノード

入力として、キーワードを入力として受け取れるように設定しています。

変数名ラベル名タイプ
keywordkeywordString

プロンプトの変更点

プロンプトのベースは一緒で、内部の一行のみ異なっています。ベースのプロンプトとしては、以下のようになっています。

ユーザーからの入力をもとに、次の手順で回答してください。
最終的な出力は、以下のフォーマットに従ってください:

名前:
職業:
年齢:
説明:

なお、職業や説明に関しては、バリエーションを持たせ、同じような内容が重ならないようにしてください。

1. {{LLMごとの変更点}}
2. ランダムに職業を1つ選択してください。
3. 名前と年齢を作成してください。名前は広い選択肢の中から作成してください。
4. 各人物の説明を500文字程度で作成してください。趣味嗜好などの情報や特筆した情報があると素晴らしいです。

それぞれの変更点としては、以下のような変更を加えています。

  • 高関連度: ユーザーが提供した場所に直接的に関係する職業を20個提案してください。
  • 中関連度: ユーザーが提供した情報からペルソナを決定するために職業を20個ランダムに生成してください。直接関係のある職業は生成しないでください。
  • 低関連度:ユーザーが提供した場所に無関係な職業を20個提案してください。2. ランダムに職業を1つ選択してください。

終了ノード

各ノードの出力結果をまとめます。

タイプ説明
user1Object(user)高関連度ユーザー情報
user2Object(user)中関連度ユーザー情報
user3Object(user)低関連度ユーザー情報

userオブジェクトの中身は以下のようになっています。

タイプ説明
nameStringキャラクターの名前
ageNumberキャラクターの年齢
jobStringキャラクターの職業
profileStringキャラクターの説明
{
  "user1": {
    "name": "田中 健太郎",
    "age": 35,
    "job": "郵便局員",
    "profile": "田中健太郎さんは、東京都内の郵便局で郵便局員として働いています。彼は、毎日多くの手紙や荷物を扱い、地域の人々と密接に関わる仕事をしています。郵便局での仕事を通じて、彼は地域のコミュニティに貢献することに喜びを感じています。特に、季節の行事や地元のイベントに合わせた特別な郵便サービスを提供することに情熱を持っています。趣味は読書で、特にミステリー小説が好きです。週末には図書館に足を運ぶことが多く、新しい本を探すのが楽しみです。また、彼はアウトドアも好きで、ハイキングやキャンプに参加することでリフレッシュします。家族と過ごす時間も大切にしており、妻と子供たちと共に自然を楽しむ旅行を計画することがあります。田中さんは、郵便配達業務の効率化に興味を持っており、最近では最新の技術を用いたサービス改善について学ぶことに力を入れています。人とのコミュニケーションが得意で、顧客のニーズを理解し、満足してもらうために常に努力しています。彼の明るい性格と誠実な対応は、地域の人々から信頼されています。"
  },
  "user2": {
    "name": "田中大輔",
    "age": 34,
    "job": "サウンドエンジニア",
    "profile": "田中大輔は、日本のサウンドエンジニアとして活躍している34歳の男性です。音楽に対する情熱は幼少期から始まり、特にロックやジャズに魅了されてきました。大学では音響工学を学び、卒業後は数々のスタジオで経験を積みながら、多くのアーティストやバンドのレコーディングに携わってきました。彼の手掛けた作品は、商業的にも成功を収めており、特にライブ音響の技術には定評があります。趣味は、レコード収集とギター演奏。休日には古いレコード店を巡り、隠れた名盤を探すのが楽しみです。また、自宅では友人たちとセッションを行い、音楽の楽しさを共有する時間を大切にしています。音楽制作だけでなく、音楽教育にも関心があり、地元の小学校で音楽ワークショップを開催することもあります。田中は、音楽が人々をつなぐ力を信じており、そのプロとしての使命感を持ちながら日々精進しています。彼の夢は、自身のレーベルを立ち上げ、若いアーティストを育てることです。音楽を通じて、より多くの人々に感動を届けたいと考えています。"
  },
  "user3": {
    "name": "山田 美咲",
    "age": 34,
    "job": "料理研究家",
    "profile": "山田美咲さんは、34歳の料理研究家です。東京都内で生まれ育った彼女は、幼い頃から料理に興味を持ち、母親の手伝いをしながら様々なレシピを学びました。大学では栄養学を専攻し、卒業後はカフェやレストランでの経験を経て、独立して料理教室を開くことになりました。彼女の料理スタイルは、伝統的な和食をベースにしながらも、現代的なアプローチを取り入れているのが特徴です。特に、地元の新鮮な食材を使った季節感あふれるレシピを提供し、食材の持つ味を最大限に引き出すことにこだわっています。また、健康に配慮したメニューも多く、家族向けの簡単料理や、ダイエットを意識した料理も人気です。趣味は旅行で、訪れた先の地元料理を学ぶことが彼女のインスピレーションの源になっています。特に、アジア各国のストリートフードを楽しむことが好きで、毎年数回は海外に出かけ、その土地の食文化を研究しています。さらに、彼女のSNSアカウントでは、自身が作った料理の写真やレシピを定期的に公開しており、多くのフォロワーに支持されています。山田さんは、料理を通じて人々の健康と幸せをサポートすることを目指し、日々精力的に活動しています。"
  }
}

パラレルランの利点

今回のユースケースでプロンプトを分割した利点について解説をしていきます。

LLMの不得意な部分の軽減

LLMは忘れる・無視する・嘘をつく(ハルシネーション)という特徴があります。これは、プロンプトが膨大な場合だと顕著に発生します。システムプロンプト内であっても、発生する可能性が0ではありません。

シンプルな対応方法は、目的に沿った十分なプロンプトを提示することです。処理を並列にして「1ユーザー-1LLM」にすることで、プロンプト量を減らして生成を行っています。

パラメーター抽出の精度向上

仮に2人分の情報生成に成功したと仮定します。次段のパラメーター抽出では、工夫が必要となります。どちらのユーザーの情報なのかを前処理や追加プロンプトで成型する必要があります。

一つの生成結果内に一つの情報のみが含まれている方が、パラメータ抽出の難易度ははるかに下がります。

反対の情報を生成する

今回のワークフローでは、「キーワードとの関連度」に応じて3人のユーザーを生成しました。一つのプロンプト内で、高関連度と低関連度(無関係)の職業を同時に生成することは難しいです。1つのプロンプト内で生成する場合では、「高関連度」の情報をチューニングしようとして「低関連度」の生成に影響を及ぼします(逆もしかり)。メンテナンス性という観点からも、ユーザー単位でメンテナンスができます。

終わり

今回の記事では、Difyのパラレルランを活用して、複数のLLMを同時に実行する方法について解説しました。プロンプトを分割することで、LLMの弱点を補い、より精度の高い情報生成が可能になることが分かりました。今後も、AIツールの効果的な活用方法について、実践的な情報を発信していきたいと思います。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です