第19回 社内AIアシスタントの構築 -- RAGで実現する検索ベースの質問応答システム

はじめに

前回はセマンティック検索の概念を整理しました。 本記事では、その発展形として RAG(Retrieval-Augmented Generation)を使った社内 AI アシスタントを構築します。

RAG は「検索で関連ドキュメントを見つけ、LLM(大規模言語モデル)がその内容を基に回答を生成する」仕組みです。 社内のドキュメントに基づいた回答を生成するため、一般的なチャット AI では答えられない社内固有の質問にも対応できます。

対象読者

  • 社内 AI アシスタントの構築に興味がある方

  • RAG の実装方法を学びたい方

  • LLM 連携の選択肢を理解したい方

RAG の仕組み

RAG のパイプライン

Fess の AI 検索モードは、以下のパイプラインで動作します。

  1. 意図分析(Intent): 利用者の質問を分析し、意図を分類(検索、要約、FAQ、不明確)

  2. 検索(Search): Fess のインデックスから関連ドキュメントを取得(ゼロヒット時はクエリを自動再生成して再検索)

  3. 評価(Evaluate): 取得したドキュメントの関連性を LLM が評価

  4. 全文取得(Fetch): 関連性の高いドキュメントの全文を取得

  5. 回答生成(Answer): ドキュメントの内容を基に LLM が引用付きの回答をストリーミング生成

このパイプラインにより、LLM の「もっともらしいが不正確な回答(ハルシネーション)」を軽減し、社内ドキュメントに裏付けられた回答を提供します。

Fess の AI 検索モードは、ベクトル検索(埋め込みモデル)を必要としません。 既存の全文検索インデックスをそのまま活用し、LLM が検索結果の評価と回答生成を担います。 そのため、埋め込みモデルの選定やベクトルデータベースの構築といった追加のインフラ準備なしに、すぐに RAG ベースの AI 検索を導入できます。

LLM プロバイダの選択

Fess は3つの LLM バックエンドに対応しています。 それぞれの特徴と選択基準を整理します。

LLM プロバイダの比較
プロバイダ プラグイン コスト 特徴
OpenAI fess-llm-openai API 従量課金 高い回答品質、GPT-4o 対応、手軽に始められる
Google Gemini fess-llm-gemini API 従量課金 拡張思考対応、長いコンテキスト
Ollama fess-llm-ollama ハードウェア費用 ローカル実行、データが外部に出ない、プライバシー重視

選択の判断基準

クラウド API(OpenAI / Gemini)を選ぶ場合

  • 初期コストを抑えたい

  • GPU サーバーを用意できない

  • 回答品質を最優先したい

  • データの外部送信が許容される

ローカル実行(Ollama)を選ぶ場合

  • 社内データの外部送信が許可されない

  • セキュリティ・プライバシー要件が厳しい

  • GPU サーバーを用意できる

  • ランニングコストを抑えたい(大量利用時)

AI 検索モードの設定

プラグインのインストール

使用する LLM プロバイダに対応するプラグインをインストールします。

  1. 管理画面の [システム] > [プラグイン] を選択

  2. 対応するプラグインをインストール(例: fess-llm-openai

AI 検索モードの有効化

Fess の設定で AI 検索モードを有効にします。

管理画面の設定または設定ファイルで rag.chat.enabled=true を設定します。

LLM 接続の設定

各 LLM プロバイダに応じた接続情報を設定します。

OpenAI の場合

  • API キー

  • 使用するモデル(gpt-4o、gpt-4o-mini など)

  • 最大トークン数

Ollama の場合

  • Ollama サーバーの URL

  • 使用するモデル名

  • Docker Compose でのサービス追加

services:
  ollama:
    image: ollama/ollama
    volumes:
      - ollama-data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

AI チャットの体験

チャット UI

AI 検索モードを有効にすると、Fess の検索画面に AI 検索モードが追加されます。 利用者はキーワード検索と AI チャットを切り替えて利用できます。

質問と回答の例

質問: 「有給休暇の申請方法を教えてください」

AI の回答:

有給休暇の申請は、以下の手順で行います。

  1. 社内ポータルの「勤怠管理」ページにアクセスします

  2. 「休暇申請」メニューから「有給休暇」を選択します

  3. 日程を入力し、上長を選択して申請します

申請は休暇の3営業日前までに行ってください。

参考: [就業規則 第15条](https://portal/rules/chapter15.html)

回答には情報源のリンクが含まれるため、利用者は原典を確認できます。

Chat API(SSE)の活用

プログラムから AI 検索モードを利用する場合は、Chat API を使用します。 Chat API は Server-Sent Events(SSE)でストリーミング応答を返します。

ストリーミング応答(SSE)を利用する場合:

GET /api/v1/chat/stream?message=有給休暇の申請方法

非ストリーミングの JSON レスポンスを取得する場合:

POST /api/v1/chat
Content-Type: application/x-www-form-urlencoded

message=有給休暇の申請方法

SSE により、回答が生成されるたびにリアルタイムでクライアントに送信されます。 利用者は回答が完全に生成されるのを待たずに、徐々に表示される回答を読み始めることができます。

会話履歴

Chat API はセッションベースの会話履歴をサポートしています。 前の質問の文脈を踏まえた追加質問が可能です。

例:

  • Q1: 「有給休暇の申請方法を教えてください」

  • A1: (上記の回答)

  • Q2: 「申請期限を過ぎた場合はどうすればいいですか?」

  • A2: (Q1 の文脈を踏まえた回答)

RAG のチューニング

回答品質の改善

RAG の回答品質は、以下の要素に影響されます。

検索品質

RAG は検索結果を基に回答を生成するため、検索品質が回答品質に直結します。 第8回のチューニングサイクルで検索品質を改善することが、RAG の品質改善にもつながります。

ドキュメントの品質

検索対象のドキュメント自体が古い、不正確、または曖昧な場合、RAG の回答も品質が下がります。 ドキュメントの定期的な更新と品質管理が重要です。

プロンプト設定

LLM に送信するプロンプト(指示文)のチューニングにより、回答のスタイルや精度を調整できます。

安全性の考慮

プロンプトインジェクション対策

Fess の RAG 機能にはプロンプトインジェクション防御が組み込まれています。 悪意のある入力により LLM の動作を操作しようとする攻撃から保護します。

情報漏洩の防止

RAG は検索結果を基に回答するため、ロールベース検索(第5回)と組み合わせることで、利用者の権限に応じた回答のみが生成されます。 権限のないドキュメントの内容は、RAG の回答にも含まれません。

まとめ

本記事では、Fess の AI 検索モードを使った社内 AI アシスタントの構築方法を解説しました。

  • RAG パイプラインの仕組み(意図分析→検索→評価→回答生成)

  • 3つの LLM プロバイダ(OpenAI、Gemini、Ollama)の選択基準

  • AI 検索モードの設定と体験

  • Chat API(SSE)によるプログラムからの利用

  • 回答品質のチューニングと安全性の考慮

社内ドキュメントに基づいた AI アシスタントにより、「探す」から「聞く」へ、ナレッジ活用の形が変わります。

次回は、Fess を MCP サーバーとして AI エージェントに統合する方法を扱います。

参考資料