🩺

与えるタスクを工夫したら、3BクラスのローカルLLMで実用的な医療用問診システムができた話

に公開

✍️ まえがき

医療の現場は、個人情報を扱うため、セキュリティがめちゃくちゃ大事ですよね。

chatGPTGeminiなどのサービスはカンタンに使えて高性能ですが、
海外サーバーへ個人情報を含むデータが送信されると、
適切な設定をしていなければ 医療情報ガイドライン違反となってしまう可能性があります。

外部に情報を送らないローカルLLMではこの問題が解決できるため、大いに期待していました。

高度なタスクを任せるには力不足という認識でしたが、今回作った医療用問診システムで小型ローカルLLMの活用方法が見えてきました。

同じようなローカルLLMを用いたシステム開発をされている方に参考になればと思います。


🤖 AIを使った問診システム、よさそうじゃないですか?

患者さんが診察室に入ってくる前に十分な情報があれば、診察がスムーズに進む場面も多いですよね。
Ubieさんの問診システムが定番でしょうか。

一方、最近こんなニュースが出ていました。
富士通、病院の問診をAIで自動化 NVIDIAと協業

こちらは、単純な問診から一歩踏み込んだエージェントシステムのようです。
ですが、開業医レベルではここまでのシステムは必要ないのではないでしょうか。

LLMが患者さんから事前の問診をするイメージで、システムを作り始めました。


🛠️ 最初に作った失敗作の仕組み

問診の項目をリストとして作成、ローカルLLMにそのリストを与えます。
そのリストに含まれる内容について十分情報が集まるまで、LLMが逐次問診していくシステムを作ろうとしました。

おそらく、GeminichatGPTのAPIを使えば簡単です。
ですが、性能に限界があるローカルLLMではあまりうまくいきませんでした。

  • モデルサイズが小さなLLMでは、与えられた問診項目について網羅的で的確な問診ができない。
  • モデルサイズの大きなLLMでは、問診精度がよくとも、臨床現場で使用するには遅すぎる。

アルゴリズムの制御でうまくいくのかもしれませんが、所詮バイブコーディングが主な僕では限界でした。

反省点:LLMでなくともよいところでLLMを使おうとした

LLMを問診に使用するメリットとしては、動的な問診項目の生成だと思います。

ですが、患者さんへいつも尋ねている内容は、病院や診療科ごとに、ある程度決まっているのではないでしょうか。
そのため、問診票への記載内容は、どの医療機関でもある程度固定されていると思います。

その問診内容をもとに、診療補助者が対面で、問診票を踏まえた個別の追加問診を行うような場面がありますよね。

最初に作ろうとしたシステムでは、ローカルLLMを使いたいという目的が先行して、
動的な問診項目が必要ない内容についても、無駄にLLMを使っていたのです。


🧑‍⚕️ 研修医だった時の自分の立場で考えてみると、、、

事前情報がない状態で、患者さんに問診するのは少しハードルが高かったような気がします。
何を聞いていいのやらわからない、的はずれな質問をしていたように思います。
alt text

問診化全体を見て、追加で不足する情報を問診をするほうがカンタンではないでしょうか?
(頭が痛い → どんな痛みですか?どんなときに痛みが強くなりますか?)

この役割こそが、真にLLMに求めるべき役割だったのだと思います。


⚙️ 最終的なシステム設計

  1. まず、基本の問診項目は固定質問として用意して、患者さんに入力してもらう。
  2. その答えをLLMがチェックして、「ここ、もうちょっと詳しく聞いた方がいいかも?」というところを一括で質問を作成してもらう。
    alt text
    結果的に、LLMに全部お任せするより、ずっと軽くてスムーズに動く問診システム「問診メイト」ができました。

問診メイト(MonshinMate)

現時点では、あくまでローカルLLMにこだわっているので、対応しているプロバイダは
OllamaLM Studioのみです。
dockerでカンタンにセットアップできます。


✨ 驚くほど小型なLLMで十分なクオリティを達成

当初は、gpt-oss 20bの使用を想定していましたが、
medgemma4Bsarashina2.2 3B といった小型LLMでも十分実用的な追加問診ができました。

MCY先生にシステムをレビューして頂いたときの問診データを、例としてお示しします。

先生、ありがとうございました!

固定問診の入力内容

項目 内容
どういった症状で受診されましたか? 歩いていたら突然頭の上でくるっと引っ張られる感じがする
症状があるのはどこですか?
いつからの症状ですか? 1ヶ月前から
これまで治療を受けたことがあれば? なし
今までにかかったことのある病気 高血圧, うつ病
手術歴 なし
現在服用している処方薬 高血圧の薬
現在使用しているサプリメント/市販薬 なし
薬剤アレルギー なし
食物・金属などのアレルギー なし
タバコ 吸わない
お酒 よく飲む

あえて、ちょっと変わった問診内容にしてみました笑

この問診内容をみて、sarashina 2.2 3Bは、こんな追加質問を出してきました。
(temperatureは0.2、量子化はQ4KM、推論はLM Studio on EVOX2で、推論時間は数秒程度)


  • 頭のくるっと引っ張られる感じは、どの方向に感じることが多いですか?(例えば、右側や後ろ側など)
  • その症状はどのくらいの頻度で起こりますか?毎日ですか、週に数回ですか、それとも月に数回でしょうか?
  • 症状の強さはどの程度ですか?日常生活に支障をきたすほどでしょうか?
  • 高血圧の薬を服用されていますが、最近血圧の測定値はいかがでしょうか?もし可能であれば、最新の測定値を教えてください。
  • うつ病の治療も行われていますが、最近の気分や精神状態について教えていただけますか?特に、頭の症状が出現した時期と関連があると感じるかどうかを知りたいです。

かなりよくないですか!?
もともとの主訴がかなりあいまいですが、うまく追加で質問ができているように思います。

わずか3Bの軽量なLLMです。
同程度の要求スペックで、医療情報を学習したmedgemma4Bも、よい問診を返してくるイメージです。

要求マシンスペックも低いため、多くのデバイスで実行できます。
小さいクリニックでも、単純な問診システムから一歩踏み込んだ、AIアシスト問診システムになったと思います。


💡 やってみてわかったこと

今回の一番の学びは、**「LLMに任せるべきタスクを選別することが大事」**ってことですね。

医療現場でローカルLLMを使うなら、何でも屋を期待するんじゃなくて、
「ここだけは任せた!」(特定の役割に絞る)って感じで役割を絞ってあげるのが大事なんだなーと実感しました。

最近流行っているエージェントでも同じですね。
何でもできるスーパーエージェントではなく、特定の機能に特化したサブエージェントを補助として使うのがトレンドのようです。

意図せず、おなじようなアイデアに行き着くことになりました。
まだまだ、臨床現場でのローカルLLMの可能性を探っていきたいと思います。


👋 おわりに

文中で使用したsarashina2.2 3bは、以下のGGUFを使用させて頂きました。
sarashina2.2 3B

ご意見・ご相談はこちらへ

X (旧Twitter) @medrecmate へお気軽にDMどうぞ 📨

Discussion