Difyで会話を全体的にリアルかつ自動的に検証するにはどうすればよいですか?

こんにちは、Difyのワークフロー内で単一の応答や孤立したメッセージではなく、会話全体を検証する実用的な方法があるかどうか知りたいです。

私のユースケースは以下の通りです:
LLMがJSON構造を生成し、その中には完全な物語(たとえば、[voice:name]のようなタグを使用した海賊をテーマにした物語)が含まれます。モデルがこの物語を生成した後、物語が海賊で始まっていること、キャプテン・バーバネグラ・ロホが王の金を盗もうとしていること、王の娘が物語に登場すること、JSON形式が正しいこと、すべての音声タグが適切に使用されていることなど、特定のルールに対して全体の出力を検証する必要があります。

この検証は、物語が生成された直後にワークフロー内で自動的に実行される必要があります。目的は単一のメッセージを検証することではなく、完全に生成されたコンテンツ、あるいは必要に応じて会話全体を検証することです。

Difyが現在、完全なJSON出力やマルチターンコンテンツを検証する公式のメカニズムを提供しているかどうか、あるいはLLMが生成した結果に対して構造化された検証を実装する推奨方法があるかどうか知りたいです。

要するに、Difyに以前のステップから完全なJSON出力を取り込み、私が定義したすべての物語のルールに従っているか分析し、「有効/無効」とエラーのリストを返すようにしてほしいのです。

現在のDifyのツールでこれは可能でしょうか? それとも、今後のアップデートで会話全体の検証がサポートされる予定ですか?

以下に例を示します:

物語は海賊から始まる必要があります。

:robot:

ワークフローのプロセス

:open_book: 物語:
{
“content”: “[voice:narrador]: 暴風雨の海の中心で、恐ろしい海賊の乗組員が「テンペスト」と呼ばれる船の甲板に集まった。[voice:antonio]: おお、俺の仲間たち! 俺はこの呪われた船の船長、ブラックビアードだ。お前たちを冒険の深淵へと導く! [voice:santiago]: 私はサントシアゴ、狡猾な第一航海士だ。どんな危険な海でも進む準備はできている。[voice:sofia]: 私はソフィア、勇敢な砲手だ。この船を誰よりも勇ましく守る! [voice:jaime]: 宝は待っている。私、ハイメ、素早い手で最初に手に入れる! [voice:veronica]: 気をつけろ! 海には危険が満ちている。私、ベロニカ、賢い賢者として、先に待ち受ける危険を予見できる。[voice:leo]: しかし心配するな。運は味方だ。私、レオ、魅了の力でどんな敵も味方にできる! [voice:hernan]: 来るがいい! 私はヘルナン、粗野な戦士だ。誰が敵対しようとも粉砕する! [voice:melina]: 一緒に航海しよう。栄光と金を求めて団結しよう! [voice:carla]: しかし忘れるな、どんなに勇敢な海賊でも報いは訪れる。慎重に進もう。海は記憶している! [voice:matias]: 私が静かに行動を確保する。私はマティアス、乗組員の影だ。[voice:rodrigo]: どうする、船長? 暴風雨に向かって帆を上げるか? [voice:antonio]: ああ! 風は味方だ! 帆を上げて、冒険を始めよう!”
}

サントシアゴは邪悪な王の金を盗みたい。

:robot:

ワークフローのプロセス

:open_book: 物語:
{
“content”: “[voice:narrador]: 乗組員が船長の周りに集まったとき、サントシアゴは目を輝かせて前に進んだ。[voice:santiago]: ああ、仲間たち! 邪悪な王の金を盗むための巧妙な計画がある! [voice:antonio]: 話せ、サントシアゴ! 何を考えている? [voice:sofia]: 王の宝は厳重に守られている。賢くやる必要がある! [voice:jaime]: 私は彼らの防衛を静かにすり抜けられる! [voice:veronica]: 私は王の動きを感じ取って、影の中を導くことができる。[voice:leo]: 私の魅力で警備兵を気をそらすから、お前が動け! [voice:hernan]: 万が一のときは戦う準備ができている! [voice:melina]: 一緒に不可能を成し遂げよう! [voice:carla]: しかし慎重に進まなければならない。王の怒りには限界がない。[voice:matias]: 隠密が味方だ。大胆な強奪の準備をしよう! [voice:rodrigo]: ああ! 王は決して気づかない! [voice:antonio]: では決まりだ! 船を準備し、夜明けに帆を上げる!”
}

サントシアゴは邪悪な王の娘に恋をする。

:robot:

ワークフローのプロセス

:open_book: 物語:
:open_book: 物語:
{
“content”: “[voice:narrador]: 日々が過ぎる中、サントシアゴは運命を変える人物に惹かれていく。[voice:santiago]: 彼女の美しさを遠くから見 admire せずにはいられない、王の娘だ。[voice:sofia]: これは何の狂気だ、サントシアゴ? 彼女は敵の娘だ! [voice:jaime]: 恋は危険なゲームだ、友よ。[voice:veronica]: しかし彼女が私たちの計画の鍵を握っているかもしれない。[voice:leo]: お前の心を勝ち取れば、城内に味方が得られる! [voice:hernan]: あるいは裏切り者が現れるかもしれない! [voice:melina]: 注意するんだ、サントシアゴ。心は私たちを迷わせる。[voice:carla]: 恋と戦いはしばしば絡み合っている。慎重に進むんだ! [voice:matias]: 私がお前を助ける、サントシアゴ。隠密は私の専門だ。警備兵に気づかれずに彼女と会えるようにする。[voice:rodrigo]: ああ、しかし忘れるな。彼女の父がこれを知れば、我々全員に破滅が訪れるかもしれない。[voice:santiago]: 危険は承知しているが、試してみる。愛こそ戦う価値のある宝だ!”
}

王の娘の助けで金を得て結婚し、ハッピーエンドになる。

:robot:

ワークフローのプロセス

:open_book: 物語:
:open_book: 物語:
{
“content”: “[voice:narrador]: 王の娘のそばにいるサントシアゴは、勝利へと導く計画を練った。[voice:santiago]: 一緒に金を盗んで、未来を確保しよう! [voice:sofia]: 私がカバー射撃を提供するから、お前が動け! [voice:jaime]: 私が警備兵を気をそらすための混乱を起こす! [voice:veronica]: 私は宝への道を感じ取れる。私の後をついて来い! [voice:leo]: 公主の魅力で王の軍勢を出し抜こう! [voice:hernan]: 彼らに我々の乗組員の真の力を示そう! [voice:melina]: 愛がこの危険な冒険を導く! [voice:carla]: 一緒に、私たちの正当なものを手に入れよう! [voice:matias]: 隠密が味方だ。我々は成功する! [voice:rodrigo]: 金は我々のものだ! [voice:narrador]: 王の娘の助けで、彼らは計画を完璧に実行し、宝を持って勝利を収めた。[voice:santiago]: 金を手にした今、愛する君の手を請う! [voice:sofia]: 時代を越える結婚式だ! [voice:jaime]: ああ、この結びつきを祝おう! [voice:veronica]: 新しい章が開かれる! [voice:leo]: 彼らの愛がどんな宝よりも輝きますように! [voice:hernan]: 幸せなカップルに乾杯! [voice:melina]: 冒険に満ちた人生を! [voice:carla]: ああ、祝いの宴を始めよう! [voice:matias]: 海が今日、我々を祝福した! [voice:rodrigo]: 確かに、時代を越える物語だ!”
}

ここで、別のモデルを使ってすべてを検証したいです。

イテレーションノード(https://docs.dify.ai/en/guides/workflow/node/iteration)を使ってはどうでしょうか?
つまり、出力を配列に構築し、イテレーションノード内でコンテンツを検証するだけです。

LLMノードの構造化出力機能を使用して、1回の会話ラウンドでLLMノードの出力用JSONスキーマを指定できます。

LLMは後で実際の内容を検証するのにも使用できますが、厳密な検証が必要な場合は、コードノードを使用するのが良いでしょう。

複数ラウンドの会話からのすべてのやり取りを一時的に保存するには、会話変数を使用するのが最適です。各ラウンドで会話変数に値を追加すれば、後続のステップで配列から以前の会話の内容を自由に取得できます。

I am using Dify free version now. I am unable to find conversation variable. could you help to advise me where I can find it? or do I need to upgrade first to find this Conversation Variable ?