はじめに
「Qiita × Fast DOCTOR Health Tech Hackathon」にチーム「ドクターエンジニア」として参加させていただきました。
背景
医療現場で患者に適切な対応をとるためには診断のための多くの情報が必要になります。そのため、初期対応にあたるオペレーターが時間をかけて聞き取りをすることもありますが、オペレーターは医師のように十分な医学知識がなく、診断に必要な情報が漏れることがしばしば起こります。
本来は豊富な医学知識を持つ医師が初期対応に当たることが理想ですが、人的資源は限られるため、現実的ではありません。
今回私たちのチームでは、ChatGPTのモデルのうち、医師国家試験に合格できると言われているGPT-4を用いることにより、システムが聞き取り業務のヘルプとして使えるのではないか、そして使えるとしたらどの程度患者の症状を判断できるか検証してみようという発想のもと、ハッカソンで上記のシステムを作成してみました。
実際の結果
作成したシステムでやり取りした実際のサンプルです。
「AI」がchatGPTのレスポンス、「User」がこちらで入力しているものとなります。
最後のFunctionはFuncation Callingという機能を使ったもので、後ほど解説します。
AI: こんにちは!私は健康相談AIカウンセラーです。健康相談を始めるにあたり、年齢と性別を教えてください。
User: 38歳男です
AI: ありがとうございます。それでは、いつ頃からどんな症状がありますか?
User: 昨日からお腹が痛い
AI: お腹が痛いとのこと、大変ですね。痛みの場所や痛みの種類(鈍痛、鋭痛など)、痛みが強くなるタイミングなど、詳しく教えていただけますか?
User: 鋭い痛みが時々あります
AI: その痛みはお腹のどの部分に感じますか?また、何か特定の行動をすると痛みが強くなることはありますか?
User: お腹の右上が食後に痛いです
AI: 食後に右上腹部が痛むとのこと、理解しました。その他にも吐き気や発熱など、何か他の症状はありますか?
User: 吐き気が強いです
AI: 吐き気が強いとのこと、辛いですね。これまでのお話から、胆石症や胆嚢炎などが考えられます。ただし、正確な診断は医師が行います。既往歴や薬歴についてもう少し詳しくお聞きしてもよろしいですか?
User: はい
AI: ありがとうございます。それでは、これまでに何か病気を患ったことはありますか?また、現在何か薬を服用していますか?
User: どちらもないです
AI: 了解しました。アレルギーは何かありますか?また、痛みが始まった時からの経過を詳しく教えていただけますか?
User: 花粉症があります。昨日からお腹が痛いです
AI: 花粉症があること、昨日からお腹が痛いこと、了解しました。以下にまとめます。
疑われる病名:胆石症、胆嚢炎
既往歴:なし
薬歴:なし
アレルギー:花粉症
症状経過:昨日から右上腹部痛、食後に痛みが強くなる、吐き気が強い
これらの情報を医療機関に伝えてください。消化器内科を受診することをお勧めします。当社の往診サービスなら当日中に診てもらえますが、ご希望されますか?
User: はい
Function: {
'name': 'order_home_medical_service',
'content': '{
"messages": "Success 往診の医師の派遣を予約しました",
"clinical_department": "消化器内科",
"datetime": "7/10 20時",
"symptom": "右上腹部痛、食後に痛みが強くなる、吐き気が強い",
"suspected_disease": "胆石症、胆嚢炎"
}'
}
AI: 往診の予約が完了しました。消化器内科の医師が今日の20時にお伺いします。それまでの間、無理をせずお待ちください。何か変化があったらすぐにお知らせください。
概要
- まずはじめに患者の症状の聞き取りを行います
- それが終わった段階で聞き取り内容をまとめて、こちらで設定した軽症状、中症状、重症状の3段階のケースを判断します
- それぞれの症状毎に設定した処理を実行します(今回のサンプルでは中症状だったので医師の往診サービスにつなげています)
Funcation Callingとは
APIを叩く時に下記のfunctions(プログラミングの機能)の情報をJSONで送ることによって、chatGPT側で適切なfunctionを実行するタイミングになった時にfunctionの名前とそれを実行するために必要な情報(引数)を返してくれます。
今回の場合最終的に呼び出す関数を、「軽症状」「中症状」「重症状」と3つにわけ、
軽症状の場合、健康アドバイスをする、
中症状の場合、往診サービスにつなげる、
重症状の場合、救急車を呼ぶ、
という想定で作成しました。
[
{
"name": "health_advice",
"description": "現時点では受診が不要なケース",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
},
{
"name": "order_home_medical_service",
"description": "緊急ではないが受診が必要なケースにおいて、往診サービスと連携する",
"parameters": {
"type": "object",
"properties": {
"clinical_department": {
"type": "string",
"description": "診療科目"
},
"symptom": {
"type": "string",
"description": "症状"
},
"suspected_disease": {
"type": "string",
"description": "疑われる病名"
}
},
"required": ["clinical_department", "symptom", "suspected_disease"]
}
},
{
"name": "call_ambulance",
"description": "緊急の救急外来受診が必要になったケース",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
}
]
参考URL
システムについて
-
openaiのgpt-4のAPIを使用しています
-
openaiのAPIを叩く際に最初に{ role: system }にさまざまなステップを指定したプロンプトを入れています。こちらは医師の方に作成していただきました。こちらのプロンプトで前半の聞き取り部分の正確さに繋がっています
-
最後の部分でfunction callingという機能を使うことで、出口を用意する+シームレスに他の処理(例えば往診サービスを利用するなど)に繋げることが可能になっています
まとめ
同じチームの医師の方からは、上記の例のやり取りから最終的な判断(疑われる病名など)まで、違和感なく驚異的だというフィードバックをいただきました。また今回のサンプルでは中症状のみなのですが、症状が軽い時は軽症状のfuncation、重い時は重症状のfunctionを呼び出すことも確認しています。
chatGPTを含む大規模言語モデルの可能性について検証できたと思います。
一方で大規模言語モデルが確率で結果を返している以上、同じプロンプトでも常に同じ結果を返すわけではなく、変な日本語だったり間違った回答をする確率も存在します。今回のハッカソン内のテストでも、返答がおかしかったり、funcation callingを呼び出すタイミングがおかしかったりということは何度かありました。
大規模言語モデルは技術としては素晴らしいものの、実際のサービスとして運用するためにはまだいくつか乗り越えなければいけない課題があるように感じました。
大規模言語モデルの可能性、そして実運用に向けての課題を確認できたことは、今回のハッカソンでの大きな収穫でした。
今回の機会を提供してくれた運営の方々、そしていろいろ議論してくれた参加者の皆様に感謝しております。