5.2 自然语言处理应用
1.把通用模型对齐到具体任务
上一篇我们已经把预训练聊得差不多了。预训练出来的语言模型,肚子里装的是通用的语言表示,底子相当好。可你要直接拿它去做一件具体的事,它未必就那么得心应手。说起来,它就像一个念了十几年书、什么科目都学过一点的通才学生,底子厚是厚,但你要让他去考研、去面试、去写毕业论文,还得再专门练一把。
那么在我看来,要拿这个通才模型去做一件具体的事,我们得先明确三样东西,输入是什么、输出是什么、拿什么标准来判断好坏。这三样东西在不同的应用里长得完全不一样,我们一个一个来说。
文本分类的输出是一组类别。比方说判断一条淘宝评论是好评还是差评、一条微博是正面情绪还是负面情绪、一封邮件是不是垃圾邮件(还记得我们第一章开头那个垃圾邮件的例子吧)。这种任务就是把一段文字塞进模型,模型吐给你一个类别标签,干净利落。我再举几个别的行业的例子。现在不少银行用文本分类来给投诉工单分紧急程度,医院也用它给病历做科室归类,物流公司还拿它识别快递单据的类型,做的事情其实都一样,把一段话归到一个标签里。
信息抽取要做的事情更细一点,它得从一篇文本里揪出实体和实体之间的关系。比方说你喂给模型一篇财经新闻,让它告诉你谁收购了谁、花了多少钱、哪天签的约。我之前翻过一本讲金融分析的书,里头提到分析师每天要读海量公告,靠的就是这类技术把关键数字抽出来。再比如医学领域,从一份病历里抽出患者症状、用药记录、过敏史,靠的也是同一套办法。这种本领对各行各业处理文本的人都特别友好。
生成任务难度就更高了,它要模型自己写出一段符合要求的文字。比如写封请假邮件、续写一段斗破苍穹、按大纲写一篇课程报告。某部很火的动漫里有个经典情节,主角靠一本神秘书册自动生成作战计划,其实今天的大模型做的事和这本册子有几分神似,都是根据上文接着往下写。这种任务里模型的输出变成了一长串像模像样的文字,难度比贴个标签高多了去了。
你看,同一个底座模型,配上不同的任务目标(也就是告诉模型该往哪个方向使劲)和不同的训练数据,就能表现出截然不同的本事。这件事在行话里叫把通用模型对齐到具体任务,听起来挺唬人,其实就是给通才学生定个专业方向,让它从什么都会一点的万金油,变成一个领域的熟手。
2.生成其实是在一次次算概率
生成任务听着玄乎,其实它背后那套逻辑挺朴素的。语言模型生成文字的过程,本质上就是在一遍遍地给下一个词元分配概率。词元(token)是模型处理语言的最小单位,你可以粗略理解成一个词或者一个字。
我们先认识几个符号。给定前面已经生成的所有内容 ,这里的 表示第 个位置之前的全部词元( 就是位置编号,从1开始数),模型会算出第 个词元 的条件概率,记作 。中间那根竖线念作在什么什么条件下,整个式子的意思是,已知前文的情况下,下一个词元是某个具体词的概率有多大。把一段话里每一个位置的条件概率乘起来,我们就得到整段话总体出现的概率,写成数学式子就是:
这里 是连乘符号,意思是从第一个词元到最后一个词元,每个位置的条件概率 全部相乘,乘下来的结果就是整段话被生成出来的总体概率。
举个接地气的例子。你给模型开头一句今天我去食堂,让它往下续。模型会算在前文已知的情况下,下一个词元是吃了的概率多大、是买了的概率多大、是见到老朋友的概率多大,然后挑一个接着写。每写一个词元,就把前文更新一下,再算下一个,循环往复,一段话就续出来了。其实这逻辑和我们人说话时脑子里默默猜下一个词的过程还挺像。我记得有个很有名的篮球运动员接受采访时说过,传球高手在球出手前就已经在预判队友下一个跑位,语言模型猜下一个词的套路和这种预判颇为相通。
生成的时候模型就是根据这个概率分布来挑下一个词元。怎么挑很有讲究,不同的挑选策略会影响生成文字的稳定程度、丰富程度和出错率。有的策略喜欢挑概率最高的,生成稳但容易翻来覆去说一样的话。有的策略愿意冒险挑点冷门词,生成丰富但容易跑偏。这块我们后面讲生成策略的时候会专门展开。
这里有一点要特别强调。模型给出的概率高,只代表按语言的统计规律这个词最可能出现,并不代表它说出来的就一定是事实。语言模型的目标是生成像人话的文本,至于内容对不对,它自己可不敢打包票。这也是为什么大模型经常一本正经地编故事,你问它一部压根不存在的电影,它能给你编出导演、演员、剧情、票房一条龙,读着还挺像那么回事。小张前阵子就在这事上栽过跟头,他拿大模型查一篇文献的出处,模型信誓旦旦给了作者、期刊、页码,他兴冲冲写进报告,复核时才发现这篇文献根本不存在,全是模型编出来的。这个毛病在行话里叫幻觉(hallucination),是当下大模型最让人头疼的毛病之一。
3.问答和事实性:顺嘴不代表对
问答系统是语言模型特别受欢迎的一个应用。你想想ChatGPT这种能陪你聊天、能给你答疑解惑的工具,本质上都是问答系统在干活。但是问答这件事,它其实要同时搞定好几件事,先得听懂问题在问什么,再从可能的来源里挑出相关信息,最后把答案组织成通顺的话。哪一步没做好,回答都得翻车。
模型生成的回答读起来通常挺顺溜,可顺嘴绝不等于正确,事实性还得单独去查证。怎么说呢,这就好比班上那个口才最好的同学,讲起来一套一套的,但你真去翻教材才发现他记错了好几个数。顺嘴和正确完全是两码事,听着像那么回事和真的是那么回事,中间还差得远。我记得有位很有名的科普作家写过,通顺的话和正确的话之间隔着一道很深的沟,这道沟只能靠查证一点点填上。
所以实际工程里的问答系统往往会接上外部的知识库、检索到的资料或者带引用的来源,让回答有据可依,免得模型全凭自己拍脑袋瞎编。这种接上外部资料来辅助生成的做法,就是现在很火的检索增强生成(RAG)的思路。你不妨把它想成把闭卷考试改成开卷考试,模型答题之前先翻一翻参考资料,答得就靠谱多了。RAG这个思路现在基本是各大厂商做问答产品的通行做法,可见光靠模型自己背的那点知识是真的不够用。
4.怎么评价生成的文本
你以为把生成模型训出来就万事大吉了?还早呢,怎么评价它生成的好不好,这又是一件相当难啃的差事。
评价一段生成的文本远比想象中复杂,得从好几个角度一起看。内容对不对(这叫正确性)、跟问题搭不搭(这叫相关性)、该说的说全了没(这叫完整性)、有没有产生有害内容(这叫安全性),每一项都不能落下。这就好比体操比赛里裁判给一套动作打分,你总不能只看落地稳不稳,还得看难度、完成度、姿态,哪一项弱了这套动作都拿不到高分。
这里还有一个让人头疼的地方。没有任何一个自动指标能把这些方面一口气全覆盖。常用的自动指标里,BLEU看的是生成文本和参考答案在词这个层面上的重合程度,它最初是为评价机器翻译设计的,偏向精确率。ROUGE看的是参考答案里的关键内容被生成文本召回了多少,常用来评价摘要,偏向召回率。它们各有各的适用场景,但也都有局限,比如对同一个意思换种说法打分就掉得厉害,更别说去判断事实对错了。所以一个认真的系统除了跑自动指标,还需要人工评测、专门构造的边界样本和细致的错误分析,才能把模型的真实水平摸清楚。说穿了,自动指标能帮你筛掉一堆明显拉胯的模型,但真正分高下还得靠人一点点去抠。
训练出一个会说话的模型只是上半场,怎么评估它、怎么让它说得靠谱,是同样难啃的下半场。这其中的麻烦程度,你想想就知道了。
练习
Q1. 把通用预训练模型用到具体任务上,业内叫"对齐到具体任务",这个"对齐"具体指什么?
对齐就是明确三样东西:输入是什么、输出是什么、拿什么标准判好坏。不同任务这三样长得完全不同,文本分类输出是一组类别标签,信息抽取输出是实体和关系,生成任务输出是一长串文字。同一个底座模型,配上不同的任务目标和训练数据,就能从万金油通才变成某个领域的熟手,这件事本质上是给模型定个专业方向。
Q2. 语言模型生成文本时,整段话的概率写成 ,这里的连乘为什么用乘法而不是加法?
因为每个词元 在前文 已知条件下的出现是相对独立的事件(条件独立假设),多个独立事件同时发生的概率要按乘法规则连乘。加法是用来算互斥事件"至少发生一个"的概率,和这里"一整段话都恰好出现"的含义对不上。连乘的结果就是整段话被生成出来的总体概率,模型要让它尽量大。
Q3. 易错点:大模型回答读起来特别顺溜,能不能就当成它说的都是对的?
不能。顺嘴不等于正确,这是两码事。语言模型的训练目标是生成像人话的文本,它给出概率高的词只代表按统计规律最可能出现,并不代表事实成立。这种一本正经编不存在内容(比如编出压根不存在的文献、电影)的毛病叫幻觉(hallucination),是当下大模型最让人头疼的问题。工程里问答系统往往会接外部知识库或检索资料(RAG思路),让回答有据可依,光靠模型自己背的那点知识不够用。