はじめに
今回は、Difyを使って、社内の人事・研修・開発ルールについて回答するRAGアプリケーションを作成します。
作成するアプリケーション名は Human Resource AI とします。
例えば、次のように質問します。
AWS研修の期間は何週間ですか?
登録した社内ナレッジに「AWS研修は2週間を標準とする」と記載されている場合、次のように回答します。
AWS研修の期間は、標準で2週間です。
ここで重要なのは、LLMへ直接質問するのではなく、途中に知識検索を挟む点です。
ユーザーの質問に関連する情報を社内ナレッジから検索し、その検索結果をLLMへ渡すことで、LLMが事前に知らない社内独自のルールについても、登録した文書を根拠として回答できるようにします。
今回の全体構成
今回作成するシステムは、ユーザーの質問をDifyが受け取り、社内ナレッジ(Markdown)を検索し、その結果をLLM(OpenAI)へ渡して回答する、という流れです。
使用する社内ナレッジ
今回のハンズオンでは、動作確認用として架空の社内ルールをまとめたMarkdownファイル「人事_研修_開発ナレッジ.md」を使用します。
このファイルには、就業規則、新入社員研修、開発ルール、セキュリティ、経費・申請などのサンプルデータを記載しています。以下のGitHubリポジトリからダウンロードできます。
GitHub:https://github.com/aiota-jp/dify-rag-sample
ファイルをダウンロード後、Dify Knowledgeへアップロードします。
本ファイルに記載している社内規則や研修制度などは、RAGの動作確認を目的とした架空のサンプルデータです。
DifyからOpenAI APIを利用するため、あらかじめOpenAI APIキーを取得しておきます。
OpenAI APIおよびDifyの料金・利用上限・画面レイアウトは変更される可能性があります。実際に利用する際は、それぞれの公式ページで最新情報を確認してください。
1. Difyにアクセスしてログインする
まず、Difyの公式サイトへアクセスします。
Dify公式サイト:https://dify.ai/ja
今回は、自分でサーバーを構築する必要のない Dify Cloud を使用します。
Difyの公式サイトから「今すぐ始める」などを選択し、Dify Cloudへ進みます。アカウントを持っていない場合はアカウントを作成し、ログインすると、Difyのワークスペースが表示されます。
今回はアプリケーション「Human Resource AI」を作成します。
2. OpenAI APIキーをDifyに登録する
Human Resource AIを作成する前に、DifyからAIモデルを利用できるように、モデルプロバイダーを設定します。
今回作成するHuman Resource AIでは、DifyからAIモデルを呼び出し、社内ナレッジをもとにユーザーからの質問に対する回答を生成します。
Dify自体がAIモデルを内蔵しているわけではないため、利用するAIモデルの設定が必要です。本記事では、OpenAIのモデルを使用します。
イメージとしては、次のような流れです。
ユーザー
↓
Dify(Human Resource AI)
↓
OpenAI API
↓
OpenAIのモデル
↓
回答生成
OpenAIのモデルを利用するには、OpenAI APIキーを取得し、Difyに登録する必要があります。
OpenAI APIキーの取得方法や料金、モデルの選び方、Responses APIを使った基本的なテキスト生成については、以下の記事で詳しく解説しています。
Pythonで始めるOpenAI API入門 〜APIキーの取得・料金・モデル選択・Responses APIによるテキスト生成まで〜
なお、Difyで利用できるAIモデルはOpenAIだけではありません。複数のモデルプロバイダーに対応しており、サービスによっては無料枠を利用できる場合もあります。また、Ollamaなどを使ってローカルLLMと連携することもできます。
Dify
├─ OpenAI
├─ その他のクラウドAIモデル
└─ ローカルLLM(Ollamaなど)
用途や予算に応じて利用するAIモデルを選択できますが、本記事ではOpenAIを使用して進めます。
OpenAI APIキーを登録する
OpenAI APIキーを取得したら、Difyのモデルプロバイダー設定から OpenAI を選択し、APIキーを登録します。
設定画面では、主に次の項目を入力します。
| 項目 | 設定内容 |
|---|---|
| 認証名 | 例:OpenAI-MyAccount |
| API Key | OpenAIで取得したAPIキー |
| Organization | 必要な場合のみ |
| API Base URL | 通常はデフォルト |
| API Protocol | Responses API |
登録が成功すると、OpenAIのモデルプロバイダーに登録した認証情報が表示されます。
補足:モデルプロバイダー設定画面の項目名やレイアウトは、Difyのバージョンによって変わることがあります。実際に構築するときは、その時点のDify公式ドキュメントで最新の設定方法を確認してください。
3. ナレッジベースを作成する
Human Resource AIアプリを作成する前に、まず社内ナレッジを検索できるようにするためのナレッジベースを作成します。
社内ナレッジをアップロードする
OpenAIの設定が完了したら、ナレッジベースを作成します。
Difyの左側メニューから 「ナレッジ」 を開きます。
右上の 「+ 作成」 をクリックし、「すぐに使えるナレッジベースを作成」 を選択します。
データソースとして 「テキストファイルからインポート」 を選択します。
「ファイルをドラッグアンドドロップする」の領域に、「人事_研修・開発ナレッジ.md」 をアップロードし、「次へ」をクリックします。
チャンクを設定する
RAGでは文書全体をそのまま検索するのではなく、文書を一定の大きさに分割して検索対象にします。この分割された文章を チャンク(Chunk) と呼びます。
今回は、次の設定で登録しました。
| 設定 | 値 |
|---|---|
| チャンキングモード | カスタム |
| 最大チャンク長 | 1024 characters |
| チャンクのオーバーラップ | 50 characters |
| インデックス方法 | 高品質 |
| Embeddingモデル | text-embedding-3-large |
| 検索方法 | ベクトル検索 |
| Top K | 3 |
チャンクを細かく分割しすぎると、文章の意味が途中で分断される可能性があります。
例えば、
チャンク1
「AWS研修」
チャンク2
「期間」
チャンク3
「2週間」
のように分割されると、「AWS研修の期間は2週間」という意味のまとまりが失われてしまいます。
そのため、設定後は 「チャンクをプレビュー」 を使用して、文章が意味のある単位で分割されているか確認します。
今回の「人事・研修・開発ナレッジ」のような Markdown 文書を検索して回答させる用途なら、まずは画面に出ているデフォルト設定で進めて問題ありません。
「チャンクをプレビュー」 をクリックしてください。
プレビューを確認し、改行単位で細かく分割されすぎる場合は、チャンク識別子を \n\n に変更します。
これは「チャンク識別子」が \n(改行)なので、Markdownの改行ごとに細かく分割されているためです。検索時に「1.1 勤務時間」という見出しと、その説明本文が別チャンクになる可能性があります。
インデックスを作成する
インデックス方法:高品質(推奨)
埋め込みモデル:text-embedding-3-large
検索設定:ベクトル検索
Rerankモデル:OFF
トップK:3
スコア閾値:0.5
「社内ナレッジをDifyのRAGで検索して回答する」 用途なら、表示されている設定で進めて大丈夫です。
特に今回は文章中心の .md ファイルなので、「画像も検索対象にする」という説明は気にしなくて大丈夫です。text-embedding-3-large でテキストをベクトル化して検索できます。
今回の設定は 高品質 → text-embedding-3-large → ベクトル検索 → Top K = 3 → スコア閾値 = 0.5 → Rerank OFF になっています。
なお、画面では 「ハイブリッド検索」が推奨 と表示されていますが、今回の記事が「DifyでRAGの基本動作を確認する」ことを目的としているなら、まず ベクトル検索 で進める構成で問題ありません。ハイブリッド検索は全文検索とベクトル検索を組み合わせる方式なので、発展項目として後から扱えます。
「保存して処理」→ インデックス作成完了まで進めてください。
「保存して処理」 をクリックすると、ナレッジベースが作成され、アップロードした文書の埋め込み処理が開始されます。
埋め込み処理では、分割したテキストをEmbeddingモデルによってベクトル化し、意味の近さを利用して検索できるようにします。
処理が完了したら、「ドキュメントに移動」 をクリックします。
作成されたチャンクを確認する
次は、「人事_研修_開発ナレッジ…」のファイル名をクリックしてください。ドキュメントの詳細画面に入り、作成されたチャンクを確認できます。
今回の設定では 106チャンク が作成されています。たとえば、
チャンク03:「1.1 勤務時間」+本文
チャンク04:勤務時間変更についての本文
チャンク05:時間外勤務についての本文
という形で、先ほどの \n\n による分割が反映されています。
また、右側に 「埋め込みコスト 9,234 tokens」 とありますが、これはこの文書をEmbeddingモデルで処理したトークン量です。
検索テストを行う
次は「検索テスト」です。
「標準勤務時間」と入力した結果、**チャンク03「1.1 勤務時間」**が1件表示されています。これは登録内容の確認としてはOKです。
4. Human Resource AIを作成する
ナレッジベースの準備ができたので、続いてアプリ本体である Human Resource AI を作成します。
Chatflowを作成する
Difyの左側メニューから 「スタジオ」 をクリックします。
スタジオ画面が表示されたら、「作成→最初から作成」「チャットフロー」 を選択します。
「最初から作成」をクリックし、アプリタイプとして
「チャットフロー」 を選択します。
「ワークフロー」ではなく「チャットフロー」 を選ぶのは、ユーザーが「勤務時間は?」「研修制度について教えて」のように質問し、対話形式で回答するRAGアプリを作るためです。
今回は、以下の内容でアプリを作成します。
- アプリ名:
Human Resource AI - 説明:
人事・研修・開発に関する社内ナレッジを参照して、ユーザーの質問に回答するAIアプリ
必要に応じてアイコンや説明を設定し、アプリケーションを作成します。作成すると、Human Resource AIのChatflow編集画面が表示されます。この時点では、まだRAGの知識検索は設定されていません。
入力が完了したら、「作成する」をクリックします。
知識検索ノードを追加する
「ユーザー入力」→「LLM」の接続を外して、「ユーザー入力」→「知識検索」を選択します。
画面の 「ユーザー入力」と「LLM」の間に知識検索を入れます。
知識検索ノードでは、主に次の2つを設定します。
クエリテキスト
ナレッジベース
クエリテキストを設定する
「クエリテキスト」の「変数値を設定」をクリックします。
クエリテキストには、ユーザーが入力した質問を指定します。
例えばユーザーが、「勤務時間は何時から何時までですか?」と質問した場合、その質問を検索条件としてナレッジベースへ渡します。
ここで重要なのは、知識検索ノードが「ユーザー入力」ノードより後ろに接続されていることです。
Difyでは、前段のノードから渡された変数を後続ノードで利用します。そのため、先に次の接続を作成してからクエリテキストを設定します。
ユーザー入力
↓
{x}query
ナレッジベースを設定する
続いて、「ナレッジベース」の右側にある「+」をクリックします。
作成済みのナレッジベース一覧が表示されるので、先ほど作成した
「人事_研修_開発ナレッジ」
を選択します。
これにより、ユーザーから質問が入力されると、その質問に関連する情報を「人事_研修_開発ナレッジ」から検索できるようになります。
今回、メタデータフィルタは使用しないため、「無効」のままとします。
5. LLMノードを設定する
続いてLLMノードを設定します。ここで、先ほど登録したOpenAIの認証情報を利用します。
Dify上で利用可能なモデルから、用途に合ったモデルを選択します。モデル名や利用可能なモデルは、契約内容やDify/OpenAI側の変更によって変わる可能性があるため、Difyのモデル選択画面に実際に表示されるモデルを確認して選択します。
画面の 「LLM」 をクリックしてください。
OpenAIモデルを設定する
① 「AIモデル」を設定
今回の Human Resource AI のRAG動作確認なら、一覧にある gpt-5.6-luna を選択して進めてよいです。
検索結果をコンテキストに設定する
② 「コンテキスト」を設定
画面右側の 「コンテキスト」→「変数値を設定」 をクリックしてください。
「知識検索 /{x}result」 を選択してください。
SYSTEMプロンプトを設定する
SYSTEMプロンプトに、次の内容を設定します。
あなたは、人事・研修・開発に関する社内問い合わせに回答するAIアシスタントです。
以下のナレッジベースの検索結果をもとに、ユーザーの質問に分かりやすく回答してください。
ナレッジベースに回答の根拠となる情報がない場合は、推測せず、
「ナレッジベースに該当する情報がありません」と回答してください。
ナレッジベースの検索結果:
「ナレッジベースの検索結果:」の直後にカーソルを置き、
SYSTEM欄右上の {x} をクリックします。
表示された変数一覧から 「コンテキスト」 を選択します。
6. RAGの動作を確認する
ここまで設定できたら、Chatflowの「プレビュー」からRAGの動作を確認します。
プレビューから質問する
プレビューを開き、チャット入力欄に次の質問を入力します。
勤務時間は何時から何時までですか?
実行すると、今回の環境では次のような回答が生成されました。
標準勤務時間は、平日の9時00分から18時00分までです。
また、所定労働時間は1日8時間です。
休憩時間は原則として12時00分から13時00分までの1時間です。
引用元を確認する
回答の下には、引用元として「人事_研修_開発ナレッジ.md」が表示されます。
これは、LLMが単独で回答しているのではなく、知識検索ノードによってナレッジベースから関連情報を取得し、その検索結果をもとに回答を生成していることを確認するためのポイントです。
今回の処理を整理すると、次のようになります。
ユーザー
│
│「勤務時間は何時から何時までですか?」
▼
ユーザー入力
│
│ query
▼
知識検索
│
│ 人事_研修_開発ナレッジを検索
▼
関連するチャンクを取得
│
│ result
▼
LLM
│
│ 検索結果をコンテキストとして参照
▼
回答
これで、ナレッジベースを利用したRAGの基本的な動作を確認できました。
ナレッジに存在しない質問をテストする
RAGでは「答えられる質問」だけでなく、答えられない質問のテストも重要です。例えば、ナレッジに社員食堂について記載していない場合、次のように質問します。
社員食堂の営業時間を教えてください。
期待する回答は、次のとおりです。
ナレッジベースに該当する情報がありません。
SYSTEMプロンプトに「根拠となる情報がない場合は推測しない」と設定しているため、存在しない社内ルールをLLMが推測して回答してしまわないことを確認します。ここで一般知識から推測した回答が返る場合は、SYSTEMプロンプトの制約を見直します。
7. RAGの仕組みを整理する
RAGでは、次のように処理が変わります。
質問
↓
ナレッジを検索
↓
関連する文章を取得
↓
LLMへ質問+検索結果を渡す
↓
回答
つまりRAGでは、LLMそのものを追加学習させるのではなく、質問時に関連する文書を検索し、その内容をLLMへ渡して回答を生成するのがポイントです。
OpenAIのモデルを社内データで再学習するわけではありません。
「RAG=AIに自社データを学習させる」と表現されることもありますが、厳密にはモデルそのものを再学習するのではなく、質問時に関連する文書を検索し、その内容をLLMへ渡して回答を生成します。
そのため、モデル自体を再学習しなくても、ナレッジを更新して再インデックスすることで、新しい情報を回答に利用できるようになります。
8. Human Resource AIを公開する
プレビューで動作を確認できたら、Human Resource AIを公開します。公開すると、Web上の共有リンクからアプリを利用できるようになり、外部のPythonプログラムから呼び出すためのDify APIも有効になります。
アプリを公開する
Chatflow編集画面の右上にある 「公開する」 をクリックします。
表示されたメニューから 「更新を公開」(初回は「公開する」)を選択すると、その時点の設定内容が公開バージョンとして反映されます。
ナレッジベースやSYSTEMプロンプトを後から変更した場合も、再度「更新を公開」を実行することで、最新の内容が公開バージョンへ反映されます。
編集(Chatflow)
↓
「公開する」→「更新を公開」
↓
公開バージョンへ反映
補足: プレビューは編集中の内容を確認するための機能で、公開バージョンとは別に扱われます。編集した内容を実際のアプリやAPIへ反映するには、必ず「公開する」→「更新を公開」を実行します。
公開したアプリを確認する
公開後、「公開する」→「Webアプリを開く」** から、公開バージョンのアプリを開けます。
プレビューと同じように質問を入力し、公開バージョンでも正しく回答が返ることを確認します。
勤務時間は何時から何時までですか?
公開バージョンでも、知識検索ノードを経由してナレッジベースから回答が生成されることを確認します。
Web公開の設定を確認する
Difyでは、公開したアプリを外部のユーザーが利用できるように、共有用のWebアプリとして設定できます。
必要に応じて、次のような設定を確認します。
| 項目 | 内容 |
|---|---|
| Webアプリの公開 | 共有リンクを有効にするかどうか |
| アクセス制限 | 誰でも利用可能にするか、限定するか |
| アプリ名・アイコン | 公開画面に表示される情報 |
社内利用の場合は、共有リンクを知っている人だけが利用できるよう、アクセス範囲を必要に応じて制限します。
補足: Webアプリの公開設定やアクセス制御の項目名・レイアウトは、Difyのバージョンによって変わることがあります。実際に公開するときは、その時点のDify公式ドキュメントで最新の設定方法を確認してください。
Dify APIキーを取得する
続いて、Python / Flaskなどの外部アプリケーションから Human Resource AI を呼び出すためのAPIキーを取得します。
Human Resource AIの画面左側から 「アクセスポイント」 をクリックします。
アクセスポイント画面には、主に次の利用方法が表示されます。
- Webアプリ
- バックエンドサービス API
- MCPサーバー
今回はPython / FlaskからDify APIを呼び出すため、「バックエンドサービス API」 を使用します。
APIエンドポイントを確認する
「バックエンドサービス API」には、APIエンドポイントが表示されています。
https://api.dify.ai/v1
このURLは、Python / FlaskからDify APIを呼び出す際に使用します。
「Webアプリ」に表示される https://udify.app/chat/... は、ユーザーがブラウザからHuman Resource AIを直接利用するためのURLです。
Python / FlaskからDify APIを呼び出す場合は、「バックエンドサービス API」に表示されているAPIエンドポイントを使用します。
APIキーを作成する
「バックエンドサービス API」にある 「APIキー」 をクリックします。
APIキーがまだ作成されていない場合は、新しいAPIキーを作成します。
作成したAPIキーは、Python / FlaskからHuman Resource AIを呼び出す際の認証に使用します。
APIキーは外部に公開しないでください。
ソースコードへ直接記述せず、.envなどの環境変数で管理します。
また、.envは.gitignoreに追加し、GitHubへコミットしないようにします。
これで、Python / FlaskからHuman Resource AIを呼び出すための準備ができました。実際にPythonからDify APIを呼び出す方法については、以下の記事で紹介しています。
まとめ
今回はDifyを利用して、社内ナレッジを検索して回答する Human Resource AI を作成しました。
実施した内容は次のとおりです。
- Difyへログイン
- OpenAI API認証情報を登録
- Human Resource AI(Chatflow)を作成
- Markdownで社内ナレッジを作成
- Dify Knowledgeへアップロード
- チャンク・インデックスを設定
- 「知識検索」ノードを追加
-
ユーザー入力.queryを検索条件に設定 -
知識検索.resultをLLMのコンテキストに設定 - SYSTEMプロンプトにコンテキスト変数を設定
- プレビューからRAGを動作確認
- Human Resource AIを公開
- Dify APIキーを作成
- Dify APIのエンドポイントを確認
今回のポイントは、LLMへ直接質問するのではなく、質問に関連する情報をナレッジから検索し、その検索結果をLLMへ渡して回答を生成するRAGの流れを構築したことです。
ユーザーの質問
↓
Dify
↓
知識検索
│
├────→ Dify Knowledge
│ │
│←─ 関連情報
│
▼
LLMノード
│
│ OpenAI API
▼
OpenAI
│
▼
回答
また、RAGはOpenAIのモデルそのものを社内データで再学習する仕組みではありません。質問時に関連するナレッジを検索し、その情報をコンテキストとしてLLMへ渡す点が重要です。
この仕組みは、人事・研修だけでなく、社内FAQ、業務マニュアル、製品マニュアル、問い合わせ対応などにも応用できます。
PythonからDify APIを呼び出し、RAGを業務システムに組み込む手順については、以下の記事で詳しく解説しています。






















