🧜

【Dify 入門】Difyで独自情報を付与したチャットボットを構築して、API経由で利用するまでの方法

2024/08/05に公開

皆様、Difyというチャットボット構築サービスをご存知でしょうか?
最近、生成AIを利用した価値検証やチャットボット構築を行う際の方法としてよく話題にあがるサービスです。Difyは非常に高機能で様々なことができるサービスですが、今回はDifyの入門編として「簡単なチャットボットの構築」と「独自情報を与えたチャットボットの構築」の手順を記事にまとめました。
これからDifyを利用開始される方の参考になれば幸いです。

Difyとは?

Difyは、コーディング不要で様々な生成AIチャットボットやエージェントを作成できるサービスです。ご存知の方も多いかもしれませんが、ノーコードで高度なアプリケーションを構築でき、Webサイトに簡単に埋め込むことができる点が特徴です。他のツールとしてOpenAIのGPTsがありますが、Difyはより高度な設定や多様な利用用途に対応しており、簡単な操作で複雑なチャットボットやワークフローの構築が可能です。

DifyはWebサービスとして簡単に利用することも、自分でホスティングしてセキュリティ性の高い環境で利用することも可能です。今回は検証目的であるため簡易的に利用ができるWebサービスを選び、セキュリティを重視する場合は自身でホスティングすることをおすすめします。

Difyの機能全体像

Difyには様々な機能があり、全体像は以下のようになります。様々な機能がありますが、複雑な処理を必要としない場合は、まず「チャットボット - 基本」を試してみるのがオススメです。今回の検証では 「チャットボット - 基本」 を用いてチャットボットの構築を行います。

なにができるか? 備考
探索 事前に準備されているワークフローやプロンプトをテンプレートとして利用できる機能 サンプルとして準備されているKnowledge Retrieval + Chatbotなどを利用するとKnowledgeの設定を行うだけで簡単にRAGが構築できる
知識(ナレッジ) 独自情報を参照するRAGを構築する際に利用します。 RAGの検索方法はベクトル検索だけではなく、キーワードを考慮したハイブリッド検索ができるなど様々なチューニングが可能です。
チャットボット - 基本 シンプルなチャットボットが作成できます。RAGの仕組みを利用して独自情報に回答させたり、Web検索の結果をもとに回答させることも可能です。 ★今回の検証で利用します。 はじめて、Difyを利用する方はまずここからはじめてみることがおすすめです
Chatflow より高度なチャットボットの構築ができます。ワークフローを作成して、ユーザーの入力ごとに参照先を変えたり分岐させたりと高機能なチャットボットの実装ができる。 まずはチャットボット- 基本ではじめてみて、より凝ったことをしたい方におすすめ
テキストジェネレーター その名の通りテキストを生成させることに特化した機能です。特定のタスクを実行させたい場合などに利用するのが良いです。 デバッグ時には複数のLLMを同時に実行して、出力比較ができるなどよりテキスト生成に特化した体験が可能です。
エージェント ユーザーの入力に応じて外部のツール(Web検索や画像生成など)を組み合わせて実行するエージェントを構築することができます。 1つの画面から複数タスクを出し分けて実行したいときが使い所
ワークフロー 現状、Previewで提供されている機能です。できることはChatflowとそんなに変わりません。 Chatflowとの違いはユーザーの入力を必要としないワークフローも作成できるため、処理を実行させたいときに利用するのが良いと思います。

1. Difyで簡単なチャットボットを構築する

今回は検証のはじめとしてDifyの操作に慣れることを目的に、 「なにを言われても昔話風に翻訳するチャットボット」 を構築します。
シンプルなチャットボットの構築は非常に簡単にできるため、手順については以下の動画を参照してください。

https://youtu.be/OVknEhi6GzU

以下に簡単な各種設定についての解説を記載します。

設定 概要
手順 手順のインプットボックスには、実施して欲しいタスクのプロンプトを記載します。今回は、昔話に翻訳するタスクを実行してほしいため、その内容に適したプロンプトを記載しました。
変数 ユーザーに入力を求めたい情報を記載します。例として ■変数の設定例 の画像のように input という変数を作成した場合、ユーザーがチャットの文章以外にInputという変数を入力することになります。この変数の内容は、手順(プロンプト)の中で埋め込んで利用することも可能です。
ビジョン 画像を利用できるようにするかの設定です(Vision API)。設定をオンにすると、ユーザーは以下のように画像を入力として利用できるようになります。
コンテキスト 独自情報を付与するかについての設定です。この記事の後半で利用方法について記載します。
引用と帰属 コンテキストを与えた際に、参照箇所をユーザーへの返答に含めるかどうかの設定です。デフォルトではONになっています。

■変数の設定例

■ビジョンの利用例

画面下部にある「その他の機能」をクリックすると、その他ユーザーにより便利に使ってもらうことができる機能が設定できます。これらの内容についても、以下に簡単な解説を記載しますが、実際に試して挙動を確認いただくことが最も分かりやすいかと思います。

その他の機能

機能を追加 概要
会話の開始 会話の開始を設定すると、ユーザーに対してWelcomeメッセージを表示することができます。
フォローアップ ユーザーの質問にチャットボットが返答したあとに、次の質問候補が表示されます。これらの質問候補はAIが自動で考えた候補が表示されます。
テキストから音声へ / 音声からテキストへ テキストから音声へ - チャットボットの回答文章を読み上げることができる機能です。
音声からテキストへ - ユーザーが音声入力できるようになります。
上記の機能を利用するためにはOpenAIのAPIの設定が必要となります。
コンテンツのモデレーション 不適切な出力を行わないようにガードレールを設定することができます。OpenAIが提供するモデレーションのAPIを設定することや特定のキーワードを検知させることができます。
注釈返信 ユーザーが特定の文章を入力した場合のカスタムレスポンスを出力することができます。少しイメージがしにくいかと思うので、以下に ■注釈返信の利用例 を記載します。

■注釈返信の利用例

作成したチャットボットを誰でも使えるように公開してみる

Difyで作成したチャットボットは簡単に公開することができます。DifyのWebバージョンを利用する場合には、チャットボットを公開するとURLが発行されます。発行されたURLにアクセスすると誰でも作成したチャットボットを利用することができます。

https://youtu.be/N7R2vE9zOjk

2. Difyで独自情報(RAG)を付与したチャットボットを構築する。

ここまでで簡単なチャットボットをWebページとして公開することができました。続いて、生成AIを用いたチャットボットで利用されることが多い独自情報(RAG)を付与したチャットボットの構築を試してみましょう。
今回はユースケースとして、社内の問い合わせ業務改善を行いたい前提として「社内情報を付与したチャットボットの構築」を行います。

独自情報を付与したチャットボットの構築方法は大まかには以下の手順となります。

  1. ナレッジを作成する
  2. チャットボットにナレッジを付与する
  3. 利用テストを行う

簡単に作成ができるため、早速試してみましょう。

2-1. ナレッジを作成する

まずは独自情報の参照先となるナレッジを作成します。ナレッジは個別のチャットボットに紐づくのではなく、共通したナレッジとして作成を行います。

ナレッジの作成手順

https://youtu.be/-aLdB7zX6t0

ナレッジの作成手順は上記の動画のようになります。ナレッジとして与えたいファイルはドラッグアンドドロップで追加することが可能です。
以下に各種主要な設定項目についての解説を行います。

埋め込みモデル
ナレッジを作成する際には、与えた文書を意味的検索ができるようにベクトル化という作業を実施します。埋め込みモデルはこの「ベクトル化」の作業を行う際に利用するモデルのことです。今回は、OpenAIが提供するembedding model(埋め込みモデル)を利用してベクトル化を行います。
注意点: 生成AIを学び始めた方は、「ベクトル化」という言葉にあまり馴染みがない方も多いかと思いますが、ざっくりと「検索を行う前の前準備」ぐらいの認識でOKです。このあたりの難しいポイントはDifyがいい感じにやってくれます。

検索方法
与えたドキュメントに対する検索手法を設定します。検索方法の概要は以下に記載します。基本的には「ハイブリッド検索」を利用すると他の検索方法より高い精度が得られやすいため、今回は「ハイブリッド検索」を採用します。

検索方法 概要
ベクトル検索 ユーザーが問い合わせた内容とドキュメントの類似度を比較して、よく似ているドキュメントを参照して回答する検索方法です。問い合わせ内容の意味を重視して、検索を行います。
全文検索 ユーザーが問い合わせた内容とドキュメントに出現している単語を重視して行う検索手法です。問い合わせに含まれるキーワードを重視して検索を行います。
ハイブリッド検索 上記のベクトル検索と全文検索を合わせた検索手法です。ハイブリッド検索を利用すると、問い合わせとして入力されたキーワードと意味の両方を考慮して検索を行います。基本的には「ベクトル検索」や「全文検索」と比較して高い検索精度になる傾向があるため、今回はこちらの検索方法を採用します。

ハイブリッド検索を利用する際に設定する主要なパラメーターの概要は以下のようになります。これらの内容は検索精度を向上させるためのチューニングの際に値を調整することが多いです。

ハイブリッド検索のパラメーター(設定項目)

検索方法 概要
ウェイト設定 セマンティック(意味的な検索)とキーワード検索をどの程度重視するかについての設定を行います。検索精度を向上させたい際にバランスをチューニングする項目なります。
Rerankモデル 検索結果に対して、結果を再評価し再順位付けする際に利用されるモデルです。ユーザーの問い合わせに対して最も関連性が高い検索結果が得られるように、利用されるモデルです。
トップK 検索時に取得する検索結果の件数の設定です。例えば、トップkを3に設定すると3件の検索結果が取得され、トップkを10に設定すると10件の検索結果を取得します。
スコア閾値 検索結果として取得する文章の類似度を設定します。例えば0.8に設定するとよく似た結果のみを取得し、0.5に設定するとより幅広く検索結果を取得します。

(参考)作成したナレッジの検索結果をテストする。

上記の手順で設定した検索が期待通り動作しているかの確認もナレッジの作成画面で実施することが可能です。

https://youtu.be/U-FReUyCr1Y

上記の動画で確認ができるように、今回はTop_k(検索結果の取得件数)を3に設定したため、3件の検索結果が取得されています。このように検索結果をテストすることで、必要なドキュメントを取得できているかを確認しながらチャットボットのチューニングを実施します。

2-2. チャットボットにナレッジを付与する

2-1の手順で作成したナレッジを付与して、社内情報に回答が可能なチャットボットを構築します。
以下に参考の動画を記載しますが、「コンテキスト」にナレッジを設定するだけで利用が可能になります。

https://youtu.be/NFz8ioeNDW4

動画を見ていただくとわかるように、ユーザーの質問に対して社内情報をもとに回答ができています。
また、回答の引用として「どのドキュメントのどの部分を参照したか?」についても参照できるため、関連情報の確認も簡単に実施可能です。
先ほど作成したチャットボットと同様の手順で「公開」を行えば、URLを共有すれば誰でも利用ができるようになります。

2-3. Difyで作成したチャットボットをAPI経由で呼び出してみる

1. Difyで簡単なチャットボットを構築する」で実施したように、Webページ上にDifyで作成したチャットボットを公開することは簡単にワンクリックで実施が可能です。DifyにはWebページとしての公開のみならず、API経由で作成したチャットボットにアクセスすることもできます。APIを利用するとSlackやTeamsなどと連携することができるため、試してみたいと思います。

API経由で利用したい際には、「APIアクセス」のメニューからドキュメントを確認することができます。

API経由で利用する場合でも、エンドユーザーからファイルアップロードを受け付けることができたり、音声を読み上げさせることができたりとたくさんの機能が準備されていますが、今回はAPIを経由して質問の実施と回答の取得をゴールにしたいと思います。

DifyのチャットボットのAPI keyは一つのチャットボットに紐づく形となり、このAPI Keyを知っている人はだれでも構築したチャットボットにアクセスすることが可能です。流出すると悪質な利用を行われてしまう可能性があるため、大切に保管しましょう。

以下にPythonで実装したDifyで構築したチャットボットをAPI経由で利用する際のサンプルコードを記載します。APIキーを変更するとすぐに利用が可能なので、是非試してみてください!

APIを利用するPythonのサンプルコード

import requests
import json

# APIキーとベースURLの設定
API_KEY = '<your-api-key>'
BASE_URL = 'https://api.dify.ai/v1'

# ヘッダーの設定
headers = {
    'Authorization': f'Bearer {API_KEY}',
    'Content-Type': 'application/json'
}

# 質問を送信する関数
def send_question(query, user, conversation_id=None):
    url = f'{BASE_URL}/chat-messages'
    
    # リクエストボディの作成
    data = {
        'query': query,
        'inputs': {},
        'response_mode': 'blocking',
        'user': user,
        'auto_generate_name': True
    }
    
    if conversation_id:
        data['conversation_id'] = conversation_id

    # リクエストの送信
    response = requests.post(url, headers=headers, json=data)
    return response.json()

# 使用例
if __name__ == "__main__":
    query = "経費申請の実施方法を教えて"
    user = "unique_user_id"

    response = send_question(query, user)
    
    print("Message ID:          ", response.get('message_id'))
    print("Conversation ID:     ", response.get('conversation_id'))
    print("Answer:              ", response.get('answer'))
    print("Retriever Resources: ", json.dumps(response.get('metadata', {}).get('retriever_resources'), indent=2, ensure_ascii=False))

レスポンス内容

tannerjohn@TannerjohnnoMacBook-Pro dify_sample % python main.py
Message ID:           60ee9d2f-40f6-4443-992e-4c0e6d67e20d
Conversation ID:      51f9e17c-9790-4b03-b2ac-9e5ebcd6c97c
Answer:               経費申請の実施方法について説明します。

1. **経費発生**
   - 交通費、宿泊費、食費、雑費など、業務に関連する経費が発生した場合。

2. **領収書の保管**
   - 経費発生時に必ず領収書を取得し、紛失しないように保管します。

3. **経理システムへのログイン**
   - 経理システムのURLにアクセスします。
   - 社員IDとパスワードを入力してログインします。
   - 2段階認証が設定されている場合、認証コードを入力します。

4. **経費申請書の作成**
   - 経理システム内の経費申請メニューから新規申請を作成します。
   - 各経費分類ごとに対応する金額を入力します。

5. **上司の承認**
   - 経理システムを通じて、上司に申請書を送信し、承認を得ます。

6. **経理部門への提出**
   - 承認を得た経費申請書を経理システム上で提出します。
   - 領収書のスキャンデータを添付することを忘れずに。

7. **精算の確認**
   - 経理部門からの確認後、指定の口座に経費が振り込まれます。

注意事項として、領収書の提出は必須であり、経費申請は原則として発生月内に行う必要があります。不明な点がある場合は、経理部門にお問い合わせください。
Retriever Resources:  [
  {
    "position": 1,
    "dataset_id": "9769453c-10c2-45e8-bea0-60ecf2aa7491",
    "dataset_name": " 社内情報のナレッジ",
    "document_id": "16ad263a-254f-4d33-a195-4fcc5e901fe7",
    "document_name": "経理申請 22b463f35ef04f1886fd78f8c26cf3b0.md",
    "data_source_type": "upload_file",
    "segment_id": "08c676a7-19e6-439b-8b40-8360fc59ee67",
    "retriever_from": "api",
    "score": 0.62578213,
    "content": "経理申請\n\n経理申請手順書\n\n1. 経費申請の概要\n\nこの手順書は、社員が経費を申請する際の手順を詳細に説明します。申請に必要な書類、プロセス、および各経費分類ごとの精算可能金額についても記載します。\n\n2. 経費申請の流れ\n\n経費発生\n交通費、宿泊費、食費、雑費など、業務に関連する経費が発生します。\n\n領収書の保管\n経費発生時に必ず領収書を取得し、紛失しないように保管します。\n\n経理システムへのログイン\nステップ1: 経理システムのURLにアクセスします。例: https://keiri-system.example.com\nステップ2: 社員IDとパスワードを入力してログインします。\nステップ3: 2段階認証が設定されている場合、認証コードを入力します。\n\n経費申請書の作成\n経理システム内の経費申請メニューから新規申請を作成します。\n各経費分類ごとに対応する金額を入力します。\n\n上司の承認\n経理システムを通じて、上司に申請書を送信し、承認を得ます。"
  },
  {
    "position": 2,
    "dataset_id": "9769453c-10c2-45e8-bea0-60ecf2aa7491",
    "dataset_name": " 社内情報のナレッジ",
    "document_id": "16ad263a-254f-4d33-a195-4fcc5e901fe7",
    "document_name": "経理申請 22b463f35ef04f1886fd78f8c26cf3b0.md",
    "data_source_type": "upload_file",
    "segment_id": "b6d27a27-bd08-4383-a752-ea21cfb80cc9",
    "retriever_from": "api",
    "score": 0.6188104,
    "content": "6. 注意事項\n\n領収書の提出は必須です。領収書がない場合は精算できません。\n\n経費申請は原則として発生月内に行ってください。\n\n不明な点がある場合は、経理部門にお問い合わせください。\n\n7. 経理部門連絡先\n\n電話番号: 03-XXXX-XXXX\n\nメール: keiri@example.com\n\nこの手順書に従って、適切に経費申請を行ってください。ダミーデータを活用して手順をシミュレーションし、実際の申請時に備えましょう。"
  },
  {
    "position": 3,
    "dataset_id": "9769453c-10c2-45e8-bea0-60ecf2aa7491",
    "dataset_name": " 社内情報のナレッジ",
    "document_id": "16ad263a-254f-4d33-a195-4fcc5e901fe7",
    "document_name": "経理申請 22b463f35ef04f1886fd78f8c26cf3b0.md",
    "data_source_type": "upload_file",
    "segment_id": "e72e447a-2b1d-4b1d-8460-e18659818cc1",
    "retriever_from": "api",
    "score": 0.60420096,
    "content": "精算の確認\n経理部門の確認後、通常の経費申請と同様に精算されます。\n\n4. 経費申請書の記入方法\n\n経費申請書には以下の項目を記入します:\n\n申請者名\n\n申請日\n\n部署名\n\n経費発生日\n\n経費の詳細説明\n\n各経費分類ごとの金額\n\n合計金額\n\n例:"
  },
  {
    "position": 4,
    "dataset_id": "9769453c-10c2-45e8-bea0-60ecf2aa7491",
    "dataset_name": " 社内情報のナレッジ",
    "document_id": "16ad263a-254f-4d33-a195-4fcc5e901fe7",
    "document_name": "経理申請 22b463f35ef04f1886fd78f8c26cf3b0.md",
    "data_source_type": "upload_file",
    "segment_id": "8a48072b-7617-46a4-946f-0ccf2c9920de",
    "retriever_from": "api",
    "score": 0.5838211,
    "content": "上司の承認\n経理システムを通じて、上司に申請書を送信し、承認を得ます。\n\n経理部門への提出\n承認を得た経費申請書を経理システム上で提出します。\n領収書のスキャンデータを添付することを忘れずに。\n\n精算の確認\n経理部門からの確認後、指定の口座に経費が振り込まれます。\n\n3. 領収書を紛失した場合の手順\n\n領収書紛失の報告\n上司および経理部門に速やかに報告します。\n\n証明書の取得\n取引先からの取引明細書やクレジットカードの利用明細など、経費の発生を証明できる書類を入手します。\n\n領収書紛失申請書の作成\n経理システム内で「領収書紛失申請書」を作成します。\n経費の内容、発生日、金額、および紛失の理由を詳細に記入します。\n\n上司の承認\n領収書紛失申請書を上司に提出し、承認を得ます。\n\n経理部門への提出\n承認を得た領収書紛失申請書と証明書を経理システムを通じて経理部門に提出します。"
  }
]
tannerjohn@TannerjohnnoMacBook-Pro dify_sample % 

上記のように出力できました。RAGで参照した該当箇所やそれ以外にも様々なパラメーターの情報が取得可能です。
API経由で利用すると様々なシステムと連携することができるので、便利ですね。

まとめ

この記事では、Difyの入門として「簡単なチャットボットの構築〜公開」と「社内情報に回答可能なチャットボットをAPI経由で利用する」検証を行いました。
Difyはプログラマーではない方でも簡単に利用ができ、かつ高速に構築ができるため価値検証を始めるツールとしては非常に有益であるとの印象を受けました。
チャットボット以外にもエージェントや様々な機能があるため、今後も利用していきたいと思います。
是非、試してみてください〜!

Discussion