Newer
Older
TelosDB / journals / 20260225-0001-MCP件数・自動再学習・GUI改善.md

2026-02-25: MCP件数・自動再学習・GUI改善

1. 作業実施の理由と指示

  • 背景: Issue #5 として MCP から格納件数を取得したい要望があり、当初は items(チャンク)数だったがドキュメント数に統一するよう指摘された。また、MCP ACTIVITY が空になる不具合、トレイクリックでウィンドウが一瞬開いて閉じる事象、追加・更新・削除のたびに手動 RE-INDEX が必要な点、インデックス化の進行が分からない点、文書一覧で内容が想像しづらい点、サイドバー下部の不要なアコーディオン・著作権表示が指摘された。
  • 観点: 件数は「ドキュメント数」で MCP・HTTP・UI を統一する。LSA 再学習は変更がたまったタイミングで自動実行し、状態は GUI に表示する。UI は必要な情報を表示し、冗長な要素を削除する。
  • 意図: get_document_count の追加と doc_count の documents 統一、MCP 呼び出しの SSE ブロードキャスト、トレイのデバウンス、LSA 自動再学習(閾値・90秒デバウンス)、インデックス状態のヘッダー表示、文書一覧にチャンク0の先頭15文字表示、サイドバー下部の整理を行う。

2. 指摘事項とその対応

  • 指摘: 格納件数は「ドキュメント数」にすべき。items 数では「X docs」と一致しない。
    • 対応: MCP ツールを get_document_count に改名し、SELECT COUNT(*) FROM documents で返す。HTTP /doc_count と UI も同様に documents 件数に統一した。
  • 指摘: MCP ACTIVITY が常に空である。
    • 対応: mcp_messages_handler 内で tools/call 受信時に state.tx.send("mcp:call:<actual_method>") を送信するようにした。
  • 指摘: トレイクリックでウィンドウが一瞬開いてすぐ閉じる。
    • 対応: 左クリックに 400ms デバウンスを導入し、二重発火を無視するようにした。
  • 指摘: 文書追加・更新・削除のたびに手動で RE-INDEX するのは手間。毎回再学習はコストが高い。
    • 対応: 変更件数が「登録ドキュメント数の 20%」と「5 件」の少ない方を超えたら、90 秒デバウンス後に自動で train_lsa_and_sync_hnsw を実行する schedule_retrain_if_needed を実装し、add_item_text・update_item・delete_item・delete_document の成功後に呼び出すようにした。
  • 指摘: インデックス化の様子が GUI で分からない。
    • 対応: AppStateindexing_status を追加し、/indexing_status API と SSE の indexing:training / indexing:syncing / indexing:idle でヘッダーに表示するようにした。
  • 指摘: 文書一覧で内容が想像しづらい。サイドバー下部のアコーディオン・著作権表示は不要。
    • 対応: list_documents に chunk0 の先頭15文字(chunk0_preview)を追加し、文書管理テーブルに表示。app-sidebar から sidebar-bottom(アコーディオン・著作権)を削除した。

3. 作業詳細

AIエージェントは、次の変更を実施した。

  • MCP・HTTP・仕様: get_item_countget_document_count に変更し、SELECT COUNT(*) FROM documents で件数を返す。tools/list・dispatch・handle_get_document_count を追加・改名。handlers.rsdoc_count_handler を documents に変更。04_mcp_api_specification.md に get_document_count を追記。
  • MCP ACTIVITY: mcp/mod.rsmcp_messages_handler で、tools/call および該当ツール実行直後に state.tx.send(format!("mcp:call:{}", actual_method)) を実行。
  • トレイ: lib.rson_tray_icon_event で左クリック時に AtomicU64 で前回クリック時刻を記録し、400ms 以内のクリックを無視。それ以外で表示/非表示をトグル。
  • LSA 自動再学習: AppStatechanges_since_train(AtomicU64)と retrain_scheduled(AtomicBool)を追加。system.rsschedule_retrain_if_needed を実装(閾値 max(1, min(ceil(doc_count*0.2), 5))、90秒デバウンス、spawn で train_lsa_and_sync_hnsw)。add_item_text・update_item・delete_item・delete_document の成功後に呼び出し。
  • インデックス状態表示: AppStateindexing_status(RwLock)を追加。train_lsa_and_sync_hnsw の開始・sync 前・完了・失敗・件数0 で indexing_status と SSE を更新。GET /indexing_status を追加。フロントのヘッダーにバッジを追加し、3秒ポーリングと SSE の indexing:* で更新。
  • 文書一覧: list_documents の SQL に chunk0 の先頭15文字のサブクエリを追加し、返却に chunk0_preview を含める。main-panel の文書管理テーブルに「先頭(chunk0)」列を追加。.docs-cell-preview でスタイルを指定。
  • サイドバー: app-sidebar.js から sidebar-bottom(TelosDB アコーディオン・著作権表示)を削除。
flowchart LR
    A[get_document_count / doc_count] --> B[documents 統一]
    C[MCP tools/call] --> D[SSE mcp:call]
    E[変更検知] --> F[schedule_retrain_if_needed]
    F --> G[90s デバウンス]
    G --> H[train_lsa_and_sync_hnsw]
    H --> I[indexing_status / SSE]
    I --> J[ヘッダー表示]

4. AI視点での結果

MCP と UI の「X docs」がドキュメント数で一致し、MCP ACTIVITY にツール呼び出しが表示されるようになった。トレイクリックでウィンドウの表示・非表示が安定して切り替わる。変更が閾値を超えたタイミングで 90 秒後に LSA が自動再学習され、ヘッダーで training / syncing / idle が確認できる。文書一覧でチャンク0の冒頭が把握でき、サイドバーはナビのみに整理された。