Dify:チャットフローの基本

チャットフローを使えば、チャットボットよりも複雑な処理を実現できます。

基本のチャットフロー

基本のチャットフローは、3つのブロックからなります。

この構成要素を、DifyのUI上では「ブロック」と表現されていますが、オンラインマニュアルでは「ノード」となっています。ここでは「ブロック」という表現で統一します。

開始

会話の開始ブロックです。これはチャットフローアプリの必須ブロックです。会話に対する初期情報を提供します。デフォルトのシステム変数に加えて、ユーザがアップロードしたファイルの情報などが含まれます。

LLM

利用するLLMモデルとパラメータを設定します。

  • モデル名 (事前にモデルプロバイダーで設定が完了しているもの)
  • システムプロンプト
  • LLMパラメータ(Temperature, Top P, MaxTokensなど)
回答

ユーザに対する回答を指定します。通常はLLMからの出力textを出力します。必要に応じて他の変数と組み合わせたり、書式を変更することもできます。
例えば、アップロードされたファイル名や、日付を追加して出力することができます。

基本のブロック

以下に、チャットフローでよく利用するブロックについて説明します。

知識獲得

RAGを実現するためのブロックです。あらかじめ作成したナレッジを参照して、LLMに回答させたい場合に使います。

質問分類器

ユーザからの質問によって処理を変えたい場合に使います。例えば、質問の内容によって、参照するナレッジを変更したり、使用するLLMを変更することができます。

IF/ELSE

チャットフローのロジックを制御するためのブロックです。変数を使うことで条件分岐が可能です。

コード

簡単なプログラムコードを埋め込むことができます。言語としては、python3,JavaScriptが使えます。
例えば、現在の時刻を取得して、変数に設定するなどできます。

from datetime import datetime, timedelta, timezone

def main():
    # 日本時間(UTC+9)のタイムゾーンを定義
    jst = timezone(timedelta(hours=9))
    
    # 現在の日時を日本時間で取得
    current_datetime_jst = datetime.now(jst).strftime('%Y-%m-%d %H:%M:%S')

    # 出力として次に渡す
    result = {"current_datetime": current_datetime_jst}
    return result
テキスト抽出ツール

通常、LLMは文書ファイルの内容を直接読み取ることができません。そこで、ファイルからテキスト部分のみを抽出した結果を、LLMの入力とします。

サポートするファイル形式は、以下の通りです。
txt,markdown,mdx,pdf,html,xlsz,xls,docx,doc,csv,md,hml

HTTPリクエスト

HTTP プロトコルを介してサーバーにリクエストを送信することを可能にし、外部データの取得、ウェブフック、画像生成、ファイルのダウンロードなどのシナリオに利用されます。

サンプルコード 感情判定付きチャット

簡単な事例として、感情判定付きのチャットをチャットフローで作ってみます。

質問分類器

質問分類器では、ユーザの入力がネガティブか、そうでないかを判定します。
ネガティブだった場合には、LLM1へ、そうでなかった場合には、LLM2へ進みます。

LLM

まず、2つのプロンプトの「メモリ」をOnにします。これによって、直近の会話履歴を使いながら、自然が会話ができるようになります。

LLM1のプロンプトは以下のようにします。

あなたは感情に寄り添ったアシスタントです。
ユーザの意見をじっくりと傾聴してください。

LLM2のプロンプトは以下のようにします。

​あなたは元気いっぱいのアシスタントです。
ユーザが楽しくなるように、積極的に話しかけてください。

これによって、ネガティブな場合には、相手の話を聴くようになり、そうでなかった場合には、積極的に話題を広げるような会話をします。

以上のように、チャットフローではチャットボットよりも複雑な処理を実現することができます。

例えば、顧客サポートボットでは、操作方法の問い合わせ、その他の問い合わせ、クレームなどを分類して、その後の処理方法を変えることができます。

目次