要正确的使用GPT一众语言模型,我们首先需要有一个对这些语言模型的原理有一个大致的认知,得知道它能做哪些事情,为什么能做这些事情,不能做什么事情(表现差),以及为什么表现差。
首先我们明确几个概念:
AI,即人工智能,是使计算机模拟人类智能行为,以解决复杂问题的科技领域。但在近一年来,我们口中的AI很多时候指的是生成式人工智能(Generative AI),而我们所说的“大模型”实际上是指大语言模型(Large Language Models)。我们平时所说的AIGC(Artificial Intelligence Generated Content),其实是AI生成的内容的意思。诸如大语言模型(如GPT、Claude)、图像生成模型(如SD、DALLE)、视频生成模型(如SORA、KELING、LUMA)、音乐生成模型(如SUNO)等,都属于生成式人工智能的范畴。 关于现在生成式AI的思维导图可参考:
回到ChatGPT上,它并不能和GPT划等号,ChatGPT是OpenAI基于GPT的一个完整的聊天机器人产品。同样的,GPT也不能和LLM划等号,可以简单理解为GPT是OpenAI给自家模型起的名字,但实际上,GPT(Generative Pre-trained Transformer,生成式预训练Transformer)已经代指了现在主流LLM的通用架构。
LLM的原理其实相当简单,可以理解为一个词语接龙游戏(next token prediction)。模型基于前面的文本预测下一个最可能出现的词语,然后将新预测的词语包括在内,继续预测下一个词。这个过程不断循环,直到生成完整的文本。模型通过在大量预训练语料库上的学习,掌握了语言的结构、语法和各种知识,从而具备了一定的理解和生成能力。有一种观点认为,大语言模型相当于对全训练语料进行了一种有损压缩,模型的参数实际上是对这些数据的高度编码和压缩。
既然它只是一个词语接龙机,那为什么可以以对话的形式跟我们聊天呢?因为模型针对聊天这个场景做了专门的调整,实际上模型看到的是接近于聊天记录的内容,模型预测的是这个聊天记录最可能的发展方向。每一轮对话后,模型就会重新将所有上文作为input进行重新推理,所以在调用API的时候,对话轮数一多,消耗的token、你的账单就会噌噌往上涨。
那我们能无限的对话下去吗?自然是不行的,语言模型有上下文的长度限制,我们称之为上下文窗口(context window)。举个例子,在ChatGPT中,如果对话太长,最早的对话记录会被丢掉,因为模型吃不下那么多的文本,超过了能处理的限制,表现就是聊着聊着就忘记了前面的内容。
窗口大小现在也是前沿模型的一个重要研究方向,(比如Claude的200k,国产的kimi,还有谷歌gemini的1M、2M大小的窗口大小)。值得一提的是,现在ChatGPT(网页版)中GPT-4o的窗口大小是32K,要注意的是,token数并不等同于字数,这个是由模型的Tokenizer决定的,它是指将文本分割成小块的单词或符号,从而方便模型进行处理的基本单位。
在充足的窗口大小中,我们可以逮着一个线程一直使用吗?实际上并不推荐,前面有提到,模型对接下来答案的推理,会受到所有前文的影响。假设两个场景,场景一:我们给模型了一个和前文不相关的任务;场景二:紧密围绕前文给出了一个新的任务。毫无疑问,场景二中模型的性能表现应该优于场景一。
基于这一点,我们可以引出**少样本学习(few-shot learning)和上下文学习(in-context learning)**这两个概念,这两个概念就是基于让模型对前文中的内容进行学习,而控制模型输出我们想要的内容的一种手法。举个例子:
假设我们希望模型生成一段关于环境保护的演讲稿。在场景一中,我们直接给模型一个简单的提示:“请写一段关于环境保护的演讲稿。” 由于缺乏上下文,模型可能会生成一段较为普通的内容。而在场景二中,我们可以先提供几段高质量的环境保护演讲稿作为示例,然后再给出提示:“请写一段关于环境保护的演讲稿,类似于上面的风格。” 这样,模型就能基于前文的示例,生成更符合我们期望的内容。 这种方法就是所谓的少样本学习,通过提供少量示例,让模型学习并模仿这些示例的风格和结构,从而生成更符合预期的输出。而上下文学习则是通过在上下文中嵌入相关信息,让模型在生成内容时能够参考这些信息,从而提高生成内容的相关性和准确性。
我们知道了,模型给你的答案基于概率,它在生成的时候会逐token的基于概率选择下一个token是什么(*并不一定是选择概率最高的token,这里要引入**温度(Temperature)*的概念,简单来说,温度越低越倾向于选择可能性最高的token,更准确死板;温度越高,越鼓励模型选择其他的可能性,更有创造力更不可控)。这种原理就导致LLM有先天存在的弱项:
模型在说第一句话的时候,并不知道自己最后一句话会说什么
由于LLM的原理如此,它在回答你的问题的时候(尤其是复杂的逻辑推理),如果你要求它直接给出答案,那么大概率它会出错。因为LLM跟人类不一样,人类在回答问题的时候可以先在脑中进行思考推理,再讲出得到的答案;而LLM的推理基于前文,我们在要求它进行复杂的推理的时候,最好给它充足的时间和足够的token,让它“step by step”,一步步的进行推理,这可以很大程度上提升LLM的性能表现。这种技巧叫做CoT(Chain-of-Thought Prompting),这里给出GPT的解释:
精确计算
由于LLM是基于概率生成文本的,它在处理需要精确计算的任务时往往表现不佳。例如,当我们要求模型计算一个数字比较大的简单四则运算,它可能会给出一个看似合理但实际上错误的答案。这是因为模型并没有真正理解数学运算的规则,而只是根据训练数据中的模式进行猜测。针对一个复杂的数学问题,让它逐步推理,也有可能看起来解的头头是道,但是在中间某个位置就出了岔子,导致全盘皆错,即使是目前最强大的模型,在复杂数学问题上也是表现欠佳。但是这个问题实际上可以通过允许模型调用工具来得到一定程度上的解决。