FessのAIチャット利用回数とLLMトークンを分析する

Fessの検索ログ分析に「AIチャット」タブが追加されました。検索の利用回数とは別に、チャットの利用回数、応答時間、エラー率、LLMのトークン使用量を確認できます。文書を指定して質問するチャットも対象です。

チャット単位で利用状況を記録する

新しいfess_log.chat_logインデックスに、チャットクライアントへ到達したリクエストごとに1件記録します。質問と回答の本文はこの利用ログに保存しません。一方、ユーザー、ロール、セッション識別子、モデル、意図、応答時間、成功・エラー・キャンセル、LLM呼び出し数などは記録します。

通常の検索ログには、チャット1回で複数回の検索が記録されたり、文書チャットでは検索がなかったりします。専用ログにより、チャット回数として集計できるようになります。本文形式の不正、レート制限、未知の文書など、チャットクライアントへ到達する前の拒否は対象外です。

初期値と保管方法

fess_config.propertiesの初期値は次のとおりです。

rag.chat.log.enabled=true
logging.chat.max.queue.size=10000

チャットログの記録は初期状態で有効です。無効にする場合はrag.chat.log.enabled=falseにします。RAGチャット自体の初期値rag.chat.enabled=falseとは別の設定です。

ログはキューへ入れ、既存の毎分のログ保存処理で書き込みます。そのため直後に集計へ反映されるとは限りません。保持期間は検索ログと同じpurge.searchlog.dayを使い、バックアップの対象にも追加しています。本文は記録しませんが利用者のメタデータは残るため、管理権限と保持期間を運用に合わせて確認してください。

集計で確認できること

リクエスト数、ユーザー数、トークン合計、平均応答時間、エラー率を前期間と比較できます。推移やユーザー別・意図別・モデル別の表はCSVで出力できます。ストリームの切断はキャンセルとして扱い、エラー率には含めません。

トークン数はLLMプラグインが報告した場合だけ記録します。このPR時点では、ストリーミングのトークン通知はプラグイン側の後続対応が必要です。通知のない呼び出しは回数だけ計上するため、表示されたトークン数を実際の全使用量や請求額と同一視しないでください。ユーザー情報の記録が無効な場合、ユーザー数は0となります。

標準の使用量収集経路を通らずLLMを直接呼ぶ独自プラグインも集計対象外になる場合があります。利用回数の把握と、プロバイダーの利用明細を照合する入口として使えます。

利用できるバージョン

Fess 15.9.0に含まれる予定の機能になります。現時点では、まだ、リリースしていないので、今後のテストで変更される可能性もあります。

関連PR

Fessの旧v1 APIでログイン必須・チャット権限を適用する改善案

Fessの旧v1 APIを利用する環境向けに、ログイン必須設定とRAGチャットの利用権限をAPIの入口でも確認する改善案が出ています。対象は互換プラグインfess-webapp-v1-apiです。コアのv2 APIで行う判定に、旧APIの挙動を合わせる変更です。

初期値と利用条件

login.requiredの初期値はfalse、rag.chat.permissionsの初期値は空です。この組み合わせでは、今回のアクセス制御による挙動は変わりません。RAGチャット自体はrag.chat.enabled=falseが初期値で、利用には有効化と対応LLMの設定も必要です。

ログイン必須とチャット利用権限は管理画面の「システム」→「全般」で設定する項目です。設定値の例は次のとおりです。

login.required=true
rag.chat.permissions={group}sales,{user}taro

この例は初期値ではなく、ログインを必須にし、指定したグループまたはユーザーへチャット利用を限定するものです。既存のRAGチャット設定の記事と合わせて、旧APIを使うクライアントの認証方法も確認します。

検索APIとアクセストークン

提案ではlogin.required=trueのとき、ログインしていない呼び出しに401を返します。検索、スクロール検索、サジェスト、ラベル、人気ワードでは、登録済みで有効期限内のアクセストークンをログインの代わりに使用できます。トークンが持つ権限に応じた検索結果になるので、ログイン必須設定と文書の閲覧権限は別に確認します。

お気に入りとチャットはユーザーのログインセッションを使う機能です。ログイン必須設定が有効なとき、トークンだけではログインの代わりになりません。ヘルスチェックの/api/v1/healthはログインなしで利用できるままです。

チャットの401と403

チャットはlogin.requiredの値にかかわらず、rag.chat.permissionsの判定も行う提案です。権限のない匿名ユーザーには401、ログイン済みでも対象権限を持たないユーザーには403を返します。非ストリーミングとストリーミングの両方が対象です。

rag.chat.permissionsが空なら、この追加の利用者制限はかかりません。チャットが回答に利用できる文書の閲覧権限まで外す設定ではありません。

変更後に確認すること

旧v1 APIの互換プラグインを導入していることが前提です。変更を含む版へ更新すると、これまで成功していた匿名リクエストが401になる場合があります。検索連携は有効なトークン、ユーザー機能はログインセッションを使う構成に分けて確認します。

未ログイン、許可ユーザー、許可されていないログインユーザー、期限切れトークンの各条件で応答を確認すると、設定の意図とクライアント側の認証方法が一致しているかを判断できます。

関連PR

Fessにフォルダから探せるファイル検索テーマを追加する

FessのStaticテーマに、共有フォルダやファイルサーバーの文書を探しやすくするfilesearchを追加しました。ファイル管理ツールに近い画面で、フォルダを絞り込み、更新日や種類で並べ替え、選んだ文書のプレビューを確認できます。Fess 15.9以降向けのテーマです。

フォルダ・一覧・プレビューの3つの領域

左側にはホストとフォルダのツリー、中央にはパンくずとファイル一覧、右側にはプレビューを配置します。フォルダを選ぶとその配下を対象に検索します。詳細、リスト、タイルの表示を切り替え、ファイル種類、更新日、サイズ、ラベルで絞り込めます。

検索条件とフォルダはURLへ保存するため、再読み込みや戻る・進む、リンクの共有でも状態を復元します。元のファイルはFessのgo/経由で開き、パスをコピーする操作も用意しています。

PDF、テキスト、画像、キャッシュした本文をプレビューできます。Office文書をブラウザでそのまま描画する機能ではなく、キャッシュされた内容を利用します。

テーマを導入する

fess-themesのソースから、次のコマンドでテーマのZIPを作成します。

./scripts/package.sh filesearch

Fess管理画面のテーマ画面でZIPをアップロードし、デフォルトテーマなどに設定します。theme.defaultはシステムプロパティです。管理画面の全般設定、system.properties、またはJVMの-Dfess.system.theme.default=filesearchを使います。

種類と場所によるソートを利用する場合は、fess_config.propertiesに以下を設定します。

query.additional.sort.fields=filetype,url

サムネイルのthumbnail.enabled=trueもシステムプロパティです。キャッシュによるプレビューを広げる場合は、crawler.document.cache.supported.mimetypesへ対象のMIMEタイプを追加し、再クロールでキャッシュを作成してください。

キーボードと小さい画面での操作

一覧は矢印キーで移動でき、Enterで元ファイルを開き、Spaceでプレビューを切り替えます。フォルダツリーもキーボードで開閉できます。小さい画面ではツリーやプレビューを引き出し式の表示にし、スマートフォン幅でヘルプやログインへアクセスするメニューも用意しました。

追加後の修正では、ページ変更で存在しないフォルダが増える問題、閉じたオプション欄へTab移動する問題、表示件数をサーバーが制限した場合のページングなども改善しています。お気に入りは追加操作に対応し、追加済みの星を「解除できる」表示にはしません。

大きなフォルダでの制限

フォルダツリーはホスト・URLのファセットから組み立てます。大量のファイルがある場合、件数は下限を示す≥表示になり、サブフォルダがすべて列挙されない場合があります。

「フォルダで表示」はテーマ内で親フォルダに移動する機能です。OSのファイル管理画面を直接開くものではありません。最近の検索はブラウザ内のlocalStorageへ保存し、Fessのログインユーザー別検索履歴とは別に扱います。

関連PR