電子カルテのベンダーロックインを
画面操作AIエージェントで回避する話

電子カルテ画面を観察し操作可能要素を検出する画面操作AIエージェントのコンセプト図

「APIを出してくれない」「カスタマイズ見積もりが数千万、納期1年」——人間が画面を見て操作できることを、AIに肩代わりさせる選択肢はないのか。ローカルGPU1枚で動くOSSの視覚AIで、どこまで現実的か実測した記録です。

(GENSHI AI 共同創業者 大塚直人)

TL;DR

  • 電子カルテ(EMR)の業務自動化は、ベンダーAPIではなく 画面操作AIエージェント(VLMベースのcomputer-useエージェント) で回避できる時代に入りつつある
  • 自前で立てたEMRモック画面で、OSSのQwen3.6-27B (Dense) + JSON Schema制約 がGUI grounding精度 84.4% を達成し、GUI特化モデルHolo3-35Bと並んだ
  • 一方、同じ「Qwen3.6」でも MoE構造の35B-A3B(active 3B)は6〜9% と壊滅。総パラ数ではなくactiveパラ数が天井を決める
  • 「クリックできる場所を全部列挙する」タスク(キーワードヒントなし)のF1は 0.53。完全自動化はまだ早く、Human-in-the-loop前提の業務補助なら今すぐ実用射程
  • 全部A100 1枚+ローカル完結。画像が外に出ない構成 なので医療情報安全管理ガイドラインとの整合説明もしやすい

なぜこの話を書くか

電子カルテのベンダーに「この画面のデータをCSVで吐けるようにして」と頼んだことがある人は分かると思います。返ってくる答えはだいたいこうです。

  • 「カスタマイズ対応になります。見積もりは追ってご連絡します」(数百万〜数千万)
  • 「次期バージョンでFHIR対応を予定しています」(時期未定)
  • 「ベンダー間連携は弊社のSaaSでのみ可能です」(実質ロックイン)

結果、画面では一瞬で見える情報 が機械的に取り出せず、転記・集計・部門間共有は人手のままです。退院サマリ、検査結果一覧、処方履歴、病名サマリ、紹介状作成——どれも「人が画面を見て、人が別の画面に打ち込む」が残ったままです。

これに対して、近年急速に立ち上がってきたのが Computer-use型の視覚言語モデル(VLM) です。Anthropic Claude Computer Use、Mind2Web、Holo3、Qwen3-VLシリーズ、UI-TARSなど、「スクリーンショットを見て、クリック座標を返す」 モデルが揃ってきました。

つまり、ベンダー協力ゼロで、人間オペレータの仕事を肩代わりするエージェント が、技術的には現実になりつつあります。問題は「OSSでどこまで使えるのか」「自前GPUで動くのか」「医療現場で安全に運用できるのか」です。この記事は、その射程を実測した記録です。

実験設定:MedBridgeサンドボックス

ベンダー製の本物のEMRで実験するわけにはいかないので、社内で 電子カルテ風のWebアプリケーション を作って計測台にしました。

  • フロント: Next.js(病院EMRっぽい6画面:ログイン/患者一覧/カルテ/検査結果/処方/病名)
  • 起動: ElectronでCDP(Chrome DevTools Protocol)を開き、headless Linux上でXvfb + openboxで表示
  • 推論: A100 80GB 1枚にllama.cpp llama-server(CUDA)で各種VLMをロード

EMR自動化エージェントに必要な能力を3つに分解して測ります。

タスク 何を測るか 病院業務での意味
Grounding 「ログインボタンの座標を返して」のような指示で正しい場所をクリックできるか 既知の操作シナリオを自動化できるか
OCR 画面に表示された患者名・検査値を正確に読めるか 転記・集計の精度
Detection キーワードなしで「クリック可能な要素」を全列挙できるか 未知画面で自律的に動けるか(汎用computer-use)

比較したモデルは以下です。

モデル 種別 サイズ 備考
Holo3-35B-A3BGUI特化VLMMoE 35B(active 3B)vLLM BF16、GUI grounding専用学習
Qwen3.6-35B-A3B汎用VLMMoE 35B(active 3B)BF16 / Q8 両方
Qwen3.6-27B汎用VLM(Dense)27B全部activeBF16 / Q8 両方

すべてのテストで enable_thinking: false(Qwen3.6のデフォ思考モードを切る)とJSON Schemaによる出力構造強制を行っています。後述しますが、これをやらないと結果が読めるレベルになりません。

EMRモック画面(カルテ)
計測台として作ったEMR風カルテ画面。患者基本情報、診療記録、検査・処方・病名タブを持つ典型的なレイアウト。

結果1:Grounding——「ボタンの場所、教えて」

最初に「画面のスクリーンショット+『ログインの座標』のような指示」で正しい場所を当てられるかを32タスク × 6画面で測りました。

モデル Hit率 平均ピクセル誤差 平均レイテンシ 備考
Holo3-35B-A3B(GUI特化)84.4%149 px既存EMR操作の自動化が「今すぐ」設計可能
Qwen3.6-27B BF16 + JSON Schema84.4%127 px2.82 s/call汎用OSSがGUI特化と並んだ
Qwen3.6-27B Q8_0 + JSON Schema84.4%148 px3.32 s/call量子化でも精度ほぼ不変
Qwen3.6-35B-A3B BF16 + JSON Schema6.3%376 px2.18 s/callactive 3Bではgroundingに不足
Qwen3.6-35B-A3B Q8_0 + JSON Schema9.4%388 px1.94 s/call同上

画面別のgrounding精度(Holo3-35B、参考値)

画面正解 / タスク数
ログイン2/2
患者一覧6/6
カルテ5/6
検査結果5/6
処方5/6
病名4/6
処方画面でのgrounding結果
処方画面でのgrounding結果(Qwen3.6-27B Dense + JSON Schema)。緑四角が「正解の領域」、赤い小さな点がVLMが返した座標。多くは小さなUI要素にきれいに乗っている。
35B-MoEの失敗例
同じログイン画面をQwen3.6-35B-A3B(MoE, active 3B)に投げた結果。座標が画面のほぼ中央付近に集中し、ボタンに乗らない。総パラ数だけ見て「大きい方が強い」と決めると痛い目に遭う実例。

何を意味するか

  • 「ベンダー画面のクリック自動化」をOSSスタックで設計できる ことが実測ベースで言える
  • A100 1枚で1クリック判断に2〜3秒。RPA的な用途には十分速い
  • OCRは全モデルでRecall 1.0、検査値・氏名読み取りは信頼できる水準

結果2:MoE 35BがDense 27Bに負けた——activeパラメータの効き方

ここが今回一番面白い発見です。同じ「Qwen3.6」シリーズで、サイズが大きいはずの35B-A3Bが、27B-Denseにダブルスコアどころか「桁違いに」負けました。

モデル公称サイズactiveパラメータGrounding Hit率
Qwen3.6-35B-A3B35B3B(MoE)6〜9%
Qwen3.6-27B(Dense)27B27B(全部active)84.4%

MoE(Mixture of Experts)は、合計パラメータが大きくても1トークンあたりに動く専門家は一部だけ という構造です。Qwen3.6-35B-A3Bはactiveが3Bしかなく、その「3B相当の推論能力」が画像と座標の幾何的対応付けに必要な容量に足りていない、と読めます。

これは量子化のせいではありません。BF16(フル精度)でもQ8(8bit量子化)でも結果はほぼ同じ で、構造的な天井です。

結果3:「キーワードなしで操作可能要素を見つけられるか」——computer-useの本丸

ここまでは「『ログインボタン』のように 何を探すか を教えた」ベンチでした。本当のcomputer-useエージェントは、未知の画面を見て、自分で操作可能な要素を発見する 必要があります。

そこでDetectionベンチを作りました。プロンプトには キーワードを一切含めず、「画面を見て、クリックできる場所と入力できる場所をJSONで全部返して」とだけ指示します。GTはCDPでブラウザのDOMから button, input, [role=button] などを実際に列挙して生成しました。

結果(Qwen3.6-27B BF16 + JSON Schema):

画面TPFPFNPrecisionRecallF1
ログイン4100.801.000.89
患者一覧112200.331.000.50
カルテ1139130.220.460.30
検査結果222830.440.880.59
処方232760.460.790.58
病名242610.480.960.64
全体95143230.400.810.53
カルテ画面のDetection結果
Detectionベンチの可視化(カルテ画面)。緑=GTのうちモデルが当てた要素、赤=モデルが見逃したGT、青=モデルが正しく見つけた点、橙=モデルが見つけたがGTになかった「過検出」。カレンダーUIで「14, 15, 16…20」を全部クリック対象として列挙してしまう傾向が見える。
ログイン画面のDetection結果
シンプルな画面(ログイン)ならF1=0.89。「操作可能要素を全部教えて」だけで実用域に乗る。

観察

  • Recallは高い(0.81)が、Precisionが低い(0.40)。「見逃しは少ないが、過検出が多い」
  • カルテ画面のカレンダーUIで「日付セル」を全部クリック対象として列挙してしまう
  • ログインのようなシンプル画面ではF1 = 0.89と実用域

病院オペレーションへの示唆

  • 完全自動操作(人間が見ないRPA)にはまだ早い。「過検出」を実行に移すと事故になる
  • Human-in-the-loop(候補提示→人間確認)なら今すぐ十分に有用
    • 例:退院サマリ作成時、「この画面で次にクリックしそうな場所」を3つ候補表示
    • 例:転記補助で「読み取り候補欄」をハイライトし、人間が承認したものだけ転送
  • 段階導入シナリオ:① 転記補助 → ② 下書き生成(編集前提)→ ③ 確認付き自動実行

実装ハック:「動くこと」を阻む3つの罠

罠1:素の出力はJSONが壊れる

JSON Schema制約をかけないと、Qwen3.6はこういうものを返してきます。

{"x":[69,33],"y":[27]}

座標を返してほしいのに配列。これだけでgrounding精度は0.63 → 0.84に跳ねました(27B Dense)。llama.cpp側で response_format: {type: "json_schema", json_schema: {...}} を渡すと、内部的にGBNF(文法制約)が効いて出力構造が強制されます。

payload = {
    "model": MODEL,
    "messages": [...],
    "response_format": {
        "type": "json_schema",
        "json_schema": {
            "name": "out",
            "schema": {
                "type": "object",
                "properties": {
                    "x": {"type": "integer"},
                    "y": {"type": "integer"}
                },
                "required": ["x", "y"]
            }
        }
    }
}

運用での意味:「壊れたJSONで業務エージェントが停止する」事故を構造的に防げます。

罠2:座標は0-1000正規化規約

Qwen-VL / Holo3系は座標を 画像サイズで割って0-1000にスケールした値 で返してきます。ドキュメントが薄いので、最初は「全部画面の左上に集まっている」ように見えて混乱します。ベンダー乗り換え時にこの規約の違いが互換性ハマりポイントになる ので、抽象化レイヤを最初から噛ませるのが安全。

罠3:思考モードでトークンが枯渇する

Qwen3.6はデフォルトで <think>...</think> ブロックを大量に吐きます。max_tokensを512程度にしていると本文が全く返ってきません。

payload["chat_template_kwargs"] = {"enable_thinking": False}

これでgroundingのような短い構造化出力ではレイテンシが1/3になります。運用での意味:医療現場のリアルタイム性に乗せるには必須設定。

アーキテクチャ:医療情報安全管理ガイドラインとの整合

このスタックの構成上、患者画面のスクリーンショットもVLMの推論も、すべて院内GPUで完結 します。

[EMR端末]──CDP/RPA経由──→[院内GPUサーバ (A100 1枚)]
                              ├ llama-server (Qwen3.6-27B BF16)
                              ├ 業務エージェント (Python)
                              └ ログ・監査トレース
  • モデル重み:完全ローカル(モデル課金なし)
  • 推論:完全ローカル(外部API不使用 → クラウド送信問題なし)
  • 監査:全プロンプト・全画像・全応答をローカルDBに記録可能
  • ベンダー:不要(ベンダー間連携契約・データ提供同意書の追加不要)

医療情報システムの安全管理ガイドライン上、外部送信なし で構成できることは「情報共有同意」「越境データ問題」を一気に消せる強みです。

概算コスト感

  • モデル重み:0円(OSS、Hugging Faceから取得)
  • GPU:A100 80GB 1枚(中古 ~250万、クラウド ~400円/h)
  • 電力:A100 ~300W、年間24h稼働で電気代 ~7万円
  • 構築:エンジニア1〜2人月でPoC、本番運用にはUI設計込みで6人月程度

ベンダーAPIカスタマイズ見積もり 数千万 / 1年と比べると、自前PoCの方が早くて安いケース は確実に存在します。


まとめ:数年後を見据えた早めの実験を

正直に言えば、この領域はまだ市場が立ち上がっていません。「画面操作AIで電子カルテを動かす」プロダクトが普通に病院に入る世界は、おそらく数年先です。

ただ、このベンチで分かったのは、「人が画面で1〜2秒で判断できるUI操作」は、OSSのVLM+A100 1枚で2〜3秒の精度84%で再現できる ところまで来ているということです。完全自動はまだ早いが、Human-in-the-loopの業務補助なら検証は今すぐ始められます。

ベンダーがAPIを出してくれないなら、画面の方をAIに見せればいい——少なくとも技術的な前提条件は揃ってきた、と言える段階です。数年後にこの選択肢が当たり前になったとき、「うちは試したことがある」と言える病院・企業が、案外少数派だと思います。

付録:使ったモデルとベンチ可視化ビューワー

ベンチ結果の生データ・プロンプト全文・予測座標などを 1 件ずつ確認できる可視化ビューワーを公開しています。