提升Azure OpenAI回答质量,嵌入还是微调?

时间:2022-01-18 01:19:26

1                   如何让Azure OpenAI回答质量提升?

相信大家在使用ChatGPT的时候,经常会遇到它一本正经的胡说八道,一些看似说得非常有道理,但是又总觉得哪里不对。比如下面例子:

提升Azure OpenAI回答质量,嵌入还是微调?

为什么ChatGPT会出现这样的问题呢?因为GPT模型是生成式的,所以它们不会生成“事实”或“真实”的信息。可能会生成正确的答案,因为它们在概率上是正确的答案,但模型无法区分真实和不真实的答案。它只是根据上下文和预训练选择最可能的标记。

       如何来提升GPT模型的回答质量呢?我们可以通过提示工程(Prompt Engineering)、嵌入(Embedding)、微调(File-tune)来实现。

2                   提示工程(Prompt Engineering)

GPT-X模型来源于大量互联网预训练数据,模型往往会产生非常有说服力和看似合理的答案,因此必须用心地设计安全过滤措施和模型的事实答案,让模型能够准确回答我们需要的答案。我们看看用默认的GPT-3模型回答问题:

提升Azure OpenAI回答质量,嵌入还是微调?

示例可以看出,小红和洋娃娃并不具备明确的性别标识,所以无法给出相关答案。那么这时候我们只需要在Prompt中给出相关的示例,经过提示的 prompt 会按照示例的格式和相关性回答你的问题。

提升Azure OpenAI回答质量,嵌入还是微调?

3                   嵌入(Embedding)

上面例子我们知道在Azure OpenAI GPT-3 API 提供的能力中,可以在 prompt 中增加上下文,来提高Completion 准确率和相关性。那么如何从自己的语料库中找到和提问相关的上下文呢?这时候就可以用到嵌入(Embedding)了,Azure OpenAI提供了Embedding接口,我们可以输入一段文字来计算出向量值,通过将「语料片段的向量」与「问题的向量」取「最相似的向量」,来判断问题和语料库(自己的数据)的相似度,便于模型来理解意义。比如,“狗”和“猫”这两个单词可能会被转换成非常接近的数字,因为它们都是宠物,具有相似的意义。

比如在构建一套知识库系统的时候,我们把自己的数据嵌入到模型中,告诉模型答案就在资料库中,来获取准确的答案。下面看看示例:

我们在一个知识库系统的Demo中加入了与Azure相关的文档,并添加到Embedding中。

提升Azure OpenAI回答质量,嵌入还是微调?

下面来试试提问,我们问了几个关于Azure虚拟机相关的问题,模型可以准确的通过我提供的文档来找到答案。

提升Azure OpenAI回答质量,嵌入还是微调?

4                   微调(File-tune)

Fine-tuning 主要是用来改善长期输出形式。相对的Prompt Engineering是短期/一次性改变输出的方法。fine-tune 的原理是在不改动(或不能改动)预训练模型的基础上,在模型「顶层」增加分类器或一些特征映射,使微调后的模型能够更贴合实际使用场景。

Fine-tune主要是为了节省每次答案提供相同 prompt 的 tokens,把类似的 prompt 可以训练成: 只需要更改具体问题,而不用重复写 上下文、示例。

GPT像个小孩, 它阅遍了全世界的书籍。它是通过主观例子来学习世界。 例子没有对错 ,只有相对好坏所以我们作为成人,也要用榜样/例子來引导孩子模仿,而非直接教他对或错,因为这样会破坏它的现有认知 。Fine Tuning就是用例子來引导GPT的过程。

5                   何时使用嵌入?何时使用微调?

l  我有一堆语料,想让 GPT依据我的语料输出内容 - 使用Embedding

l  想让 GPT 模仿一个一位睿智的的长者和我对话 - 使用Fine-tune

l  希望用户按照一定格式提交问题 - 使用Fine-tune

l  可以根据产品的使用手册来回答用户的问题 - 使用Embedding

建议在引入Azure OpenAI时首先做prompt engineering来验证提升潜力。 然后转为Fine-tuning 做长线改善以帮助节省token,降低TCO。