Shinichiro Yamamoto

山本 慎一郎

Difyのチャットフローを使うのイメージ画像

Difyのチャットフローを使う

今回はDifyの「チャットフロー」という機能を使い、『ファクトチェック付きのChatGPT』を実現したいと思います。

コンセプトの説明

操作の説明に入る前に、『ファクトチェック付きのChatGPT』とはどういうものか説明しておきたいと思います。

みなさんもご存じの通り、2024年現在の生成AIには、「ハルシネーション」など、誤った情報を回答してしまう危険性があります。
このような危険を回避するには、生成AIが回答した内容を精査し、誤った情報がないか、すべて真実であるかを確認する必要があります。
そのような、真実であるかを確認する行為を「ファクトチェック」と呼びます。

OpenAI社が公開しているChatGPTには、「ファクトチェック」を自動で行う機能はついていません。
ChatGPTの回答を、利用者が手動で検索するなどして確認する必要があります。
これは手間です。
せっかくなら、「ファクトチェック」まで自動的に行って結果を教えてくれる生成AIがあれば、利用者に負担をかけることなく「ファクトチェック」を行うことができます。

しかし、これを実現しようとした場合に、ChatGPTの機能だけでは難しい面があります。
その理由の一つに、『「ファクトチェック」は、異なるAIでやらなければ効果が薄い』という点が挙げられます。

「ハルシネーション」などの誤情報は、AIの学習データに基づいて生じます。
そのため、誤情報を回答したAIを使って回答内容が真実かを確認しても、判断を誤る可能性が高くなります。
従って、「ファクトチェック」を行うのであれば、異なるAI(モデル)を用いて検査すべきです。

では、異なるAI(モデル)をどのように使用するか。
これが、ChatGPT単体では難しい部分です。
方法としては、MyGPTのアクション機能を使い、外部のAPIを呼び出す処理を書くことで対応できるのですが、ややハードルが高めです。

ここで、Difyの出番です。
この後、実際の手順を紹介していきますが、Difyを使えば難しいAPI呼び出しの記述などは必要ありません。
いくつかのパラメータを指定するだけで、簡単に異なるAI(モデル)のAPIを呼び出すことができます。

このような背景から、Difyを使用して『ファクトチェック付きのChatGPT』の構築を題材として取り上げました。
Difyならではの利点にも着目しながら、読み進めていただけると幸いです。

「チャットフロー」タイプの操作

それでは、操作の説明にはいります。
今回は、複数のLLMを連携させて使用しますので、「チャットフロー」というタイプのアプリを選択します。

最初から作成を選ぶ図 チャットフローを選ぶ図

作成すると、何やらBIツールでよく見るような、フローチャートにも似た図が表示されるかと思います。
この図に修正を加えることで、期待する動作を実現していきます。

チャットフローが作成された図

ちなみに、初期状態では、ChatGPTに質問をして返ってきた回答を表示するだけの、シンプルなアプリになっています。
(手動で編集したわけではなく、自動的にこのようなアプリに設定されていました)

それでは、フローを編集していきましょう。
今回のアプリでは、ChatGPTの回答を「Gemini」のLLMを使用して「ファクトチェック」することにします。
まずは、「Gemini」のLLMをフローに追加しましょう。
適当な余白部分を右クリックして、「ブロックを追加」という項目を選択します。

ブロックを追加する図

すると、さらにサブメニューが表示されますので、「LLM」を選択します。

LLMを選択する図

選択すると、『LLM2』というアイテムが図に置けるようになります。
適当な余白部分をクリックして、『LLM2』を図に配置します。

LLMを配置する図

配置すると、図のような状態になり、項目のプロパティなどが表示されます。
私の環境では、OpenAIのモデルを最初に登録したため、デフォルトでOpenAIのLLMが選択されています。

LLMを配置した図

今回は、ここを「Gemini」に変えたいので、設定を変更しましょう。
画面右のプロパティ欄にある、モデルの部分をクリックします。

モデルを変更する図

現在の設定の詳細が表示されますので、モデル名の部分をクリックします。

モデル名をクリックする図

「Gemini 1.5 Flash」を探して選択します。

Gemini 1.5 Flash を選択する図

選択後、元の画面のプロパティ欄にも「Gemini 1.5 Flash」が表示されれば、設定変更完了です。

Gemini 1.5 Flash を選択した図

では次に、この Gemini の LLM を、一連のフローに組み込んでいきます。
今はまだ、LLM を用意しただけですので、どういったデータを受け取り、どういった出力を行うのか、設定していきます。

まずは、入力データを設定します。
今回のアプリでは、Gemini の LLM は、ChatGPT が回答した内容の「ファクトチェック」を行います。
つまり、入力データは『ChatGPT が回答した内容』ということになります。

生成AIの結果を受け渡すなんて難しそう……、と思われるかもしれません。
確かに、自前でプログラミングをしていると面倒ですが、Difyならとても簡単に実現できます。

まずは、設置したLLMの左端にマウスカーソルを合わせます。
すると、図のようにプラスマークに変わる箇所がありますので、そこでマウスの左ボタンをクリックします。

設置したLLMの左端をクリックする図

クリックしたら、そのままマウスをドラッグして LLM1(gpt-4)の右端へ。
図のようにプラスマークが表示されたら、そこでマウスボタンを離します。

LLM1 に向かってドラッグする図

正しく操作できていれば、図のように LLM1 と LLM2 が、曲線で接続されます。

LLM1 と LLM2 が接続された図

LLM1 からの入力の接続ができたら、今度は LLM2 からの出力を作成します。
先程とは反対側、LLM2 の右端にマウスカーソルを近づけ、図のメッセージが表示される状態にします。

LLM2 の右端にカーソルを近づけた図

メッセージが表示されたら、今度はその場でマウスの左ボタンをクリックします。
すると、図のようにサブメニューが表示されますので、「回答」を選択します。

「回答」を選択する図

選択すると、自動的に「回答」というブロックが設置され、プロパティが表示されます。

「回答」が設置された図

「回答」ブロックは、その名の通り、AI からの回答を表示するブロックです。
ただ、初期状態では、何を表示するのかの設定がされていません。
ここでは、シンプルに LLM2 の API の回答内容を表示するようにしてみましょう。

回答内容を設定する欄の図

プロパティ欄の「回答」という欄に、回答内容を記述します。
ここで、回答内容には「変数」の値を含めることができます。
「変数」というのは、アプリの様々な情報のことで、その中のひとつに『LLM の回答内容』があります。
「回答」欄に半角の開き波かっこ「{」を入力すると、変数の一覧が表示されますので、『LLM2 の「text」変数』を探し出して選択してください。

LLM2 の「text」変数を探す図

選択すると、プロパティ欄に反映されます。
今回はお試しなので、特別な設定はせず、このまま進むことにします。

LLM2 の「text」変数を設定した図

さて、これで回答側の設定は完了です。
一方、LLM2 の入力側については、線を接続しただけで、どのようなプロンプトを入力するのか設定していません。
LLM2 のブロックをクリックして、プロパティを見てみましょう。

LLM2 の入力プロンプトが未設定の図

「SYSTEM」の欄が空欄になっていますので、ここに「ファクトチェック」用のプロンプトを設定します。
「ファクトチェック」を行うには、「ファクトチェック」を行わせる指示と、「ファクトチェック」の対象となる文章が必要です。
先程、「回答」のブロックで設定した方法を踏まえて、設定していきましょう。

LLM2 の入力プロンプトを設定する図 LLM2 の入力プロンプトを設定する図2

プロンプトの文章には、当然、固定の文章も入力できます。
「ファクトチェック」を行わせる指示は固定ですので、そのまま設定欄に入力します。

LLM2 の入力プロンプトを設定する図3

以上で、『ファクトチェック付きのChatGPT』の設定は完了です。
特に複雑な構造ではありませんが、今一度、全体像を見てみましょう。

アプリのフロー全体像の図

まず、「開始」ブロックからアプリが開始され、「gpt-4」を搭載した「LLM」(ChatGPT)に接続されます。
「LLM」では「gpt-4」のAPIを呼び出して、通常のChatGPTと同様の回答を得ます。

ここで重要なのは、「LLM」で回答を得た後、アプリの制御が、右にある「回答」ブロックに送られるのと同時に、下にある「LLM 2」にも送られるということです。
つまり、「回答」ブロックで回答を表示すると同時に、「LLM 2」で「ファクトチェック」が行われるということです。
そして、「LLM 2」の「ファクトチェック」の結果が、別途、「回答2」のブロックで画面に表示されるようになっています。

このように、複数の「LLM」を多段方式で接続することで、「ファクトチェック」の機能を実現します。

動作のプレビュー

設定が完了しましたので、プレビュー機能を利用して動かしてみましょう。

プレビュー機能を利用する図

プレビュー機能は画面右側に表示されます。
一般的な生成AIのツールよろしく、チャット欄が表示されますので、適当に質問を投げかけてみます。

プレビュー機能で質問してみる図

今回は、光の三原色について聞いてみました。
最初の『光の三原色は「赤」「緑」「青」です。これらの~~できます』の部分が、「gpt-4」を搭載した「LLM」の出力部分です。
一方、図でも強調している『この記述は事実と合致しています』という文章以降の部分は、「Gemini」を搭載した「LLM2」による「ファクトチェック」の内容です。
根拠も述べるように指示しているせいで、だいぶ詳細に根拠を示してくれていますが、しっかりと『光の三原色は「赤」「緑」「青」です』に対する「ファクトチェック」になっています。

せっかくなので、「ファクトチェック」でNGとなるケースも試してみたいところです。
ちょっと小難しい質問ですが、『EU圏におけるAIに関する規制』について聞いてみました。

EU圏のAI規制について質問してみる図 EU圏のAI規制について質問してみる図2

先程とは異なり、何やら『ニュアンス』に注意が必要だと回答しています。

この点について、「ファクトチェック」の内容を読んでいくと、言葉通りニュアンスの違いによる事実誤認が指摘されていましたが、1点、明らかな差も指摘されていました。
それがこちら。

EU圏のAI規制についてのファクトチェック結果の図

「gpt-4」の「LLM」では、『~~。しかし、現在この指令はデジタル・サービス法案(Digital Service Act)によって更新される予定で、~~』という回答がありました。
この点について、「Gemini」の「LLM」による「ファクトチェック」では、『「更新される予定」ではなく、DSAは既に施行されています(2023年1月)』と指摘されています。
もし、「gpt-4」の回答だけで資料作成していたら、この事実には気づかなかったかもしれません。

ちなみに、余談ですが、DSAの施行は『2022年11月』です。
一見すると、「ファクトチェック」にも誤りが紛れているように見えます。
ただ、「ファクトチェック」の文章の書き方も紛らわしいのですが、『(2023年1月)』というのは、『2023年1月現在』という意味なのかもしれません。
もっとも、以前の実験でも『法令の施行年月』を誤っていたので、ここは生成AIの苦手分野なのかもしれませんが。

もし、2種類のLLMでは不安だということであれば、3種類、4種類のLLMを使った「ファクトチェック」も可能です。
ただ、ほとんどの API は、リクエストごとに料金がかかりますので、あまりにたくさんの「ファクトチェック」を入れると、ランニングコストが増加します。
このあたりは、実際に利用するシーンや費用感なども加味して検討する必要があります。

おわりに

以上が、Difyのチャットフローのシンプルな使い方になります。
割と直感的に操作できるUIになっていますので、色々弄っていれば、すぐに習熟できるのではないかと思います。
APIの使い過ぎによる制限と費用に気を付けつつ、試してみてはいかがでしょうか?

お問い合わせ→