n8n活用 RAGを構築して社内FAQ検索を改善してみた

 こんにちは、Cake.jp 技術部の釘野です。

 

 昨今のAIの進化は目覚ましく「とりあえずAIを使って業務を楽にできないか?」と考える場面も増えてきました。

 

 Cake.jpでも、技術部を始め社内のさまざまな業務でAI活用を模索しています。

 今回はそんな中での「カスタマーサポート業務のFAQ検索を改善した取り組み」の話をさせていただきます。

 

カスタマーサポートが抱えていた課題 

 Cake.jpのカスタマーサポートでは、お問い合わせに対して

  1. 内容を確認
  2. 適切なFAQを探す
  3. FAQをもとに回答を作成

 という流れで対応しています。

 ただ、Cake.jpのサービス運営期間が長くなるにつれ、FAQの数も増え続けてきました。

 結果として

  • FAQが多く、検索に時間がかかる
  • 慣れたスタッフでも毎回探すのが大変
  • 新しいスタッフには特にハードルが高い

 そんな状況がボトルネックになってきました。

 

そうだ、AIを使おう

 この課題に対して「FAQ検索そのものをAIに任せられないか?」という対策案があがりました。

 

 そこで採用したのがRAG(Retrieval-Augmented Generation:検索拡張生成)という仕組みです。

 RAGをざっくり説明すると、

「あらかじめ用意した外部データ(FAQや社内ドキュメント)を検索させ、その結果をもとにAIが回答を生成する」

 という仕組みになります。

 

 LLMが普段おこなっている一般知識での回答はなく「こちらが用意した限定した情報を参照して答えさせる」のがポイントです。

 カスタマーサポートのFAQ検索は、まさにRAGの活用例として良いケースとなりえると思いました。

 

n8nでRAGを構築する

 今回の実装には『n8n』を利用しました。

 n8nは、ノードと呼ばれる単位を組み合わせてワークフローを構築できる自動化ツールで、AI関連のノードも豊富に用意されています。


 最初に作ったワークフローは、以下のような最低限の構成です。

  • FAQデータ(CSV)をアップロード
  • ベクターDBに登録
  • 質問文からFAQを検索

 

 使っているノードは次のとおりです。

ラベル

ノードの種類

役割

FAQデータCSVをアップロード

n8n Form Trigger

CSVファイルをアップロードするフォームの提供。このノードを使ってCSVファイルを入力します。

FAQデータの入力

Simple Vector Store

ベクターDBへのデータの入力をします。

Embeddings OpenAI

Embeddings OpenAI

ベクターDBでのデータの入力や検索を司るAIです。今回はOpenAIの「text-embedding-3-large」モデルを選択しました。

CSV

Default Data Loader

ベクターDBへ入力するデータの形式を指定します。今回は「CSVファイル」をそのまま取り込めむようにしました。

FAQデータの検索

Simple Vector Store

ベクターDBでFAQを検索して回答をします。

 

 FAQデータ(CSV)は以下の3項目で、現在使われているFAQページから作りました。

  • タイトル(質問)
  • コンテンツ(回答)
  • 該当ページのURL

 

しかし、検索精度が思ったほど出ない

 さっそく「もらったはずのクーポンがありません」という問い合わせで検索してみたところ、返ってきたのは

  • 配送状況がわかる送り状番号を知りたい
  • eGiftの受け取りURLを紛失した

 など、大きくズレたFAQでした。

 

 クーポン関連のFAQは確かに入力して、登録されているのに、うまく回答されなかったのです。

 原因を考えたところ

「入力されたFAQの文章では、AIが検索しやすい形になっていない」

 ということだと推測されました。

 

 そこでCSVの入力をそのまま登録するのではなく「AIが検索しやすい形に要約してからベクターDBに登録する」ことにしました。

 具体的には、次のようにワークフローを拡張しました。

 

 追加したノードや変更したノードは次のとおりです。

ラベル

ノードの種類

役割

JSONに置換

Extract from File

以降のノードで使いやすいように、CSVファイルのデータをJSONに変換します。

FAQの要約

AI Agent

入力されたデータを要約します。プロンプトは後述。

OpenAI Chat Model

OpenAI Chat Model

FAQの文章の要約に使っているAIです。今回はOpenAIの「gpt-5-mini」モデルを選択しました。

JSON

Default Data Loader

ベクターDBへ入力するデータの形式を指定します。「CSV」から「JSON」に変更しました。
ここで要約されたFAQの文章を「pageContent」として、もとのFQAの文章を「Metadata」として登録することを指定しています。

 

 

改善後の検索結果

 再度「もらったはずのクーポンがありません」という問い合わせでで検索してみると

  • 届いたクーポンがマイページに表示されない
  • クーポンを使用することができない

 といった、質問の意図に合ったFAQが返ってくるようになりました。

 

 n8nから返す結果としては「Metadata」に保存した元のFAQの文章を利用するため、 スタッフが見る情報はこれまでと変わりません。

 そのうえで「探す時間」を大きく減らすことができました。

 

さいごに

 今回の取り組みで、

  • RAGはカスタマーサポートと相性が良い
  • データの前処理(要約)が検索精度に大きく影響する
  • n8nを使えば、比較的低コストで試せる

 ということを感じました。

 

 今後の課題としては、

  • FAQデータの更新を手動ではなく自動化したい。
  • 実運用の中でプロンプトや要約精度を改善していきたい。

 などを考えています。

 

 これからも、こうした新しい技術を取り入れながら、改善を積み重ねて日々の業務やサービスの品質向上に取り組んで行きたいと思います。