Reports / 2026-08-02 · Prototype

RCS + AI rerank
アーキテクチャと検証

RCS の top10 候補を LLM が読み、最良 HOMBA を選び、クエリとの関係 (一致 / より大きい / より小さい / 異なる)を返す。 本番 API ではなく playground プロトタイプの設計と、 rcs_ai_compare.csv 100 件での検証結果です。

モデル: deepseek-v4-flash スコア付きクエリ: 87 / 100 推定コスト: ≈ $0.0064

1. 要点

RCS top1 hit 93.1%
AI best hit 97.7%
expected ∈ top10 98.9%
RCS✗ → AI✓ +5
RCS✓ → AI✗ −1
AI が top1 変更 10
  • AI は HOMBA 全カタログを見ない。RCS が返した最大 10 件だけを選ぶ。
  • 主効果は略語・粒度の取り違え修正(ACC / EC / MGB / PAG など)。
  • 関係ラベルは評価用 3-pass judge とは別。本番応答に載せる価値のある情報として設計。
  • RCS エンジン本体は未変更(別系統の精度改善と競合しない playground 実装)。

2. アーキテクチャ

現行の統合は RCS を第一段、LLM を第二段の再選択器 とする二段構成です。 LLM は検索エンジンではなく、候補リスト上の裁定者です。

1. RCS

exact / fuzzy / BM25 とルールで候補を生成・スコアリング。top_k=10 を返す。

2. LLM rerank

候補 ID だけを見て最良 1 件を選択。カタログ外 ID は拒否。

3. Relation

選んだ HOMBA がクエリに対して match / larger / smaller / different かを付与。

関係ラベルの向き

ラベルは常に 最良 HOMBA レコードがクエリに対してどうか を表します。

API 値 日本語 意味
match 一致 同一構造・同義・慣用表記ゆれ
larger より大きい HOMBA の方が広い(親・コンテナ)
smaller より小さい HOMBA の方が狭い(部分・下位)
different 異なる 解剖学的に別構造(候補内に妥当な一致がない場合含む)

実装上の制約

  • homba_id は必ず候補リスト内。発明 ID はパース時に破棄し RCS top1 へフォールバック。
  • 1 クエリあたり LLM 呼び出しは 1 回(選択と関係ラベルを同レスポンスで取得)。
  • 3-pass majority vote(整合性評価)は使わない。評価パイプラインとは分離。
  • モデル既定は deepseek-v4-flash(低コスト・低レイテンシ)。
ハーネス: playgrounds/260802_playground/rcs_ai_rerank_harness.py · 出力: runs/rcs_ai_rerank/

3. catalog-in-context との違い

同日の別実験( RCS vs 3-AI compare )では、HOMBA 全件(約 2342)を毎回プロンプトに載せ、LLM に単独マッピングさせていました。 今回の AI 統合はその対極にあります。

catalog-in-context(研究比較)

  • 目的: 「AI だけで RCS を置き換えられるか」
  • 入力: クエリ + 全カタログ
  • 出力: 単一 HOMBA ID
  • トークン: リクエストあたり数万
  • 100 件規模で map だけで数十セント級
  • 本番運用前提ではない

RCS → AI rerank(今回)

  • 目的: RCS を残したまま AI で改善
  • 入力: クエリ + RCS top10
  • 出力: 最良 ID + 関係ラベル
  • トークン: 候補 10 件程度
  • 100 件で ≈ $0.006
  • 将来の use_ai API オプション候補

catalog 実験では Luna 等が raw ID match で RCS をわずかに上回る場面もありましたが、 コスト・レイテンシ・運用境界の面で「RCS 置換」は選ばず、 候補再選択 + 関係説明 に寄せたのが現在の統合方針です。

4. 検証結果(rcs_ai_compare.csv)

データセット 100 クエリのうち、expected HOMBA ID がある 87 件で ID hit rate を算出(残り 13 件は関係ラベル分布のみ集計対象)。

指標 RCS top1 AI best(top10 内)
ID hit rate(n=87) 93.1% 97.7%
expected が RCS top10 内 98.9%(天井。AI はこれ以上を原理的に超えられない)
AI が RCS top1 を変更 10 / 100
改善(RCS✗→AI✓) 5
悪化(RCS✓→AI✗) 1(BLA)

難易度別 ID hit

difficulty n(expected あり) RCS AI
easy 32 96.9% 100%
medium 38 92.1% 97.4%
hard 17 88.2% 94.1%

関係ラベル分布(全 100)

relation 件数 読み
match 一致 88 大半は同義・慣用一致として裁定
smaller より小さい 6 広いクエリに対し下位候補しかない場合など
larger より大きい 5 親・コンテナへのフォールバック
different 異なる 1 Septum → septum pellucidum(意味ずれ)

コスト

  • API calls: 13(バッチ 8)
  • prompt ≈ 37k tok / completion ≈ 7.4k tok
  • 合計 ≈ $0.0064(100 クエリ)
  • catalog-in-context 比較一式(≈ $0.30)より二桁安い

5. 代表ケース

改善例(RCS top1 誤り → AI 正解)

AIC-033 ACC RCS: caudal branch of anterior commissure → AI: anterior cingulate cortex(match)。 略語の文献慣用を候補内から拾い直した典型例。
AIC-054 EC / AIC-059 MGB / AIC-081 PAG RCS が division / complex / region 側に寄ったところを、 AI が慣用の親構造(entorhinal cortex / medial geniculate nucleus / periaqueductal gray substance)へ戻した。
AIC-021 Dorsal raphe nucleus RCS が dorsal division を top1 にしたのを、クエリ全体に合う親ノードへ修正。

悪化例(1 件)

AIC-047 BLA expected / RCS top1: basolateral amygdaloid complex(HOMBA:10366)。 AI: basolateral nucleus(HOMBA:10368)を match と判定。 略語 BLA の「複合 vs 核」粒度で食い違い。関係ラベルは match のままなので、 confidence や粒度ポリシーの調整余地がある。

関係ラベルが効く例

larger — Cerebral hemisphere → telencephalon、 Medial hypothalamus → hypothalamus。 オントロジーに exact が無い/広すぎるクエリで親へ寄せ、かつ「一致ではない」と明示。
smaller — Auditory cortex → primary auditory cortex、 Brainstem → midbrain gray。 候補が狭い側しか無いことをラベルで伝える。
different — Septum → septum pellucidum。 候補内最良でも意味がずれるケースを正直にフラグ。
天井: expected が RCS top10 に無いケース(例: LH → lateral hypothalamic area, tuberal part)は AI でも回復不能。AI 統合は RCS 召回の品質に依存する。

6. 将来の API 形(草案)

本番 Lambda にはまだ載せていません。playground の結合レコードが示す応答イメージです。

{
  "query": "ACC",
  "top_k": 10,
  "candidates": [ /* RCS のスコア付き候補 */ ],
  "ai": {
    "enabled": true,
    "best_homba_id": "HOMBA:10278",
    "best_name": "anterior cingulate cortex (...)",
    "relation": "match",
    "relation_ja": "一致",
    "confidence": 0.95,
    "reason": "ACC is a standard abbreviation for anterior cingulate cortex."
  }
}
  • リクエスト案: use_ai: true(既定 false)。オフ時は現行どおり candidates のみ。
  • AI 失敗時は candidates を返し、ai.error を付ける(検索自体は落とさない)。
  • エンジン改善と AI 層は分離。RCS の精度向上はそのまま rerank の天井を上げる。

7. 限界と次のステップ

  • 召回依存: top10 に無い正解は救えない。RCS 側の abbrev / alias 改善が引き続き本丸。
  • 粒度曖昧: BLA のような complex vs nucleus はポリシーまたは追加シグナルが必要。
  • ラベル品質: 今回の relation は LLM 自己申告。別系統の 3-pass judge で監査する余地はある(ただし API 応答自体には載せない想定)。
  • 本番化: API キー管理、タイムアウト、レート制限、フロントの opt-in UI が残作業。

詳細な行単位表は rerank 詳細レポート を参照。再計算は playgrounds/260802_playground/rcs_ai_rerank_harness.py で行えます。