ChatGPT 真是火爆全网了,铺天盖地的文章一个接一个。
最近我老爹都来问我:
“你的工作是不是跟那一串英文字母有关系?”
“是,但又不完全是。”
“儿子工作有出息啊~”
“别,我有可能被它干失业!”
前两天我老婆来问我:
“ChatGPT 能不能拿来帮我写公文?”
我转手给她看了看这个问题:
ChatGPT 能用来帮助公务员写材料吗?
她又问:“是不是国内太菜了?”
我不情愿地给予了肯定。
可见,大家对这个先进生产力是满怀期待的。去做一个 ChatGPT,对于国内大厂们似乎成为了正确且必须的事情。这周,微软已经向我们展示,在 ChatGPT 的加持下被重新定义的搜索引擎是一个怎样的产品形态。当大众沉浸于 ChatGPT 搜索的惊艳时,作为一个 NLPer,我在思考的问题是:对话式 AI 搜索是否一定强依赖于 ChatGPT/GPT3?在这种应用场景下,GPT 等语言模型是否一定要做到成百上千亿的参数量?
从忙碌的业务中抽出闲暇,经过两个晚上没睡好觉的思考,决定写下这篇文章,围绕着对话式 AI 搜索(不是对话 AI)的技术路线作出一些猜想,并浅谈相关的 NLP 核心技术或任务。
[ 笔者没有搜广推的工作经验,研究上有一点问答背景,工作上有一点对话背景。如果关于搜索的内容写得有问题,还望批评指正。]
Bing对话式AI搜索的产品形态
(一) 与传统搜索结合
直接明了,左侧网页排序结果,右侧 AI 答复。我们关注 AI 答复的内容:
- 汇总了不同来源的信息,并用虚线及引用符号注明来源;
- 加粗与答案相关的实体或短语;
- 层次分明的行文结构,流畅且语法正确的文本;
- 根据提问和回复的内容,给出了追问候选;
- 可以对 AI 答复进行正向或负向的反馈,并给出进入对话形态的入口。
(二) 像ChatGPT一样对话提问
对话即是交互,是传统搜索以及上述形态那种单轮技术向多轮技术的延伸。在问答形式上,新的输入可以是对原问题的修正,对 AI 答复的追问或否定,也可以是独立的新问题,等等。这也对算法和模型能力的要求更上了一个层次。
从视频中看到,相同的问题,AI 回答的文本内容是一致的,但拆成了多条内容来回复。为啥那么做?为了让回复的过程更像是在对话吧,估计是有个断句算法或小模型来支持的。
回归主题,在对话形态下,Bing 所做的事情就不只是搜索了,可以发挥起 ChatGPT 的所有的能力,比如闲聊,或根据用户的指令(Instruction)完成任务或工作等等。这里其实可以大胆猜想:Bing 里是否有一个模型来判断用户的意图是否是搜索,或者回答用户的问题是否要依赖搜索?然后去决定是根据原 Bing 搜索出来的信息去汇总,或是完全依赖 ChatGPT 输出。
写到这里,后背一凉,你说国内厂商会不会也搞个模型去选择是否调用 ChatGPT 的 API 呢?套个壳再搞点自己行业或领域特有的对话模型,然后宣称自研技术……这是诈骗,是诈骗啊。
本篇文章收缩视野,聚焦在对话式 AI 搜索上,暂时放下对 ChatGPT 的其他各项能力的执念,来思考:通往对话式 AI 搜索是否有捷径?我个人的答案:有,且不止一个。
技术路线“先检索后总结”
我们先看一下 Bing 官方是怎么说的:
通俗易懂,先检索后总结。个人认为这种方式是必然的,原因有以下几点:
1. ChatGPT 存在一定的信息滞后性。粗糙地说,基于 Transformer 的语言模型在训练过程中,将文本中语法、概念、常识等信息(或知识)转换为了模型中的参数 [1][2]。模型参数量越大,其能记忆住的信息就越多,训练足够充分的大语言模型就具备了一定通用化的能力。
如今,大模型仍然相对黑盒,信息更新需要参数更新,更新参数的一般方法都是再训练模型,而训练超大语言模型是费钱费时的,因而信息滞后。针对这个缺陷,还可以期待一下直接编辑权重的方法 [3],只是还需要一定的积累和验证,再发展成熟。
2. ChatGPT 容易犯事实性错误(这里心疼 Bard 一波),在搜索中这个缺陷会被放大。语言模型的语料很大程度上来自于互联网,暂且排除那些充斥着的虚假信息,正常人在互联网中写下的内容,都有可能存在错误。模型本身是不具备鉴别信息的能力的,这些错误数据都或多或少地参与到 GPT 甚至 ChatGPT 的训练中,导致了错误的输出结果。
3. Bing 的“先检索后总结”,对模型来说可以降低参数量门槛,因为原先模型是自己输出信息,现在是整理信息,难度小了,而对生成的内容来说,还可以做到信息可控。检索是搜索引擎的工作,做好总结就完成了前面提到第一个形态的 123。
信息检索:从文档到语句,从语句到短语
传统搜索引擎是根据用户查询,按相关性从高到低排序,反馈多个网页链接。很多网页里的内容并不是都跟输入的查询相关的,这些内容都交给下一阶段的模型去做总结,势必会带来很大的噪音,过长的文本还会给 Transformer 计算带来负担。因此,信息必须要精炼:
- 精炼到语句粒度,保持语义信息的连贯与递进,有利于下一阶段生成模型对文本逻辑的理解。
- 精炼到短语粒度,可支持像 Bing 那样对答案相关实体或短语的加粗或高亮。
在语句粒度上,这个精炼过程常见于 NLP 问答任务(Question Answering,QA),跟 HotpotQA [4] 抽取 Supporting Facts,TriviaQA [5] 抽取Evidences,NaturalQuestion [6] 抽取 Long Answers 都是一样的。
在短语粒度上,如果用户问题可以用短答案回答,就完全等同于 MRC。如果问题根本不存在短答案的形式,也可以抽取问题中的关键词,计算其与文档中的词或短语的相关性。
对于这两个问题,模型仍然依赖于预训练语言模型,不过小模型就达到不错的效果,但最关键的还是数据。
其实,这些早已是搜索引擎的必备能力,搜索引擎可以根据你的问题在网页的语句中抽取或高亮你要寻找的答案及句子。下面是一些示例,可以看到这个能力大家都是有的,只不过要通往对话式 AI 搜索,能力还需往多文档、多语句、多短语上延伸一下(说白了还是数据问题)。
答复生成:整理信息,总结答案
基于没那么大的语言模型的生成方案基于多篇文档提炼出来的信息,再次汇总整理,形成一段答复。这描述起来又像是另一个冷门的 NLP 任务——基于 Query 的摘要生成(Query-base Summarization)[7],但是这方面的研究工作实在太少了,中英文数据都不多,所以暂不参考。我尝试去拆解这一问题:最小语句集合的发现:假定上一阶段提炼出的语句,对于回答问题来说是充足的,那么从这些语句里提取出一个支持回答该问题的最小集合,作为后续生成回复的草稿。
- 在任务上变成了语句分类任务。
- 在数据标注上,将语句按文档的相关性进行排序后依次标注,ground-truth 也是唯一的。
- 在模型上,将问题 query 与提炼后的语句 sentences 拼接,用语言模型编码后用 sentence embeding 作分类。其实方法上又回到了上一阶段的语句粒度任务,合并在一个模型里感觉也行。
草稿补全:语句排列的过程,并使其内容通顺、层次分明。
在任务上仍然是生成任务,但是简化成了已有信息的排列补全。
在模型上,GPT/T5/BART/UNILM 等支持文本生成的语言模型都可以尝试,base 级别的参数量或许都够用。
关键问题在数据,除了投入人力直接写,目前思考有两个获取数据的方向:- 抽取式摘要(Extractive Summarization)的 ground-truth 作为输入,反向生成全文。只是一个思路,感觉会生成冗余内容。
- 无监督构造:获取任意一个段落做句法解析,删去连接词保留子句后随机排列作为输入,训练模型还原完整段落。
拿一个实际的 query 来举例,query 内容是“上海旅游三天攻略”,我将 bing 的传统搜索结果简化如下:
网页一:知乎回答 上海三天游,有何攻略?
推荐路线及景点:
Day1:城隍庙 — 豫园 — 南京路步行街 — 外滩
Day2:中华艺术宫 — 田子坊 — 上海新天地
Day3:上海杜莎夫人蜡像馆 — 陆家嘴 — 东方明珠广播电视塔
(3日游经典路线)
网页二:马蜂窝
路线概览
D1 上海城隍庙旅游区(2小时) → 豫园(1小时) → 南京路步行街(3小时) → 外滩(1小时)
D2 中华艺术宫(4小时) → 田子坊(2小时) → 上海新天地(2小时)
D3 上海杜莎夫人蜡像馆(3小时) → 陆家嘴(2小时) → 东方明珠广播电视塔(2小时)
网页三:上海本地宝
第一天:淮海路、城隍庙、新天地,晚餐,南京路步行街、外滩、JAZZ CLUB、茂名路酒吧街。
第二天:朱家角、徐家汇。
第三天:东方明珠、金茂大厦,午餐,多伦路,行程结束。以我提出的方法,最小语句集合就只有网页一,生成模型仅依赖网页一的内容生成答复。这里再假定用户追问“不想去城隍庙”,那么三个网页 Day1 的内容都应该在信息检索阶段过滤掉,最小语句集合的发现会过滤掉网页二,此时的草稿是网页一的“Day2、Day3”和网页三的“第二天”。在草稿补全阶段,生成模型依据新的三条语句再去生成答复。
基于超大语言模型的生成方案
如果有 ChatGPT 或 GPT3,这个问题似乎就简单很多了(本以为)。
Instruction Learning:以 ChatGPT 为代表,将检索后的信息输入给 ChatGPT 并后面补上一句“请根据以上内容,回答问题 xxx”。国产 ChatGPT 如果真的做出来了,未来估计会有大量的 prompt 工程师岗位和做 paraphrase 的工程师岗位……
In-context Learning 以 GPT3 为代表,将检索后的每个文档(标题+提炼后的语句)作为一个样本输入到 GPT3 里,最后写“标题:xxx \n 内容:_______”,让模型去补全。话不多说了,国产百亿参数的 GPT3 也是有的啊,咱们拉出来溜溜。我们以 去上海旅行两天,怎么安排行程?必去景点有哪些?的标题和回答的内容作为输入
- 调用 ChatGPT 时结尾加上“请根据本文的内容,给出上海旅行三天的行程安排。”
- 在调用 GPT 时,结尾加上“文章标题:去上海旅行三天,这样的行程如何安排呢?\n 文章内容:”
先看一下模范生的结果:
[ChatGPT]
如果是在上海旅行三天,那么可以根据两天的行程安排进行扩充。
第一天:住在黄浦区巨鹿路附近,游览老上海风貌的别墅,晚上去外滩走一走,可以坐观赏渡轮,或者去陆家嘴的东方明珠塔看一看,也可以去城隍庙逛逛。
第二天:去迪士尼游玩,住在迪士尼附近或迪士尼内部,在迪士尼里面玩一天,晚上住在迪士尼休息。
第三天:可以去人民广场,上海博物院,或者其他当地知名景点游玩,如果还有时间可以去田子坊逛一逛。
以上是在上海旅行三天的行程安排。
[GPT]
标题:去上海旅行三天,这样的行程如何安排呢?
内容:在上海旅行三天的话,首先可以安排去外滩和人民广场这些老上海的景点,也可以去黄浦区古镇和租界遗留下来的别墅。
随后去迪士尼或者豫园重新体会一下上海的文化风情;然后再到南京路步行街逛逛,在这里你可以看看最新最时尚的服装店、书店、电影院等等。
此外还可以去杨树浦公园、龙华寺、徐家汇大片区看一看。总之三天要加强休闲时间,如果能够在当地购物也是不错的选择。
再去 modelscope 上试一下国产百亿参数量的生成模型们,结果全都寄了,都有大量的重复,有的就是复制粘贴,有的第一天和第二天完全相同…… 我都怀疑,这真的是参数量不够?还是模型没训好?这里只列两个最大的生成模型:
小结
这篇文章,本是想梳理一下自己对技术路线的猜想,提出一个或可一试的方案,对,就是个 proposal,可没想到梳理的过程顺带给国内的百亿大模型泼了个冷水…… 嗯…… 任重而道远…… 那些声称 “类 ChatGPT” 已经进入内测阶段的大厂们,在公测时能达到怎样的效果,感觉不要抱以太高的期待比较好,或者说应该多一点容忍,但就怕是诈骗……
回到技术本身,做好信息的提炼和总结,至少就完成了对话式 AI 搜索的单轮目标,即一问一答,完成这一步或许并不困难。而下一步,从单轮向多轮的延伸,以及未来其他的能力,或许还是绕不开超大的语言模型。第一次在知乎上写文章,个人感觉写得潦草了点,如果有同学感兴趣的话,下一篇就不猜想了,来看一看新 Bing 发布会上展示出来的其他能力在 NLP 领域中对应的任务和技术,包含多轮对话、阅读理解、表格问答、问题生成、代码预训练等等。
参考文献
[1] Transformer Feed-Forward Layers Build Predictions by Promoting Concepts in the Vocabulary Space-https://arxiv.org/abs/2203.14680
[2] Transformer Feed-Forward Layers Are Key-Value Memories-https://arxiv.org/abs/2012.14913
[3] Mass Editing Memory in a Transformer-https://arxiv.org/abs/2210.07229
[4] HotpotQA: A Dataset for Diverse, Explainable Multi-hop Question Answering-https://arxiv.org/abs/1809.09600
[5] TriviaQA: A Large Scale Distantly Supervised Challenge Dataset for Reading Comprehension-https://arxiv.org/abs/1705.03551
[6] Natural Questions: A Benchmark for Question Answering Research-https://aclanthology.org/Q19-1026/
[7] Query-Based Extractive Summarization-https://paperswithcode.com/task/query-based-extractive-summarization/codeless