1. 要点
- 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_aiAPI オプション候補
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 正解)
悪化例(1 件)
関係ラベルが効く例
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
で行えます。