
有名なAIの誤りを再現するデモを作った。ベースラインはそれを拒んだ
起こそうとしても起きなかった誤り
この構築を始めたとき、私は特定の、よく文書化された失敗を再現したかった。患者マッチングAIは臨床メモをテキストとして読むため、見た目は似ていても医学では意味が異なる語を取り違える。古典的な例は明快だ。第III相の抗凝固薬試験は、既往に心臓カテーテル検査がある患者を除外する。ある患者のメモには中心静脈カテーテル留置と書かれている。類似度マッチャーは二つの循環器系カテーテル処置だと見てスコアを近づけ、実際には適格だった患者を除外してしまう。公表された評価は、実在のモデルがまさにこの誤りを犯すことを確認している(Fierce Biotech、2025年)。私はデモでそれが起きる様子を示し、それから自分のエンジンがそれを捕まえる様子を示したかった。
そこで私は、悪役を演じる公平なベースラインを書いた。エンティティ単位のTF-IDFコサイン類似度、単語および文字の3〜5グラム、本物のベクトル類似度手法だ。さらに、こちらに有利な設定を渡し、判定閾値をベースライン自身のために交差検証までした(層化3分割ROC、YoudenのJ、シード13、t=0.6932で頭打ち)。藁人形では何も証明できないからだ。それから心臓カテーテルのケースを走らせ、誤った除外を待った。
それは来なかった。ベースラインは二つのカテーテル表現のスコアを自ら交差検証した閾値を余裕をもって下回ると判定し、適格と返した。デモ全体を組み立てた土台だったその誤りは、どうしても再現しなかった。
有名な失敗を演出しようとして、正直な悪役はそれを犯すには弱すぎると分かったのだ。
その理由は教訓的だった。過大に語りやすいので、正確に述べたい。疎な語彙ベースラインでは、その特定の誤除外は起きない。二つの表現を閾値を超えるほど近づけるには、密な意味埋め込みが必要だ。重い埋め込みモデルを足せば、オフラインでワンコマンドでは走れないデモになってしまう。だから私は決断した。ベースラインを正直で疎なまま保ち、犯せない罪を犯しているふりはやめる。その決断が、いま構築している記事全体を組み替えた。自分で動かしたいなら、veriprajna.com/ja/demos/clinical-trial-recruitment-ai にある。
中心ラインとは、本当は何なのか?
それでも私は心臓カテーテルのケースを残した。捕まえた誤りよりも良いことを証明したからだ。それが証明するのは、なぜ私のエンジンの答えがそもそも信頼に足るのかということだ。ここにある二つの概念には、いずれも確認可能なSNOMED-CT識別子がある。中心静脈カテーテル法は392230005。心臓カテーテル検査は41976001。どちらかを公開のSNOMEDブラウザに貼り付ければ、階層の別々の枝にいることを確認できる。一方から他方へのis-aパスは存在しない。中心ラインは心臓カテーテルではなく、それを知るのは階層だけだ。
それがグラフの一つの辺に凝縮された、論文全体の主張だ。類似度スコアは「is-a」を表現できない。表現できるのは「これらの文字列は似て見える」だけであり、似て見えることと意味が同じことは違う。エンジンが除外条件「既往の心臓カテーテル検査なし」を評価するとき、何もスコアリングしない。構造的な問いを立てる——患者の検証済み事実は、禁止された概念に包摂されるか?オントロジーを歩き、包摂パスがないことを見つけ、両方の概念IDと確認したグラフ辺を名指す三ステップのトレース付きで適格を返す。

そのトレースが描画されるのを初めて見たとき、印象に残ったのは判定そのものではなかった。その下にあるレシートだった。同じ画面のベースラインの枠は、出所もなく再現性もない類似度の数字を示す。私のエンジンの枠は、二つのSCTIDと、正確に問いかけたis-aの問いを名指す。一方は規制当局がファイルできる。もう一方は、肩をすくめただけの数字だ。捕まえた誤りではなく、その対比こそが、心臓カテーテルのケースが実際に稼いだものだ。
マッチャーが本当に捨てた患者
それでも本当に失われた患者が必要だったので、正直なベースラインが本気で失敗する場所を探し、見つけたのはたった一語だった——ない。合成のヒーローカルテP-074には「糖尿病の所見なし」というメモ行がある。腫瘍学プロトコルの除外条件の一つは「糖尿病の診断なし」だ。ベクトルベースラインは、トークン「diabetes」が基準側の「diabetes」のすぐ隣にあるのを見て、類似度1.0でマッチする。完璧なスコアだ。ネゲーションのモデルを持たないため、糖尿病を「ない」とする文を、糖尿病を「ある」とするかのように読み、適格だった患者を除外してしまう。
これがマッチャーが捨てる患者であり、もともと心臓カテーテルのケースに担わせるつもりだった核の場面だ。ネゲーションこそ、疎なベースラインが、自ら最良の閾値で、細工なしに正直に崩れる場所だ。

この失敗の静けさについて、ずっと考えている。エラーメッセージもなく、低信頼フラグもなく、何かがおかしいという信号もない。スコアは1.0、ありうる最高値、システムが持ちうる最大の確信だ。ベースラインが最も間違っているまさにその瞬間ほど、確信が高いことはない。こうしたキューを見直すコーディネーターには、この完璧なマッチが本来登録すべき患者だと知る手段がない。プロトコル全体に掛け合わせれば、試験の80%が募集期限を逃す理由(業界コンセンサス、2025年)、そしてスクリーニング失敗一件あたり平均約1,200ドルかかる理由(Antidote.me、2025年)が分かる。
ベースラインが最も間違っているまさにその瞬間ほど、確信が高かったことはない。それはチューニングで消せるバグではない。カテゴリ錯誤だ。
なぜ判定はモデルの外に置かれるのか?
いま振り返ると唯一重要だったアーキテクチャ上の決断を、私は早い段階で下した。言語モデルを判定から完全に遠ざけることだ。パイプライン全体で確率的なステップはまさに一つだけ。プロバイダ交換可能なモデルが、助言のみで、雑然とした散文を読み、候補事実を提案する。それぞれに、事実を読み取った原文スパンと、小さな閉じた語彙から引いた候補概念IDが付く。モデルが本当に得意なのは、その一つだけ——読むことだ。誰が適格かについての投票権はない。
その後はすべて、監査できる決定論的なコードだ。提案された事実が決定に達する前に、敵対的検証器が原文メモに対して三つのチェックで挑む。スパンは実際に存在するか、否定されていないか、主語は家族ではなく患者か。「糖尿病の所見なし」の事実は否定チェックで落ち、エンジンに届かない。同じカルテで「乳がんの家族歴」は主語チェックで落ちる。その歴は患者ではなく家族のものだからだ。失敗したチェック名を付けてREJECTEDとフラグされる。

ゴールドセット全体で、この検証器は7件の事実インスタンス、3件の異なる悪い事実(否定された糖尿病の言及、家族歴の乳がん帰属、裏づけスパンのない植え付けられた幻覚薬物)を却下した。13の採点済みケース実行のうち4件にまたがり、いずれも判定に触れる前だった。人が「エージェントがメモから引き出したものをどう信じればいいのか」と聞くとき、このパネルが答えのすべてだ。信じるようには頼まない。何を提案し、何が捨てられ、なぜかを見せる。
そして判定そのものは、エージェント枠組みの外に座る素のPythonだ。オントロジーといくつかの日付計算の上で、禁止・時間例外・要件を評価する義務論理エンジンである。モデルはこのゲートを上書きできない。ゲートが走るとき、モデルは部屋にいないからだ。それこそが、エンジンを再現可能にもする。ロジックが固定オントロジー上の決定論的コードなら、同じカルテを再実行すれば、毎回バイト単位で同じ答えが出る。
モデルは読む。投票しない。その単一の境界こそが、再実行をバイト同一にする。
臨床オペの読み手が気にした唯一の数字
私は何週間も、やがて自分に認めたのだが、買い手が夜も眠れぬほど気にしない指標を最適化していた。判定精度はリーダーボードの数字だ。スポンサーやCROでフィージビリティを担う人は、リーダーボードを比べていない。募集タイムラインの遅延を見ていて、遅れ一日は高い。Tufts CSDD Impact Report(2024年)は、募集遅延のコストを失われた処方売上でおよそ一日80万ドルとし、このデモが触れる治療領域ではさらに高い——腫瘍学で約一日84万ドル、循環器で一日140万ドル。プロトコルの複雑さは、2005年以降の試験処置で139%上昇した(IQVIA、2026年)。つまり基準が増え、条項が増え、テキストマッチャーが一つ間違える場所が増える。
だから精度を先頭に出すのをやめ、その痛みに本当に対応する数字を先頭に出した——取りこぼさなかった適格患者だ。固定ラベル付きゴールドセットの2つの合成プロトコルにわたる7人の合成患者から取った13ケースで、私のエンジンが失うのは適格患者0人。公平なベースラインは3人。同じセット、ベースライン自身に有利に交差検証した同じ閾値だ。

これらの数字が何であり、何でないかを正確にしたい。それらは、その固定された13ケースのセット上でのハーネス自身の出力であり、オープンワールドの約束ではない。100%は「このゴールドセット上の100%」であり、決して「常に正しい」ではない。TrialProofが決して間違わないとは言わない——そう言うデータがなく、そう言う人を信じもしないからだ。言えるのはより狭く、私にはより有用だと思うことだ。このセットでエンジンは適格患者をゼロ人失い、すべての判定に再現可能なトレースが付き、必要な検査値やバイタルが欠けたとき推測せずNEEDS-REVIEWで安全に棄権した判定が二つあり、セット全体の再実行は13件すべてバイト同一だった。患者・メモ・プロトコルはすべて合成フィクスチャで、実記録はどこにもない。それらの実行はすべて veriprajna.com/ja/demos/clinical-trial-recruitment-ai で見られる。
私が気にする数字は精度ではない。捨てなかった適格患者だ。このセットでは、ベースラインの3に対し、失ったのはゼロだ。
規制上の形もある。慎重に名指す。FDAの2026年1月のClinical Decision Supportガイダンスが、このようなヒューマン・イン・ザ・ループのマッチング支援に関する該当枠組みだ。エンジンが出すすべての判定は、CDISC SDTM IEレコードとしてエクスポートできる——患者と基準ごとに一行、判定・推論トレース・概念ID・義務演算を載せる。それは承認ではなく、承認を主張してもいない。整合と方向だ。だがそれは、トレースがデバッグの便利機能ではないことを意味する。ファイル可能な成果物であり、後付けではなく、すべての判定に構造として存在する。
何度も立ち返ること
悪役が役を拒んだ瞬間に、何度も戻る。それが問いを変えたからだ。三年間、この分野はモデルをより良く適格者を判定する方向で改善しようとしてきた。より良いプロンプト、より大きなコンテキスト、より多くの検索——すべて、確率的システムを患者の登録を裁くのに足りるほど信頼できるようにするためだ。この構築の最初の期間、私もその枠組みの中にいて、モデルを直すためにモデルの誤りを捕まえようとしていた。
最後に腑に落ちたのは、それが間違った層だということだ。類似度スコアは「is-a」を表現できず、「ない」を表現できず、「ランダム化の十二か月以上前に療法が完了した場合を除く」も表現できない。どれだけプロンプトを重ねても足せない。言語の問題ではないからだ。論理の問題だ。だから本質的な一手は、モデルを信頼できるようにすることではない。信頼を不要にすることだ。モデルには得意な一事だけをやらせる——散文を読み、読み取ったスパン付きで事実を提案すること。それから検証器がメモに支えられないものを捨て、医療オントロジー上の素の監査可能なコードが判定を計算する。
適格性は予測ではなく、計算すべきものだ。初めに予想していなかったのは、見返りがベンチマークのように感じられないことだ。レシートのように感じる。同じカルテは毎回同じ答えを出し、答えはそれを決めた概念IDとグラフ辺を名指し、フィージビリティ担当が本当に眠れなくなる数字——捨てられた適格患者——はゼロになる。
私の説明を読むより見たいなら、端から端まで動いている全体がここにある。
だから、いまも手放せずに回している問いがあり、あなたがどう答えるかを本気で知りたい。賭けが実在の人の試験への一回の機会であるとき、信頼をどこに置きたいか——信じなければならないモデルか、読めるコードか?


