一、导言
首先介绍一下京东在电商场景下 AIGC 方面的探索。
这是一个商品营销文案自动生成的全景图,自下而上首先是商品的输入信息。输入信息是异构多源的,包括商品的商详页里的图片、文本、商品的标题以及商品的知识图谱。通用的知识图谱是三元组的形式,也就是头实体、尾实体以及关系,比如“中国的首都是北京”(头实体:中国;尾实体:北京;关系:首都)。在电商场景下,三元组的知识图谱转化为一个二元组,是一个“商品属性-属性值”对。商品里含有图片信息,也就是说实际上这是一个多模态文本生成的场景。当我们拿到这些较为丰富的信息后,会对信息做一些初步处理,包括提取它的卖点(描述了商品非常好的、值得大家去参考的一些价值点)、要素(对商品知识图谱的凝练,比如空调,它的要素就有电机、静音、能效等等,当描述到能效可能就会介绍到环保、节能、省电这样的要素和要素词的体系)。
信息得到初步处理后会进入模型侧。模型侧有编码器、解码器,因为输入信息是多模态的,所以编码器又分文本编码器和图片编码器。在解码器方面会使用受限解码、复制解码的形式来满足 AIGC 在电商这一严肃场景下的应用。除此之外也会用到现在比较流行的预训练语言模型、句间流畅度模型。句间流畅度模型是对传统解码器的加强,因为传统解码器最关注的点是词与词之间的衔接性(或者说连贯性),但是对短句与短句之间的衔接性的关注并不直接,所以需要加入一个句间流畅度模型加强短句之间的连贯性或者逻辑的一致性。
此外,还会涉及标点纠错模型,比如有时生成的文案会倾向于“一逗到底”(整个文案里面所有的标点都是逗号)。
最上面就是输出,输出是多种多样的文案,包括 50 字、100 字较短的文案,也包括 500 字甚至 1000 字更长的直播文案。
接下来给大家展示一些京东电商场景下的真实应用。
首先是京东 APP 的发现好货频道,这个频道内会给用户推荐优质商品,有图片、商品卖点标题以及商品文案等展示形式。
第二个场景是导购机器人,当和京东客服进行交流的时候,在人工客服或智能客服解答用户问题之前,导购机器人会根据用户需要咨询的商品,首先给他推送一条商品的介绍文案,预期达到通过介绍文案直接解答用户的一些疑问和进一步对商品进行促销的效果。
第三个场景是社交 APP 京粉,这是个社交团购的场景,通过对文案进行一些个性化的处理(加一些表情符号、促销信息),方便分享到社交平台。
第四个场景是直播机器人,直播场景下需要生成比较长的文案,有时可能超过一千字,用于给虚拟主播或者一些没有经验、没有运营团队的真人直播提供文案参考。
最后一个场景就是搭配购,搭配购和前面四个场景不同点在于前面四个场景都是为单一商品生成文案,搭配购是给多个商品生成文案。例中商品是上衣、裤子和书包,他们都是符合某一种风格的——比如颜色相近,或者说都是运动风——模型需要基于这种相似性自动生成文案对商品组合形成促销。
实际上,大多数使用场景的底层技术都是文本生成,或者说可控文本生成。也就是在相对严肃场景下,不借助人工的审核或编辑,直接生成文案展示给用户,并且不会出现一些比较离奇的、难以接受的错误,比如说描述出一个错误的属性,描述出一个不通顺的文本。
近年来,可控文本生成技术在学术界的关注也呈现出爆发增长的趋势,根据最近几年 NLP 领域两个顶会 ACL 和 EMNLP 的文本生成相关论文统计,2018 年之前相关论文投稿数仅有个位数,而到 2019 年之后出现了激增,并一直保持在两位数以上,说明相关话题在学术界已经得到了足够的关注。
那么如何做到可控文本生成呢?主要有三个角度去实现。
首先第一个角度,是从输入方面控制输入文本,我们知道“garbage in garbage out”,如果输入里面有非常多的垃圾信息,模型学习压力就比较大。比如说一些违反广告法的“最”、“顶级”等词,就不希望出现在输入里面。
第二个控制方向是词表,比如希望某些词(如卖点词、属性词、知识图谱相关的描述词)被鼓励,或某些词是被禁止的,我们可以以调整词表的形式,在解码端对词的概率进行调整。
第三个角度是模型,这是一个比较有效但难度也比较大的方式,例如可以通过改变解码器的初始化、解码器改变编码器的初始化、添加一些辅助任务以及做一些多任务学习来调整模型。
电商领域的文本生成研究面临着非常多挑战。
首先就是文本生成的基础挑战。所谓文本生成的基础挑战就是指无论在学术界使用,还是在做闲聊机器人、生成文案等任务时,都会面临的挑战,概括来说主要是希望生成的内容像人写的,有以下几个性质的表现:
- 重要性,让生成的文案会描述重要的内容而不是闲聊。
- 非冗余性,当生成一个较长的文案——例如 500 字文案——时,不会一直重复某一个角度。
- 可读性,要能比较流畅地表达。
在电商场景,会面临一些进阶的要求:
- 多样性,要求描述商品的角度非常丰富。
- 忠实性,要求描述出来的商品的属性必须符合商品知识图谱。
- 商品的内容的丰富性,比如说除了描述商品本身的信息外,还希望有一些常识性的信息,例如有一些和通用知识图谱相关的信息能够展示给用户,从而使文案的促销性更强。
接下来,我们将针对上述提到的四个方面正式展开介绍。一是基于电商知识图谱对真实性的控制,通过电商知识图谱使属性的描述更加忠实。二是基于通用知识图谱的内容丰富度拓展,让商品的文案里面不仅有商品信息,还有额外的能够引发用户共鸣的信息。第三和第四个角度是在大模型方面的探索——将领域知识和通用知识融入到大模型里。
二、基于领域知识图谱的商品文案生成
领域知识图谱可以定义成一个属性规格参数,比如说一款洗衣机的两个规格:
容量:9 kg,
产品类型:波轮洗衣机。
在这种情况下,有一些属性很容易出现描述错误的问题,比如说属性值为数字的容量。我们通过查询商品知识图谱,很容易得知这款商品的容量是 9kg,但实际上众多洗衣机里,还有各种其它规格的洗衣机,比如一些非常尾部的 1-2kg 的小型洗衣机,当模型描述这些数字相关的属性值的时候,很容易出错。我们可以回忆,早年在机器翻译任务比较火热时,对数字的翻译就一直是一个难题;现在在商品文案生成中,数字相关信息的处理也还是一个难点,尤其对一些低频的属性数值。而在电商场景下,数值是一定不能出错的,否则很容易引发用户的投诉。
在这里,我们想描述出真实的 9kg 这个属性值,如何让模型在解码(模型解码就是在一个大词表里面去找到一个概率最高的值,让模型去参考的信息是最正确的。)时找到最高、最好的那个正确值呢?模型可能有非常多的参考信息来源,第一种是模型通过理解输入,综合性地判断哪个属性值是正确的。第二种是,比如前面介绍的商品的各种描述——有可能来自于商品的标题,有可能来自于商品详情页的文本——在成百上千字的文本里,找到这个正确属性值。
第三种方式就是我想介绍的一个非常好的捷径——通过商品知识图谱直接查找。比如这里我们希望使模型意识到,当他在描述到“这款洗衣机的容量是”时,要形成一种模式让模型知道这里要描述的是商品容量属性。当模型能学习到这个模式,就可以直接去查询商品知识图谱,找到容量对应的属性值,确保一定不会出错。而不必通过综合理解输入来判断应该输入什么属性值,综合理解输入对于模型是非常难的。
综合来说,我们希望通过类似于检索的形式,让知识图谱充当一个指针,让模型查询知识图谱,从而使商品属性值一定不会出错。
如何用公式来表达这个过程呢?
首先是原始的复制机制,就是当拿到商品属性值时,在输入的所有信息里面找到一个正确的解码的词。那么我们提出的改进的复制机制就不仅仅是从输入的文本中进行复制,而是先找到 token 的属性类型,比如这里的“容量”,然后再检索”容量”这一属性对应的属性值,从而使这类属性值 token 的解码结果忠实度更高。
使用知识图谱参与到过程里的一个难题是如何使知识图谱能够提供足够的信息,电商平台上的商品可能是上千万甚至上亿的,很多商品的知识图谱是非常稀缺的。以服饰为例,电商场景下服饰是分 12 个季的,更换频率非常高,有的大店铺可能有几千上万件的商品,很容易有一些知识图谱的缺失现象。我们希望利用商品的信息去补齐商品的知识图谱,在补齐过程中,我们也注意到很多属性值在补齐过程中会有一些“奇怪”现象,比如有时候会描述一个尺寸,但是我们不知道尺寸是内径还是外径,有的会描述到一个长度,我们不知道是袖长还是裤长。但是通过观察商品的图片,我们很容易知道它的颜色,具体是描述哪个部分,或者说长度描述的是裤子还是上衣,所以我们希望利用商品的多模态信息——就是图片信息和文本信息——一起补齐商品知识图谱。
具体来说,商品的图片信息可以提供两方面的帮助,第一方面就是通过商品的图片能够清楚地知道某一部位的属性是什么。比如可以通过观察图片里衣服的领子部分,知道领子是圆领还是直领,所以这里用了一个局部的视觉门,就是想在描述不同的商品属性时,让模型关注到具体商品图片的某个区域。
第二个方面就是我们根据任务(我们定义的实际上是一个序列标注任务,就是从文本里边去抽出具体的属性对应的属性值)非常容易可以想到的方向:如何增强文本的理解。图片实际上和文本之间是有跨模态的联系的,所以我们希望利用图片的信息去提升模型对文本的理解,所以这里定义了第二个门——一个全局视觉门——去利用图片信息增强文本理解。最后在这两个视觉信息的帮助下,完成商品知识图谱的补齐问题。
下面是如何使用商品知识图谱进一步加强复制机制。
传统的文本生成模型在生成文本时有一个非常好的机制——复制机制。解码文本是由两部分构成的,第一部分是一个生成概率,需要计算生成词表里哪个词的概率是最大的,第二个方面是复制概率,计算在当前时刻输入里哪个词放到输出里,最终解码概率实际上是两个概率的叠加。传统的复制概率,在选择复制某一个词时,是从输入里去复制,但是生成概率则不一定。
比如这个“美的”的变频空调,我们探讨它会不会生成错误的“定频”属性,传统的复制概率在计算“定频”的解码概率时,是由两部分构成,复制概率(Pcopy)和生成概率(Pgen),因为输入中只有“变频”,没有“定频”,所以“定频”的复制概率为 0。但是生成概率,因为”定频”和”变频“这两个 token 都处于解码词表中,所以很难保证”定频“的解码生成概率一定等于 0。最终结论就是我们不能够确保传统的复制概率不生成一个错误的属性值——也就是”定频“。所以我们对这种现象进行了一个改进,就是在生成属性值的时候,将生成概率置 0,也就是说当生成属性值时,它的解码概率只剩下复制概率,只有出现在输入中的属性值才能被解码到输出里,这样就避免了错误的属性值出现在解码文本中。
接下来我们看一下最终的实验结果。我们使用了从属性词表里复制以及加入属性词 Only-Copy,最终就能够取得一个非常好的一个结果。从忠实度和可读性人工评价表可以看出,最早的也就是第一个模型 PGNet 是传统的 pointer-generator,传统的复制模型忠实度只有 64%,加入 Only-Copy 机制之后能提升到 93% 以上。
三、基于通用知识图谱的商品文案生成
接下来介绍如何将通用知识图谱用在商品文案生成的场景里。
我们在实际使用知识图谱时,存在知识图谱融合的问题,比如在使用商品知识图谱时,希望商品知识图谱和通用知识图谱互联,我们在这里互联是比较简单地使用产品词作为一个桥梁进行互联,比如一个方便面,我们从商品的知识图谱里知道产地、原材料等,但是通用知识图谱——就是右边绿色的图谱——能给我们提供更加丰富的信息,比如在食用方便面时能搭配什么,方便面的原材料会有一些什么,会有一些什么样的食用场景。在这种情况下,我们就能给用户提供更多的信息,比如当你在工作繁忙,没有时间做饭,你可以食用方便面,然后使文案更具有促销效果。
当然我们也注意到一个问题,就是当使用商品知识图谱时,当前商品的商品知识图谱——也就说它的属性和属性值——都是符合当前商品的。但是我们关联进来的通用知识图谱里的一些信息,它并不一定忠实于我们当前的商品。比如说方便面,是有小麦作为原料也有荞麦作为原料的,通常很难区分出哪个通用知识图谱引进的信息是忠实的,但是又希望能使用通用知识图谱,所以我们进行一定改进,将输入信息的信息来源做了一个 token,因为传统做编码时,基于 Transformer 模型是有两部分编码的,一部分是输入 token,另外一部分是位置信息,那么这时我们加入第三部分,就是 token 的类别信息,比如来自于商品类目的描述 token,它描述的是商品的产品词,然后 token 是来自于商品商详,或者说来自于商品的知识图谱,或者来自于通用知识图谱,那么引入 token 向量想要做什么事呢?就是当我们模型在解码时,在参考输入信息的过程中,如果是参考的是商品知识图谱应该完全信赖,但是在使用通用知识图谱时,应该选择性地使用,而不是一味从里面拿信息。
最终我们可以看一个 case,就是当我们引入通用知识图谱后,比如对于一款太阳眼镜,它的功效是能够减轻眼睛疲劳和强光的刺激伤害,引入通用知识图谱之后,它会对功效信息做一个描述,它描述的信息就是能够阻隔强光和有害光线对眼睛的伤害。我们在家电、服饰、食品三个类目上评测了 ROUGE 指标。所谓 ROUGE 指标就是衡量模型生成的文案和人工写的文案之间有多少相似度。可以看到,加入了商品通用知识图谱之后,也就是图里的红色柱形,ROUGE 指标有一定提升。
在使用改进之后,其实还有另外一个发现,就是当我们将 token 的类别信息加入后,模型对产品词的描述有一个比较明显提升。如果读第一个文案的时候,他没有提到耳机,我们有可能还认为它是一个手机,加入 token 类别向量之后,他明确地描述这是一款耳机,这其实对我们来说是非常希望看到的一个现象。
四、基于领域知识图谱的 LLM
下面分享一下我们在大模型方面的探索,首先是基于领域知识图谱的一个大模型。
近几年,大模型的发展非常迅猛,从 2017 年 Transformer 出现之后,这几年模型参数量已经由十亿、百亿,增长到了万亿级别。但是硬件资源进展却非常缓慢,还是停留在两三年前的 A100 这样一个水平,虽说现在推出了 H800、A800,但是实际计算能力上没有见到明显的提升,所以在这种情况下,到底应该怎么去看待大模型,也是值得我们思考的一个话题。
我们可以简单回顾一下,从最开始推出的大家关注到的通用大模型,比如说在自然语言理解 NLU(Natural Language Understanding)方向,有个非常里程碑式的就是 BERT(Bidirectional Encoder Representation from Transformers)模型,以及文本生成方向,有一个非常里程碑的 BART(Bidirectional and Auto-Regressive Transformers)模型,分别作用在文本生成、文本摘要或者一些翻译任务上。然后业界出现了一些基于通用知识的大模型,比如说基于知识图谱的 KGPT(Knowledge-grounded Pre-training),以及百度提出的 ERNIE。我们针对趋势做了一些思考,就是如何将大模型真正应用于产业界或者应用场景里为我们创造价值。我们最终得出的结论是领域大模型,面临的挑战是如何将领域知识图谱或者领域知识融合到大模型里面。
为了实现这一目标,我们首先要定义我们需要的领域知识,这里定义了四类领域知识:
- 比较通用的商品的知识图谱,比如商品的二元组信息,商品的一些相关联的通用知识图谱信息等。
- 商品的要素知识,要素知识其实是对商品知识图谱的一个凝练,商品知识图谱或商品属性的某些类目量级是非常大的,可能有几万甚至几十万这样一个量级,这导致某些尾部商品的知识图谱非常低频,所以我们需要对这些知识图谱,或者对他的一些 schema 进行一些重新设计,这就是我们的商品要素。
- 一些类别信息,比如说商品它是耳机还是手机。
- 商品卖点,我们希望卖点知识被我们文案生成模型更好的去捕捉到,从而有助于卖点文案生成的场景。
针对这四类知识,我们定义了五个预训练任务,前两类是比较通用的掩码的语言模型任务,分别是掩码生成单个词和掩码生成文本片段,我们在设计这样的任务时,也着重对知识信息优先去掩码。剩下三类是针对我们的知识去设计的三类预训练任务。第三类是商品的要素检测任务,因为在描述一款商品时会分很多角度,比如说在描述洗衣机时,会描述它的电机、是否静音,我们能否让模型意识到前两句是在描述电机,后两句在描述静音,实际上就是去检测这两个要素的分界点。第四个任务是商品的类别分类任务,我们需要让模型意识到商品的文案是在描述耳机而不是手机。第五个是商品的卖点短语,或者说商品卖点句,它的生成任务实际上是为了作用在 AIGC 场景里,通过设计我们希望模型在预训练过程中既能学习到一些语言相关的信息,也能学习到知识图谱相关的信息。
接下来是对我们模型的一个评价,我们分别测评了 NLU 任务和 NLG 任务,分别是知识图谱补齐、电商多轮对话以及商品摘要生成任务。一共测试了三类模型,一个是 C-PLUG,C-PLUG 就是通用的、不加入任何知识的模型;一个是 E-PLUG 就是将通用知识加入到模型里去;最后就是 K-PLUG,是将电商知识注入到模型中去。我们发现加入电商知识后,在我们电商领域下的三个下游任务上,模型表现有一个比较明显的提升。然后这里我们也给大家看一个非常有意思的 case,是一个电商场景下的真实场景。一个纸皮核桃,它的尺寸在三到五厘米,产地是新疆,然后模型根据商品的知识图谱回复顾客,顾客其实问的就是这是不是纸皮核桃,然后是不是特级的纸皮核桃。但是我们把问题输入给 ChatGPT,当然也是把商品的知识图谱以知识注入的形式输给了 ChatGPT,但是 ChatGPT 并没有意识到“特级”是什么意思,因为它没有特级的评价指标。但是如果是有领域知识的,就可以知道“特级”其实就是尺寸在三到五厘米的这个尺寸内,通过融入知识,模型能够意识到,如果它的尺寸是三到五厘米,那就是一个特级核桃。
这是我们在一个文本生成任务里的一个更直观的评测,我们发现三点:第一个就是融入知识后,拟人化更好,也就是 ROUGE 得分更高,模型生成的文案和人写的文案相似度更高。第二个角度就是描述更丰富,我们对比了通用预训练模型 T5,它的描述的长度只能达到 60 个字左右,而融入知识训练后,单条文案的描述长度能达到 80 个字以上。第三点就是它的可信度会更高,通过对模型进行人工评测,我们可以看到传统通用的预训练模型 T5 只能达到 76% 的审核通过率,而我们模型仅仅是融入知识的训练,没有做任何的后处理,就能达到 90% 的审核通过率。
五、基于通用知识图谱的 LLM
最后要分享的是如何使用通用知识图谱去加强预训练语言模型。
最初代的预训练语言模型有一个预训练方式是去噪的自编码器,就是选择性或者随机性地对输入文本进行掩码,输入在掩码过程中变成一个含噪音的输入,然后希望文本生成模型对输入去噪。但是我们发现其中有一些问题的,第一个方面是在训练过程中,模型不会对所有的信息进行区分对待,比如如果是对知识进行加强学习,我们会希望知识的掩码概率要大。第二个方面是在训练过程中,无论是掩码语言模型,还是现在比较流行的 Decoder-only 的语言模型,训练方式都是 Teacher-Forcing 的形式,就是当我们预测下一个词时,模型会给到上个词或者说历史信息的真值的词。
这里举一个例子,传统的预训练语言模型在预训练的时候,比如要训练 Tom Cruise 出生于什么地方,这时因为他真实出生地是纽约,那么在预测出生地第一个字时,模型可能根据上文“出生于”,预测出第一个字是“纽”,但是可能模型没有学习到这样一个知识,所以预测出来的是华盛顿,也就是算出来概率最高的第一个字是“华”,但是在预测第二个词时,模型不会将第一个词最高的那个概率“华”作为输入,而会把“纽”词作为输入预测“约”。这会导致虽然我们看起来模型使用的是“纽约”词做训练,但实际上它根本就没有学习到这个知识,它还是认为华盛顿才是 Tom Cruise 的出生地,也就是这种 Teacher-Forcing 形式并不足以使模型很好地学习到知识的表达。
为了解决这个问题,我们提出了一个不仅要在编码器或者在输入信息里加噪,还要在输出里加噪,就是当模型去预测这样的一个知识 entity(实体)时,我们并不只是用 Teacher-Forcing形式,而是要让他完整地预测,比如说在预测第二词“约”时,我们并不把“纽”作为一个输入,而是把噪音作为输入,例如一个[MASK]token,让模型完整地依次预测出“纽”、“约”这两个字。
具体来说就是传统的掩码只在 Encoder(编码器)端加噪,比如说对所有的词随机加噪,80% 换成一个[MASK]字符,10% 替换成随机字符,10% 保持不变,然后在 Decoder(解码器)端不再做加噪处理。但是我们提出的策略,不仅延续了在编码器加噪的处理,在解码器也会加噪。也就是在我们已经解码出的文本里,不是将一个 Ground-Truth 的 token 作为 Decoder 的一个输入,而是说有 80% 替换成一个[MASK]字符,10% 替换成一个随机 token,10% 保持不变的这样一个加噪方式,让模型去完整地预测出一个实体 token。当然,虽然我们这些工作是 2022 年 EMNLP 的工作,当时 Decoder-only 框架可能还没引起大家的轰动,但实际上,我们提出的训练框架也是能够很好适用于 Decoder-only 框架的。
我们也围绕实体 NLG 的任务,在 WebNLG 和 WikiBio 这两个数据上进行了测试,可以看到我们提出的面向知识的、在解码侧加入噪音的掩码预训练大模型的提升是非常明显的。