海外の治験実施施設・検査機関から毎月届く英文の請求書を読み取り、契約の単価表と来院実績に照らして過大請求を見つける
海外の治験実施施設や中央検査機関から毎月届く英文の請求書を読み取り、明細の1行ずつを契約の単価表の費目に対応付けます。そのうえでEDCの来院実績と照らし、単価の違い・来院の無い請求・二重の請求に印を付けて担当者に返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- 医療/製造
- 対象部門
- 研究開発/経理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 施設から届いた請求書のPDFを、試験ごとのフォルダに保存する
- 明細を1行ずつ表計算に書き写す(被験者番号、来院、日付、費目、金額)
- 契約の管理台帳からその施設の単価表を開き、行ごとに単価が合っているかを見る
- EDCから来院の記録を出し、被験者番号と来院が実際に行われたかを1行ずつ照らす
- 前月までの請求の表を開き、同じ被験者の同じ来院が既に請求されていないかを見る
- 合わない行を施設ごとにまとめ、照会のメールを書く
- 問題の無い請求書を支払の承認に回し、経理が会計の仕組みに入力する
- 人施設から届いた請求書のPDFを、受付フォルダに保存する。ファイル名に試験番号と施設番号を付ける
- 自動保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめる
- 自動OCRが請求書の請求番号・日付・合計・明細の行を、信頼度付きで返す
- 自動生成AIが明細の各行から被験者番号・来院・日付を切り出し、単価表の費目に対応付ける
- 自動プログラムが単価×回数を計算し、単価表・EDCの来院実績・前月までの請求と照らす
- 自動行ごとに `ok` / `rate_diff` / `no_visit` / `duplicate` / `not_in_budget` / `unreadable` を付ける
- 自動請求書ごとに `pass` / `query` / `needs_human` を規則で決め、照会文の下書きを作る
- 人担当者が `query` と `needs_human` の請求書だけを開き、印の付いた行を確かめる
- 人照会を施設に送り、`pass` のものと回答の済んだものを支払の承認に回す
各工程の詳しい説明を読む
- 施設から届いた請求書のPDFを、試験ごとのフォルダに保存する
- 明細を1行ずつ表計算に書き写す(被験者番号、来院、日付、費目、金額)
- 契約の管理台帳からその施設の単価表を開き、行ごとに単価が合っているかを見る
- EDCから来院の記録を出し、被験者番号と来院が実際に行われたかを1行ずつ照らす
- 前月までの請求の表を開き、同じ被験者の同じ来院が既に請求されていないかを見る
- 合わない行を施設ごとにまとめ、照会のメールを書く
- 問題の無い請求書を支払の承認に回し、経理が会計の仕組みに入力する
(a)書き写しに時間の大半が消える。 1件の請求書に明細が20〜40行あり、それを書き写すだけで10分かかります。照合という本来の仕事に使える時間が、書き写しに削られています。
(b)来院していない分の請求を見落とす。 予定されていた来院が実際には行われなかった、被験者が途中で同意を撤回していた。EDCの記録との突き合わせを省いた月に、こうした行がそのまま通ります。
(c)二重の請求に気づけない。 前月の請求で漏れた来院を、施設が翌月にまとめ直して請求することがあります。前月までの全請求と照らさないと、同じ来院を2度支払います。
(d)単価の版を取り違える。 契約の変更で単価が上がった施設で、変更前の来院まで新しい単価で請求されることがあります。来院の日付と単価の適用開始日を見比べる必要があります。
- 【人】 施設から届いた請求書のPDFを、受付フォルダに保存する。ファイル名に試験番号と施設番号を付ける
- 【自動】 保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめる
- 【自動】 OCRが請求書の請求番号・日付・合計・明細の行を、信頼度付きで返す
- 【自動】 生成AIが明細の各行から被験者番号・来院・日付を切り出し、単価表の費目に対応付ける
- 【自動】 プログラムが単価×回数を計算し、単価表・EDCの来院実績・前月までの請求と照らす
- 【自動】 行ごとに
ok/rate_diff/no_visit/duplicate/not_in_budget/unreadableを付ける - 【自動】 請求書ごとに
pass/query/needs_humanを規則で決め、照会文の下書きを作る - 【人】 担当者が
queryとneeds_humanの請求書だけを開き、印の付いた行を確かめる - 【人】 照会を施設に送り、
passのものと回答の済んだものを支払の承認に回す
8番目が、この設計の分かれ目です。 担当者は全件を読みません。印の付いた行について、原本の該当箇所と照合の相手を見比べることに時間を使います。
7番目を規則で決めているのも、意図してのことです。 少額の端数の違いを照会するか、どこまでを許容するかは契約と社内の取り決めで決まり、後から変わります。その判断をAIに置かず、規則として持ちます。
02今回想定するシステム構成
施設・検査機関の英文の請求書(PDF) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数・パスワード・試験番号の確認 ▼ AWS Textract(StartExpenseAnalysis/GetExpenseAnalysis) │ 請求番号・日付・合計・明細の行と、信頼度 ▼ Claude API ── 明細の行の切り出しと、単価表の費目への対応付け │ ① 被験者番号 ② 来院の名前 ③ 実施日 ④ 費目 ⑤ 回数 ▼ Python ── 単価×回数の計算、単価表・EDCの来院実績・前月までの請求との照合 ▼ 行ごとの判定 + 請求書ごとの判定(pass / query / needs_human) ▼ 【担当者が印の付いた請求書を確認】 ├──▶ 施設への照会文の下書き └──▶ 支払の承認へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartExpenseAnalysis/GetExpenseAnalysis) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(明細の切り出しと費目の対応付け、照会文の下書き) | OpenAI API、Gemini API |
| 差異計算 | Python(単価の計算、来院実績と前月までの請求との照合) | 治験の予算管理の仕組みの照合機能 |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(請求書、読み取り結果、照合の結果、照会の記録) | 社内のファイルサーバー |
EDCと契約の管理台帳は、新しく足すものではありません。 最初の準備は、施設ごとの単価表を「施設番号・費目のコード・費目の名前・単価・通貨・適用開始日・適用終了日」の列で持つことです。契約書のPDFのままでは、照合の相手になりません。
OCRに AWS Textract を選ぶのは、請求書が英文だからです。 公式の上限の表で、対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語とされ、日本語・中国語・韓国語は読めません。 アジアの施設でも英文で請求してもらうことを前提にし、そうでない施設は対象から外します。
この題材で効くのは、請求書と領収書の分析(StartExpenseAnalysis)です。 テンプレートの設定なしに、請求番号・日付・合計などを標準の項目名(INVOICE_RECEIPT_ID、INVOICE_RECEIPT_DATE、TOTAL など)にそろえて返し、明細は LineItemGroups として1行ずつ、ITEM・QUANTITY・UNIT_PRICE・PRICE の項目に分けて返します。施設ごとに違う「Invoice No.」「Bill Number」が同じ項目名になるので、様式の違いを吸収できます。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)にPDFが保存されたことを起点にします。 請求書は月初に集中しますが、施設ごとに届く日がばらばらなので、1日1回の定時実行にはしません。 届いた日に照会を出せば、施設が月末の締めに間に合うように回答できます。
ファイル名の先頭に試験番号と施設番号を付けるところまでを人が行います。番号が付いていないファイルは、照合する単価表を決められないので、処理を始める前に止めます。 メールの添付を受付フォルダへ移す作業は、共有の受信箱のルールで自動にしてもかまいません。
S3 への保存を AWS Lambda が受け、StartExpenseAnalysis を呼びます。ClientRequestToken に施設番号とファイルのハッシュから作った値を入れると、同じトークンで呼び直しても同じ JobId が返り、同じ請求書を二度読みません。 JobTag には試験番号と施設番号を入れ、完了の通知(Amazon SNS)からどの施設の請求書かを引けるようにします。通知の状態が SUCCEEDED であることを確かめてから結果を取り、すぐ S3 に保存します。 JobId は7日間しか有効ではありません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 請求書のPDF | 請求番号、請求日、請求の対象期間、明細、合計、通貨 | 受付フォルダ(S3) |
| 読み取り結果 | 標準の項目、明細の行、信頼度、ページ番号 | AWS Textract |
| 単価表 | 施設番号、費目のコード、費目の名前、単価、通貨、適用開始日・終了日 | 契約の管理台帳から作った表 |
| 来院実績 | 被験者番号、来院の名前、実施日、実施した検査、被験者の状態(スクリーニング不適格・中止) | EDCの出力 |
| 前月までの請求 | 施設ごとに、支払済み・照会中の明細(被験者番号・来院・費目) | この構成が残した照合の記録 |
| 費目の言い換えの一覧 | 施設ごとに、請求書の書き方と単価表の費目の対応 | 担当者が育てる一覧 |
質を決めるのは、下の3つです。 来院実績が無ければ「来院していない」と言えず、前月までの請求が無ければ二重の請求を見つけられません。言い換えの一覧は、最初は空でかまいません。 担当者が対応付けを直すたびに1行ずつ増え、翌月からその施設の行が迷わず結び付くようになります。
データの取得方法を決める
結果は GetExpenseAnalysis で取ります。1回の呼び出しで返る件数は既定・最大20で、NextToken が返る限り続けて取ります。 JobStatus が PARTIAL_SUCCESS のときは Warnings に出たページを記録し、その請求書を needs_human にします。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 請求番号・請求日・合計など | SummaryFields の Type と ValueDetection | 請求書の特定、合計の検算 |
| 書かれていた見出しの文字 | LabelDetection | 標準の項目に当たらない見出し(請求の対象期間など)を拾う |
| 明細の行 | LineItemGroups の LineItems | 1行ずつの費目・回数・単価・金額 |
| 通貨 | Currency の Code | 単価表の通貨との一致 |
| 信頼度とページ番号 | 各項目の Confidence と PageNumber | unreadable の判定と、原本に戻る手がかり |
標準の項目に当たらないものは OTHER として返ります。 「Service Period」「Protocol No.」のような治験に固有の見出しは、多くがここに入ります。OTHER の LabelDetection の文字を見て、請求の対象期間と試験番号を拾います。
明細の行は、1行の文字が長いことがあります。 「Visit 4 (Week 12) – Subject 1012-007 – 14-Aug – incl. ECG, PK sampling」のように、来院・被験者・日付・検査が1つの ITEM に詰め込まれます。これを分けるのが、次の段の生成AIの仕事です。
AIへ渡す前に整形する
- 形式の確認 … 請求書の分析で非同期に扱えるのは JPEG、PNG、PDF です。TIFFで届いたものはPDFに変換します
- パスワードの確認 … PDFはパスワードで保護されていてはいけません。保護されたものは施設に解除したものを頼みます
- ページ数とサイズの確認 … 非同期の処理でPDFは500MB・3,000ページが上限です。来院の明細書や領収書の束が添付されているものは、請求書の部分と分けます
- 文字の大きさの確認 … 文字の高さが15ピクセルを下回ると検出されません。150 DPIで8ポイント相当です
- 被験者の氏名が無いかの確認 … 被験者番号ではなく氏名やイニシャル以外の個人を特定できる情報が書かれていれば、処理を止めて担当者へ回します
- 単価表と来院実績の準備 … その施設の単価表とEDCの最新の出力を、照合用に読み込みます
5番目を省かないでください。 請求書は本来、被験者識別コードで書かれるものです。氏名が書かれた請求書を外部のAIに渡す前に止め、施設に様式を直してもらいます。
AIに処理させる
させるのは、明細の各行を被験者番号・来院・実施日・費目・回数に分け、単価表の費目のコードに対応付け、根拠の文字列を添えることだけです。
| 取り出す項目 | 中身 | 取り出せないときの扱い |
|---|---|---|
| 被験者番号 | 行に書かれた被験者番号(施設番号付きの形式) | 書かれていなければ not_found |
| 来院の名前 | Visit 4、Week 12、Screening、Early Termination など | 書かれていなければ not_found |
| 実施日 | その行の来院・検査の日付 | 日付が複数あれば ambiguous |
| 費目のコード | 単価表のどの費目に当たるか | 当てはまる費目が無ければ not_in_budget、候補が複数なら ambiguous |
| 回数 | 書かれた数量 | 書かれていなければ1とせず not_found |
費目の対応付けには、施設ごとの言い換えの一覧を渡します。 一覧にある書き方なら、そのコードを使います。一覧に無ければ、単価表の費目の名前と見比べて候補を出し、その行には new_mapping の印を付けて人に確かめてもらいます。
| させないこと | 理由 |
|---|---|
| 金額の計算・検算 | 単価×回数と間接費の率はプログラムが計算する |
| 来院が行われたかの判断 | EDCの記録との照合はプログラムが行う |
| 書かれていない回数・日付の補完 | 「通常は1回」で埋めると、根拠の無い請求を通す |
| 支払ってよいかの結論 | 契約の解釈と支払の判断は担当者が行う |
| 単価表に無い費目を近い費目に寄せる | 契約に無い請求が、契約にある請求に見えてしまう |
5行目がいちばん起きやすい失敗です。 「Unscheduled visit」のような単価表に無い行を渡すと、AIは近い名前の「Visit」に寄せて結び付けがちです。寄せた瞬間、契約に無い請求が単価の差だけの問題に見えます。 無ければ not_in_budget と返させます。
指示内容を固定する
あなたは製薬企業の臨床開発部で、治験の実施施設から届いた英文の請求書を点検する担当です。
OCRが返した明細の行だけを見て、各行を項目に分けてください。推測で埋めないでください。
【やること】
1. 明細の各行から、被験者番号・来院の名前・実施日・回数を原文のまま切り出す
2. 各行を、下に示す単価表の費目のコードに対応付ける
3. 対応付けの根拠にした原文の文字列を evidence に入れる
【費目の対応付けの決まり】
- まず「この施設の言い換えの一覧」を見る。一覧にある書き方ならそのコードを使う
- 一覧に無ければ、単価表の費目の名前と見比べて候補を1つ選び、mapping を "new_mapping" にする
- 単価表に当てはまる費目が無ければ budget_code を "not_in_budget" にする。
名前の近い費目に寄せないでください
- 候補が2つ以上で決められなければ "ambiguous" にする
【厳守事項】
- 金額を計算しないでください。単価や合計を検算しないでください。
- 書かれていない回数を 1 としないでください。"not_found" にしてください。
- 1行に複数の日付があるときは、来院の実施日がどれか分からなければ "ambiguous" にしてください。
- 被験者番号の桁や記号を直さないでください。読み取った文字列をそのまま写してください。
- 来院が行われたかどうか、支払ってよいかどうかを書かないでください。
- 被験者の氏名など、被験者番号以外の個人の情報を書き出さないでください。
- confidence は OCR が返した値をそのまま入れてください。
【明細の行】{line_items}
【この施設の単価表(費目のコードと名前)】{budget_items}
【この施設の言い換えの一覧】{alias_list}
「名前の近い費目に寄せない」を、対応付けの決まりの中に書いているのには理由があります。 厳守事項の側だけに書くと、対応付けの手順を優先して寄せてしまいます。手順そのものの中に「無ければ無いと返す」分岐を入れます。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に type: "json_schema" とスキーマを指定)を使い、形の崩れた応答を照合のプログラムに流さないようにします。
{
"study_no": "",
"site_no": "",
"invoice_no": "",
"invoice_date": "",
"currency": "",
"lines": [
{ "line_no": 1, "subject_id": "", "visit": "", "visit_date": "",
"budget_code": "", "mapping": "alias | new_mapping | ambiguous | not_in_budget",
"quantity": "", "billed_amount": "", "confidence": 0, "evidence": "", "page": 1 }
]
}
照合のプログラムは、この lines に次の判定を付けます。
| 判定 | 意味 |
|---|---|
ok | 単価表と来院実績の両方と合う |
rate_diff | 単価×回数と請求額が違う。来院の日付で単価の版を選んで計算する |
no_visit | EDCにその被験者のその来院の記録が無い |
duplicate | 前月までに同じ被験者・来院・費目が請求されている |
not_in_budget | 単価表に当たる費目が無い |
unreadable | 読み取りの信頼度が低い、または ambiguous |
理由は、AIの出力とプログラムの判定を別の層に置けることです。 lines はAIが原文から埋め、判定はプログラムが単価表とEDCを相手に付けます。契約が変わっても、直すのは単価表の行だけです。
| 請求書ごとの判定 | 条件 |
|---|---|
pass | すべての行が ok、かつ合計が明細の和と一致 |
query | rate_diff・no_visit・duplicate・not_in_budget のいずれかがある |
needs_human | unreadable がある、または new_mapping がある |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(S3) | AWS Lambda の起動 | 請求書の保存を検知し、読み取りを始める |
| AWS Textract | 非同期のAPI呼び出しと SNS の通知 | 請求書の項目と明細の行を返す |
| Claude API | API呼び出し | 明細の切り出しと費目の対応付け、照会文の下書き |
| EDC | 定期的な出力ファイルの読み取り | 来院実績を照合用に読み込む |
| 単価表 | 照合用の表の読み取り | 施設ごとの単価と適用期間を引く |
| 会計の仕組み | 既存の入力経路 | 承認されたものだけを回す |
EDCへは書き込みません。 EDCは症例のデータの仕組みで、支払の都合で触ってよいものではありません。読み取りの権限だけを持つ出力ファイルを使います。 会計の仕組みへも書き込まず、承認を通ったものだけが既存の経路で回ります。
人が確認する
担当者が開くのは query と needs_human の請求書だけです。 pass のものは一覧で施設と合計を流し見ます。全件を開く設計にすると、第10章の8分には収まりません。
needs_humanを先に見る …unreadableの行は原本で読み、new_mappingの行は対応付けが正しいかを決めます。決めた対応は言い換えの一覧に足しますno_visitを確かめる … EDCの入力が遅れているだけのことがあります。施設に照会する前に、モニターにEDCの入力状況を聞きますrate_diffとduplicateの根拠を確かめる … 単価表のどの版で計算したか、前月のどの請求と重なったかを見ます- 照会文を直して送る … 送るのは担当者です
- 判定を変えたら記録する … どの行を、どの判定に、なぜ変えたかを残します
2番目を省かないでください。 EDCの入力は来院から数日遅れることがあり、入力待ちの来院を「来院していない」と施設に問い合わせると、施設との関係を損ねます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 英語以外の請求書 | この構成では読めない。英文で請求してもらうよう施設に依頼する |
| パスワード付きのPDF | 解除したものを施設に頼む |
| TIFFで届く | 請求書の分析は非同期で JPEG・PNG・PDF。PDFに変換する |
| 被験者の氏名が書かれている | 処理を止め、施設に様式を直してもらう |
| 単価表がまだ登録されていない施設 | 照合せずに needs_human。契約の担当に単価表の登録を頼む |
| 通貨が単価表と違う | 換算せずに query。為替の扱いは契約で決まる |
| 1つのPDFに複数の請求書 | ExpenseIndex で分け、請求書ごとに照合する |
PARTIAL_SUCCESS で一部のページが読めない | Warnings のページを記録し、請求書を needs_human に |
| OCRが応答しない | 受付フォルダに残す。処理済みに移すのは成功したときだけ |
上から5行目が、立ち上げの時期にいちばん多く出ます。 新しい施設が試験に加わったとき、契約の締結から単価表の登録までに間があり、その間に最初の請求書が届きます。単価表の登録を契約の手続きの最後の工程に入れておくと、この行は減ります。
記録を残す
- 請求書の原本と、受け取った日時・試験番号・施設番号
- OCRが返したJSONの全文(
GetExpenseAnalysisの全ページ分) - AIの切り出しと対応付けの結果(
lines) - 照合の結果と、そのとき使った単価表の版とEDCの出力の日付
- 担当者が判定や対応付けを変えた記録
- 照会の内容と施設の回答、支払の承認の日時
- 施設ごとの
unreadableとnew_mappingの発生率
4つ目で単価表の版を残すのは、契約の変更で単価が後から変わるためです。 当時どの版で照合したかが分からないと、監査や施設との精算のときに説明できません。
ICH E6(R3) は、治験の財務的な事項を治験依頼者と治験責任医師・実施医療機関の間の合意文書に記録するよう求め、その取り決めを必須の記録に挙げています。 請求の照合の記録は、その合意どおりに支払ったことを示す材料になります。保存の期間は、自社の治験の文書の保存の規程に合わせて決めます。
04実装レベルの3段階
最小構成では件数がさばけません。 1件ずつ貼り付けるので、150件には使えません。確かめるための段階です。 半自動化で、1件28分が15分程度になります。 書き写しと単価の照合は無くなりますが、EDCとの照合と前月までの請求との照合が残ります。本格構成で8分になり、この段階が本記事の想定です。 差が大きいのは、EDCとの照合と二重の請求の確認が、明細の行数に比例する作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、new_mapping の多い施設と、読み取りの崩れやすい様式が先に分かります。言い換えの一覧が育ってから本格構成に進むほうが、人に回る請求書が減ります。
05工数削減シミュレーション
導入後 150件 × 8分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 国際共同治験を自社で管理し、海外の実施医療機関や中央検査機関から英文の請求書を毎月百件以上受け取っている製薬企業・医療機器メーカー・バイオベンチャー。請求書の明細を表計算に書き写し、契約の単価表とEDCの来院の記録を目で突き合わせている場合。施設ごとに請求書の様式が違い、担当者が施設の癖を覚えて処理している場合。
- 施設への支払をCRO(開発業務受託機関)や支払代行の会社にすべて委ねており、自社で請求書を見ない場合。請求書が英語以外(中国語・日本語・韓国語など)で届く施設が中心の場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めません)。施設が支払の仕組みに直接データを入れる運用になっている場合。なお、契約の解釈が分かれる請求を支払うか、施設と単価を見直すかの判断は、臨床開発の担当と契約の担当が行うもので、この構成では代替できません。
07最小構成で試す方法
- 先月の請求書から、様式の違う施設の20件を選ぶ(うち数件は、照会を出したものを入れる)
- 20件の請求書を AWS Textract のコンソールで請求書として分析し、明細の行がどう返るかを見る
- 明細の行と、その施設の単価表を手元のAIサービスに貼り、「各行を被験者番号・来院・実施日・費目に分け、単価表の費目に対応付けてください。当てはまる費目が無ければ無いと書き、近い費目に寄せないでください。金額は計算しないでください」と指示する
- 出てきた対応付けを、当時の担当者の書き写しと突き合わせる
20件は必ずやってください。 ワークフローを組む前に、「明細の行が、被験者と来院に分けられるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時と同じ対応付けになった | EDCと単価表との照合に進む |
| 単価表に無い行を近い費目に寄せた | 指示の書き方で直る。構成は有効 |
| 明細の行が途中で切れる、行がまとまる | その施設の様式の問題。 施設に様式の相談をする |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 単価表に無い行を近い費目に寄せる | 指示の手順の中に「無ければ無い」の分岐を入れる |
| 契約の変更の前の来院を新しい単価で照合する | 来院の日付で単価の版を選ぶ |
EDCの入力待ちを no_visit として照会する | 照会の前にモニターに入力状況を聞く |
| 二重の請求を見落とす | 前月までの照合の記録を、被験者・来院・費目で引けるように残す |
| 回数の無い行を1回として扱う | not_found にさせ、人が確かめる |
| 明細の1行に複数の来院が詰め込まれる | 切り出しで分け、分けた元の行を evidence に残す |
| 被験者の氏名が書かれた請求書をそのまま読む | 前処理で止め、施設に様式を直してもらう |
| 通貨の違う請求を勝手に換算する | 換算せずに照会する |
| 単価表の登録が遅れる | 契約の手続きの最後に単価表の登録を入れる |
上の2行が、この構成の失敗のほとんどです。 どちらも「合っているように見える」照合を作る誤りです。寄せた対応付けと古い版の単価は、差額が小さいほど見落とされます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 被験者識別コード、来院の日付と実施した検査、施設への支払額と単価、そして治験の契約の条件です。被験者識別コードは仮名化された情報ですが、来院の日付や検査の内容と組み合わさると、施設の側では個人に結び付きます。
- 被験者の氏名などを外部のAIに渡さない … 前処理で止めます。被験者識別コード以外の個人の情報は、請求書に書かないよう施設に依頼します
- 生成AIに渡す範囲を明細の行に限る … EDCの来院実績と単価表の金額は、プログラムの側で照合します。生成AIへ渡すのは明細の文言と、費目の名前の一覧だけです
- 保管の暗号化を決める …
StartExpenseAnalysisのKMSKeyIdを指定すると、利用者のバケットに出力するときにそのキーで暗号化されます。指定しない場合は SSE-S3 で暗号化されます - EDCの権限を読み取りに限る … 支払の照合のために症例データを書き換えられる権限を持たせません
- 照会を自動で送らない … 出すのは下書きまでです。施設との関係は、試験の進み具合に直結します
- 支払の判断を自動で確定させない … 契約の解釈が分かれる請求は、臨床開発の担当と契約の担当が決めます
誤りが起きた場合のリスクは、根拠の無い請求を支払うことと、正当な請求を照会して施設の負担を増やすことの2つです。 前者は費目の寄せと単価の版の取り違えから、後者はEDCの入力待ちと読み取りの粗さから起きます。
10まず何から始めるか
1週目:単価表を表にする
請求書の件数が多い上位20施設について、契約の単価表を「施設番号・費目のコード・費目の名前・単価・通貨・適用開始日・適用終了日」の表に起こします。全施設を一度にそろえる必要はありません。
2週目:20件で試す
先月の請求書から様式の違う20件を選び、コンソールで読み取り、手元のAIサービスで明細を費目に対応付けさせます。近い費目に寄せていないか、回数を補っていないかを最優先で見ます。
3週目:照合の規則を決める
端数の違いをどこまで許すか、EDCの入力待ちをどう扱うか、二重の請求をどの単位で見るかを、臨床開発と経理で決めます。 あわせて、EDCから来院実績を出力する手順をデータ管理の担当と決めます。
4週目:受付フォルダから一覧までをつなぐ
S3 と Lambda で受付フォルダを見張り、OCRを呼び、明細の対応付けと単価の照合を一覧に書き出すところまで作ります。この時点では請求書ごとの判定を出さず、行ごとの結果だけを見ます。
2か月目: EDCの来院実績と前月までの請求との照合を足し、請求書ごとの判定を出します。query と needs_human の件数を毎週数えます。3か月目以降: 照会文の下書きを足し、1件28分が何分になったかを実測します。言い換えの一覧が育ち、new_mapping が月に数件まで減った時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 治験の財務的な事項を、治験依頼者と治験責任医師・実施医療機関の間の合意文書に記録すべきこと(3.5 Financing)。財務的な事項に関する取り決めが必須の記録に含まれること | ICH E6(R3) Guideline for Good Clinical Practice(2025年1月6日採択) | 2026-10-08 |
| 非同期の処理でPDFが500MB・3,000ページまで。パスワード付きPDF不可。対応言語が英・仏・独・伊・葡・西。文字の高さ15ピクセル(150 DPIで8ポイント)が下限 | AWS: Set Quotas in Amazon Textract | 2026-10-08 |
テンプレートなしで請求書の項目を抽出し、異なる見出しを INVOICE_RECEIPT_ID などの標準の項目にそろえること。標準に当たらない項目が OTHER になること。明細の ITEM・QUANTITY・UNIT_PRICE・PRICE、LabelDetection・ValueDetection・Confidence・PageNumber・ExpenseIndex が返ること | AWS: Analyzing Invoices and Receipts | 2026-10-08 |
StartExpenseAnalysis が JPEG・PNG・PDF を扱うこと。ClientRequestToken で同じ JobId が返ること。JobTag が完了の通知に含まれること。KMSKeyId の扱い。JobId が7日間有効なこと | AWS: StartExpenseAnalysis | 2026-10-08 |
MaxResults が既定・最大20で NextToken で続きを取ること。SummaryFields・LineItemGroups の構造。JobStatus に PARTIAL_SUCCESS があること | AWS: GetExpenseAnalysis | 2026-10-08 |
構造化出力を output_config.format(type: "json_schema")で指定すること | Claude: Structured outputs | 2026-10-08 |
請求を支払うかどうか、契約の解釈が分かれる請求の扱いは、臨床開発の担当と契約の担当で決めてください。 本記事は公開仕様と ICH E6(R3) で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1070)についてのご相談はこちらから。
