ChatQA实现策略:兼看大模型进行时序事件挖掘的思路

一、ChatQA:两阶段指令微调的对话思路

《ChatQA: Building GPT-4 Level Conversational QA Models》(https://arxiv.org/pdf/2401.10225.pdf)提出了一个两阶段的对话问答思路。

1、指令微调

微调包含两个阶段,Supervised Fine-tuning和Context-Enhanced Instruction Tuning,如下图所示:

图片

image

在第一阶段,在指令跟随和对话数据集上进行监督微调(Supervised Fine-tuning),该阶段用于让模型获取基本的对话和指令遵循能力。

在这个阶段,为了构建一个大型、全面的监督微调(SFT微调(SFT)数据集,从高质量指令调谐数据集中收集128KSFT样本,包括社会对话数据集Soda、一个长式QA数据集ELI5、FLAN和思维链数据集、Self-Instruct 、Unnatural Instructions、公共对话数据集:OpenAssistant以及Dolly。

在准备阶段,将所有SFT数据的结构统一为对话格式,首先在开头添加了一个“System”角色,以设置一个通用指令,指导LLM提供礼貌和有帮助的回答,还添加了“User” and “Assistant”角色,以纳入指令调整数据集中的指令和回复对,在LLM基础模型上使用这种统一格式进行微调。

System: This is a chat between a user and an artificial intelligence assistant.
The assistant gives helpful, detailed, and polite answers to the user’s questions
based on the context. The assistant should also indicate when the answer cannot be
found in the context.
User: {Question 1}
Assistant: {Answer 1}
...
User: {Latest Question}
Assistant:

第二阶段为语境增强指令调整的后续阶段(Context-Enhanced Instruction Tuning),该阶段专门用于增强模型在对话中的语境感知或检索增强生成能力,这里的重点是怎么获取这方面的数据。

一个是人工标注的会话质量保证数据集(称为HumanAnnotatedCon-vQA),该数据集仅由7k个对话组成。为了建立这个数据集,首先从互联网上收集了7k篇涵盖不同主题的文档。然后,指示标注人员提出有关文档的问题(和后续问题),并给出答案,最终为每份文档创建了一个多回合对话,共产生了7k个QA对话,每个对话平均有5个回合。

此外,为了减少在无法回答的情况下产生的幻觉答案,在数据集中加入了无法回答的样本,这里的构建方式很有趣,通过让标注者提供所有上下文位置给用户问题,然后删除相关文本来构建的,对于无法回答的问题,使用“对不起,我无法根据上下文找到答案”(“Sorry. I cannot Page 1 of 2 find the answer based on the context”)作为回复。

一个是GPT-3.5-turbo生成合成对话式QA数据集,从网络抓取中收集了7k篇文档(平均每篇文档的字数在1k左右),这些文档涵盖了广泛的领域,每个文档都用于生成一个会话QA样本,这样就生成了总共7k个多回合QA对话,每个对话平均有4.4个用户代理回合(称为SyntheticConvQA)。

与HumanAnnotatedConvQA类似,还构建了另外1.5k个带有无法回答的多轮数据集。在这个合成数据集中,由于没有注释的上下文位置注释,因此构建了SyntheticConvQA中的合成无法回答样本。

这块也很有趣,首先将文档(针对每段对话)切割成不同的块。然后,只有当有与对话者的回答"高度重叠"的语块被删除,而其余语块与对话者的回答"低度重叠"时,才将其视为有效的无法回答样本。

这里的重叠度计算方式为:使用每个语块与代理答案之间的4-gram召回得分(它衡量了答案的4-gram短语在每个语块中的比例)作为衡量标准来确定它们之间的重叠度,并将高于0.5视为"高重叠度",低于0.1视为"低重叠度"。

最后,为了提高处理表格文档和算术计算的QA能力,添加了包含着两个能力的TAT-QA数据集,第二阶段的训练混合数据集包括:会话式QA数据集:HumanAnnotatedConvQA或SyntheticConvQA;单轮QA数据集:DROP、NarrativeQA、Quoref、ROPES、SQuAD1.1、SQuAD2.0、NewsQA、TAT-QA以及第一阶段的所有SFT数据集。

这个阶段对应的prmpt如下:

System: This is a chat between a user and an artificial intelligence assistant.
The assistant gives helpful, detailed, and polite answers to the user’s questions
based on the context. The assistant should also indicate when the answer cannot be
found in the context.
{Context for Latest Question}
User: {Instruction} + {Question 1}
Assistant: {Answer 1}
...
User: {Latest Question}
Assistant:

2、对话式问答检索

在对话式问答中,当文档变得过于冗长而无法直接输入LLM时,能够处理对话式查询的检索器就变得至关重要,这种会话检索器会对对话历史和当前查询进行编码,然后从文档中检索相关上下文,然后只有相关上下文才会被用作LLM的输入。

这块的方式包括两种:

一个是查询重写query rewrite,一个是微调一个检索模块。

图片

 

其中:

在微调检索模块方面,由于Dragon等代表方案,都是针对单轮查询进行优化的,因此对多轮对话查询的泛化能力有限,因此使用会话查询和上下文对来进一步微调单轮检索器,以更好地应对会话输入,为了建立高质量的微调数据集,利用来自HumanAnnotat-edConvQA或SyntheticConvQA的会话QA数据集来构建会话查询和上下文对。

对于HumanAnnotatedConvQA,直接采用会话查询和上下文对,并利用它们进一步微调查询检索器。对于SyntheticConvQA,首先将对话式QA数据集中的每篇文档切割成不同的块。然后,计算回答与每个语块之间的4-gram召回得分。然后,将召回分数最高的语块视为当前用户问题的正确语块。最后,将构建的会话查询和上下文数据集进行微调。

另一种解决方案是会话查询重写,使用查询重写器根据会话历史记录重写当前问题,重写后的查询直接作为单轮查询检索器的输入,用于检索相关上下文。

除了嵌入和搜索成本外,查询重写模型还为生成重写查询带来了大量额外的计算费用,这一块使用GPT-3.5-turbo作为重写器,不仅为GPT-3.5-turbo提供了改写任务指令,还为其提供了少量改写示例,以提高改写结果的质量。

对应的prompt如下:

You are a helpful, pattern-following assistant.
role-user:
Given the following conversation between PersonU and PersonA:
PersonU: Hello, I would like to know what to do if I do not agree with any decision.
PersonA: disagree with our decision about your monthly income adjustment amounts?
PersonU: no. Where can I find my SHIP contact information?
PersonA: You can find your local SHIP contact information in the back of your
Medicare & You 2020 Handbook online.
PersonU: and how do they calculate the adjustments?
Instead of having this entire conversation, how can PersonU get what he or she is
looking for using a single question? Respond with that question.
role-assistant:
How is the calculation for adjustments made by SHIP determined?
role-user:
Given the following conversation between PersonU and PersonA:
PersonU: I need to know how to prepare for college.
PersonA: You should first define your goals and interest and be sure to know the
costs and how to plan financially and academically for college.
PersonU: Is there something I can use as a guide to get ready for it?
Instead of having this entire conversation, how can PersonU get what he or she is
looking for using a single question? Respond with that question.
role-assistant:
What resources or guides can I use to help me prepare for college?
role-user:
Given the following conversation between PersonU and PersonA:
{Dialogue History + Latest Question}
Instead of having this entire conversation, how can PersonU get what he or she is
looking for using a single question? Respond with that question.
role-assistant:

二、基于大模型进行时序事件抽取

事件序列模型在分析和预测事件方面非常有效,建立此类模型需要大量高质量的事件序列数据。然而,在某些应用中,无法获得干净的结构化事件序列,自动序列提取也会导致数据过于嘈杂和不完整。在金融领域,事件模型可用于预测股市趋势并做出明智的投资决策,在医疗保健领域,事件模型可以帮助识别病人数据中的模式和相关性,从而改进诊断和治疗计划,在网络安全领域,这些模型可以通过分析导致入侵的一系列事件来检测和预防潜在的网络攻击。

《Distilling Event Sequence Knowledge From Large Language Models》(https://arxiv.org/pdf/2401.07237.pdf)这一文章探索了如何使用大型结构模型(LLM)来生成事件序列,从而有效地用于概率事件模型的构建,假设是,在大型语料库中接受过训练的 LLM 已经收集了关于可信事件序列的所需知识,因此可以在适当的指导下生成多样化和高质量的事件序列,设计了一种新的上下文迭代提示策略,用于使用LLM生成高质量的事件序列。

1、实现思路

该工作将从LLM中提炼事件序列知识的任务分为两个子任务,如图2所示:

图片

 

(i)给定事件触发类型,生成新的、独特的事件序列;

(ii)挖掘知识图谱中尚未推导出的高置信度序列模式,并学习概率模型以发现复杂的事件序列规则。

图2中的每个事件类型都对应维基数据中的一个高级事件概念,这些事件概念没有相关的时间戳,但有因果关系(如has_cause或has_effect,例如地震导致海啸)。

其中,为了得到这些事件概念集合,从维基数据中整理出一个新的数据集,其中包含代表有新闻价值事件的高级事件概念(类)。

为此,在维基数据中查询了与维基新闻文章有链接的事件概念,这些概念是发生类的子类,即表示它们是有新闻价值的事件类的实例,为这些事件概念收集了50个顶级类,每个类都有多个标签(如冲突→冲突(心理)、争议、分歧等)。

这样,50个顶级类共产生了202个独特的事件标签,这些事件概念中的大多数都有一些因果关系(即has_cause或has_effect),可以使用这些关系对作为上下文示例来创建提示。

2、利用LLMs进行事件序列生成器

首先分析了LLMs将事件预测建模为条件生成任务的能力,这种条件生成任务可以zero-shot生成,也可以是few shot生成,目标是事件概念的线性化序列,首先用一个事件触发器提示一个大型语言模型(带有上下文中的示例)从一组定义好的标签中生成下一个概念,然后重复这一过程,直到得到一个所需长度的序列。

具体的提示如下:

图片

image

例如,给定一个事件触发器T,对生成长度为T的线性化字符串y的概率进行建模,该字符串包含依次跟随T的N个唯一事件概念,这是标准的条件语言建模目标。

图片

3、挖掘事件序列链

应用经典的模式挖掘算法(即 GSP)来识别潜在has_cause和has_effect事件序列链,为了在提取的事件类别之间推导出新的、未见过的关系(has_cause或has_effect),使用上一步骤生成的新事件序列,然后使用经典的频繁项集挖掘算法。

图片

图2右上角部分展示了整个工作流程的这一方面,即从事件序列中挖掘规则。

为了在zeroshot环境中生成新的事件序列,从一个事件触发器(如工作场所事故等概念)开始,创建一个带有描述期望关系的说明和一些上下文示例的提示(ICL提示),并将模型输出限制为原始的50个事件概念标签,以生成序列中的下一个事件。

将模型输出附加到另一个ICL提示中,其中包含连接事件示例(即问题形式为 "X、Y和Z之后会发生什么"),通过重复这一过程,直到达到预先设定的最大序列长度(本例中为10),或直到模型在k次最大尝试中无法生成词汇内应答(。

图片

用来挖掘新事件模式的经典模式挖掘算法(即GSP和SPADE)都是基于先验的方法。

在这两种方法中,给定相同事件概念类的两个序列 α=<a1,a2,...an>和β=<b1,b2,...bn>, α是β的子序列,表示为α?β,如果存在值集1≤j1<j2<...<jn≤m,使得a1?bj1,a2?bj2,...,an?bjn,则β是α的超序列,给定多个这样的序列和一个支持阈值,就能找到一组频繁事件子序列。

4、通过SuMM模型识别事件序列规则

了解在大量事件序列中导致给定事件类型的潜在影响事件,是分析多变量事件序列(即没有时间戳的事件,如模型生成的事件)的一个重要方面,来识别特定感兴趣事件类型的潜在影响事件(即父事件类型)。

图片

经典的k阶马尔可夫链通过模拟在前k个事件序列中观察到特定事件类型的概率来捕捉这些动态。

《Summary Markov Models for Event Sequences》(https://arxiv.org/abs/2205.03375)通过利用汇总历史事件发生情况的函数,以及识别影响相关事件类型发生概率的事件类型子集(这就形成了影响集),对其他事件序列马尔可夫模型进行了概括。

该工作利用LLM生成的序列来学习两种类型的SuMM:二元SuMM(BSuMM)和顺序SuMM(OSuMM)。在二元SuMMs中,只有相关历史中某个事件的存在或不存在才会对其他事件的发生产生影响,而在OSuMMs中,事件的顺序也会被考虑在内。

图片

例如,图1展示了使用BSuMMs学习难民危机和大规模移民事件影响集的示例。

大规模移民和饥荒这两个事件被确定为难民危机的影响事件。

大规模移民和饥荒同时发生时,作为事件序列的一部分,导致难民危机的概率为0.91。

另一方面,在没有饥荒的情况下发生大规模移民导致难民危机的概率为0.31。

总结

本文主要介绍了三个话题,是最近读起来稍微有趣的工作,其中介绍的数据构造方式、算法思路,可以再延伸阅读。

参考文献

1、https://arxiv.org/pdf/2401.10225.pdf

2、https://arxiv.org/pdf/2401.07237.pdf