LLM 初探

1 阅读9分钟

大模型工作原理

LLM auto-regression 来源: jalammar.github.io/illustrated…

上面这个动图展示了大模型工作原理,有点类似文字接龙。

  1. 输入recite the first law $ ,大模型预测出下一个单词是 A

  2. 将输出的 A 拼接在之前的输入后面,再次送进大模型(recite the first law $ A )继续预测,得到下一个输出 robot。以此类推,得到最后的输出结果。

那么大模型是进行预测的? 首先会将每一个输入的文本进行编码,将这些文本转化成一系列的数字,这步一般叫做 tokenizer 。

可以在 platform.openai.com/tokenizer 在线输入和预览。可以看到对于同一个文本来说,不同的模型对应的数字可能是不一样的。

不同模型同一文本对的数字 ID

目前的大语言模型可以看做是一个巨大的分类模型。因为文字是有穷的, 将所有的文字赋予一个唯一编号 (tokenizer), 训练过程就是将互联网上的资料压缩在黑盒中形成概率权重,每次预测就是输出对所有 token 出现的概率值。

如果每次只取概率最高的值,这意味的每次输入相同,输出的文字应该都是一样的。这样缺少了多样性,为了多样性,会先取前 K 个概率高的ID (Top K),然后将 K 个 token 的按照概率高低依次累加,直到达到设定的 top-p 值(Top P) , 随后它们的概率根据设置的 tempature 重新调整,然后随机(seed 值)取其中的一个值。

其中 tempature = 1 时,这些 token id 的概率分布保持原样,当 temperature 越高, 这些 token id 概率分布越趋近均匀,tempature 越低,这些 token id 概率分布越尖锐。

最后阶段来到 token id 的选取阶段,由 seed (种子值) 控制。因此如果 top k, top p, tempature,不做任何调整,但是每次输入同一个 seed 值,模型输出的值是一样的。这个特性常常用于 evaluation 阶段。

temperature 对 token id 概率分布的影响

LLM 常用参数 & 特性

  • Top-K & Top-P & temperature
  • context window
  • structure output
  • tool use
  • prefix cache & chat prefix completion

Top-K & Top-P & temperature

在 Top-K、Top-P、temperature 参数的设置,取决于具体的应用和期望的结果,并且这些设置相互影响,需要理解所选模型如何组合不同的采样设置。

token 采样规则:先取前 K 个概率高的ID (Top K),然后将 K 个 token 的按照概率高低依次累加,直到达到设定的 top-p 值(Top P) , 随后它们的概率根据设置的 tempature 重新调整,然后随机(seed 值)取其中的一个值。

在某个参数配置值的极端设置下,该采样设置要么抵消其他参数设置,要么变得无关紧要:

  • 如果将温度设置为 0,Top-K 和 Top-P 将变得无关紧要——下一个预测的 token 一定是概率最高的 token。如果将温度设置得极高(高于 1——通常在 10 的量级),温度将变得无关紧要,通过 Top-K 和/或 Top-P 标准的任何 token 都有可能成为下一个预测的 token。
  • 如果将 Top-K 设置为 1,温度和 Top-P 将变得无关紧要。只有一个 token 通过 Top-K 标准,该 token 就是下一个预测的 token 。如果将 Top-K 设置得极高,例如达到 LLM 词汇表的大小,任何具有非零概率的 token 都将满足 Top-K 标准,没有 token 被筛选掉。
  • 如果将 Top-P 设置为 0(或一个非常小的值),大多数 LLM 采样实现将只考虑概率最高的 token 来满足 Top-P 标准,使得温度和 Top-K 无关紧要。如果将 Top-P 设置为 1,任何具有非零概率的 token 都将满足 Top-P 标准,没有 token 被筛选掉。

这些配置参数并非独立运作。它们的相互作用很复杂,某些设置可以主导或抵消其他设置。理解这些相互作用对于可预测的控制至关重要。例如,将温度设为 0 或 Top-K 设为 1 会使其他采样参数失效。必须承认 LLM 参数的调整没有绝对的标准,是个实验工程。

(1)作为一般的起点,温度为 0.2、Top-P 为 0.95、Top-K 为 30 将给出相对连贯的结果,可以具有创造性但不过度。(2)如果想要特别有创意的结果,可以尝试从温度 0.9、Top-P 0.99 和 Top-K 40 开始。如果想要较少创意的结果,可以尝试从温度 0.1、Top-P 0.9 和 Top-K 20 开始。(3)最后,如果任务总是只有一个正确答案(例如,回答数学问题),则从温度 0 开始。

context window

上文说到 LLM 是把文字转化成一个个 token 然后进行处理,对于每个 LLM 的都有最大 token 的处理数量。模型提供商的官方网站一般提供了每个模型的 context window 和 max output tokens。max output tokens 顾名思义就是模型每次输出的最多 tokens。 context windows = Prompt (模型输入) + Completion (模型输出), 如果输入超出最大值, 模型厂商的一般忽略输入的前半部分。

此外模型的输入并不是越多越好,里面的内容并不是都能利用起来,有研究指出,LLM 会忘记中间内容,LLM 对于开头和结尾的表现较好。有一个 benchmark 评测了各个模型对于 context window 的召回能力 fiction.live/stories/Fic…

structure output

这个特性能强制要求模型按照定义好的 schema 结构进行输出。比如 LLM 用于提取信息,输出 json。

tool use

这个特性主要是让 LLM 拥有调用工具的能力。比如你想问下今天上海的天气,对于 LLM 来说,并不知道今天的天气,但是给 LLM 提供了一个查询某地天气的工具, 那么 LLM 就是调用它进行获得。具体的调用流程如下

  1. 程序将工具信息和用户输入传递给 LLM
  2. LLM 认为需要调用工具才能完成此次任务,输出调用工具的名称和参数 (工具名称:weather,参数:today,上海)
  3. 程序接收到需要调用工具信息进行调用程序,获取结果,将之前的用户输入和此次调用工具的结果继续传给 LLM
  4. LLM 进行总结输出今天上海的天气

如果 LLM 没有提供这个能力,你也可以使用 prompt 让模型输出需要调用的工具名称和参数,代价就是你需要在输出中提取工具调用名称和参数这些信息。

聪明的你肯定发现一个问题,调不调用工具完全取决于 LLM 。因此现在大模型的训练基本都会加强工具的调用,此外也有对各种 LLM 调用工具能力的评测

另外一个方面,工具也并不是越多越好,openaigemini 都指出工具数量应该少于 20 个。

prefix cache & chat prefix completion

如果查看模型厂商的 api 价格,可以看到一个 input 和 cache input,他两的价格能差距 4 - 10 倍(不同模型厂商背部不同)。对于同样的模型输入,第一次调用价格会高,当第二次调用,模型厂商发现会有相同输入前缀,这部分相同前缀由于之前曾经输入过,因此这部分计算价格会按照 cache input 的价格计算 (prefix cache)。 由此可以得出,对于大规模应用来说,每轮对话应该尽可能维持 prompt 不变,这样能利用好 cache 的特性,然后尽可能的降低成本。

chat prefix comletion 可以预填充文字,让 LLM 进行续写,这个主要用在代码生成领域,也可用在 tool use 场景中,让模型选定特定的工具。

manus 有篇文章详细讲述了他们是如何利用 prefix cache 和 chat prefix completion 特性大大降低成本的。

大模型优化手段

LLM 训练过程中的知识具有滞后性,以及有些私域数据,为了满足要求,有两种优化大模型优化手段

(1)上下文工程(改变输入)。其中 (a)提示词工程 (b)RAG (c)提供工具 都可以看做为 LLM 提供必要的信息

(2) 训练模型 (改变模型)

因此和 LLM 对话时需要考虑下面这个四象限,给 LLM 提供必要的信息。

  • 鲁迅的写作风格 --> AI 知道, 人知道。可以直接叫 AI 仿写
  • 模仿何同学拒绝网约车司机好评博文 --> AI 不知道, 人知道。将案例告诉 AI,叫它仿写
  • Excel 的使用技巧 --> AI 知道, 人不知道, 直接问 AI
  • Google 的搜索技巧 --> AI 知道, 人不知道, 直接问 AI
  • 人类生命的意义 --> AI 不知道, 人不知道, 发散性探索询问

如何与 AI 沟通

优化大模型-提示词工程

常见的提示词优化手段

  1. 给模型设定角色
  2. 给模型下达准确的指令 (目标)
  3. 拆解步骤,一次只做一件事情。摘要和翻译拆成 2 个调用进行。
  4. 给 LLM 提供范例
  • 两个魔法咒语
  • 我是 xxx 领域小白 --> 能让 LLM 以简单易懂的语言为你讲述领域知识
  • think step by step --> 让 LLM 进入思考模式, 回答数学相关问题和复杂问题有奇效

但是现在我们应该使用魔法打败魔法,利用 LLM 来生成我们所需要的提示词。更重要的是根据 LLM 输出,进行评估。(1)对于有明确标准答案的,建立好测试集,每次修改 prompt 运行评估,看是否有提升 (2) 对于没有明确答案的,可以采用 LLM 进行评估的方式 (需要对齐人类的喜好)。

修改 prompt --> 进行评估 --> prompt --> 进行评估... 直到达到目标准确率。市面上有一类 prompt 自动最佳化工具。 开源的有 (1)gpt-prompt-engineer (2) DSPy (3) Textgrad。闭源的有字节的 PromptPilot

关键的是

  1. 描述你要做什么
  2. 有哪些输入和输出
  3. 建立测试集
  4. 建立相关的评估指标
  5. 然后使用 AI 来产生 prompt

误差范围与测试集数量的关系 community.openai.com/t/how-to-ca…

可以看到,误差范围要减少 3 倍, 所需样本需要增加 10 倍

优化大模型-RAG

添加图片注释,不超过 140 字(可选)

LLM 应用

  • 警惕: 拿着锤子找钉子
  • 主要有两种应用方向
  • 以 AI 主体, 打造 AI + X 的应用 -> 智能体
  • 以原有工作流为主体, 打造 X + AI -> 对原有工作流进行改造, 提效

未完待续... (llm 应用,llm分类, agent .etc)