论文:An interpretable logic KBQA method based onopen-source large language models
研究背景
大家观察下面的图可以发现,对于“《九条命的弗里茨猫》中演员出演的电影类型是什么?”这个问题,从主实体“九条命的弗里茨猫”到答案实体“喜剧”有多条路径。但是,只有红色标记的路径是正确的。如果模型只提供答案实体,则不可能知道使用哪条路径来检索答案。因此,即使正确识别了答案,推理过程仍可能被认为是不可靠的。
因此,在这篇论文中,作者提出了一种结合大型语言模型 (LLM) 和逻辑编程语言 Prolog 的生成检索多跳KBQA 方法。在生成阶段,我们对开源 LLM 进行微调,以生成自然语言问题的相应 prolog 表示的逻辑形式。在检索阶段,模型使用 Prolog 查询对 KB 进行推理以获得最终答案和推理路径。透明的推理路径也有助于识别和纠正错误,提高模型的可靠性和实用性。
具体地来说,这篇论文的具体贡献主要在以下两方面:
1.我们的模型是可解释的。我们将逻辑编程语言 prolog 合并到 KBQA 任务中,并在生成逻辑形式之前采用主题实体屏蔽策略。这种方法不仅提高了推理过程的准确性,而且还确保了推理路径每一步的可追溯性和可视化。
2. 我们的研究探索了开源 LLM(例如 ChatGLM2 和 Baichuan2)在解决 KBQA 问题方面的表现。为了展示 LLM 模型的功能,我们将其与传统的序列到序列 T5 模型进行了比较。我们的模型在基准数据集 WebQSP 和 MetaQA 上实现了最先进的性能。
相关工作
大家应该了解过,知识库问答系统在过去的十几年中得到了快速的发展,针对知识库质量分析任务的各种方法也层出不穷。现有的知识库问答方法主要可以分为两类:基于检索的方法和基于语义解析的方法。我们现在对这两种方法进行回顾。
(1)基于检索的方法
基于检索的方法的核心思想是直接从知识库中检索与用户问题相关的信息,并基于这些信息来生成答案。这种方法通常依赖于文本相似度计算、关键词匹配等技术来定位知识库中的相关条目。
优点:实现简单,不需要复杂的语义解析过程。而且它适用于大规模知识库,因为检索效率通常较高。
缺点:精确度可能不如语义解析方法,因为依赖的是文本相似度而非精确的语义匹配。对于需要复杂逻辑推理的问题,处理起来较为困难。
这里,给大家举例说明:
假设用户的问题是:“谁是《哈利·波特》的作者?”
那么对于这个例子而言,
- 自然语言问题:谁是《哈利·波特》的作者?
- 信息检索:
- 从问题中提取关键词:“哈利·波特”和“作者”。
- 在知识库中检索包含这些关键词的条目。
- 可能找到多个与《哈利·波特》相关的条目,包括其作者信息。
- 生成答案:
- 从检索到的条目中提取出《哈利·波特》的作者名称。
- 可能需要一些额外的处理来确保答案是准确的,比如处理同义词、缩写等。
接下来给大家介绍基于语义解析的方法。
(2)基于语义解析的方法
基于语义解析的方法的核心思想是将用户的自然语言问题转换成一种中间逻辑形式,这种逻辑形式通常是一种查询语言,如SPARQL(用于RDF数据)或SQL(用于关系型数据库)。然后,这个逻辑形式会在知识库上执行,以获取最终的答案。
优点:能够处理复杂的查询需求,因为逻辑形式可以表达复杂的查询逻辑。精确度高,因为查询是基于精确的逻辑转换。
缺点:需要复杂的自然语言处理技术和语义理解技术。对于不同的知识库,可能需要定制化的逻辑形式转换规则。
这里,给大家举例说明:
假设用户的问题仍然是:“谁是《哈利·波特》的作者?”
那么对于这个例子而言,
- 自然语言问题:谁是《哈利·波特》的作者?
- 语义解析:将这个问题转换成SPARQL查询(假设知识库是RDF格式的):
PREFIX book: <http://example.org/book#>
SELECT ?author WHERE {
?book book:title "哈利·波特" .
?book book:author ?author .
}
- 执行查询:在RDF知识库上执行上述SPARQL查询。
- 获取答案:从查询结果中提取出《哈利·波特》的作者名称。
与传统方法相比,我们选择逻辑编程语言 Prolog作为逻辑形式,因为它是简洁和合乎逻辑的。Prolog 语言的简单性可以有效地提高 LLM 的准确性,这种逻辑形式提供了问题含义的结构化表示,而无需定义任何其他函数。
例如,提出"What is the name of justin bieber brother"这个问题。相应的 Prolog 查询是"people.person.sibling s (Justin Bieber, X), people.sibling relationship.sibling(X,Y), people.person.gender(Y,Male)"
LLM-PROLOGKBQA 框架
A.概述
LLM-PROLOGKBQA采用“生成检索”框架,如下图所示。它使用微调的llm来生成问题的逻辑形式,并从知识库中检索相关信息,从而促进KBQA中准确和自然语言理解和答案生成。为了微调开源 LLM,我们使用逻辑形式的逻辑编程语言 Prolog 来调整来自 KBQA 数据集的< question, answer >对 到 < question, logical form >对。
< question, answer > -------调整-------> < question, logical form >
然后使用微调后的 LLM 通过语义解析将新的 NL 问题翻译成相应的候选逻辑形式。问答模块利用这些逻辑形式对知识库进行推理以获得最终答案,为 NL 问题提供可解释的推理路径。
将KBQA数据集中的<question, answer>对转换为<question, logical form>对的过程,涉及到将自然语言问题(NL questions)转换为逻辑编程语言Prolog的逻辑表达式。这个过程主要通过两个步骤实现:主题实体掩码(Topic Entity Mask)和Prolog逻辑形式生成(Prolog Logical Form Generation)。下面我将举例说明这个过程。
B.逻辑形式生成
(1)主题实体掩码
为了确保模型专注于问题的表示并减少主题实体对问题建模的影响,采用了一种称为“主题实体掩蔽”的策略。推理过程应该优先考虑问题语义结构,特别是谓词,而不是给定问题的主题实体。KBQA 中可视化推理的关键是将 NL 问题的信息映射到 KB 中的关系,这通常作为自然语言问题中的谓词出现,不涉及主题实体。因此,为了使模型专注于问题本身的语义结构,我们将每个问题中的主题实体替换为特殊标记“ENT”。
(2)Prolog 逻辑形式生成
为了将每个自然语言问题转换为 Prolog 中表达的逻辑形式,我们需要利用来自数据集的附加信息,例如 SPARQL 查询和问题类型,以构建问题的相应逻辑谓词映射。由于 SPARQL 查询和问题类型具有固定的结构和特定的关键字,因此我们使用基于模板的匹配算法使用预定义的模式和规则对文本进行解析和匹配,从而能够从文本数据中准确识别和提取关键信息。基于 SPARQL 查询和问题类型中的固定句法结构,我们设计了相应的模板,然后将关键信息从模板映射到逻辑谓词,从而构建 Prolog 逻辑表达式。
为了提高模板匹配的准确性,我们首先对问题进行标记,然后通过消除不影响 Prolog 逻辑形式的固定句法结构来消除噪声。最后,从模板匹配获得的关键信息中,我们设计了不同匹配符号和 Prolog 谓词的映射,提取逻辑推理谓词来构建 Prolog 逻辑表达式。通过使用模板匹配,我们从文本数据中实现关键信息的精确识别和提取,最终能够为自然语言问题构建正确的 Prolog 逻辑表达式。
C.微调大语言模型
由于llm的参数尺寸较大,传统的训练方法需要较高的硬件需求,导致训练速度缓慢,效率低。因此,本文采用参数高效微调(PEFT)[28]对llm进行微调。微调是大规模预训练llm中的关键步骤,使其适应特定任务。
D.基于 Prolog 的答案检索
由于微调 LLM 在生成逻辑形式方面的出色性能,我们可以获得给定问题的逻辑形式和推理路径。传统的语义解析方法通常将微调llm生成的逻辑形式转换为SPARQL,然后在知识库上执行查询以获得最终答案。然而,从逻辑形式到 SPARQL 的转换既耗时又不可靠。在我们的答案检索模块中,我们利用 Prolog 逻辑形式,消除了查询转换的需要。我们的逻辑形式是 Prolog 查询,这是一种通过 SWITProlog 直接可执行的逻辑编程语言。在执行查询之前,我们需要为我们的模块导入事实和规则。
Tips:在这里,给大家解释一下基于Prolog的答案检索和传统的语义解析方式的区别。
(1)我们应该先明确的是基于Prolog的答案检索使用了微调的LLMs,类似于LLMs生成逻辑形式,而传统的语义解析方式并没有使用LLMs。
举例说明:
- 假设有一个自然语言问题:“哪部电影是由导演詹姆斯·卡梅隆执导的?”
- 经过LLMs的处理,这个问题可能会被转化为以下逻辑形式之一(具体形式取决于LLMs的训练和设计):
- 逻辑表达式:
movie.directed_by(X, 'James Cameron')
,其中X
是待查询的电影名称。- 查询图:一个包含节点(如“电影”、“导演”)和边(如“执导”)的图结构,其中“导演”节点被标记为“詹姆斯·卡梅隆”,并指向一个或多个“电影”节点。
- 结构化数据表示:一个JSON或XML格式的数据结构,其中包含电影的名称、导演等信息,且导演字段被设置为“詹姆斯·卡梅隆”。
(2)Prolog是一种逻辑编程语言,其查询语句本身就是一种逻辑形式,可以直接通过Prolog解释器(如SWI-Prolog)执行,在这个过程中无需进行任何转换。但是传统的语义解析方式是需要转换的。
举例说明:
假设我们有一个关于电影知识库的问题:“哪部电影是由导演詹姆斯·卡梅隆执导的?”
- LLMs生成逻辑形式:通过微调后的LLMs,我们可以为这个问题生成一个逻辑形式,如
movie.directed_by(X, 'James Cameron')
,其中X
表示待查询的电影名称。- 传统方法的处理:传统方法可能会将这个逻辑形式转换为SPARQL查询,如
SELECT ?movie WHERE { ?movie movie:directed_by "James Cameron" }
,然后在知识库上执行这个SPARQL查询。
接下来,这个例子将完整地表示LLM-PROLOGKBQA的具体流程。
假设我们有一个自然语言问题(NL question)和它的答案,如下所示:
NL Question: "What is the name of Justin Bieber's brother?"
Answer: "Jaxon Bieber"
为了将这个问题和答案对转换为<question, logical form>对,我们可以按照以下步骤进行:
Step 1. 主题实体掩码
在这个步骤中,我们需要将问题中的主题实体(在这个例子中是"Justin Bieber")替换为一个特殊的标记(例如"ENT")。这是为了让模型在生成逻辑形式时更专注于问题的语义结构,而不是特定的实体名称。
所以,转换后的问题是: "What is the name of ENT's brother?"
Step 2. Prolog逻辑形式生成
接下来我们需要将转换后的问题转换为一个Prolog逻辑表达式。这通常涉及到识别问题中的关键词和关系,并将它们映射到Prolog的谓词和参数上。在这个例子中,我们可以将问题分解为几个关键的关系:
person.sibling_s
:表示两个人是兄弟姐妹关系。person.gender
:表示一个人的性别。然后,我们可以构建一个Prolog查询来表示这个问题:
people.person.sibling_s(ENT, X), % ENT(Justin Bieber)的兄弟或姐妹是X people.sibling_relationship.sibling(X, _), % X是某人的兄弟(这步可能不是必需的,取决于具体的KB结构) people.person.gender(X, Male). % X是男性(因为问题是询问“brother”)
通过上述两个步骤,我们可以将自然语言问题转换为逻辑编程语言Prolog的逻辑表达式。这个过程使得模型能够更准确地理解问题的语义结构,并通过逻辑推理来找到答案,同时提供了一个可解释的推理路径。
实验结果
在 MetaQA 和 WebQSP 上评估了我们的模型,结果表明我们的模型在两个标准 KBQA 基准数据集上都实现了最佳性能。
在本文中,我们提出了一种针对 KBQA 任务的创新方法。我们将不同的开源 LLM 集成到 KBQA 任务中,利用它们对自然语言的独特理解来深入分析给定的 NL 问题并提取更多语义信息。与传统的基于语义解析的方法不同,我们专注于在答案推理之前生成逻辑形式,选择逻辑编程语言 Prolog 作为问题的中间逻辑形式,并采用主题实体屏蔽策略使 LLM 专注于语义结构。我们对开源 LLM 进行微调以生成问题的中间表示。随后,我们利用生成的 Prolog 表示作为推理的逻辑形式。我们的答案推理模块能够基于问题的中间表示进行推理并最终输出答案。