问答系统概述
问答系统是人类从机器中获取数据与知识的主要形式,问答系统包括NLP的多种应用:语义理解,知识图谱,推理,文本生成。问答系统是检验机器智能的一种方式(图灵测试)。
图灵测试(英语:Turing test,又称“图灵判断”),是阿兰·图灵于1950年提出的一个关于判断机器是否能够思考的著名试验,测试某机器是否能表现出与人等价或无法区分的智能。如果一个人(代号C)使用测试对象皆理解的语言去询问两个他不能看见的对象任意一串问题。对象为:一个是正常思维的人(代号B)、一个是机器(代号A)。如果经过若干询问以后,C不能得出实质的区别来分辨A与B的不同,则此机器A通过图灵测试。
对于领域特定的QA,问答系统需要KG作为支撑,结构化的KG可以实现更精准,更高召回的回答。
问答系统中的技术
核心是将自然语言转为可以用于KG结构化查询的语句,比如:
- 自然语言:有多少人住在北京
- 查询语句:
select value From KG where subject="北京" and predicate="人口"
这里有两个关键问题:
- 实体链接:将自然语言中的文本与KG中的条目链接,具体操作是将文本中的实体映射到给定知识库中的实体(比如基于token的embedding相似度进行链接)
- 关系理解:一般简单的项目都采用模板匹配关系,现在可以用深度学习模型分类关系,比如输入为自然语言,输出为关系的分类,但这有个潜在问题,分类空间太大,所以可能需要LLM的zero-shot能力
KG可以为问答系统带来结构化的领域知识,在查询时具有明确的可解释性,适合构建领域特定中的问答系统。
以肝病KG的QA系统为例:https://github.com/vivianLL/QASystemOnHepatopathyKG,首先构建KG,这里需要明确:
- 构建方式:专家手动标注知识,或者自动从文本中提取知识
- 存储方式:一般为neo4j
- 有哪些实体,有哪些关系,实体有哪些属性
- 来自:https://github.com/liuhuanyong/QASystemOnMedicalKG
对于数据,在medical.json
中,包含一共8808条数据,其中某条数据为下面的格式,注意其他数据可以不局限于下面的这些格式:
{ "_id" : { "$oid" : "5bb57901831b973a137e6142" },
"name" : "腱鞘炎",
"desc" : "腱鞘炎是临床上最常见到的手外科疾病之一,又称“键盘手”。主要是指肌腱在短期内活动频繁或用力过度或慢性寒冷刺激,导致腱鞘组织发生炎性反应、纤维变性,使腱鞘变厚,引起鞘管狭窄,肌腱在鞘管内活动受到限制,而炎性反应同时引起局部疼痛的一类疾病。腱鞘炎好发于30-50岁之间,女性多于男性,其比例为10:1。",
"category" : [ "疾病百科", "外科", "骨外科" ],
"prevent" : "1、在洗衣、做饭、编织毛衣、打扫卫生等家务劳动时,要注意手指、手腕的正确姿势,不要过度弯曲或后伸;提拿物品不要过重;手指、手腕用力不要过大。\n2、感觉身体关节疲劳时可以泡个热水澡,舒解一下紧绷的肌肉,或是在酸痛的部位进行热敷。\n3、冬天洗衣服时,最好用温水,下雪后扫雪,也要戴上棉手套,防止手部受寒。\n4、手腕关节做360度的旋转;或将手掌用力握拳再放松,来回多做几次;或将手指反压或手掌反压几下,都可以有效缓解手部的酸痛。\n5、对于长期伏案办公人员来说,应采用正确的工作姿势,尽量让双手平衡,手腕能触及实物,不要悬空。",
"cause" : "可以是受伤、过份劳损(尤其见于手及手指)、骨关节炎、一些免疫疾病,甚至是感染也有可能引起。\n一些需要长期重复劳损关节的职业如打字员、器乐演奏家、货物搬运或需要长时间电脑操作的行业等,都会引发或加重此病。常见患处有手腕、手指、肩部等位置。\n女性及糖尿病患者会较易患上这病。病人会感到关节疼痛,晨僵,通常关节晨僵的感觉在起床后最为明显,而症状并不会随着活动频繁而明显缓解。受影响的关节肿胀,甚至弹响,关节活动障碍。",
"symptom" : [ "手指小关节痛肿", "腕部肿胀压痛", "手腕在大拇指侧的疼痛", "扳机指的弹响", "结节", "腕关节扭挫伤", "拇指不明原因疼痛", "筋膜疼痛" ],
"yibao_status" : "否",
"get_prob" : "0.005%",
"easy_get" : "好发于30-50岁之间",
"get_way" : "无传染性",
"acompany" : [ "肿胀" ],
"cure_department" : [ "外科", "骨外科" ],
"cure_way" : [ "支持性治疗", "康复治疗" ],
"cure_lasttime" : "2-3月",
"cured_prob" : "98%",
"common_drug" : [ "布洛芬缓释胶囊", "依托芬那酯凝胶" ],
"cost_money" : "根据不同医院,收费标准不一致,市三甲医院约(1000——5000元)",
"check" : [ "斯比德试验", "屈肌紧张试验", "伸肌紧张试验", "雅加森试验" ],
"do_eat" : [ "鸭蛋", "鸡蛋", "鸭翅", "鸡爪" ],
"not_eat" : [ "杏仁", "腐竹", "白扁豆", "虾皮" ],
"recommand_eat" : [ "羊肉煎包", "羊肉温补汤", "鸡肉冬菜饼", "鸡肉炒藕丝", "鸡肉蛋花汤", "草鱼豆腐", "竹筒蒸草鱼", "酱肉西兰花" ],
"recommand_drug" : [ "布洛芬缓释混悬液", "Ⅰ", "布洛芬缓释胶囊", "双氯芬酸钠肠溶片", "伤痛酊", "复方七叶皂苷钠凝胶", "双氯芬酸二乙胺凝胶", "布洛芬片", "双氯芬酸钠缓释片", "阿西美辛缓释胶囊", "酮洛芬凝胶", "依托芬那酯凝胶" ],
"drug_detail" : [ "正士布洛芬缓释胶囊(布洛芬缓释胶囊)", "澳托芬依托芬那酯凝胶(依托芬那酯凝胶)", "南国布洛芬片(布洛芬片)", "邦琪集团伤痛酊(伤痛酊)", "仕象(双氯芬酸二乙胺凝胶)", "天津金耀酮洛芬凝胶(酮洛芬凝胶)", "欧莱(复方七叶皂苷钠凝胶)", "四川中方布洛芬缓释混悬液(布洛芬缓释混悬液)", "常州制药布洛芬片(布洛芬片)", "石药布洛芬片(布洛芬片)", "山西云鹏布洛芬片(布洛芬片)", "柏赛罗布洛芬缓释胶囊(布洛芬缓释胶囊)", "珠海联邦布洛芬缓释胶囊(布洛芬缓释胶囊)", "北京红林布洛芬缓释胶囊(布洛芬缓释胶囊)", "太平布洛芬缓释胶囊(布洛芬缓释胶囊)", "白云峰双氯芬酸钠肠溶片(双氯芬酸钠肠溶片)", "江西南昌济生双氯芬酸钠肠溶(双氯芬酸钠肠溶片)", "欧意双氯芬酸钠肠溶片(双氯芬酸钠肠溶片)", "蜀中双氯芬酸钠肠溶片(双氯芬酸钠肠溶片)", "瑞培林双氯芬酸钠肠溶片(双氯芬酸钠肠溶片)", "中大双氯芬酸钠缓释片(Ⅰ)(双氯芬酸钠缓释片(Ⅰ))", "特适纳双氯芬酸钠缓释片(双氯芬酸钠缓释片)", "高顺松阿西美辛缓释胶囊(阿西美辛缓释胶囊)" ] }
实体类型如下:
KG中有以下关系:
KG中的实体有以下属性:
可以看到,上面例子中的数据"name" : "腱鞘炎"
是一个疾病相关的实体。
KG是一个工程化的领域,而关于领域特定的问答,如果对自然语言的涉及很多,比如输入输出都以自然语言为主,还是建议使用LLM,领域知识往往是利用KG,由GPT的API生成具有领域知识的微调数据集,然后再用这些微调数据基于LoRA训练指定的LLM。
如果涉及到输入输出本身就是结构化条目,对自然语言的参与比较少,比如在药物不良反应推荐系统中,我们重点是构建准确的KG,其中包含药物,食物等实体,关系则是两者之间的不良反应,这种场景下,我们可以直接在KG上查询知识条目。