概要
AIモード(RAG: Retrieval-Augmented Generation)は、Fess の検索結果をLLM(大規模言語モデル)で拡張し、 対話形式で情報を提供する機能です。ユーザーは自然言語で質問し、検索結果を基にした 詳細な回答を得ることができます。
AIモードの仕組み
AIモードは以下の多段階フローで動作します。
意図解析フェーズ: ユーザーの質問を分析し、検索に最適なキーワードを抽出
検索フェーズ: 抽出したキーワードで Fess の検索エンジンを使用して文書を検索
評価フェーズ: 検索結果の関連性を評価し、最も適切な文書を選択
生成フェーズ: 選択した文書を基にLLMが回答を生成
出力フェーズ: 回答とソース情報をユーザーに返す
このフローにより、単純なキーワード検索よりも文脈を理解した高品質な回答が可能になります。
基本設定
AIモード機能を有効にするための基本設定です。
app/WEB-INF/conf/system.properties:
# AIモード機能を有効にする
rag.chat.enabled=true
# LLMプロバイダーを選択(ollama, openai, gemini)
rag.llm.type=ollama
LLMプロバイダーの詳細設定については、以下を参照してください:
Ollamaの設定 - Ollamaの設定
OpenAIの設定 - OpenAIの設定
Google Geminiの設定 - Google Geminiの設定
生成パラメーター
LLMの生成動作を制御するパラメーターです。
| プロパティ | 説明 | デフォルト |
|---|---|---|
rag.chat.max.tokens | 生成する最大トークン数 | 4096 |
rag.chat.temperature | 生成のランダム性(0.0〜1.0) | 0.7 |
temperature設定
0.0: 決定的な回答(同じ入力に対して常に同じ回答)
0.3〜0.5: 一貫性のある回答(事実に基づく質問に適切)
0.7: バランスの取れた回答(デフォルト)
1.0: 創造的な回答(ブレインストーミング等に適切)
コンテキスト設定
検索結果からLLMに渡すコンテキストの設定です。
| プロパティ | 説明 | デフォルト |
|---|---|---|
rag.chat.context.max.documents | コンテキストに含める最大ドキュメント数 | 5 |
rag.chat.context.max.chars | コンテキストの最大文字数 | 4000 |
rag.chat.content.fields | ドキュメントから取得するフィールド | title,url,content,... |
rag.chat.evaluation.max.relevant.docs | 評価フェーズで選択する最大関連ドキュメント数 | 3 |
コンテンツフィールド
rag.chat.content.fields で指定できるフィールド:
title- ドキュメントのタイトルurl- ドキュメントのURLcontent- ドキュメントの本文doc_id- ドキュメントIDcontent_title- コンテンツのタイトルcontent_description- コンテンツの説明
システムプロンプト
システムプロンプトは、LLMの基本的な振る舞いを定義します。
デフォルト設定
rag.chat.system.prompt=You are an AI assistant for Fess search engine. Answer questions based on the search results provided. Always cite your sources using [1], [2], etc.
カスタマイズ例
日本語での回答を優先する場合:
rag.chat.system.prompt=あなたはFess検索エンジンのAIアシスタントです。提供された検索結果に基づいて質問に回答してください。回答は日本語で行い、出典を[1]、[2]などの形式で必ず明記してください。
専門分野向けのカスタマイズ:
rag.chat.system.prompt=You are a technical documentation assistant. Provide detailed and accurate answers based on the search results. Include code examples when relevant. Always cite your sources using [1], [2], etc.
セッション管理
チャットセッションの管理に関する設定です。
| プロパティ | 説明 | デフォルト |
|---|---|---|
rag.chat.session.timeout.minutes | セッションのタイムアウト時間(分) | 30 |
rag.chat.session.max.size | 同時に保持できるセッションの最大数 | 10000 |
rag.chat.history.max.messages | 会話履歴に保持する最大メッセージ数 | 20 |
セッションの動作
ユーザーが新しいチャットを開始すると、新しいセッションが作成されます
セッションには会話履歴が保存され、文脈を維持した対話が可能です
タイムアウト時間を経過すると、セッションは自動的に削除されます
会話履歴が最大メッセージ数を超えると、古いメッセージから削除されます
レート制限
APIの過負荷を防ぐためのレート制限設定です。
| プロパティ | 説明 | デフォルト |
|---|---|---|
rag.chat.rate.limit.enabled | レート制限を有効にする | true |
rag.chat.rate.limit.requests.per.minute | 1分あたりの最大リクエスト数 | 10 |
レート制限の考慮事項
LLMプロバイダー側のレート制限も考慮して設定してください
高負荷環境では、より厳しい制限を設定することを推奨します
レート制限に達した場合、ユーザーにはエラーメッセージが表示されます
APIの使用
AIモード機能はREST APIを通じて利用できます。
非ストリーミングAPI
エンドポイント: POST /api/v1/chat
パラメーター:
| パラメーター | 必須 | 説明 |
|---|---|---|
message | はい | ユーザーのメッセージ |
sessionId | いいえ | セッションID(会話を継続する場合) |
clear | いいえ | true でセッションをクリア |
リクエスト例:
curl -X POST "http://localhost:8080/api/v1/chat" \
-d "message=Fessのインストール方法を教えてください"
レスポンス例:
{
"status": "ok",
"sessionId": "abc123",
"content": "Fessのインストール方法は...",
"sources": [
{"title": "インストールガイド", "url": "https://..."}
]
}
ストリーミングAPI
エンドポイント: POST /api/v1/chat/stream
Server-Sent Events(SSE)形式でレスポンスをストリーミングします。
パラメーター:
| パラメーター | 必須 | 説明 |
|---|---|---|
message | はい | ユーザーのメッセージ |
sessionId | いいえ | セッションID(会話を継続する場合) |
リクエスト例:
curl -X POST "http://localhost:8080/api/v1/chat/stream" \
-d "message=Fessの特徴を教えてください" \
-H "Accept: text/event-stream"
SSEイベント:
| イベント | 説明 |
|---|---|
session | セッション情報(sessionId) |
phase | 処理フェーズの開始/完了(intent_analysis, search, evaluation, generation) |
chunk | 生成されたテキストの断片 |
sources | 参照元ドキュメントの情報 |
done | 処理完了(sessionId, htmlContent) |
error | エラー情報 |
詳細なAPIドキュメントは Chat API を参照してください。
Webインターフェース
Fess のWebインターフェースでは、検索画面からAIモード機能を利用できます。
チャットの開始
Fess の検索画面にアクセス
チャットアイコンをクリック
チャットパネルが表示される
チャットの使用
テキストボックスに質問を入力
送信ボタンをクリックまたはEnterキーを押す
AIアシスタントの回答が表示される
回答には参照元へのリンクが含まれる
会話の継続
同じチャットセッション内で会話を継続できます
前の質問の文脈を考慮した回答が得られます
「新しいチャット」をクリックすると、セッションがリセットされます
トラブルシューティング
AIモードが有効にならない
確認事項:
rag.chat.enabled=trueが設定されているかLLMプロバイダーが正しく設定されているか
LLMプロバイダーへの接続が可能か
回答の品質が低い
改善方法:
より高性能なLLMモデルを使用
rag.chat.context.max.documentsを増加システムプロンプトをカスタマイズ
rag.chat.temperatureを調整
レスポンスが遅い
改善方法:
より高速なLLMモデルを使用(例: Gemini Flash)
rag.chat.max.tokensを減少rag.chat.context.max.charsを減少
セッションが維持されない
確認事項:
クライアント側でsessionIdが正しく送信されているか
rag.chat.session.timeout.minutesの設定セッションストレージの容量
デバッグ設定
問題を調査する際は、ログレベルを調整して詳細なログを出力できます。
app/WEB-INF/classes/log4j2.xml:
<Logger name="org.codelibs.fess.llm" level="DEBUG"/>
<Logger name="org.codelibs.fess.api.chat" level="DEBUG"/>
<Logger name="org.codelibs.fess.chat" level="DEBUG"/>