적극적 건강의 6가지 특성인 주도성, 예방, 정확성, 개인화, 공동 구축 및 공유, 자기 훈련을 기반으로 남중국 공과대학교 광동성 디지털 트윈 핵심 연구소 미래 기술 학교가 오픈 소스를 공개했습니다. 다음을 포함하는 중국 분야의 생활 공간의 활성 건강 시스템 모델 기반 ProactiveHealthGPT
생활공간 활성 건강 대형 모델 기반 ProactiveHealthGPT가 학계가 만성 질환, 심리 상담 등 활동 건강 분야에서 대형 모델의 연구 및 적용을 가속화하는 데 도움이 되기를 바랍니다. 이번 프로젝트는 생활공간 건강의 대형모델인 BianQue 입니다.
연구를 통해 우리는 건강 분야에서 사용자가 일반적으로 일련의 상호 작용에서 자신의 문제를 명확하게 설명하지 않으며 현재 일반적인 오픈 소스 의료 질문 및 답변 모델(예: ChatDoctor, HuaTuo(이전의 HuaTuo), DoctorGLM)을 발견했습니다. , MedicalGPT -zh)는 "사용자 설명이 불충분할 수 있는" 상황을 무시하면서 단일 사용자 설명 문제를 해결하는 데 중점을 둡니다. 현재 인기 있는 ChatGPT에도 비슷한 문제가 있습니다. 사용자가 ChatGPT가 텍스트 설명을 통해 질문 및 답변 형식을 채택하도록 강요하지 않으면 ChatGPT도 사용자의 설명을 선호하고 적절하다고 판단되는 제안과 솔루션을 신속하게 제공합니다. 그러나 의사와 사용자 간의 실제 대화에는 "의사가 사용자의 현재 설명을 기반으로 여러 차례 질문을 수행하는" 경우가 많습니다. 그리고 의사는 사용자가 제공한 정보를 바탕으로 최종적으로 아래 그림과 같이 종합적인 제안을 합니다. 의사의 지속적인 질문 과정을 질문 체인(CoQ, Chain of Questioning) 으로 정의합니다. 모델이 질문 체인 단계에 있을 때 다음 질문은 일반적으로 대화 컨텍스트 기록에 따라 결정됩니다.
현재 오픈 소스 중국 의학 질문 및 답변 데이터 세트(MedDialog-CN, IMCS-V2, CHIP-MDCFNPC, MedDG, cMedQA2, Chinese-medical-dialogue-data)를 결합하여 단일 라운드/다라운드 특성을 분석하고 의사문의 특성을 연구실에서 자체 구축한 장기 생활공간 건강대화 빅데이터와 결합하여 수천만 규모의 비앙크 건강 빅데이터를 구축하였습니다. 대화 데이터는 아래 그림과 같이 "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에 해당하는 경로에 파일을 복사합니다. 참조: win11-cuda11에서 conda를 사용하여 pytorch 설치 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 증류 지침 등의 데이터를 확장하여 모델의 제안 및 지식 쿼리 기능을 강화했습니다. 아래에는 두 가지 테스트 샘플이 있습니다.
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 (비앙퀘-1.0) , 훈련에 사용되는 중국 의학 질문 및 답변 지침과 다단계 문의 대화의 혼합 데이터 세트에는 900만 개가 넘는 샘플이 포함되어 있으며, 한 에포크의 훈련을 완료하는 데 약 16일이 걸렸습니다. Bian Que 모델의 "보고, 듣고, 묻고, 느끼는" 기능을 의학 전문 지식, 다중 모드 기술 및 다중 생리학적 신호 계산과 결합하여 여러 버전의 모델 반복 연구를 수행할 계획입니다. BianQue 모델은 여러분의 기여를 환영합니다! BianQue GitHub 페이지에서 문제를 보고하고, PR을 제공하고, 토론에 참여하시기 바랍니다. 우리는 차세대 Bianque 모델 연구를 공동으로 수행하기 위해 더 많은 대학, 병원, 연구소, 기업 등과 협력할 수 있기를 기대합니다. 그러한 요청(및 GitHub에서 작성하기에 적합하지 않은 기타 요청)의 경우 [email protected]으로 직접 이메일을 보내주십시오.
'보고, 냄새 맡고, 묻고, 느끼는' 네 가지 진단 방법은 Bian Que가 발명했습니다. 4대 진단법(검사, 냄새, 질문, 촉진)은 한의학의 기본 진단 방법입니다. 그 중 "질문"하는 능력은 언어 모델로 모델링될 수 있습니다. 우리는 AI 모델의 "요청" 능력을 다음과 같이 정의합니다.
'질문' 능력 : AI 모델은 환자가 입력한 정보와 의학적 지식을 결합해 적절한 질의를 할 수 있고, 추가 질의를 통해 얻은 환자의 정보를 바탕으로 '적절한 진단이나 조언'을 할 수 있다. "질문" 과정은 일반적으로 여러 단계의 대화 과정입니다.
다음은 2가지 간단한 예입니다.
실시예 1
User: 요즘 완전히 지쳤어요. Bian Que-1.0: 피곤해서 그런 건가요, 아니면 늦게까지 자서 그런 걸까요?
사용자: 이번 주에는 논문을 작성하기 위해 늦게까지 자고 있었습니다. Bian Que-1.0: 글쎄, 늦게까지 자면 현기증, 피로, 불면증, 몽환 등 다양한 불편함을 쉽게 느낄 수 있습니다. 깨어나지 않으려면 오리자놀, 비타민 B1, 안셴부나오액(Anshen Bu Nao Liquid)을 복용할 수 있습니다.
실시예 2
사용자: 요즘 불면증에 많이 시달리고 있어요. Bianque-1.0: 불면증을 앓은 지 얼마나 됐나요?
사용자: 2주가 지났습니다. Bianque-1.0: 잠은 잘 잤나요?
User: 몇 시간 정도 자야 잠이 들 수 있나요? 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 epoch 동안만 훈련되었습니다. 모델에는 특정 의료 조사 기능이 있지만 여전히 다음과 같은 제한 사항이 있습니다.
**BianQue-2.0(BianQue-2.0)**은 ChatGLM-6B 모델의 가중치를 사용하며 해당 MODEL_LICENSE를 따라야 합니다. 따라서 이 프로젝트는 비상업적 연구 목적으로만 사용할 수 있습니다 .
이 프로젝트는 화남이공대학교 미래기술대학 광동성 핵심 연구소에서 시작되었으며, 화남이공대학교 정보 네트워크 공학 연구 센터, 전자정보대학 및 기타 부서의 지원을 받습니다. 또한 광둥 모자 보건 병원, 광저우 시 정부 여성 및 아동 의료 센터, 쑨원 대학교 제3 부속 병원, 허페이 국립 과학 센터 인공 지능 연구소 및 기타 협력 기관에도 감사드립니다.
동시에, 이 프로젝트를 보도해주신 다음 언론 또는 공개 계정에 감사의 말씀을 전하고 싶습니다(특정 순서 없음).
언론 보도 People's Daily, China.com, Guangming.com, TOM Technology, Future.com, Dazhong.com, 중국 발전 보고 네트워크, China Daily Network, Xinhua News Network, China.com, Toutiao, Sohu, Tencent News, NetEase News , 중국 정보 네트워크 , 중국 통신 네트워크, 중국 도시 보고 네트워크, 중국 도시 네트워크
공공계정 광동연구소 구축, 지능형 음성신청소년, 딥러닝 및 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 }
}