# HDSの枠組みと医療上の守秘義務医療上の守秘義務(公衆衛生法典第L.1110-4条)は、個人を特定できる健康情報を含むすべての文書に適用され、音声の文字起こしも含まれます。患者データが診療所や病院の敷地外で処理される場合、ホスティング事業者はHDS認証(ASIP/ANS基準)を取得している必要があります。具体的には、HDS認証のないクラウドAPI(OpenAIのWhisper、Claude、あるいはどのような一般向けプラットフォームであっても)に診療内容を送信すると、テスト目的であっても法的枠組みから外れます。
対策は、音声も文字起こしも、自分で管理できる範囲の外に決して出さないことです。ローカルLLMを使った医療向け文字起こしパイプラインなら、まさにこれを実現できます。推論用のマシンは診療所内にあり、ディスクは暗号化され、ネットワークは隔離されています。ホスティング事業者は介在せず、認可を申請する必要もありません。
!
HDS非認証のクラウド利用は規定の枠外
多くの医療従事者が、時間を節約するためにChatGPTやホスティングされたWhisperを利用しています。これは職務上の守秘義務違反であり、懲戒手続き(医療倫理規則第4条)および刑事訴追(刑法第226-13条)の対象となり得ます。ARSの監査では、外部への通信を通じてこの違反を容易に検知できます。
# 100%ローカルアーキテクチャ✓
企業向けローカルAIキット
職場でのローカルAI導入:GDPR、AI Act、マルチユーザーアーキテクチャ、コスト、経営陣向けメモ。
永久に利用できるオンラインスペース PDF + ファイル 生涯アップデート パイプラインは4つのブロックで構成され、すべてローカルで動作します:音声キャプチャ → Whisper-large-v3 → SOAPテンプレート付きLLM → クリニック用ソフトウェア(LGC)またはDMPへのエクスポート。
録音 ピンマイク、または医療従事者と患者の間に置いた単一指向性のUSBマイクを使う。Bluetoothは使わない(遅延と圧縮があるため)。WAV形式、16 kHz、モノラルで録音する。
文字起こし Whisper-large-v3(OpenAI、重み公開、MITライセンス)をfaster-whisper経由でローカルGPU上で実行。モデルはメモリに読み込まれ、音声は文字起こし後に破棄されます。
構造化 Ollama経由で提供するLlama 4 Scout(17B-A2B、MoE)またはQwen3-14B。LLMは文字起こしを入力として受け取り、SOAP形式(Subjective:主観的情報、Objective:客観的情報、Assessment:評価、Plan:計画)の記録を作成します。
エクスポート 報告書は、クリップボード、HL7 CDAのショートカット、または利用可能な場合はAPIを使って、LGC(Weda、Medistory、AxiSanté、Doctolib Pro、Maiia)に挿入します。 i
なぜv3-turboではなくWhisper-large-v3を選ぶのか
Whisper-large-v3-turboはより高速ですが、医療分野のフランス語ではWER(単語誤り率)が1〜2ポイント悪化し、とりわけ固有名詞や用法・用量の認識精度が低下します。臨床現場では速度よりも正確さが優先されます。特に、パイプラインを実行する時点では診察がすでに終わっているためです。
# ハードウェアとソフトウェアの前提条件
GPU 最低限必要なのはRTX 4070 12 GBで、RTX 4080 16 GBまたはRTX 4090 24 GBなら余裕があります。Whisper-large-v3は約3 GBのVRAMを使用し、Q4_K_Mの14B LLMは約9 GBを使用します。
Macを使う代替構成 48 GBのユニファイドメモリを搭載したMac mini M4 Proなら、スタック全体を動かせます。開業している医療従事者の診療所に最適です。静かで、アイドル時はファンが停止し、消費電力も低く抑えられます。
ストレージ LUKS(Linux)、BitLocker(Windows Pro)、またはFileVault(macOS)で暗号化したNVMe SSD。100 GBあれば十分です。モデルに約25 GBを使い、残りは一時的な文字起こしデータに使います。
ネットワーク 推論用端末は、患者用Wi-Fiとは別のVLANに配置されています。本番環境では外向きのインターネットアクセスは許可せず、監督下で行う更新時にのみ許可します。
ソフトウェア Ollama(≥ 0.5)はhttp://localhost:11434でLLMを提供するために、faster-whisper(Python)は文字起こしに、ffmpegは音声変換に使用します。 →
段階的なエアギャップ
まず、更新用ドメイン(ollama.com、huggingface.co、ディストリビューションのリポジトリ)宛て以外のすべての外向き通信を遮断する、単純なファイアウォールルールを設定してください。このルールを無効にするのは、承認され、記録が残るメンテナンス時間帯だけにしてください。
# 1. フランス語の診療で使うWhisper-large-v3faster-whisperはCTranslate2を使うフォークで、Pythonのリファレンス実装より4〜5倍高速で、品質は同じです。同じモデルを利用でき、シンプルなAPIを提供します。
インストール ⧉ コピー
python -m venv ~/venv-medtranscript
source ~/venv-medtranscript/bin/activate
pip install faster-whisper==1.1.0 ffmpeg-python
# Téléchargement du modèle (téléchargé une fois, ~3 Go)
python -c "from faster_whisper import WhisperModel; WhisperModel('large-v3', device='cuda', compute_type='float16')"文字起こしのコード自体は数行で済みます。language='fr'という指定に注目してください。これによって言語の自動検出を無効にし、診療の冒頭で言語の認識がぶれるのを防げます。
transcribe.py ⧉ コピー
from faster_whisper import WhisperModel
import sys, pathlib
AUDIO = pathlib.Path(sys.argv[1])
model = WhisperModel('large-v3', device='cuda', compute_type='float16')
segments, info = model.transcribe(
str(AUDIO),
language='fr',
vad_filter=True, # coupe les silences
vad_parameters={'min_silence_duration_ms': 500},
beam_size=5,
initial_prompt=(
'Consultation médicale en français. Vocabulaire clinique, '
'noms de molécules, posologies. Termes courants : doliprane, '
'amoxicilline, lévothyrox, ECG, IRM, NFS, CRP, HbA1c.'
),
)
transcript = '\n'.join(seg.text.strip() for seg in segments)
OUT = AUDIO.with_suffix('.txt')
OUT.write_text(transcript, encoding='utf-8')
print(f'Transcription : {OUT}')→
initial_prompt の役割
Whisperはこのプロンプトを条件としてデコードを行います。専門用語、よく使われる分子名、生物学分野の略語を列挙すると、認識精度が大きく向上します。これは、簡易的なファインチューニングに相当します。ご自身の専門分野(循環器科、小児科、婦人科)に合わせてリストを調整してください。
RTX 4080では、15分の診療を約90秒で文字起こしできます。元の音声ファイルは、その直後に削除されます。文字起こしだけで十分であり、音声を残すことは不要なリスクになるためです。
# 2. LLMおよびSOAPテンプレートSOAP形式の記録は事実上の標準です。Subjective(受診理由、患者の訴え)、Objective(身体診察、バイタルサイン、追加検査)、Assessment(診断または仮説)、Plan(処方、今後の検査、フォローアップ)で構成されます。LLMには、情報を捏造せず、このテンプレートに厳密に従って記入するよう求めます。
モデルの選択 ⧉ コピー
# Option 1 — Llama 4 Scout (multimodal, 17B MoE, ~10 Go en Q4)
ollama pull llama4:scout
# Option 2 — Qwen3 14B (excellent en français)
ollama pull qwen3:14b
# Option 3 — Mistral Magistral 24B si VRAM ≥ 16 Go
ollama pull magistral:24bシステムプロンプトは厳格なルールを定めます。内容を捏造しないこと、不確かな場合は原文をそのまま引用すること、医療分野のフランス語を使うことです。
system_prompt_soap.txt ⧉ コピー
Tu es un assistant médical chargé de structurer une transcription
de consultation au format SOAP. Tu écris en français médical clair.
RÈGLES IMPÉRATIVES :
1. N'INVENTE JAMAIS de symptôme, diagnostic, traitement ou posologie
qui ne figure pas explicitement dans la transcription.
2. En cas d'information ambiguë, écris littéralement :
"À préciser par le praticien : [extrait textuel de la transcription]".
3. Conserve les unités exactes (mg, mL, fois/jour). Ne convertis rien.
4. Pour toute posologie, cite mot pour mot la phrase d'origine
entre guillemets dans la section Plan.
5. Ne formule pas de diagnostic définitif si le praticien ne l'a pas
posé. Utilise "hypothèse diagnostique" ou "à confirmer par...".
6. Garde uniquement ce qui relève de la consultation. Ignore les
éléments hors propos (conversations annexes, interruptions).
STRUCTURE DE SORTIE (Markdown, exactement ces sections) :
## Subjective
- Motif de consultation :
- Histoire de la maladie actuelle :
- Antécédents pertinents évoqués :
- Traitements en cours évoqués :
## Objective
- Examen clinique :
- Constantes mentionnées :
- Examens complémentaires cités :
## Assessment
- Hypothèse(s) diagnostique(s) :
- Diagnostics différentiels évoqués :
## Plan
- Prescriptions (citer textuellement) :
- Examens complémentaires demandés :
- Conseils donnés au patient :
- Suivi prévu :
À la fin, ajoute une section :
## Points à vérifier par le praticien
Liste des éléments douteux, manquants ou nécessitant validation.!
用法・用量:情報の捏造は一切許されません
LLMが生成した用法・用量の誤りは、人命を奪う可能性があります。原文をそのまま引用符で囲んで引用するルールは、必ず守らなければなりません。モデルが投与量の記述を言い換えたら問題です。モデルを変更するか、プロンプトの指示を厳格にしてください。
# 3. エンドツーエンドパイプライン文字起こしに続いて、OllamaのローカルREST APIを使って構造化を行います。スクリプトはコンパクトで監査しやすく、約40行に収まっています。これは意図的な設計です。コードが少なければ、攻撃対象となる範囲も小さくなります。
pipeline_soap.py ⧉ コピー
import sys, json, pathlib, requests, hashlib, datetime
from faster_whisper import WhisperModel
AUDIO = pathlib.Path(sys.argv[1])
MODEL_LLM = 'qwen3:14b'
SYS_PROMPT = pathlib.Path('system_prompt_soap.txt').read_text('utf-8')
# --- 1. Transcription locale
whisper = WhisperModel('large-v3', device='cuda', compute_type='float16')
segments, _ = whisper.transcribe(str(AUDIO), language='fr', vad_filter=True)
transcript = '\n'.join(s.text.strip() for s in segments)
# --- 2. Structuration SOAP via Ollama (localhost uniquement)
resp = requests.post(
'http://localhost:11434/api/chat',
json={
'model': MODEL_LLM,
'messages': [
{'role': 'system', 'content': SYS_PROMPT},
{'role': 'user', 'content': transcript},
],
'options': {'temperature': 0.1, 'num_ctx': 8192},
'stream': False,
},
timeout=600,
)
soap = resp.json()['message']['content']
# --- 3. Sortie + hash d'intégrité pour le journal d'audit
ts = datetime.datetime.now().isoformat(timespec='seconds')
sha = hashlib.sha256(soap.encode('utf-8')).hexdigest()[:16]
out = AUDIO.with_suffix('.soap.md')
out.write_text(
f'<!-- généré le {ts} — modèle {MODEL_LLM} — sha256:{sha} -->\n\n{soap}',
encoding='utf-8',
)
# --- 4. Effacement immédiat de l'audio et de la transcription brute
AUDIO.unlink()
print(f'Compte-rendu : {out}')→
温度パラメータは低め、コンテキストは広め
温度を0.1に設定すると創造性が抑えられます。この用途では望ましい設定です。num_ctxを8192に設定すれば、長時間の診療でも情報を失わずに扱えます。複雑な症例(精神科や、詳細な病歴聴取を伴う神経科の症例)を扱う場合は、16384に引き上げ、その長さにネイティブのコンテキストウィンドウが対応しているモデルを選んでください(Llama 4 Scoutなら256kまで余裕があります)。
15分間の診察の処理は、RTX 4080 なら3分未満でパイプライン全体を完了します。.soap.md の診察記録は、そのまま LGC に貼り付けられます。
# 4. 診療所の管理ソフトウェアとの連携LGCに応じて、統合レベルは三つあります。
01
レベル1 — クリップボード
スクリプトは自動的にレポートをコピーします(pyperclip)。ユーザーは2回のクリックでLGCに貼り付けます。100%のLGCと互換性があり、エディタ側の統合はゼロです。推奨される出発点です。
02
レベル2 — HL7 CDAのショートカット
Markdown形式のレポートは、pandocとXMLテンプレートを用いたスクリプトでCDA R2(臨床ドキュメントアーキテクチャ)に変換され、LGCのドキュメントインポート機能を通じてインポートされます。Weda、Medistory、AxiSantéがCDAを受容するため、互換性があります。
03
レベル 3 — LGC のネイティブ API
一部のソフトウェア提供元(Doctolib Pro、Maiia)は、所見を登録するAPIを公開しています。パイプラインは、INSで識別された患者の診療記録に報告書を直接送信します。最も手間の少ない方法ですが、ソフトウェア提供元の同意とCPS認証が必要です。
i
国民健康識別番号(INS)
正しい患者への紐付けを自動化する場合は、内部の診療記録番号ではなく、資格確認済みのINSを使用してください。これは、LGCを変更しても引き続き使え、法的にも対抗できる唯一のキーです。INSはINSiのオンラインサービスを通じて取得します。
# コンプライアンスと監査ログの記録医療文書の作成支援ツールを使用した場合は、その使用を記録する必要があります。患者の診療記録には、最低限、次の3項目を記載してください。
文章作成にAIの補助を利用した旨の明記 診療報告書の末尾に1行記載:「ローカルAIモデル(Qwen3-14B、バージョン2026-04-12)の支援を受けて構造化した診療報告書。[date]に医師[...]が確認済み。」この記載により、作成・確認の経緯を追跡できます。
アクセスログ パイプラインを実行するたびに、ローカルにログが記録されます(実行者、日時、使用した音声、モデル、報告書のハッシュ)。ログは追記のみ可能で、署名付きで10年間保存されます(患者記録の保存期間)。
GDPRのデータ保護影響評価(DPIA) 「AIによる文字起こし支援」という処理について、影響評価(GDPR第35条)を実施してください。100%ローカルであることで、評価が容易になります。EU域外へのデータ移転がなく、処理の委託先もなく、利用目的が一つに限られるためです。
患者への説明 待合室のポスターと受付フォームの記載で、文字起こし支援ツールを使用することを明示する必要があります。患者は使用を拒否できます。その場合に備えて、代替のワークフローを用意してください。
保存データの暗号化 ディスク全体が暗号化されています。診療記録はLGCの患者フォルダに保存され、推論用端末のファイルシステムには保存されません。一日の終わりに、一時的な.soap.mdファイルを削除してください。
管理下で行う更新 モデル(Whisper、LLM)を更新するたびに、匿名化した10件のテスト用診療データで再検証を行います。既知のリグレッションバグがある場合はデプロイしません。 !
ファイルの削除 ≠ セキュアな削除
unlink() は inode を削除しますが、暗号化されていない SSD ではデータブロックを復元できる状態のまま残します。実際に削除を不可逆にするのは、ディスク全体の暗号化(LUKS/FileVault/BitLocker)です。これを省略しないでください。
# さらに詳しくこのパイプラインは、独立して診療を行う医療従事者や、小規模な病院の診療部門の日常的な利用をカバーします。自然な拡張として、次の3つが考えられます。DockerとCPS認証用リバースプロキシを使って複数端末への展開を本格運用できるようにすること、HASの推奨事項を対象とするローカルRAGを追加してAssessmentを支援すること、そして完全なエアギャップ化に至るまでネットワークセキュリティを強化することです。
このガイドは役に立ちましたか?
ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。
👍 役に立った 👎 わかりにくい ✏️ エラーを報告