Dify(ディファイ)を使って、独自のナレッジベース(知識データベース)を参照する高度なチャットボットを作成してみませんか?
この記事では、Difyの標準機能だけでなく、Amazon Bedrock Knowledge Baseと連携する「カスタムツール」を作成し、RAG(検索拡張生成)チャットボットを構築する手順を詳しく解説します。
1. シンプルなチャットボットの作成(動作確認)
まずはDifyの基本的な機能を使って、シンプルなチャットボットを作成し、動作を確認してみましょう。
- Difyのスタジオから「最初から作成」を選択し、「チャットボット」を選びます。
- 使用するLLMモデル(Claude 3 Haikuなど)を選択します。
- 設定を変更したら必ず「公開」→「更新」ボタンを押して保存してください。

※モデルを選択
※更新する (何か設定変更したら更新して保存するように!)
チャットボットを起動
プレビュー画面で適当な質問を投げかけ、AIから応答が返ってくることを確認します。これでベースとなる環境の準備は完了です。
チャットしてみる
Claude 3 Haiku は、ChatGPT をベースに作られていることが分かりました…
2. Amazon Bedrock連携用カスタムツールの作成
外部のナレッジベース(ここではAmazon Bedrock Knowledge Base)を検索するために、Difyの「カスタムツール」機能を使用します。
OpenAPIスキーマの設定

「ツール」タブから「カスタムツールを作成」を選択し、以下のOpenAPIスキーマを入力します。これにより、Difyが外部API(Amazon API Gateway等で構築したBedrock検索API)を呼び出せるようになります。
openapi: "3.0.1"
info:
title: "DifyAPI"
version: "2024-10-04T04:37:52Z"
servers:
- url: "https://idocl2ul73.execute-api.ap-northeast-1.amazonaws.com/prod" # ここを正しいリクエストURLに変更する
variables:
basePath:
default: "prod"
paths:
/:
post:
summary: QueryBedrockKnowledgeBase # 追加
operationId: queryBedrockKnowledgeBase # 追加
requestBody: # 以下の requestBody を追加
description: "Request body containing the query"
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/query"
responses:
"200":
description: "200 response"
content:
application/json:
schema:
$ref: "#/components/schemas/Empty"
security:
- api_key: []
components:
schemas:
query: # 以下の query を追加
title: "query"
type: "object"
properties:
query:
type: "string"
required:
- query
Empty:
title: "Empty Schema"
type: "object"
securitySchemes:
api_key:
type: "apiKey"
name: "x-api-key"
in: "header"

認証情報の設定
APIへのアクセスに必要な認証キー(x-api-key)を設定します。
| Key | Value |
|---|---|
| x-api-key | (発行したAPIキーを入力) |

設定後、「テスト」ボタンを押して実際にAPIが動作するか確認します。「bedrock と teams は連携できますか」などのクエリを送信し、検索結果が返ってくれば成功です。

bedrock と teams は連携できますか


3. チャットフローの構築
カスタムツールが完成したので、これを組み込んだチャットボットのワークフロー(チャットフロー)を構築します。全体の流れは以下のようになります。
以下のようなフローにします
各ブロックの設定詳細
- 開始ブロック: ユーザーの入力(
sys.query)を受け取ります。
デフォルトで問題ないですsys.query変数にユーザの質問内容が入ります- 変数は、全てのブロックから利用できます

- 質問分類器: ユーザーの質問内容を分析し、ナレッジベース検索が必要かどうかを判定します。不要な場合は通常の会話へ分岐させます。
入力変数は、sys.queryにしますクラスで、条件を日本語で記載します
ユーザの質問に対して、自然言語で IF 文を定義すると考えてください
- カスタムツールブロック: 作成したツールを呼び出します。入力変数には
sys.queryを設定し、出力結果(検索されたナレッジ)を受け取ります。
カスタムツールブロックは、カスタムツールを呼び出すブロックになります
入力変数は、sys.queryにします
出力変数に、API Gateway からのレスポンスが入ります▷からテストをすると、textに Knowledge Base の回答が入っていることが分かります
- LLMブロック: 最終的な回答を生成します。
- コンテキスト: カスタムツールブロックの出力結果を設定します。
- プロンプト: 「以下のコンテキストを元に質問に答えてください」といった指示を記述します。
SYSTEMとUSERの 2 つの内容を元に生成 AI が回答を生成します
回答結果は、出力変数textに入ります
- 回答ブロック: LLMが生成したテキストをユーザーに表示します。
回答ブロックは、ユーザの質問に対して回答するアシスタントのメッセージ文を記載します
ここでは、Knowledge Base から情報が取得できなかった場合のブロックになるので、以下の日本語を直接返しますKnowledge Baseに情報はありませんでした
動作確認
プレビュー画面で再度質問を投げてみます。今回は外部のナレッジベースを検索し、その内容に基づいた回答が生成されているはずです。
bedrock と teams は連携できますか

このようにDifyでは、標準機能だけでなく外部APIと連携することで、AWSなどのクラウドサービス上に構築した既存の資産を有効活用したチャットボットをノーコード(ローコード)で構築することが可能です。
【推奨】業務システム化に有効なアイテム
生成AIを学ぶ



システム化のパートナー



VPSサーバの選定










コメント