こんにちは、カディンチェです。
社内AI勉強会で、「整形されていない既存のプレゼン資料だけで、実用的なRAGチャットボットが本当に作れるのか?」という実証実験を行いました。結論から言うと、Difyを使えば特別な資料準備なしに、数時間で製品問い合わせボットが構築できることがわかりました。
本記事では、その実装プロセスと技術的な知見を共有します。
目次
- 背景:なぜ製品問い合わせチャットボットなのか
- 従来の問い合わせフォームの課題
- Difyを利用した背景
- 実装環境
- 実装プロセス
- Step 1: ナレッジパイプラインの検討と断念
- Step 2: ワークフローによるQA形式のCSVの生成
- ワークフロー構成
- LLMノードのプロンプト設計
- Step 3: RAGへのデータ投入
- Step 4: チャットボットの構築
- 実証実験:実際の動作確認
- まとめ
- 参考リンク
背景:なぜ製品問い合わせチャットボットなのか
従来の問い合わせフォームの課題
- 心理的ハードル: 「メールを書く」という行為は、明確な目的(見積依頼、デモ希望)がないと実行されにくい
- 潜在顧客の機会損失: 「ちょっと気になる」程度の興味段階では問い合わせに至らない
- 定性情報の欠如: Google Analyticsでページビューは分かるが、「どの機能に興味があるのか」「どんな疑問を持っているのか」は見えない
これらの課題を解決するため、RAG(Retrieval-Augmented Generation)を活用したチャットボットの構築に着手しました。
Difyを利用した背景
Difyは以下の特徴を持つノーコード/ローコードAI開発プラットフォームです:
- ノーコード/ローコードで実装可能
- RAGパイプラインとエージェント機能を統合的に提供
- AWSなどのプライベート環境にデプロイ可能(コミュニティエディション)
- ワークフローの視覚的な設計が可能
カディンチェでは、DifyのコミュニティエディションをAWS EC2上にデプロイし、社内で活用しています。その為、今回のチャットボットでもDifyを使ってAIアプリケーションを作ることにしました。
実装環境
- Dify: Version 1.9.1(コミュニティエディション)
- インフラ: AWS EC2
- LLM: GPT(OpenAI API経由)
- 入力データ: 既存のプレゼン資料PDF(Kadinche Layerd製品説明資料
※プレゼン資料なので、表紙のようなRAGに入力するには無駄な情報も含まれています。
実装プロセス
Step 1: ナレッジパイプラインの検討と断念
Dify v1.9.0で正式リリースされたKnowledge Pipelineは、データソース接続からドキュメント解析、チャンキング戦略まで、各処理ステップを自分自由に設計しカスタマイズできる機能です。
この方法の利点は、プレゼン資料に含まれる不要な情報(ページ番号、装飾的な要素など)を排除し、意味のある情報だけを構造化してRAGに投入できる点です。
しかし、v1.9.1では既知の不具合によりKnowledge Pipelineが正常に動作しませんでした。調査の結果、コミュニティで報告されているバグと一致することが判明したました。
その為Knowledge Pipelineを使用することを断念し、ワークフローでQA形式のCSVに変換し、生成したCSVをRAGに設定する代替アプローチを採用することにしました。
Step 2: ワークフローによるQA形式のCSVの生成
Knowledge Pipelineが使えないため、Difyのワークフロー機能を使用してまずはPDFファイルからQA形式のCSVの出力を行いました。
ワークフロー構成
ノード構成:
- 開始ノード: PDFファイルをアップロード
- テキスト抽出ノード: PDFからテキストを抽出
- LLMノード: GPT-5を使用してテキストをQA形式に変換
- MARKDOWN TO CSV FILEノード: 出力をCSV形式でエクスポート
LLMノードのプロンプト設計
LLMノードでは、抽出したテキストをQ&A形式に構造化するプロンプトを設定しました:
{{入力テキスト}}に基づいてQ&Aペアのリストを生成してください。出力はMarkdown形式の表として提示し、第1列を連番、第2列を質問、第3列を回答としてください。この表形式はCSVファイルに容易に変換できる形式にしてください。
# 出力形式の例:
| Index | Question | Answer |
|-------|-----------|--------|
| 1 | この資料の主な目的は何ですか? | この資料は、当社の新製品発売戦略について説明しています。 |
| 2 |製品はいつ発売されますか?| 製品は今年の第3四半期に発売される予定です。|
# 指示:
- 入力テキストを読み、内容を理解してください
- PDF抽出テキストのため、文章構造が不完全だったり、改行位置が不自然だったり、情報が断片的である可能性があります。文脈から意味を推測し、論理的につながるように情報を補完してください
- 断片的な情報は、関連する内容同士を統合して、意味のある完結したQ&Aペアにしてください
- 箇条書きや見出しと思われる部分は、文脈を考慮して適切にまとめてください
- 重要な情報を抽出し、意味のある質問と回答を生成してください
- 情報が不完全で意味が不明瞭な部分は、無理にQ&Aにせず、確実に理解できる部分のみを対象にしてください
- 入力テキストに含まれる ![image] 形式の画像URLは、回答内に必ず保持してください
- 質問を作成する際は、以下のルールに従ってください:
・ 製品・サービス・システムなどの固有名詞に関する質問の場合、必ずその固有名詞を質問文に含めてください(例:「Kadinche Layerdとは何ですか?」「Kadinche Layerdで実展示と連動した表示制御はできますか?」)
・ 企業全体や組織に関する一般的な質問の場合は、固有名詞を含めなくても構いません(例:「企業名と創業日は?」「会社の所在地はどこですか?」)
・ 判断基準:回答内容が特定の製品・サービス・機能に関するものであれば、質問にその名称を含める。企業情報や組織全体に関するものであれば含めない
- 質問は簡潔かつ具体的にしてください
- 回答は正確で、それ単体で理解でき、明確なものにしてください
- 1つの回答には関連する情報をまとめて記載し、ユーザーが追加で検索しなくても理解できるようにしてください
- 余計な説明は付けず、Markdown形式の表のみを出力してください
このプロンプト設計により、整形されていないPDF資料から、RAGに適した構造化データを自動生成できます。{{入力テキスト}}に基づいてQ&Aペアのリストを生成してください。出力はMarkdown形式の表として提示し、第1列を連番、第2列を質問、第3列を回答としてください。この表形式はCSVファイルに容易に変換できる形式にしてください。
# 出力形式の例:
| Index | Question | Answer |
|-------|-----------|--------|
| 1 | この資料の主な目的は何ですか? | この資料は、当社の新製品発売戦略について説明しています。 |
| 2 |製品はいつ発売されますか?| 製品は今年の第3四半期に発売される予定です。|
# 指示:
- 入力テキストを読み、内容を理解してください
- PDF抽出テキストのため、文章構造が不完全だったり、改行位置が不自然だったり、情報が断片的である可能性があります。文脈から意味を推測し、論理的につながるように情報を補完してください
- 断片的な情報は、関連する内容同士を統合して、意味のある完結したQ&Aペアにしてください
- 箇条書きや見出しと思われる部分は、文脈を考慮して適切にまとめてください
- 重要な情報を抽出し、意味のある質問と回答を生成してください
- 情報が不完全で意味が不明瞭な部分は、無理にQ&Aにせず、確実に理解できる部分のみを対象にしてください
- 入力テキストに含まれる ![image] 形式の画像URLは、回答内に必ず保持してください
- 質問を作成する際は、以下のルールに従ってください:
・ 製品・サービス・システムなどの固有名詞に関する質問の場合、必ずその固有名詞を質問文に含めてください(例:「Kadinche Layerdとは何ですか?」「Kadinche Layerdで実展示と連動した表示制御はできますか?」)
・ 企業全体や組織に関する一般的な質問の場合は、固有名詞を含めなくても構いません(例:「企業名と創業日は?」「会社の所在地はどこですか?」)
・ 判断基準:回答内容が特定の製品・サービス・機能に関するものであれば、質問にその名称を含める。企業情報や組織全体に関するものであれば含めない
- 質問は簡潔かつ具体的にしてください
- 回答は正確で、それ単体で理解でき、明確なものにしてください
- 1つの回答には関連する情報をまとめて記載し、ユーザーが追加で検索しなくても理解できるようにしてください
- 余計な説明は付けず、Markdown形式の表のみを出力してください
このプロンプト設計により、整形されていないPDF資料から、RAGに適した構造化データを自動生成できます。copy
Step 3: RAGへのデータ投入
ワークフローから出力されたCSVファイルを、Difyのナレッジベース機能でインポートしました。
重要なポイントとして、「Q&A 形式で分割」にチェックを入れることです。こうすると、出来上がるチャンクがQAごとに分割されます。その他の設定は、全てデフォルトの設定を使用しました。
生成されたチャンクは下記のようにQAごとにチャンク化されます。
また、GUI上から有効・無効を切り替えることができます。
社内のありものの資料を使用すると、どうしても実現したいチャットとは関係のない情報が含まれてしまうことがあると思いますのでこの機能は便利です。
Step 4: チャットボットの構築
ナレッジベースを作成したら、チャットフロー型のアプリケーションを構築しました。
基本構成:
- 開始ノード: ユーザーの質問を受け付け
- 待機中の表示: LLMで回答生成中にユーザーに表示
- ナレッジ検索ノード: RAGから関連情報を取得
- LLMノード: 検索結果を基に回答を生成
- 応答ノード: ユーザーに回答を返す
実証実験:実際の動作確認
今回は「Kadinche Layerd」という1製品のみを対象に、以下の3つの質問パターンでテストしました。どのケースでも十分な回答が得られていることが分かります。
まとめ
やってみる前は、PDFファイルから適切に構造化された情報が抽出できるのかや、不要な情報を読み取ってしまい回答がおかしくなるのではないかと不安だったのですが、今回の社内AI勉強会で得られた最大の知見は、「特別な準備をしなくても、今ある資料で実用的なRAGチャットボットが数時間で作れる」という発見でした。
現在は1製品のみですが、今後は他の製品ドキュメントも活用し、Kadincheの製品全てに回答できるようなAIを開発していく予定です。
実用性が確認できれば、KadincheのWebサイトにこのAIチャットボットを搭載する予定です。
カディンチェでは、今後もAI技術の実践的な活用方法について、社内勉強会の成果を共有していきます。