blog

Bob背后的大语言模型技术

2023-05-29
AI 技术 大语言模型

这篇文章是我在 2023 年夺得黑客松冠军项目”Bob”的技术分享。鉴于这两年大语言模型技术发展迅猛,有些内容可能已经过时,这篇文章仅作记录。

引言

在去年的十一月,OpenAI 发布了基于 GPT-3.5 架构的大语言模型。该模型不仅可以通过自然语言对话进行交互,还能够处理相当复杂的语言任务,如自动生成文本、问答和摘要等。这一推出瞬间掀起了互联网界的 AI 热潮。今年三月,OpenAI 又推出了更加强大的多模态模型 GPT-4。这样的发展速度意味着人工智能已经成为推动创新和变革的重要引擎。随着巨大的数据集和强大的计算能力的迅猛发展,我们正处于一个前所未有的技术交汇点上。AI 正在逐渐渗透到各个领域,改变着我们的生活方式、商业模式以及社会互动方式。

其中,作为 AI 领域的一项重要技术,大语言模型引起了广泛的关注和研究。大语言模型基于深度学习,通过大量的训练数据和复杂的算法,能够理解和生成人类语言,实现自然语言处理、对话系统和文本生成等任务。这种技术的出现为我们带来了前所未有的机会和挑战。

在这个背景下,我们有幸参加了公司的黑客松比赛,并组建团队开发了一个基于大语言模型技术的项目,名为”Bob”。通过这个项目,我们不仅成功地创造了一个可以扮演多种角色的虚拟人物,还探索了大语言模型在实践中的应用潜力。

接下来,我将详细介绍我们在黑客松比赛中夺得冠军的项目,并深入讨论我们如何利用大语言模型相关技术,以及如何运用这些技术来打造一个像”Bob”一样的聊天机器人。这个项目不仅代表了我们团队的努力成果,也代表了 AI 技术在解决实际问题中的突破和创新。让我们一同探索这个令人激动的旅程!

什么是 Bob

在开始之前,请允许我花点时间向您介绍一下”Bob”。Bob 是一个基于大语言模型的视频会议虚拟销售机器人。它具备无人值守的 7x24 小时服务能力,包括与客户进行聊天,从知识库中查找相关信息以回答客户的问题,针对客户的痛点推荐公司现有产品功能,演示部分会议的功能,让潜在客户提前体验公司的产品价值,并展示产品价格表等等。除此之外,Bob 还能记录和总结与潜在客户的对话过程,评估他们的购买意向,并将这些信息发送给销售团队以便进行后续跟进。当然,拥有这些能力的 Bob 不仅仅可以充当虚拟销售,还可以担任会议秘书、工作助理、DJ 主持人等角色。

如何实现 Bob

那么如此强大且有趣的 Bob 是怎么实现的呢?

基于 Bob 现有的能力,我们使用了以下几种关键技术:

  • STT(Speech to text): 语音转文字让 Bob 可以“听”
  • TTS(Text to speech):文字转语音让 Bob 可以“说”
  • Embedding:Embedding 技术让 Bob 可以基于知识库内的知识回答用户的问题
  • Prompt Engineering:Prompt Engineering 让 Bob 拥有分析,推理和拆解的能力

STT 与 TTS

其中,语音转文字(STT) 和文字转语音(TTS) 技术让 Bob 拥有了 “听” 和 “说” 的能力,Bob 便可以与客户进行语音对话。语音转文字(STT) 和文字转语音(TTS) 技术已经广泛地应用在智能语音助手、电话客服等领域。属于比较成熟的技术,我们这里就不再赘述。

基于知识库的 Embedding 技术

什么是 Embedding

Embedding 技术是一种将文本转换为向量的方法,是一种在自然语言处理(NLP)中用来表示词语、句子或者整个文档的技术。

在一般的自然语言处理任务中,我们需要一种方式来表示词汇和语句,使得计算机能够理解和处理它们。一种常见的方法是使用 one-hot 编码。

One-hot 编码的工作方式是为每个类别创建一个二进制列。假设有一个包含五个类别的数据,那么 one-hot 编码将会为每个类别创建一个新的列,并使用二进制(0 或 1)来表示该类别是否出现。

例如,假设有一个 “颜色” 列,包含 “红色”、“蓝色” 和 “绿色” 三种颜色,使用 one-hot 编码后,你将得到三个新的列:

  • 红色:(1, 0, 0)
  • 蓝色:(0, 1, 0)
  • 绿色:(0, 0, 1)

在这些新的列中,如果某个颜色出现了,对应的位置就标为 1,其他位置标为 0。这就是为什么叫做 “one-hot” ——因为每个编码中只有一个位置是 “hot”(即为 1)。但这种方法有两个主要的问题:一是无法表达词语之间的相似性,二是在处理大规模词汇表时,这种方法的效率很低,需要大量的存储空间。

Embedding 技术是为了解决这些问题而出现的。它使用实数向量来表示词汇,这些向量通常是由神经网络学习得到的。这种表示方法有几个优点:

  1. 它能有效地处理大规模词汇表,因为每个词的向量表示只需要几十到几百个维度,远小于 one-hot 编码的维度。
  2. 通过训练,词嵌入可以捕捉到词语之间的相似性。例如,“dog” 和 “puppy” 这两个词的向量可能会非常接近,因为它们在很多上下文中是可以互换的。
  3. 同样地,词嵌入还可以捕捉到一些语义和语法的规律。例如,“king” - “man” + “woman” 近似等于 “queen”。

常见的词嵌入模型包括 Word2Vec、GloVe 和 FastText 等。在处理复杂的自然语言处理任务,如情感分析、文本分类、自然语言生成等时,它们都有非常好的效果。

为什么需要用到 Embedding 技术

我们知道,LLM 虽然强大,但是他们的训练数据具有一定的时效性并且使用的是公开可访问的数据。因此,如果我们想让 LLM 有理解和回答公司内部产品信息的能力,就需要进行一些额外的处理实现。

首先想到的方案是对大模型进行 Fine-tuning,Fine-tuning 是一种迁移学习的技术,通过在预训练的模型基础上进行微调,使模型适应新的任务。Fine-tuning 的优势在于,它可以利用预训练模型的通用知识,减少训练新任务所需的数据和时间。但这也意味着我们需要准备好足够多的数据对模型进行微调,然而在我们的研究中,由于数据集不够多,所以 Fine-tuning 的效果不是很好。

并且 Fine-tuning 还有一些其他问题:

  1. Fine-tuning 模型可能会忘记预训练阶段学到的知识。这是因为在微调过程中,模型参数可能会发生大幅度的改变,导致原来在预训练任务上学到的知识被遗忘。这个问题在微调多个任务时尤其明显。
  2. Fine-tuning 模型和 LLM 模型一样,都存在一个时效性问题。某个时间点前训练过的数据,就可以回答,之后的就不行了,而一次 Fine-tuning 通常需要动用较大的算力和成本。不仅如此,对微调模型的评估也是一个非常复杂的工程,任何参数的权重调整,都可能影响到之前优化好的任务。

基于这些问题的考量,我们在现有的资源和时间内不太可能使用这种方案,于是我们选择了基于 Embedding + 向量数据库的 Q&A 。

如何使用 Embedding + Vector Store

首先,我们需要构建一个知识库,这个知识库可能包括各种格式的文档和数据,在这里我们提前准备的是公司的 support 文章数据, 通过一个简单的爬虫把文章页面爬取下来并进行数据清洗和过滤,这样有助于更好地提取语义信息。下一步便是使用大语言模型将所有准备好的内容进行向量化,这些向量会在多维空间中表示出文本的语义内容。将生成的向量存储到向量数据库中,以便后续进行高效的相似度检索。这种数据库通常使用一些高效的算法,如 k-近邻搜索(k-NN)等,来实现快速查找。在我们收到用户的问题之后,我们也用同样的大语言模型将问题转换为向量,并通过向量数据库,找出与这个问题向量的余弦角度相近的 top-k 的内容,并将这些内容作为问题的上下文和问题一起发送到大语言模型,生成更加自然、连贯的回答。通过这种方式,我们利用了大语言模型强大的语义理解能力,结合 Embedding 技术和向量数据库的高效查询能力,构建出一个既准确又高效的知识库 Q&A 系统。

Prompt Engineering

什么是 Prompt Engineering

Prompt Engineering 是一种在使用大型预训练模型(如 GPT-3 或 GPT-4)时,优化输入提示以获得更好输出的方法。“Prompt”在这里指的是输入给模型的查询或命令,而 “Engineering” 则是指设计和优化这些查询或命令的过程。GPT-3 和 GPT-4 等模型是通过预测下一个词来生成文本的,它们会根据给定的输入(或者 “prompt”)来生成相应的输出。Prompt Engineering 的目标就是找到那些能激发模型产生最好、最相关输出的输入提示。

例如,如果你想让模型写一首诗,你可能会发现给出 “写一首关于春天的诗” 这样的提示可能不会得到你期望的结果,而如果你更具体地指定格式和风格,如 “写一首十四行的奏鸣诗,描述春天的复苏和新生”,那么你可能会得到更好的结果。

Prompt Engineering 可以涉及许多技术和策略,包括:

  • Zero-Shot:模型根据给定的提示直接生成预测,而不需要任何先前的类似任务经验。
  • Few-Shot:模型先被给予几个示例,展示任务的要求和预期输出,然后再根据给定的提示生成预测。
  • Chain of Thought (CoT):这是一种新的策略,模型首先回答一个问题,然后使用该答案作为下一个问题的一部分,这样可以形成一个 “思考”的链条,帮助模型处理更复杂的任务。

Prompt Engineering 是自然语言处理(NLP)中一个非常活跃的研究领域,他的目标是找到最有效的方法来利用大型预训练模型的能力。下面我将详细介绍提到的三种策略:

零样本提示(Zero-Shot)

Zero-Shot Prompting 是一种自然语言处理技术,可以让计算机模型根据提示或指令进行任务处理。我们平时常用的 ChatGPT 网页端就是用的这个技术。传统的自然语言处理技术通常需要在大量标注数据上进行有监督的训练,以便模型可以对特定任务或领域进行准确的预测或生成输出。相比之下,Zero-Shot Prompting 的方法更为灵活和通用,因为它不需要针对每个新任务或领域都进行专门的训练。相反,它通过使用预先训练的语言模型和一些示例或提示,来帮助模型进行推理和生成输出。简单来说,就是不对大语言模型提供任何额外的信息,直接运用它的能力去得到我们想要的结果,例如如果我们想让它区分一句话是积极还是消极的,只要说 “Classify the text into neutral, negative or positive.” 然后提供文本,它就会输出相应的类别结果。

少样本提示(Few-Shot)

Zero-Shot 虽然简单,不过在面对稍微复杂一点的任务时,输出会比较不稳定。于是,就有了一种叫 Few-Shot 的技术。这个方法最早是 Brown 等人在 2020 年发现的,论文里有一个这样的例子,非常有意思,通过这个例子你应该更能体会,像 ChatGPT 这类统计语言模型,其实并不懂意思,只是懂概率。

Brown 输入的内容是这样的(whatpu 和 farduddle 其实根本不存在):

A "whatpu" is a small, furry animal native to Tanzania. An example of a sentence that uses

the word whatpu is:

We were traveling in Africa and we saw these very cute whatpus.

To do a "farduddle" means to jump up and down really fast. An example of a sentence that uses

the word farduddle is:

Output 是这样的:

When we won the game, we all started to farduddle in celebration.

包括上述图示中的例子,我们尝试给 ChatGPT 一些不一定准确的案例:每一行,都写了一句话和一个情感词,并用 // 分开,但给这些句子都标记了错误的答案,比如第一句其实应该是 Positive 才对。但我们发现:

  1. 即使给内容打的标签是错误的,对于模型来说,它仍然会知道需要输出什么东西。换句话说,模型知道 // 划线后要输出一个衡量该句子表达何种感情的词(Positive or Negative)。这就说明,即使给的标签是错误的,或者是否基于事实,并不重要。标签和输入的文本,以及格式才是关键因素。
  2. 只要给了示例,即使是随机的标签,对于模型生成结果来说,都是有帮助的。

在 Bob 中,我们大量的使用了 Few-Shot 技术,例如提供一些样例给到大语言模型,帮助它做决策,决定基于当前的聊天内容,下一步应该采取什么行动,是聊天,或是推荐内容,亦或是演示某个功能等等。

链式思考提示(Chain of Thought)

Few-Shot 也是有一定的缺陷的,例如下面这个例子:

Prompt:

The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.

A: The answer is False.

The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.

A: The answer is True.

The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.

A: The answer is True.

The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.

A: The answer is False.

The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.

A:

Output:

The answer is True.

显而易见,答案是错误的,实际上答案应该是:

Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.

那么,我们该怎么解决这个问题呢?

Jason WEi 等人在 2022 年的论文中引入了链式思考(CoT)提示,通过中间推理步骤实现了复杂的推理能力。一般 CoT 会和少样本提示相结合,以获得更好的结果,以便在回答之前进行推理的更复杂的任务。例如上面这个错误的例子,通过修改 prompt 如下:

The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.

A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.

The odd numbers in this group add up to an even number: 17, 10, 19, 4, 8, 12, 24.

A: Adding all the odd numbers (17, 19) gives 36. The answer is True.

The odd numbers in this group add up to an even number: 16, 11, 14, 4, 8, 13, 24.

A: Adding all the odd numbers (11, 13) gives 24. The answer is True.

The odd numbers in this group add up to an even number: 17, 9, 10, 12, 13, 4, 2.

A: Adding all the odd numbers (17, 9, 13) gives 39. The answer is False.

The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1.

A:

就会输出正确的答案

Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.

最后需要注意的是,链式思考(CoT)仅在使用大于等于 100B 参数的模型时,才会生效。

Bob 项目中的部分 Prompt 展示

下面提供两个 Bob 项目中用到的比较核心的 prompt 供大家参考:

结语

以上被介绍的技术,不仅目前都被运用到了 Bob 项目里,并且他们也是业内运用较为广泛的技术。除了提到的这些内容,在这次的黑客松项目里也出现了不少非常有意思的东西,以及 China AI swat team 也实现了不少有价值的技术,包括长文本拆分,Summarization 评估系统,LLM Ops,AI Service 基建等等,基本可以满足我们项目里会应用到的一些用户场景,给用户带来新的体验价值。然而,尽管大模型展现出了强大的能力,我们还是不得不承认,这些模型也有自身的缺陷和限制。比如请求频率的限制,处理速度的限制,以及输出稳定性的问题等等。虽然我们目前已经能通过一些比较高级的 prompt 技术解决输出稳定性的问题,但还有更高级更新的技术值得我们去探索,例如我最近翻阅到亚马逊的科学家发表了一篇关于解释自动链式推理(Auto-CoT)的论文,让大语言模型拥有了自动化的链接推理能力,非常值得反复阅读;以及微软也发表了一篇基于 GPT-4 的评估技术论文,称为 G-EVAL,号称效果比目前业内流行的评估系统包括 UniEval/BERT/BART 等效果都要好,非常值得我们去学习并应用我们的项目中来。

未来,大语言模型的训练和应用将会更加精细,更加个性化。随着算力和数据的增长,以及大语言模型的迭代,模型将能够理解更深层次的语义和语境,生成更准确、更创新的输出。在更广泛的层面上,我们也会在未来看到大语言模型在教育、医疗、娱乐、艺术等更多领域发挥其作用。教育中,模型可以提供个性化的学习支持,帮助学生理解复杂的概念。在医疗领域,模型可以协助医生进行诊断和治疗决策。在娱乐和艺术领域,模型可以创作出令人惊叹的作品,拓宽我们的想象空间。

所谓大语言模型未来所能达成的目标,纵观其实际可能性必然超越当下所能揣度。期许未来会有更多人能通过创新和努力,持续致力于解决模型存在的问题,提高模型的性能,发掘模型的新应用,用更创新和优质的产品给用户带来更多的惊喜和价值。

引用