Claude Code × Medical Application

【Claude Code】治療の流れを1枚の図に Part4:AI の組み込み — 渡すのは列名とレジメン名だけ

1. はじめに — 処方データは、レジメン名の一覧でも外に出せないことがある

治療ラインの推移で、人が手間取るところは2つあります。

  • 列の対応:どの列がラインで、どれが開始日で、どれが患者 ID か
  • 表記の違い:同じ治療の別の書き方を、どれとどれでまとめるか

どちらもルールである程度は当たります(Part1、Part3)。それでも、略称と正式名、日本語と英語のような違いは、ルールでは拾えません。ここを AI に手伝わせることにしました。

ただ、患者のデータを扱う道具です。列名やレジメン名の一覧でさえ、施設の書き方や治療の傾向が分かる情報になりえます。AI を入れる前に、次のことを決めました。

  1. AI に 何を渡すか(何を渡さないか)
  2. AI の答えを どう扱うか
  3. 公開版で、どこまで使えるようにするか
  4. 送っていないことを、どう確かめるか
  • 0行AI に渡す患者の行。渡すのは列名・型・値の種類の数と、レジメン名と件数だけ
  • 0件お手元のファイルを読み込んだあとの、AI の中継への通信
  • 30日公開版で、同じ依頼への答えを使い回す期間
  • 約0.1円1回の提案の費用(列の対応。表記の違いは約0.03円)

2. 渡すもの・渡さないもの

2-1. 列名とレジメン名だけ

依頼 渡すもの 渡さないもの
列の対応 列名、列の型、値の種類の数、値の入っている行の数 値そのもの、患者 ID、日付、年齢、検査値
表記の違い レジメンの名前と、それぞれの件数 どの患者がどの治療か、ほかの列

患者の行は1行も渡しません。 集計はすべてブラウザの中で行い、AI に届くのは、表の「見出し」と「治療の名前の一覧」にあたるものだけです。

AI に渡すものの図。ブラウザの中で集計し、列名・型・値の種類の数、レジメン名と件数だけが、サイトのサーバーを通って AI へ渡る
AI に渡すもの・渡さないもの

ツールの入口の「データの扱い」にも、同じことを書いています。

入口の「データの扱い」。集計はブラウザの中、AI の提案は架空のデータでだけ、送る前に中身を出す、患者ごとの行は送らない、と書かれている
入口の「データの扱い」

2-2. 送る前に、中身を見せる

「列名だけ」と書いても、使う人には見えません。そこで「AI で提案」を押すと、送る中身(AI への指示文とデータ)をそのまま画面に出し、「送る」を押したときだけ送る形にしました。

送る前の確かめの画面。指示文と、送る列名・型・値の種類の数が一覧になっている
送る前に、送る中身をそのまま見せる(架空のデータ)

2-3. サーバーで形を確かめ、組み直してから渡す

ブラウザから AI へ直接は送りません。いったん自分のサイトのサーバーに送り、サーバーが AI へ渡します。サーバーでは、届いた依頼の 形 を確かめます。

  • 受け取る項目は決めたものだけ。列は「名前・型・種類の数・行の数」、レジメンは「名前・件数」だけで、ほかの項目が1つでもあれば断る(400)
  • 列は200まで、名前は300まで、名前の長さは200文字まで。種類の数が行の数を超えるような食い違いも断る
  • 確かめた値から依頼を 組み直して AI に渡す。確かめていない値は AI に届かない

ログに残すのも、依頼の種類・件数・時間・エラーの種類だけで、列名やレジメン名は残しません。

3. 答えは候補 — 確定は人

AI の答えは、候補として並べるだけです。

  • 列の対応:選択欄に候補が入り、理由が一覧で出る
  • 表記の違い:「AI の提案」の札つきで、チェックの入っていない状態 で並び、理由も出る
  • 「適用する」「選んだものをまとめる」を押すまで、図も数字も変わらない
AI の列の対応の候補。ライン1〜5 のレジメンの列に tx_groupname_1〜5 が入り、それぞれに理由がついている
列の対応の候補と理由(架空のデータ)
AI の表記の違いの候補。チェックの入っていない状態で、理由つきで並ぶ
表記の違いの候補(架空のデータ)
確定の前。データの確かめに注意点が9件ある
確定の前(架空のデータ)
確定の後。「2件の表記ゆれをまとめています」と「まとめを解除する」が出ている
確定の後。まとめはいつでも解除できる(架空のデータ)

Part3 のとおり、架空のデータでは10回とも正解でした。それでも、違うデータでは外れることがあります。正解の率が高いことと、確かめなくてよいことは別 です。

4. 公開版は、架空のデータだけ

4-1. 鍵をかける

公開版は、誰でも開けます。そこで、公開版の AI は、ツールに入っている架空のデータのときだけ 動くようにしました。

お手元のファイルを読み込むと、「AI で提案」のボタンは鍵の表示になります。押すと説明が出るだけで、サーバーには何も送りません。

お手元のファイルを読み込んだときの、鍵のかかった AI のボタンと説明
お手元のファイルでは、AI のボタンに鍵がかかる

架空のデータかどうかは、読み込んだファイルの中身から作った指紋(SHA-256)を、ツールに入っている架空のデータと比べて判定します。列の対応を変えたり、表記の違いをまとめたりしたあとも、架空のデータとして扱います。

4-2. サーバーでも照合する

ブラウザの鍵だけでは、送る中身を書き換えれば別のデータを送れてしまいます。そこで、サーバーでも、届いた依頼が架空のデータから作られたものかを照合し、違えば AI を呼ばずに断ります(403)。

依頼 受けるのは
列の対応 列名・型・値の種類の数・値の入っている行の数・行数が、架空のデータと完全に一致するもの
表記の違い どの名前も架空のデータの名前で、件数が架空のデータの件数か、そのまとめ方で足した数になっているもの

利用者が新しく打った名前や、合わない件数を含む依頼は断り、「この内容は AI に送っていません」と出します。

4-3. 答えの使い回しと、回数の制限

公開版では、架空のデータに限っているので、届く依頼の組み合わせは数十通りしかありません。そこで、同じ依頼への答えは30日のあいだ使い回し、2回目からは AI を呼びません。

  • 使い回した答えには、「同じ依頼に〈日時〉に AI が出した答えを再利用しています」と出す。AI がいま答えたように見せない
  • 1つの接続元から呼べる回数に上限を設ける(1時間20回・1日60回)。数えるときの鍵は IP アドレスそのものではなく、秘密の値と組み合わせて変換したもの(HMAC)にし、1時間・1日で消える。IP アドレスは保存しない
使い回した答えの画面。「同じ依頼に〈日時〉に AI が出した答えを再利用しています」と出ている
使い回した答えには、いつの答えかを出す(架空のデータ)

4-4. ボットよけを入れなかった理由

DPC のダッシュボード では、人間かどうかを確かめる仕組み(ボットよけ)を入れていました。今回は入れていません。外のスクリプトを読み込み、外へ通信することになり、次の章の「ブラウザが通信してよい先は自分のサイトだけ」という決まりを崩すからです。代わりに、架空のデータに限ること、答えの使い回し、回数の上限で、使いすぎを抑えています。

4-5. お手元のファイルで AI の手を借りたいとき

公開版にも、AI への依頼文をコピーする 機能を入れています。依頼文には列名とレジメン名・件数だけが入り、中身はその場で確かめられます。社内で使ってよい AI に自分で貼り、返ってきた答えを貼り戻すと、候補として読み込みます。ツールからの通信は増えません。

依頼文のコピーの画面。写した中身を開いたところ
依頼文をコピーする(架空のデータ)
返ってきた答えを貼り戻した画面。「答えを列の対応に入れました。確かめてから『適用する』を押してください。」と出ている
答えを貼り戻すと、候補として並ぶ(架空のデータ)

導入先の環境に組み込む 導入版 では、お手元のデータに AI の提案をそのまま使えます。中身のコードは同じで、設定で切り替えています。

5. 送っていないことを確かめる

5-1. ブラウザが通信してよい先を決める

ツールのページには、ブラウザが通信してよい先は自分のサイトだけ(connect-src 'self')という決まり(CSP)を付けています。ツールのコードが誤って外のサーバーへ送ろうとしても、ブラウザが止めます。AI への依頼も、自分のサイトのサーバーを通しているので、この決まりを変えずに済みました。

応答ヘッダーの CSP
通信してよい先は自分のサイトだけ

CSP のほかに、配信の仕組みが自動で付けるヘッダー(NEL)や、アクセス解析のスクリプトの差し込みにも気をつける必要があります。考え方と確かめ方は TLF Visual QC の Part4 と同じなので、そちらにまとめています。このツールでも、本番のドメインに移す日に、同じ確認をしました。

5-2. 場面ごとの通信を記録する

本番のツール(treatment-line.herzleben.co.jp)で、次の場面の通信を記録しました。

場面 AI の中継(/api)への通信 外への通信
画面を開く 0件 0件(ページ・スクリプト・画像はすべて自分のサイトから)
架空のデータで AI の提案を頼む 1件(「送る」を押したときだけ。中身は列名・型・値の種類の数と行の数) 0件
お手元のファイルを読み込んで絞り込む 0件(鍵の説明を開いても) 0件
図と表を書き出す 0件 0件(ブラウザの中でファイルを作る)

架空のデータで「送る」を押したときの答えは、11月9日に AI が出した答えの使い回しでした。画面にもそのとおり出ます(4-3)。

公開前の自動の確認でも、お手元のファイル(わざと崩した入力)を読み込んだあと、AI の中継への通信が0件であること、外への通信が無いこと、CSP の警告が無いことを確かめています。

5-3. 通信を切っても、集計は動く

画面を開いて読み込みが終わったあとなら、ネットワークを切っても、図を描き、絞り込めます。架空のデータでも、ディスクから選んだファイルでも、通信のあるときと同じ数字になることを確かめました。AI のボタンは「通信がないため使えません」になります。

通信を切ったときの画面。AI のボタンが「AI で提案(通信がないため使えません)」になっている
通信を切ると、AI のボタンは使えない表示になる
通信を切ったままの Sankey 図。3,000人の集計がそのまま出ている
通信を切っても、集計と図は動く(架空のデータ)

6. 連載のほかのツールとの違い

DPC のダッシュボード TLF Visual QC 治療ラインの推移
扱うデータ 公開データ 申請前の帳票 処方のデータ
AI に渡すもの 質問の文 なし 列の名前とレジメンの名前・件数
公開版での AI 使える なし 架空のデータでだけ
ボットよけ あり なし なし(CSP を守るため)

データの性質に合わせて、AI に何を渡すかを決めています。

7. Claude Code に任せたことと、人が決めたこと

任せたこと 人が決めたこと
AI への依頼と、答えの形(JSON)の決まりの実装 AI に渡すものを列名とレジメン名・件数に限ること
送る前の確かめの画面 送る中身をそのまま見せ、「送る」を押したときだけ送ること
サーバーでの形の検査と、依頼の組み直し 確かめていない値を AI に届けないこと、ログに名前を残さないこと
架空のデータの照合(ブラウザの指紋と、サーバーの 403) 公開版の AI を架空のデータに限ること
答えの使い回し(30日)と回数の上限(HMAC) 使い回した答えに日時を出すこと、IP アドレスを保存しないこと
「あらかじめ用意した結果の例」を消し、使えない理由を出す画面 AI の答えでないものを AI の答えに見せないこと
公開前の自動の確認(通信0件・CSP・通信を切ったとき) ボットよけを入れず、CSP を守ること

8. まとめ

  • AI に手伝わせるのは、列の対応と表記の違いの2か所だけ
  • 渡すのは列名・型・値の種類の数と、レジメン名と件数。患者の行は渡さない
  • 送る前に中身を見せ、サーバーで形を確かめて組み直してから渡す。答えは候補で、確定は人
  • 公開版の AI は架空のデータだけ。ブラウザで鍵をかけ、サーバーでも照合して断る
  • 答えは30日使い回し、回数は IP アドレスを保存しない形で数える。お手元のファイルでは、依頼文のコピーで AI の手を借りられる
  • 通信してよい先は自分のサイトだけ。お手元のファイルでは AI の中継への通信0件、通信を切っても集計は動く

AI を入れるかどうかより先に、何を渡すかを決める。決めたことは、画面に出して見せる。

次のステップ

連載はここまでです。治療ラインの推移は treatment-line.herzleben.co.jp で公開しています。架空の関節リウマチのデータで、AI の提案まで試せます。数え方と Sankey 図の読み方は 参照ページ にまとめています。

お手元のデータで AI の提案を使う形や、社内の定義・コード表に合わせた作り込みのご相談は、お問い合わせからお聞かせください。

出典

  • 本ページの画面写真と数値は、架空の関節リウマチのデータ(3,000人)と、わざと崩した入力で作成したものです。実在の患者・施設・薬剤・企業とは関係ありません