アクティブな健康の 6 つの特徴(自発性、予防、正確性、個人化、共同構築と共有、自己規律)に基づいて、華南理工大学未来技術学部は、デジタル ツインのオープンソース化を実現しました。中国分野における生活空間のアクティブヘルスシステムのモデルベース ProactiveHealthGPT には以下が含まれます。
私たちは、居住空間アクティブ ヘルス大規模モデル ベース ProactiveHealthGPT が、学術コミュニティが慢性疾患や心理カウンセリングなどのアクティブ ヘルス分野における大規模モデルの研究と応用を加速するのに役立つことを願っています。このプロジェクトは、生活空間の健康に関する大規模なモデルである BianQueです。
調査を通じて、健康分野では通常、ユーザーは一連のやり取りで自分の問題を明確に説明しないことがわかりました。現在一般的なオープンソースの医療質疑応答モデル (ChatDoctor、HuaTuo (旧名 HuaTuo)、DoctorGLM など) , MedicalGPT -zh) は、「ユーザーの説明が不十分である可能性がある」という状況を無視しながら、ユーザーの説明の 1 ラウンドの問題を解決することに焦点を当てています。現在普及している ChatGPT にも同様の問題があります。ユーザーが ChatGPT にテキスト記述による質疑応答形式の採用を強制しない場合、ChatGPT もユーザーの記述を優先し、適切と思われる提案や解決策を迅速に提供します。しかし、医師とユーザーとの実際の会話では、「ユーザーの現在の説明に基づいて医師が複数回の質問を行う」ことがよくあります。そして最終的に医師は、ユーザーから提供された情報をもとに、下図のように総合的な提案を行います。医師の継続的な質問のプロセスを質問の連鎖 (CoQ、質問の連鎖)として定義します。モデルが質問の連鎖段階にある場合、次の質問は通常、会話のコンテキスト履歴によって決定されます。
現在のオープンソースの中国医学質問と回答データセット (MedDialog-CN、IMCS-V2、CHIP-MDCFNPC、MedDG、cMedQA2、 Chinese-medical-dialogue-data) を組み合わせて、シングルラウンド/マルチラウンドの特徴を分析し、医師の問診特性と、研究室が長期にわたって構築した居住空間健康会話ビッグデータを組み合わせて、数千万規模のビアンケ健康ビッグデータBianQueCorpusを構築しました。会話データは、下図のように「Patient:xxxnDoctor:xxxnPatient:xxxnDoctor:」という指示形式に統一されています。
input: "病人:六岁宝宝拉大便都是一个礼拜或者10天才一次正常吗,要去医院检查什么项目n医生:您好n病人:六岁宝宝拉大便都是一个礼拜或者10天才一次正常吗,要去医院检查什么项目n医生:宝宝之前大便什么样呢?多久一次呢n病人:一般都是一个礼拜,最近这几个月都是10多天n医生:大便干吗?n病人:每次10多天拉的很多n医生:"
target: "成形还是不成形呢?孩子吃饭怎么样呢?"
学習データには直接的なアドバイスではなく、医師の問診内容である対象テキストが大量に含まれており、AIモデルの問診能力の向上に役立ちます。
cd ~
git clone https://github.com/scutcyr/BianQue.git
cd BianQue
conda env create -n proactivehealthgpt_py38 --file proactivehealthgpt_py38.yml
conda activate proactivehealthgpt_py38
pip install cpm_kernels
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
cd BianQue
conda create -n proactivehealthgpt_py38 python=3.8
conda activate proactivehealthgpt_py38
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
pip install -r requirements.txt
pip install rouge_chinese nltk jieba datasets
# 以下安装为了运行demo
pip install streamlit
pip install streamlit_chat
[補足] Windows での CUDA-11.6 の設定: CUDA-11.6 をダウンロードしてインストールし、cudnn-8.4.0 をダウンロードし、ファイルを解凍して CUDA-11.6 に対応するパスにコピーします。参照: Using conda to install pytorch under win11-cuda11 6-一般的な設置のアイデア
Python で BianQue-2.0 モデルを呼び出します。
import torch
from transformers import AutoModel , AutoTokenizer
# GPU设置
device = torch . device ( "cuda" if torch . cuda . is_available () else "cpu" )
# 加载模型与tokenizer
model_name_or_path = 'scutcyr/BianQue-2'
model = AutoModel . from_pretrained ( model_name_or_path , trust_remote_code = True ). half ()
model . to ( device )
tokenizer = AutoTokenizer . from_pretrained ( model_name_or_path , trust_remote_code = True )
# 单轮对话调用模型的chat函数
user_input = "我的宝宝发烧了,怎么办?"
input_text = "病人:" + user_input + " n医生:"
response , history = model . chat ( tokenizer , query = input_text , history = None , max_length = 2048 , num_beams = 1 , do_sample = True , top_p = 0.75 , temperature = 0.95 , logits_processor = None )
# 多轮对话调用模型的chat函数
# 注意:本项目使用"n病人:"和"n医生:"划分不同轮次的对话历史
# 注意:user_history比bot_history的长度多1
user_history = [ '你好' , '我最近失眠了' ]
bot_history = [ '我是利用人工智能技术,结合大数据训练得到的智能医疗问答模型扁鹊,你可以向我提问。' ]
# 拼接对话历史
context = " n " . join ([ f"病人: { user_history [ i ] } n医生: { bot_history [ i ] } " for i in range ( len ( bot_history ))])
input_text = context + " n病人:" + user_history [ - 1 ] + " n医生:"
response , history = model . chat ( tokenizer , query = input_text , history = None , max_length = 2048 , num_beams = 1 , do_sample = True , top_p = 0.75 , temperature = 0.95 , logits_processor = None )
このプロジェクトでは、BianQue-2.0 モデルの使用例として bianque_v2_app.py を提供します。次のコマンドでサービスを開始し、http://<your_ip>:9005 でアクセスできます。
streamlit run bianque_v2_app.py --server.port 9005
特に、bianque_v2_app.py では、次のコードを変更して、指定されたグラフィックス カードを置き換えることができます。
os . environ [ 'CUDA_VISIBLE_DEVICES' ] = '1'
Windows の単一グラフィックス カード ユーザーの場合は、 os.environ['CUDA_VISIBLE_DEVICES'] = '0'
に変更する必要があります。そうしないと、エラーが報告されます。
次のコードを変更することで、モデル パスがローカル パスになるように指定できます。
model_name_or_path = "scutcyr/BianQue-2"
また、BianQue-1.0 モデルの使用例として bianque_v1_app.py 、BianQue-1.0 モデルと BianQue-2.0 モデルの併用例として bianque_v1_v2_app.py も提供しています。
BianQue Health ビッグデータ BianQueCorpus に基づいて、初期化モデルとして ChatGLM-6B を選択し、すべてのパラメーターの微調整トレーニング後に新世代の BianQue [BianQue-2.0] を取得しました。 Bianque-1.0 モデルとは異なり、Bianque-2.0 では薬剤の指示指示、医学百科事典の知識指示、ChatGPT 蒸留指示などのデータが拡張され、モデルの提案機能と知識クエリ機能が強化されています。以下に 2 つのテストサンプルを示します。
Bianque-2.0 と Bianque-1.0 を共同で使用してアクティブなヘルス サービスを構築するには、次のコマンドを使用します。
streamlit run bianque_v1_v2_app.py --server.port 9005
以下は応用例です。最初の数ラウンドは Bianque-1.0 モデルによる問い合わせのプロセスであり、最後の応答は Bianque-2.0 モデルによる回答です。
BianQue-1.0 (BianQue-1.0)は、指示と複数回の問い合わせダイアログを通じて微調整される大規模な医療対話モデルです。調査の結果、医療分野では、医師は決定を下す前に複数回の問い合わせを行う必要があることがわかりました。これは単純な「指示と回答」のモデルではありません。ユーザーが医師に相談するとき、最初は完全な状況を医師に伝えないことが多いため、医師は最終的に診断を下し、適切な提案を行うまでに質問を続ける必要があります。これに基づいて、医師の尋問プロセスをシミュレートするAIシステムの尋問機能を強化することを目的として、 BianQue-1.0(BianQue-1.0)を構築しました。私たちはこの能力を「見る、聞く、問う、知る」の「問う」部分と定義します。現在の中国語モデル アーキテクチャ、パラメーターの数、必要な計算能力を考慮して、ClueAI/ChatYuan-large-v2 をベースライン モデルとして使用し、8 枚の NVIDIA RTX 4090 グラフィックス カードで 1 エポックを微調整して、Bianque- 1.0 (BianQue-1.0) 、トレーニングに使用された中国の医療の質問と回答の指示と複数ラウンドの問い合わせダイアログの混合データ セットには900 万を超えるサンプルが含まれており、トレーニングの 1 エポックを完了するのに約 16 日かかりました。私たちは、Bian Que モデルの「見る、聞く、尋ねる、感じる」機能に基づいて、医療専門家の知識、マルチモーダル技術、および複数の生理学的信号計算を組み合わせた、複数のバージョンのモデル反復研究を実施する予定です。 BianQue モデルはあなたの貢献を歓迎します! BianQue GitHub ページで問題を報告し、PR を投稿し、ディスカッションに参加することをお勧めします。今後もより多くの大学、病院、研究所、企業等と連携し、次世代Bianqueモデルの研究を共同で実施していきたいと考えております。そのようなリクエスト (および GitHub 上で行うのが適切でないその他のリクエスト) については、[email protected] に直接電子メールを送信してください。
「見る、嗅ぐ、尋ねる、感じる」の4つの診断方法はビアン・クエによって発明されました。 「四診」(望診、嗅覚、問診、切診)は中医学における診断の基本的な方法です。その中で、「尋ねる」能力は言語モデルにモデル化できます。 AI モデルの「質問」能力を次のように定義します。
「問う」能力:AIモデルは、患者が入力した情報をもとに医学的知識と組み合わせて適切な問診を行い、さらに問診によって得られた患者の情報をもとに「適切な診断やアドバイス」を行うことができます。 「質問」のプロセスは通常、複数ラウンドの対話プロセスです。
以下に 2 つの簡単な例を示します。
例1
ユーザー: 最近完全に疲れています。Bian Que-1.0: 疲れのせいですか、それとも夜更かしのせいですか?
ユーザー: 今週は論文の執筆に追いつくために夜更かししています。夜更かしすると、めまい、疲労、不眠症、夢見心地などのさまざまな不快感が起こりやすくなります。もっと休んでください。オリザノール、ビタミンB1、アンシェンブナオリキッドを摂取すると、夜更かしを避けることができます。
例 2
ユーザー: 最近不眠症に悩まされています。Bianque-1.0: いつから不眠症に悩まされていますか?
ユーザー: 2 週間経ちました Bianque-1.0: 睡眠はどうですか?
ユーザー: 何時間寝たら眠れますか? Bian Que-1.0: いくつかの薬を経口摂取できます。 Bian Que-1.0: まず確認する必要があります。 : どのような検査が必要ですか?
Bian Que-1.0: 心電図
import os
from transformers import T5Tokenizer , T5ForConditionalGeneration , AutoTokenizer
import torch
device = torch . device ( "cuda" if torch . cuda . is_available () else "cpu" )
tokenizer = T5Tokenizer . from_pretrained ( "scutcyr/BianQue-1.0" )
model = T5ForConditionalGeneration . from_pretrained ( "scutcyr/BianQue-1.0" )
model = model . to ( device )
def preprocess ( text ):
text = text . replace ( " n " , " \ n" ). replace ( " t " , " \ t" )
return text
def postprocess ( text ):
return text . replace ( " \ n" , " n " ). replace ( " \ t" , " t " )
def answer ( user_history , bot_history , sample = True , top_p = 1 , temperature = 0.7 ):
'''sample:是否抽样。生成任务,可以设置为True;
top_p:0-1之间,生成的内容越多样
max_new_tokens=512 lost...'''
if len ( bot_history ) > 0 :
context = " n " . join ([ f"病人: { user_history [ i ] } n医生: { bot_history [ i ] } " for i in range ( len ( bot_history ))])
input_text = context + " n病人:" + user_history [ - 1 ] + " n医生:"
else :
input_text = "病人:" + user_history [ - 1 ] + " n医生:"
return "我是利用人工智能技术,结合大数据训练得到的智能医疗问答模型扁鹊,你可以向我提问。"
input_text = preprocess ( input_text )
print ( input_text )
encoding = tokenizer ( text = input_text , truncation = True , padding = True , max_length = 768 , return_tensors = "pt" ). to ( device )
if not sample :
out = model . generate ( ** encoding , return_dict_in_generate = True , output_scores = False , max_new_tokens = 512 , num_beams = 1 , length_penalty = 0.6 )
else :
out = model . generate ( ** encoding , return_dict_in_generate = True , output_scores = False , max_new_tokens = 512 , do_sample = True , top_p = top_p , temperature = temperature , no_repeat_ngram_size = 3 )
out_text = tokenizer . batch_decode ( out [ "sequences" ], skip_special_tokens = True )
print ( '医生: ' + postprocess ( out_text [ 0 ]))
return postprocess ( out_text [ 0 ])
answer_text = answer ( user_history = [ "你好!" ,
"我最近经常失眠" ,
"两周了" ,
"上床几小时才睡得着" ],
bot_history = [ "我是利用人工智能技术,结合大数据训练得到的智能医疗问答模型扁鹊,你可以向我提问。" ,
"失眠多久了?" ,
"睡眠怎么样?" ])
conda env create -n bianque_py38 --file py38_conda_env.yml
conda activate bianque_py38
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
cd scripts
bash run_train_model_bianque.sh
BianQue-1.0 (BianQue-1.0) は1 エポックのみトレーニングされていますが、このモデルには特定の医療照会機能がありますが、次の制限があります。
**BianQue-2.0(BianQue-2.0)** は ChatGLM-6B モデルの重みを使用しており、その MODEL_LICENSE に従う必要があるため、このプロジェクトは非営利の研究目的でのみ使用できます。
このプロジェクトは、華南理工大学未来技術学院の広東省デジタルツイン重点研究室によって開始され、電子情報学院情報ネットワーク工学研究センターおよび華南理工大学の他の学部の支援を受けています。また、広州市政府広東省母子保健病院、女性児童医療センター、中山大学第三附属病院、合肥国立総合科学センター人工知能研究所にも感謝します。
同時に、このプロジェクトについて報道していただいた以下のメディアまたは公開アカウントに感謝いたします(順不同)。
報道機関 人民日報、China.com、Guangming.com、TOM Technology、Future.com、Dazhong.com、China Development Report Network、China Daily Network、Xinhua News Network、China.com、Toutiao、Sohu、Tencent News、NetEase News 、中国情報ネットワーク、中国通信ネットワーク、中国都市報告ネットワーク、中国都市ネットワーク
パブリックアカウント 広東省研究所建設、Intelligent Voice New Youth、ディープラーニングと NLP、AINLP
@misc { chen2023bianque ,
title = { BianQue: Balancing the Questioning and Suggestion Ability of Health LLMs with Multi-turn Health Conversations Polished by ChatGPT } ,
author = { Yirong Chen and Zhenyu Wang and Xiaofen Xing and huimin zheng and Zhipei Xu and Kai Fang and Junhong Wang and Sihang Li and Jieling Wu and Qi Liu and Xiangmin Xu } ,
year = { 2023 } ,
eprint = { 2310.15896 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.CL }
}