2022年8月

一、相关竞品产品调研

1.左手医生
https://open.zuoshouyisheng.com/--优先
2.百度灵医
https://01.baidu.com/index.html (线上无法体验)
3.科大迅飞-全科辅诊诊疗系统
http://www.iflytek.com/health/qkfzzl (线上无法体验)
4.阿里健康
https://www.doctoryou.ai/dm
5.腾讯
https://tencentmiying.com/official/

二、相关文章

1.https://zhuanlan.zhihu.com/p/379202949
2.https://zhuanlan.zhihu.com/p/59401605

三、开源项目

1.基于知识图谱和向量检索的医疗诊断问答系统
https://github.com/wangle1218/KBQA-for-Diagnosis
2.知识图谱问答
https://github.com/wangle1218/QASystemOnMedicalKG
3.医疗知识图谱问答
https://github.com/LuoFanA595/Medical-Robot-AI

四、baseline选型

1.baseline参考源码:https://github.com/LuoFanA595/Medical-Robot-AI
2.使用框架:rasa、官方网站:http://wwww.rasa.com
3.技术架构选型:为多种问答系统的综合应用,包括:问答型、任务型、闲聊型,其中问答型包括:FAQ、KBQA(知识图谱)
4.技术流程图:后期预期加入asr、tts模块
技术架构.png

五、对话系统环境配置

1.baseline环境配置:知识图谱部分

(1)如果是windows下直接参考git相关配置
(2)一般都是linux下配置,部分内容需要修改

#1.配置环境:创建所需环境:
conda create -n 环境名 python=3.7
#激活环境:
conda activate 环境名
#2.项目所需安装包已打包在requirements.txt中Terminal终端命令执行:
pip install -r requirements.txt 即可安装

(3)知识图谱数据库neo4j下载、安装、运行:
1)下载:
从官网:https://neo4j.com/download-center/#community 下载3.5.35版本(linux)。
2)解压:下载完成后通过命令:
tar -zxvf neo4j-community-3.5.35-unix.tar 解压
3)启动:neo4j命令:
./bin/neo4j start
4)web访问:在浏览器中输入,默认端口7474
http://localhost:7474/browser/
显示如图则启动成功:
20210227101959817.png
5)结构化疾病数据入库:
python build_medicalgraph.py
注意修改代码中数据库账户和秘密,最终可视化效果:
graph_summary.png

2.闲聊部分---这部分是基于理解自己添加的。

(1)环境安装

pip install paddlepaddle
pip install paddlenlp
pip install paddle

(2)使用模型
plato-mini

六、代码运行与服务启动

1.rasa后台服务启动(启动有先后顺序)
#(1)运行rasa cors,作用对话状态跟踪,对话管理部分:
 nohup python3 -m rasa run -vv --cors "*" --port 5005 --endpoints endpoints.yml --credentials 
 credentials.yml --debug >log1.log 2>&1 &

#(2)运行 rasa action,行为管理:
nohup python3 -m rasa run actions --port 5055 --actions actions --debug >log2.log 2>&1 &

#(3)用端口将文件映射到本地:
python -m http.server 8888

#(4)docker容器启动:
docker run -p 8000:8000 rasa/duckling
2.前端接口修改

修改路径:
rasa_bot_front_dist-main/static/js/main.341de945.chunk.js
修改ip地址:http://192.168.2.220:5055/webhooks/rest/webhook/
将ip修改为rasa启动服务端地址
之后,在浏览器打开rasa_bot_front_dist-main/index.html即可对话

七、baseline知识图谱实现功能

1.知识图谱实体类型
实体类型中文含义实体数量举例
Check诊断检查项目3,353支气管造影;关节镜检查
Department医疗科目54整形美容科;烧伤科
Disease疾病8,807血栓闭塞性脉管炎;胸降主动脉动脉瘤
Drug药品3,828京万红痔疮膏;布林佐胺滴眼液
Food食物4,870番茄冲菜牛肉丸汤;竹笋炖羊肉
Producer在售药品17,201通药制药青霉素V钾片;青阳醋酸地塞米松片
Symptom疾病症状5,998乳腺组织肥厚;脑实质深部出血
Total总计44,111约4.4万实体量级
2、知识图谱实体关系类型
实体关系类型中文含义关系数量举例
belongs_to属于8,844<妇科,属于,妇产科>
common_drug疾病常用药品14,649<阳强,常用,甲磺酸酚妥拉明分散片>
do_eat疾病宜吃食物22,238<胸椎骨折,宜吃,黑鱼>
drugs_of药品在售药品17,315<青霉素V钾片,在售,通药制药青霉素V钾片>
need_check疾病所需检查39,422<单侧肺气肿,所需检查,支气管造影>
no_eat疾病忌吃食物22,247<唇病,忌吃,杏仁>
recommand_drug疾病推荐药品59,467<混合痔,推荐用药,京万红痔疮膏>
recommand_eat疾病推荐食谱40,221<鞘膜积液,推荐食谱,番茄冲菜牛肉丸汤>
has_symptom疾病症状5,998<早期乳腺癌,疾病症状,乳腺组织肥厚>
acompany_with疾病并发疾病12,029<下肢交通静脉瓣膜关闭不全,并发疾病,血栓闭塞性脉管炎>
Total总计294,149约30万关系量级
3、知识图谱属性类型
属性类型中文含义举例
name疾病名称喘息样支气管炎
desc疾病简介又称哮喘性支气管炎...
cause疾病病因常见的有合胞病毒等...
prevent预防措施注意家族与患儿自身过敏史...
cure_lasttime治疗周期6-12个月
cure_way治疗方式"药物治疗","支持性治疗"
cured_prob治愈概率95%
easy_get疾病易感人群无特定的人群

4、理论上支持问答类型

问句类型中文含义问句举例
disease_symptom疾病症状乳腺癌的症状有哪些?
disease_cause疾病病因为什么有的人会感冒
disease_acompany疾病的并发症失眠有哪些并发症?
disease_not_food疾病需要忌口的食物感冒不能吃什么
disease_do_food疾病建议吃什么食物感冒了能吃什么
food_not_disease什么病最好不要吃某事物什么病不能吃豆腐
disease_drug啥病要吃啥药感冒应该吃什么药
drug_disease药品能治啥病板蓝根颗粒能治啥病?
disease_check疾病需要做什么检查脑膜炎怎么才能查出来?
check_disease 检查能查什么病全血细胞计数能查出啥来?
disease_prevent预防措施怎样才能预防肾虚?
disease_lasttime治疗周期感冒要多久才能好?
disease_cureway治疗方式高血压要怎么治?
disease_cureprob治愈概率白血病能治好吗?
disease_easyget疾病易感人群什么人容易得高血压?
disease_desc疾病描述糖尿病

对话效果展示:
2022-09-08 16-52-39屏幕截图.png

八、目前对话系统存在的问题和解决方法

1.目前的对话系统上还存在部分bug,存在提问无法回答的情况
2.目前还无法支持多轮对话,无法实现和用户的交互式问答
3.对用户提问问题的多样性(相同问题不同的提问方式)这种情况还无法很好兼容
4.基于检索的问答FAQ功能还没有加上去
5.根据用户疾病症状,预测疾病功能还不能实现
6.目前疾病知识图谱的知识结构化还不完全,需要继续做信息抽取

针对以上问题,目前都有相关解决办法,需要后续持续推进开发。

九、多轮对话

1.不同疾病共有交互问题

年龄、性别、症状持续时间

FLAT主要创新点在于:
(1)基于Transformer设计了一种巧妙position encoding来融合Lattice结构,可以无损的引入词汇信息。
(2)基于Transformer融合了词汇信息的动态结构,支持并行化计算,可以大幅提升推断速度。

一、背景

ACL2020中一篇来自复旦大学邱锡鹏老师团队的 FLAT: Chinese NER Using Flat-Lattice Transformer 刷新了中文NER任务的新SOTA。
论文链接:https://arxiv.org/pdf/2004.11795.pdf

开源代码:https://github.com/LeeSureman/Flat-Lattice-Transformer

二、

一、查看通过pip库版本

1.查看已经安装的所有库版本
pip list
2.查看已经安装的某个库版本
pip show paddlenlp
3.查看将要安装的某个库版本
pip index versions [your python module name]
例如:
pip index versions paddlenlp

或者
pip install  paddlenlp==

二、pip离线安装一个包

1.离线下载
#pip download 你的包名 -d "下载的路径(windows下双引号来表示文件夹)"
pip download paddlenlp -d pipDownloadTest
2.离线安装
# 模块有依赖包的把所有包放在一个文件夹下,执行以下命令安装
pip install --no-index --find-link=./pipDownloadTest paddlenlp

三、pip离线安装多个包

1.制作requirement.txt

此处制作requirement只是为了测试,pip freeze命令可将已安装的模块列表打印出来。实际应用中只需把要安装的包及版本信息写入一个文本文件。后续用写入pip包的文本文件代替后续命令中的requirement.txt文件。

pip freeze > requirement.txt
2.离线下载
pip download -d offline_packages -r requirements.txt #批量下载
pip download -d offline_packages [package_name] #单个包下载
3.离线安装
pip install --no-index --find-links=./offline_packages/ -r requirements.txt #批量安装
pip install --no-index --find-links=./offline_packages/ [package_name] #单个包安装

四、修改源
1.临时修改

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/

2.永久修改

r-drop本质上是一种有监督的数据增强方式
SimCse本质上是一种无监督的数据增强方式
对比学习标准流程:对比学习的标准流程是同一个样本通过不同的数据扩增手段得到的结果视为正样本对,而 batch 内的所有其他样本视为负样本,然后就是通过 loss 来缩小正样本的距离、拉大负样本的距离了。

一、相关背景

关注 NLP 新进展的读者,想必对2021年4月份发布的 SimCSE印象颇深,它通过简单的“Dropout 两次”来构造正样本进行对比学习,达到了无监督语义相似度任务的全面 SOTA。无独有偶,最近2021年6月份的论文《R-Drop: Regularized Dropout for Neural Networks》提出了 R-Drop,它将“Dropout两次”的思想用到了有监督任务中,每个实验结果几乎都取得了明显的提升。此外,笔者在自己的实验还发现,它在半监督任务上也能有不俗的表现
论文标题:R-Drop: Regularized Dropout for Neural Networks

论文链接:https://arxiv.org/abs/2106.14448

代码链接:https://github.com/dropreg/R-Drop

所以难度主要集中在数据扩增手段上。对于 NLP 来说,我们很难人工构建保证语义不变的数据扩增,所以 SimCSE 干脆不人工进行数据扩增,而是通过“Dropout 两次”的方式来得到同一个输入的不同特征向量,并将它们视为正样本对。奇怪的是,这个简单的“Dropout 两次”构造正样本,看上去是一种“无可奈何”的妥协选择,但消融实验却发现它几乎优于所有其他数据扩增方法,令人惊讶之余又让人感叹“大道至简”。

在实现上,SimCSE 也相当简单,所谓“Dropout 两次”,只需要将样本重复地输入到模型,然后计算相应的 loss 就行了,如上图所示。由于 Dropout 本身的随机性,每个样本的 Dropout 模式都是不一样的,所以只要单纯地重复样本,就可以实现“Dropout 两次”的效果。

二、算法结构

从结果上来看,SimCSE 就是希望 Dropout对模型结果不会有太大影响,也就是模型输出对 Dropout 是鲁棒的。所以很明显,“Dropout 两次”这种思想是可以推广到一般任务的,这就是 R-Drop(Regularized Dropout)。
未命名文件 (2).png

1.损失函数

损失函数由两部分组成:常规的交叉熵损失函数+KL散度约束的相对熵
cr.png
kls.png
zz.png

参考:
https://mp.weixin.qq.com/s/IvhGbFEMotpKJIUPExUklg