KBQA是一个很有趣的话题,其本质上是一个text2cypher的任务,虽然说大模型出现后,可以基于大模型进行text2cypher语句生成,例如开源项目:https://github.com/wey-gu/NebulaGraph-GPT中,将限定好的知识图谱schema写好,然后进行query提问,最后生成cypher语句。
在底层实现上,通过prompt进行执行,例如可以参考:https://docs.llamaindex.ai/en/stable/examples/query_engine/knowledge_graph_query_engine中的论述:
你是一位兔数据库Cypher专家,请根据给定的图 Schema 和问题,写出查询语句。 schema 如下: --- {schema} --- 问题如下: --- {question} --- 下面写出查询语句:
但回过头来,我们还是来看看传统的KBQA方案,继续围绕KBQA相关评测这一主题,首先介绍当前具有代表性的单跳KBQA数据及其常见实现范式,然后对当前具有代表性的复杂KBQA评测数据集进行介绍,供大家一起参考。
当前,中文的开放KBQA评测主要集中在针对单跳问答当中,主要包括有KgCLUE、NLPCC2016/2017、ccks2018-2021这三个评测。
1、KgCLUE
KgCLUE是中文语言理解领域最具权威性评测基准CLUE在知识图谱问答任务上的榜单,作为中文KBQA测评基准,基于CLUE的积累和经验,并结合KBQA的特点和近期的发展趋势,精心设计了该测评,希望可以促进中文领域上KBQA领域更多的研究、应用和发展,评测数据如下所示:
其中,所用知识库包括实体数量3137,356,关系数量246,380,高频关系(>100)为4143条,三元组数量共计23,022,248条。
当然,也给出了体验地址:http://www.cluebenchmarks.com:5000
地址:https://github.com/CLUEbenchmark/KgCLUE
2、NLPCC2016/2017
NLPCC在2016和2017两年都举办了开放知识图谱问答比赛,其中,NLPCC2017的Task5:Open Domain Question Answering中,提供了KBQA的相关评测数据。其包含 14,609 个问答对的训练集和包含 9870 个问答对的测试集,并提供一个知识库,包含 6,502,738 个实体、 587,875 个属性以及 43,063,796 个三元组。
地址: http://tcci.ccf.org.cn/conference/2017/taskdata.php
地址: http://tcci.ccf.org.cn/conference/2016/pages/page05_evadata.html
3、ccks2018-2021
作为国内标准的知识图谱会议,CCKS连续在2018年至2021年都举行了知识图谱相关评测,即基于中文知识图谱的自然语言问答,简称CKBQA (Chinese Knowledge Base Question Answering)。
即输入一句中文问题,问答系统从给定知识库中选择若干实体或属性值作为该问题的答案。问题均为客观事实型,不包含主观因素。理解并回答问题的过程中可能需要进行实体识别、关系抽取、语义解析等子任务。这些子任务的训练可以使用额外的资源,但是最终的答案必须来自给定的知识库。
地址: https://www.biendata.xyz/competition/ccks_2019_6/
KBQA其主要核心在于针对特定的知识图谱数据进行技术的快速适配,下图以kgclue为例(地址:https://github.com/CLUEbenchmark/KgCLUE),从给定的知识库(三元组)统计信息、知识库描述、问答数据集统计信息以及问答数据集描述几个方面进行了介绍。
其中,数据存储格式如上,每一行是一个三元组,格式为 <头实体,关系,尾实体>,每列之间以'\t'分隔, 其中头实体后的括号项为该实体的消歧项。问答数据集为one-hop数据,总共包含25000条问答对。问答数据集为json格式,每行为一条问答对。问题是one-hop问题,即答案为 知识库中的一条三元组。数据格式如下,其中id为问答对索引,quetion为问 题,answer为答案,来自知识库,以' ||| '分割。
1、实现思路
单跳的KBQA在实现上架构较为简单,主要包括实体识别以及属性/关系识别两种,kgclue给出了一个十分清晰的例子,思路可以分成以下四步:
首先,利用NER模型进行实体识别(S);其次,根据识别到的实体,通过es接口找到可能的候选关系的列表,然后,训练相似度模型进行关系预测:输入为问句和候选关系,找到最可能的关系(P);最后根据实体(S)、关系(P)定位到答案(O,即尾实体)
2、关键模块之实体识别
实体识别模块旨在针对给定的query,识别出其中的实体【当然,在实际的过程当中哦,一个问句中可能会出现多个实体】。为了解决这一问题,可以从给定的训练数据集出发,通过答案中实体进行query原文回标,得到对应实体bio标签数据集,
如下的训练数据为例:
<questionid=1> 《机械设计基础》这本书的作者是谁?
<triple id=1> 机械设计基础 ||| 作者 ||| 杨可桢,程光蕴, 李仲生
<answer id=1> 杨可桢,程光蕴,李仲生
经过处理,并采用BIO标签进行标注,可以快速得到相应训练数据。
3、关键模块之关系/属性分类
在识别出query当中的实体之后,需要找到问句中所提及的关系或者属性。一般来说,为了解决这一问题,我们有两种方法,一种是直接用关系或者属性词表进行匹配,以得到显式的关系或者属性提及,但这种方式无法解决隐式问题,另一种是使用分类的方法,将query为文本,实体对应的属性或者关系列表作为分类标签。
例如图中所示,“请问后卫寨站的最后一班车是什么时候?”中识别出实体为“后卫寨站",通过查询kb,可以得到其拥有的属性包括成立地点、目前状况等,这些可以作为负样本,标签为0,而末班车这一属性可以作为证样本。
如此以来,可以训练分类模型完成这一工作。
当然,在实际的业务场景中,这种单跳的情况较为理想化,有很多带约束条件以及特定意图的问答需求,例如下图中所列举的多种复杂问答类型:
这些复杂场景下的问答需求,也对相应的解决方案提出了更多的要求,与此相对应的技术评测成为了现有工作的重点。
1、CCKS2022开放知识图谱问答评测
与之前举行的知识图谱问答评测不同,这次测评会及到带有距离约束的查询需求以及多条件的多跳问题:
1)多条件约束查询
问句:北京故宫博物院(故宫)附近2公里还有哪些好玩的?
语句:select ?y where { <故宫博物院(故宫)> <附近> ?cvt. ?cvt <实体名称> ?y. ?cvt <距离值> ?distance. filter(?distance <= 2). ?y <类型> <景点>. }
答案:<北海公园>\t<国家大剧院>\t<景山公园>
有按价格排序/过滤的查询需求,涉及到排序语法如下:
问句:故宫附近5km内便宜的酒店是多少钱?
语句:select ?price where { <故宫博物院(故宫)> <附近> ?cvt. ?cvt <实体名称> ?y. ?cvt <距离值> ?distance. ?y <类型> <酒店>. ?y <平均价格> ?price. filter(?distance <= 5). } ORDER BY asc(?price) LIMIT 1
答案:“758”
2)多跳关联查询
下面列举两个多挑类的问题例子:
问句:创办了美国苹果公司和Pixar动画公司的著名企业家是谁?
语句:select ?x where { ?x <主要成就> "美国苹果公司联合创办人". ?x <主要成就> "Pixar动画公司创始人". ?x <职业> <企业家>. }
答案:<史蒂夫·乔布斯_(美国苹果公司联合创始人)>
问句:陈可辛导演黄晓明主演的电影票房是多少?
语句:select ?y where { ?x <导演> <陈可辛>. ?x <主演> <黄晓明_(中国内地男演员、歌手、商人)>. ?x <票房> ?y. }
答案:"¥5.37亿元(中国内地)
地址:https://www.biendata.xyz/competition/ccks2020_ckbqa/data/
2、LcQuAD
LcQuAD,全称Large-Scale Complex Question Answering Dataset,是由Trivedi等人在2017年公布了一个针对DBpedia的复杂问题数据集,该数据集中简单的单跳问题占比18%。
{
"_id": "1394",
"corrected_question": "Who created the Women in the Garden and also the L'Enfant a la tasse ?",
"intermediary_question": "What is the <Artist> of the <Women in the Garden> and <L'Enfant a la tasse>",
"sparql_query": "SELECT DISTINCT ?uri WHERE { <http://dbpedia.org/resource/Women_in_the_Garden> <http://dbpedia.org/property/artist> ?uri. <http://dbpedia.org/resource/L'Enfant_a_la_tasse> <http://dbpedia.org/property/artist> ?uri . }",
"sparql_template_id": 15
},
{
"_id": "2637",
"corrected_question": "Which famous horserace has seen both Fergie sutherland and the illustrious War of Attrition?",
"intermediary_question": "What is the <race> of the <War Of Attrition (horse)> and <Fergie Sutherland>",
"sparql_query": "SELECT DISTINCT ?uri WHERE { <http://dbpedia.org/resource/War_Of_Attrition_(horse)> <http://dbpedia.org/property/race> ?uri. <http://dbpedia.org/resource/Fergie_Sutherland> <http://dbpedia.org/property/race> ?uri . }",
"sparql_template_id": 15
},
在该数据集的构建上,先利用一部分SPARQL模板,一些种子实体和部分关联属性通过DBpedia生成具体的SPARQL,然后再利用定义好的问句模板半自动利用SPARQL生成问句,最后通过众包形成最后的标注问题。Dubey等人也使用同样的方法,构建了一个数据量更大更多样的数据集 LcQuAD 2.0。
地址:https://github.com/AskNowQA/LC-QuAD/
3、KQA Pro
KQA Pro是发表在WWW2021的一篇工作,提出了一个120K,基于wikidata,有(问题,SPARQL,Program,10 choice,golden answer)的数据集,包括多跳,比较,最高级,时间,集合操作等复杂处理。 数据样例:
{
"question":"Which town has a TOID of 4000000074573917 and has an OS grid reference of SP8778?",
"choices":[
"Wigan",
"Doncaster",
"Royal Tunbridge Wells",
"Kettering",
"Edmonton",
"Macclesfield",
"Blackburn",
"Colchester",
"South Shields",
"Wimbledon"
],
"program":[
{
"function":"FindAll",
"dependencies":[
],
"inputs":[
]
},
{
"function":"FilterStr",
"dependencies":[
0
],
"inputs":[
"TOID",
"4000000074573917"
]
},
{
"function":"FilterConcept",
"dependencies":[
1
],
"inputs":[
"town"
]
},
{
"function":"FindAll",
"dependencies":[
],
"inputs":[
]
},
{
"function":"FilterStr",
"dependencies":[
3
],
"inputs":[
"OS grid reference",
"SP8778"
]
},
{
"function":"FilterConcept",
"dependencies":[
4
],
"inputs":[
"town"
]
},
{
"function":"And",
"dependencies":[
2,
5
],
"inputs":[
]
},
{
"function":"What",
"dependencies":[
6
],
"inputs":[
]
}
],
"sparql":"SELECT DISTINCT ?e WHERE { ?e <pred:instance_of> ?c . ?c <pred:name> \"town\" . ?e <TOID> ?pv . ?pv <pred:value> \"4000000074573917\" . ?e <OS_grid_reference> ?pv_1 . ?pv_1 <pred:value> \"SP8778\" . }",
"answer":"Kettering"
}
地址:https://github.com/shijx12/KQAPro_Baselines
本文主要围绕KBQA相关评测这一主题,首先介绍了当前具有代表性的单跳KBQA数据及其常见实现范式,然后对当前具有代表性的复杂KBQA评测数据集进行简介。
我们发现,当前针对单跳的kbqa问题类型已经能够取得较好的结果,kgclue的榜单已经接近0.99,而在复杂类型的问答场景中,还有很长一段路要走,例如关于更具规模性的中文复杂问答数据集以及性能更高的实现方法有待提出。
最后,感谢相关工作贡献者的辛苦付出。
1、https://developer.aliyun.com/article/775683
2、https://zhuanlan.zhihu.com/p/348851375
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。