chatGPTのAPIを使って疾患のお悩み相談を受けてくれるボットを開発

2023/04/06に公開

先日、製薬会社様主催のこちらのイベントに参加してきました。
https://hemophilia-hackathon-2023.peatix.com/

血友病の患者さんの助けになるような製品・サービスを考案するというハッカソンでした。

血友病は遺伝性の疾患なので、彼氏・彼女ができたり、子供を作る際に悩む方がいます。
医学的な疑問や解決方法はインターネット上に回答があるのですが、「正解がない生活にまつわるお悩み」についてはまとまった情報がありませんでした。

そこで、このハッカソンにご登壇いただいている医師の知見を入れた、FAQを作成し、chatGPTのAPIを噛ませた「血友病お悩み相談ボット」を提案しました。

Step1:まずはFAQデータベースを作成

先生にアドバイを頂きながら、質問文と回答を作っていきました。
chatGPTが回答する元になるデータがこれなので、結局ここのデータの質がめちゃくちゃ大事になります。

質問 回答
いつ恋人に伝えればいいか迷っています。 そのようなお悩みをお持ちの方は1人ではないですよ。周りの経験談ですと、3ヶ月〜3年で勇気を持ってお話しする方がいらっしゃいました。3ヶ月くらいで、この人と結婚する可能性があるかも、と思い始める方が多いようです。3年くらい経ってからパートナーにお伝えする方もいらっしゃいます。パートナーには結婚した場合はお子さんが血友病になる可能性を伝える方もいらっしゃいます。場合によりけりですが、伝えてみたら「そうなんだ」と素直に受け入れてくれるパートナーもいらっしゃると伺っています。もし、それで受け入れてくれない人だったら、一生を添い遂げるのにふさわしくない人だと思います。
幼稚園、小学校にはどのように伝えればいいですか? 昔は幼稚園・学校への説明することをためらっていた方もいらっしゃったようですが、今はそんなことはありません。伝え方については皆さん工夫してご説明されています。血友病の専門医や製薬企業が幼稚園・学校への説明を想定した資料を作成していますのでご活用ください。どうしても説明が難しい場合は、病院に電話してもらい医療者から説明してもらうことで解決することもあるので、主治医に相談するとよいです。一人で悩まずに是非医療機関にご相談してみてください。お子さんが手元から離れるのは非常に不安だと思いますが、しっかり相談することで味方を増やして、お子さんを守りましょう。
子供の公園遊びや外出は控えたほうがいいでしょうか? 公園遊びや外出を控える必要はありませんよ。乳幼児期の適度な運動は、骨や筋肉の発育に重要です。また、転びにくく怪我や関節内出血をしにくい身体をつくるためにも身体を動かす習慣が必要です。しっかりと見守りつつ、楽しく外遊びができるように導いてあげてください。足を引きずったり、足を触ろうとすると払い除けるようなことがあれば、出血のサインかもしれません。そのような時は、ご自分で注射などの対処をするか、主治医の先生に相談しましょう。
子供の血友病をママ友にどうやって伝えればいいですか? 伝え方には様々な伝え方があります。病名が一人歩きしても困るので、症状から伝えるのはいかがでしょうか。お子さんと関わるすべての人に血友病について詳しく説明する必要はありませんよ。具体的に言えば、アザができやすい、捻挫しやすい、などの症状からお伝えするのはいかがでしょう。血が止まりにくい体質だから、それに対する治療をしています。という説明で十分な場合も多いです。相手との関係が深くなったらより詳しい説明をすればよいので、必要最低限のことから伝えてはどうでしょう。病気を理解してくれる人が近くにいると心強いので、信頼できる方を作れるととても良いと思います。
予防接種は受けるべきでしょうか? そのときに、気をつけることはありますか? 血友病を理由に予防接種を避ける必要はありません。お子さんを感染症から守るため、予防接種は決められたスケジュールどおりに受けるようにしましょう。お子さんによっては打ったところが皮下に出血することもあるので、予防的に製剤を使うことも考えられます。それについては主治医にご相談してください。
子供の公園遊びや外出は控えたほうがいいでしょうか? 公園遊びや外出を控える必要はありませんよ。乳幼児期の適度な運動は、骨や筋肉の発育に重要です。また、転びにくく怪我や関節内出血をしにくい身体をつくるためにも身体を動かす習慣が必要です。しっかりと見守りつつ、楽しく外遊びができるように導いてあげてください。足を引きずったり、足を触ろうとすると払い除けるようなことがあれば、出血のサインかもしれません。そのような時は、ご自分で注射などの対処をするか、主治医の先生に相談しましょう。

Step2:質問・回答をどのように返すか構成の作成

構成はシンプルで質問文をopen aiのAPIのtext-embedding-ada-002を使って質問文を数値ベクトル化してDataFrameで返すPythonプログラムを構築しました。

text-embedding-ada-002を使えば簡単にembeddingができます。

embeddingとは、従来の自然言語解析にもよく使われたもので、単語や文章等をベクトル表現に変換する操作のことを指しています。

サンプルコードはこんな感じでmodelで読み込んで、createというメソッドを使ってあげれば簡単に質問文をベクトル化することができます。

def get_embedding(text, model="text-embedding-ada-002"):
   text = text.replace("\n", " ")
   return openai.Embedding.create(input = [text], model=model)['data'][0]['embedding']

df['ada_embedding'] = df.combined.apply(lambda x: get_embedding(x, model='text-embedding-ada-002'))
df.to_csv('output/embedded_1k_reviews.csv', index=False)

open aiのドキュメントに詳しく載っています。
https://platform.openai.com/docs/guides/embeddings/use-cases

Step3:streamlitで簡単ウェブアプリ開発

Streamlitとは、PythonでWebアプリケーションを作成するためのフレームワークです。バックエンド開発の知識がなくてもPythonのコードを数行書くだけで、気軽にデモ用のアプリを作成することができます。

そこで質問者が質問をインプットすることができる機能を作成しました。

Step4:質問者がした質問と事前に作成したFAQデータベースの質問文の類似度を計算

質問者がした質問をtext-embedding-ada-002を使ってembeddingした後、
事前に作成したFQAデータベースの質問文(既にembedding済み)との類似度をこサイン類似度を使って、最も類似度が高いものを取ってくる処理を作成します。

コサイン類似度は以下のコードで計算することができます。この計算コストが少し高いのが考えもの。。

import numpy as np

def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

Step5:プロンプトを生成してchatGPTのAPIへリクエスト

あとは、ユーザーが作成した質問文とFAQデータベースに入っている類似度の最も高い質問の回答を使って、プロンプト(prompt)を生成し、chatGPTのAPIにリクエストすることで、ユーザーに届ける回答を作成しました。

chatGPTのAPIにリクエストするコードは以下のようなコードを作成しました。

import openai

res = openai.ChatCompletion.create(
            model='gpt-3.5-turbo',
            messages=[{'role': 'user', 'content': prompt}],
            temperature=temperature,
            max_tokens=max_tokens
        )
answer = res['choices'][0]['message']['content']

サンプルはこちらのドキュメントに詳細を載せています。
https://platform.openai.com/docs/guides/chat/introduction

以上のような構成で、「血友病お悩み相談ボット」を作成しました。

今までのルールベースのchatbotから「箇条書きにして」「簡潔に教えて」「Stepでまとめて教えて」など回答文を質問者の意図通りに書き換えることができることが、chatGPTのAPIを活用した非常に有用な点になるかと思います。

技術でお困りのことがある方はオンライン相談が可能です。
こちらから会社概要資料をDLできます!
お問い合わせ内容に「オンライン相談希望」とご記載ください。
https://share.hsforms.com/19XNce4U5TZuPebGH_BB9Igegfgt

株式会社piponでは定期的に技術勉強会を開催しています。
ChatGPT・AI・データサイエンスについてご興味がある方は是非、ご参加ください。
https://chatgptllm.connpass.com/

株式会社piponではChatGPT・AI・データサイエンスについて業界ごとの事例を紹介しています。ご興味ある方はこちらのオウンドメディアをご覧ください。
https://bigdata-tools.com/

Discussion