Skip to content
This page has been auto-translated and may contain errors.View in English

LLM 如何工作

docs.scrimba.com

首先,名字。LLMlarge language model(大语言模型)的缩写:这是 ChatGPT 等工具背后的 AI 类型,你向它发送一个提示,然后得到文本回复。本章介绍的是一个 LLM 实际上是什么。

你输入一个问题,几秒钟后就出现了一个流畅、自信的回答。读起来像是模型理解了你的问题并查找了答案。这个印象是有用的,但在某些重要方面是错误的,这两者之间的差距是大多数初学者犯错的来源。

这一章对你使用这些工具的整个职业生涯都会有回报。你不需要了解训练模型的数学原理来与一个模型配合工作。但你需要对它在回答时实际上发生了什么有一个清楚的认识,因为这个认识解释了其他所有问题:为什么提示词有效,为什么同一个问题会给出不同的答案,为什么模型会编造事实,为什么它们的成本是这样的,为什么某些看起来应该很简单的功能却很难实现。本手册后面的所有内容都是这里所讨论的想法的直接结果。

这一章是这些系统背后的心智模型:什么是模型,它运行的一个循环,以及解释本手册其余部分的几个关键属性。这里没有数学。所有内容都是针对黑盒进行编码与知道它为什么会以这种方式表现之间的区别。

后面章节中的每一种技术(提示、结构化输出、检索、智能体)都是你即将阅读内容的后果。理解这个图景,其余的就不再感觉像是一袋技巧,而是感觉像一台你可以预测的机器了。

这些模型以特定的、可重复的方式失败,这一章就是原因所在。去掉界面后,语言模型就是一个冻结的函数,它一次预测一个文本块,几乎所有的生产故障模式(不确定性、成本爆炸、丢失上下文、错误的自信答案)都源于这一个事实。

这里没有新的数学,这就是重点:耐用的工程优势在于机制,而不是每月的模型。把它当作每个后续决策都建立在其上的基础来读。

模型实际上是什么

剥掉聊天界面,大语言模型就是一件事:一个巨大的数学函数,一个固定的由数十亿个数字组成的集合,称为**参数**(你也可能听到它们被称为权重)。这就是整个模型。不是数据库,不是搜索引擎,不是盒子里的小人。它是一个非常大的数字堆,接收文本并输出文本。

这些数字不是程序员输入的。它们是在训练期间设置的。提供商向模型提供了大量的文本、书籍、代码、文章、网页,并反复运行一个简单的练习数十亿次:隐藏下一个词,要求模型预测它,每当模型猜错时就轻微调整其数字。以巨大的规模重复这个过程,数字会慢慢稳定在擅长预测文本的值。这就是训练:调整数十亿个刻度盘直到预测变好。

这产生了两个后果,它们解释了你后来会遇到的许多行为。首先,训练发生一次,提前进行,成本非常高。到你调用模型时,这些数字已经冻结了。模型不会从你的对话中学习。你说的任何东西都不会改变它的参数。虽然感觉它能记住并适应,但那是它周围的软件,而不是模型本身,这一点在上下文窗口部分会硬生生地回归。

其次,内部没有事实表。"知识"以模式的形式烤进这些数字中,就像一个做过一万条面包的面包师在他们的手中掌握了这种技术而不需要读食谱一样。模型学到了正确、聪慧文本的形状。这就是为什么它可以在同一句话中既流畅又错误:它在复制一个好答案的形状,而不是从架子上读取存储的事实。

Juno模型实际上是什么 所以一个模型是一个巨大的固定数字堆,将文本转换为文本,这些数字在训练期间调整一次然后冻结。它在你聊天时不会从你那里学习,内部没有整洁的事实表,它有模式。这就是为什么它能听起来肯定但仍然是错的,所以总是检查任何重要的东西。

模型是一个**纯函数**:你给它(权重、输入),它计算一个输出,就这样。权重是在训练期间固定的数十亿个学习的数字;输入是你发送的文本。因为它是一个函数,在相同设置下相同的输入每次都会产生相同的底层得分。你在不同运行之间看到的任何变化都来自于选择词语的采样步骤,而不是来自模型改变主意。

函数携带的知识以一种有损的方式存储,一次性分散和压缩到所有权重中,而不是作为可检索的记录归档。没有你能读取的行,也没有你能编辑的单元格。模型"知道"的一个事实实际上是权重重新构造的一个强模式,有时会略微重新构造错误。你无法指出一个事实在哪里,也无法在不重新训练的情况下修复一个事实。

实际的做法是把模型当作你调用的固定函数,而不是你查询的知识库。依靠它来塑造语言、推理文本和遵循指令。当你需要具体的、最新的或可审计的东西时,通过输入本身提供那个信息,而不是相信权重会保留它。这个单一的习惯——提供事实而不是期望权重记住它们——防止了大量的自信错误答案。

Juno模型实际上是什么 把模型看作权重和输入的纯函数:相同的输入、相同的设置、相同的底层得分,运行之间的变化来自采样。它的知识以有损的方式压缩到权重中,所以你无法查看或编辑其中的单个事实。相应地构建:把它当作你调用的固定函数,并通过输入提供具体或最新的事实,而不是期望权重记住它们。

一个已部署的模型是一个 API 后面的冻结权重:数十亿个学习的数字,在训练时固定,计算(权重、输入)的纯函数。它的行为实际上改变的唯一时间是提供商交付不同的模型时。

这有一个尖锐的操作优势。相同端点下的静默更新可以在你的代码没有改变一行的情况下转变你的输出,所以固定一个特定的模型版本,把那个版本当作你合同的一部分,并在采用新版本之前重新运行你的评估。在信任的基础上采用"最新的"是一个正常工作的系统安静地倒退的方式。

权重是压缩的参数化记忆,它既是有损的,也是不可审计的。你无法对版本之间模型的"知识"进行 diff,你无法列举其事实,你无法证明某个给定的事实在那里或是正确的。所以永远不要把一个负载承载事实的正确性放在参数化回忆上。如果一个错误的答案会花费你成本,通过从你可以控制和引用的来源输入提供事实,并保持模型在措辞和对该来源进行推理的角色中,而不是成为来源。

故意改变权重就是微调所做的,值得明确说明它会带来什么。微调可靠地转变行为和形式、语调、格式、任务习惯,但它不会给你一个可靠的、可查询的事实存储。达到它来塑造模型如何响应,而不是安装你需要信任的知识。保持事实在输入中,保持风格在权重中,你不会对任何一个感到惊讶。

Juno模型实际上是什么 权重是冻结的,所以行为只在提供商交付不同模型时才会改变:固定版本,使其成为你合同的一部分,并在升级之前重新运行评估,或者一个静默交换会在你睡着的时候让你倒退。参数化记忆是有损的和不可审计的;你无法对其知道的东西进行 diff,所以把负载承载的事实保留在你可以控制的来源的输入中,而不是在回忆中。微调转变行为和形式,而不是可靠的事实存储,所以用它来表示模型如何响应,而不是它应该知道什么。

预测下一个标记

有了这堆数字,模型做了一个工作:它一遍遍预测下一个文本块。

这是缓慢进行的循环。你给它一些文本。它通过所有这些参数运行该文本,并为它知道的每一个可能的下一个块产生一个概率,一次数万个选项。在"法国的首都是"之后,块"巴黎"可能会获得 97% 的得分,"一个"1% 的得分,和其他一切几乎没有。

然后模型选择一个块,将其添加到文本中,并再次运行整个事情以选择下一个。它重复直到答案完成。

这是整个引擎。你作为单一想法阅读的回复是一次一个块构建的,每个块从新鲜的可能性排名中选择,对于句子的走向没有计划,除了"下一个可能的是什么"。你将使用的每一个能力、聊天、代码、翻译、工具使用、推理,都是这同一循环在底下运行。

建议你下一个词的手机键盘是同样的想法的缩小版。区别在于猜测背后的数十亿参数。在足够的文本上训练后,"最可能的下一个块是什么"足以写出工作代码和清晰的解释。但底层的动作从不改变:它是预测,而不是理解,也不是查找一个存储的答案。

Juno预测下一个标记 整个引擎是一个小循环:读到目前为止的文本,对每个可能的下一个块评分,选择一个,并一直进行直到答案完成。模型对句子的走向没有计划,除了下一个可能的是什么,所以你作为单一想法阅读的回复实际上是一次一个块构建的。那是预测,而不是理解,也不是一个被查找的存储答案。

模型一遍遍做一件事:在每一步,它读取到目前为止的所有文本,并为其词汇表中的每个标记(标记是文本的一个块,通常是一个词的一部分)发出一个得分,一次数万个。这些得分变成一个概率分布,模型从中采样一个标记。然后它将该标记追加到文本中,并再次运行整个事情以选择下一个。在"法国的首都是"之后,"巴黎"可能几乎持有所有的概率,其他一切几乎没有。

这种反馈就是为什么它被称为**自回归**:每个新标记取决于到目前为止的所有文本,包括它在这个回合中已经写过的标记。没有全局计划,也没有修订的草稿。模型一次承诺一个标记,因为它无法收回一个标记,它可以把自己逼进一个角:一个自信的早期词可以强制句子的其余部分沿着一个尴尬的路径,然后它必须完成。

这单一的事实解释了你在实践中会使用的几件事。让模型在最终答案之前写出其推理有帮助,因为更多标记意味着更多步骤和更多计算在它承诺答案之前花在问题上。输出结构严格从左到右决定,所以响应的形状在进行时设置,而不是提前计划。而同一循环是什么驱动工具使用的:模型预测形成调用的标记,你运行它,结果作为更多文本被反馈以进行下一次预测。

Juno预测下一个标记 在每一步,模型对其词汇表中的每个标记评分,采样一个,反馈它,并重复:这个反馈循环就是自回归的意思。没有计划,也没有撤销,所以它一次承诺一个标记,可以把自己逼进一个角。这就是为什么在答案之前写出推理有帮助,为什么工具使用是同一循环,结果反馈进来。

生成在结构上是顺序的:模型生成一个标记(文本的一个块),反馈它,并预测下一个,所以每个输出标记都是通过网络的一个单独的前向传递。阅读你的输入相对便宜,一次性处理;缓慢、昂贵的部分是模型写作。延迟和成本随输出长度缩放,而不是输入长度。实用的杠杆从这中脱颖而出:保持输出简短,流式传输标记以便用户看到进度而不是等待完整回复,并且不要为你要丢弃的冗长格式付费。

另一个后果是正确性。因为没有全局计划,单次传递不是自我纠正的:模型从左到右承诺,一旦标记出来就无法修订。这就是为什么必须正确的东西想要验证或对第一个草稿的第二次传递,为什么写出其推理然后答案的模型往往做得更好,你购买了它更多的步骤来承诺。把第一代当作草稿,而不是判决。

一个值得接入的杠杆:许多设置暴露每标记概率(logprobs,模型对它选择的每个标记的自己的信心分数)。你可以读取它们来标记低信心跨度,关闭一个模型不确定的答案,或将不确定的案例路由到第二次传递或人类。这是一个你已经有的便宜信号,它把"模型可能在这里是错的"变成你可以以编程方式行动的东西,而不是猜测。

Juno预测下一个标记 每个输出标记是它自己的前向传递,所以成本和延迟跟踪输出长度,而不是输入长度:保持回复简短,流式传输它们,并停止为你丢弃的格式付费。没有计划和撤销,所以一次传递不能自我纠正;把第一代当作草稿,并为任何必须正确的东西添加一个验证传递。如果你能读到每标记 logprobs,用它来标记或路由模型最不确定的跨度,这是信心你已经有并且很少花费。

随机性刻度盘

如果模型总是抓住单一最高评分的块,它会一次次给你同一个提示的同一个答案,而那个答案常常是平的和重复的。所以大多数时候选择有点随机性:它通常接收一个高概率块,但并不总是非常顶部的。这就是为什么你可以问完全相同的问题两次并获得两个不同的回复。这是系统按设计工作,而不是故障。

你通过一个被称为**温度**的设置来控制有多少随机性,你在本章关于从代码调用模型的部分调用模型时设置。直觉现在值得拥有。在低温度下,模型坚持其顶级选择:专注、一致、可预测,这就是从发票中提取数字或将文本分类到类别中所需的。在更高的温度下,较低概率的块更经常被选择:更多样化和创意,以及更有可能偏离到某个错误的地方。头脑风暴和创意写作需要更高的一端;任何有正确答案的事物需要更低的一端。

所以一个单一的刻度盘在模型的"谨慎和可重复"和"令人惊讶和富有发明精神"之间滑动。它是同一预测循环的两种方式;温度只改变模型如何大胆地从其最安全的猜测中到达。

Juno随机性刻度盘 温度是你的随机性刻度盘。对于有正确答案的任务(如提取或排序),将其设置得低,你会获得专注的、可重复的回复。对于头脑风暴和创意工作,将其转向上,你会获得更多的变化以及偏离的更多机会。相同的预测循环,只是一个更大胆或更安全的到达。

在模型选择其下一个块之前,它为每个候选项都有一个概率。温度在模型从中采样之前重塑该分布。低温度将分布锐化为单一最可能的标记(更接近总是采取顶级选择),所以输出变得专注和可重复。高温度使其变平,给不太可能的标记一个真实的机会,所以输出变得更多样化,更有可能漂移错误。这就是为什么相同的提示可以返回不同的回复:有一个抽奖发生,温度设置赔率有多倾斜。

温度不是唯一的旋钮。Top-p(仅从概率加起来达到 p 的最小标记集中采样)和 top-k(仅最可能的 k 个标记)都在采样之前修剪候选池。它们与温度的效果重叠,所以将它们视为一个随机性设置而不是三个独立的设置很有帮助。

实用的做法是为每个任务明确设置温度,而不是相信任何默认值。对于提取、分类和任何发出你稍后解析的结构化输出的东西,设置低一点;对于多样性是重点的构思和起草,设置高一点。观察交互:将高温度与 1 的 top-p 堆放在一起会将完整的尾部置于游戏中,当你需要可靠、可解析的结果时,这对你不利。

Juno随机性刻度盘 温度重塑采样前的概率分布:低对顶级标记进行锐化以获得专注的输出,高对以获得多样性。把 temperaturetop_ptop_k 视为一个随机性设置,而不是三个。为每个任务设置它:低用于提取、分类和结构化输出;较高用于构思。当你需要可解析的结果时,不要将高温度与 top_p of 1 配对。

温度在采样前缩放得分分布,诱人的快捷方式是将其设置为 0 并称输出为确定的。这接近了,但不是保证。浮点数学、服务器端批处理和大型模型内部的路由即使在 0 也引入了小的不确定性。所以不要建立完全匹配缓存或完全匹配测试,假设重复提示的字节相同输出;该假设间歇性地失败,间歇性失败是追逐成本高的类型。

这塑造了你如何测试采样的行为。单次运行对**随机**系统(其输出从运行到运行变化的)告诉你几乎没有任何东西,所以通过几次运行评估一个提示并查看输出的分布来评估它:它多经常在规格中着陆,方差有多宽,尾部走向哪里错误。这是你的评估做的工作,并且他们想要足够的样本来看到分散,而不是一个幸运的通过。

把温度、top-p(仅从概率到达累积 p 的最小标记集中采样)和 top-k(仅保持最可能的 k 个标记)当作一个采样预算,你一起调整,而不是三个你通过反射设置的刻度盘。选择仍然为任务给予可接受多样性的最低随机性:同时紧化所有三个可以将输出折叠成重复和脆弱的东西,而将它们全部打开你给了你方差你然后必须验证。成本在两边都是真实的,所以有意花费它。

Juno随机性刻度盘 温度 0 接近确定的,不保证:浮点、批处理和内部路由泄露不确定性,所以跳过完全匹配缓存和完全匹配测试。通过多个运行评估采样的行为并阅读分布,而不是一次通过;这是你的评估所为。将 temperaturetop_ptop_k 作为一个采样预算调整,并选择仍然给予可接受多样性的最低随机性。

标记

一个模型预测的"块"有一个名字:标记。一个标记是文本的一部分,通常是一个整词,有时只是一个词的一部分。常见的词通常是单个标记,而更长的或更稀有的词被分割成几个。

"tokenization"  ->  "token" + "ization"
"unbelievable"  ->  "un" + "believ" + "able"
"cat"           ->  "cat"

为什么把文本切成这些奇怪的片段,而不是使用整词或单个字母?这是一个折衷。单个字母会使每个序列非常长,而长度是模型必须计算的。整词需要一个数百万个条目的词汇表,并且仍然会在第一次有人发明一个词或制造一个打字错误时中断。标记是中间路径:一个固定的数万个常见片段的词汇表,可以被拼在一起来拼写任何东西,包括模型从未见过的词。

这是在幕后产生的后果让人们惊讶。模型从不看到字母。它看到标记,这对它来说真的是这些块的 ID 号。所以对我们来说看起来毫不费力的任务对它来说可能很难:数一个词中的字母,反转一个字符串,注意到"strawberry"有三个 r。

这不是变得暗淡。它根本不感知单个字符,就像你不能尝到成品面包中面粉的单个颗粒一样。当一个模型在拼写或字符计数任务上摇摆不定时,这就是原因,修复通常是在普通代码中做那部分。

标记也是你将不断关心的两件事的单位:

  • 金钱:提供商按标记计费,你发送的标记和模型写回的标记,所以一个长文档进来和一个长答案出去都会花费更多。英文的粗略衡量大约是四个字符每个标记,或 100 个标记每 75 个词;代码和其他语言经常分裂成更多标记,这是部分为什么它们可以花费更多。你会在开始从代码调用模型时直接遇到这个。
  • 限制:有一个上限,限制模型一次可以处理多少标记,这是下一节。
Juno标记 一个标记是文本的一个块,通常是一个词或它的一部分,模型作为 ID 号而不是字母读取这些块。这就是为什么它在计数或拼写方面可能摇摆不定,所以把那项工作交给普通代码。并且由于你按两种方式计费每个标记并且有一个上限,一次有多少符合,更少的标记意味着更少的成本和更多的空间。

模型预测标记,通常是一个整词有时是一个片段的文本片段。进行分割的片段是**标记器**,它通过反复合并最常见的字符对直到你有一个固定的数万个片段的集合来工作(一个通常称为字节对编码或 BPE 的方案)。这个历史是为什么频繁的词最终成为单个标记,而稀有词碎片成为部分:常见的模式在训练期间合并,罕见的从未合并。

两个实践事实从这里脱颖而出。首先,模型从不处理字符,只有标记 ID,所以任何字符级操作(计数字母、反转字符串、在精确位置切片)在提示内部摇摆不定,在你自己的代码中是可靠的。把那项工作推到代码上,让模型做语言部分。其次,标记化是模型特定的,所以标记计数不可移植。相同的句子在不同的标记器上可能花费不同数量的标记,这在你预算成本或将内容放入窗口时很重要。

对于构建的启示:不要从字符长度估测标记计数。使用模型实际使用的标记器计数,因为那是你被计费的数字,并受到限制。你在开始从代码调用模型时具体遇到所有这些,你发送的计数加上你得到的计数就是账单。

Juno标记 一个标记器使用学习词汇表(BPE)分割文本,这就是为什么常见的词是一个标记,稀有的词碎片。标记化是模型特定的,所以用模型自己的标记器计数,而不是从字符猜测。并且保持字符级工作(计数、反转、精确切片)在你的代码中,而不是在提示中。

标记是你发送的所有东西上的计量。一个标记是来自标记器学习词汇表的文本片段,而每标记的账单加上固定的上下文上限是塑造你的成本和你的设计的两个数字。舒适的四字符每标记的经验法则对平文英文散文成立,并在生产生活的地方精确崩溃:代码、JSON、深层嵌套格式和非拉丁脚本全部碎片成远多于启发式预测的标记。所以用真实的标记器预算,而不是衡量,或你的成本和容量估计将精确地在你实际发送的有效负载上是错的。

碎片不是均匀分布的,这在大规模上是一个公平性和成本问题。非拉丁语言中的相同含义可以花费其英文版本标记的数倍,所以相同的功能对你的某些用户来说悄悄更昂贵,更缓慢。在你向任何人承诺一个固定价格或一个固定的延迟之前,值得按语言测量。

来自该领域的另外两个习惯。格式是花费:空格、冗长分隔符和装饰性降价都花费标记,零添加意义,所以保持你提供给模型的结构紧凑,并让你的代码稍后添加呈现。并提供清洁、普通文本,因为稀有或格式错误的标记(乱码、漂泊的控制字符、奇怪的编码)坐在词汇表的薄、未充分训练的角落,可以触发奇怪的输出。这都不是异国情调;这是一个你信任的标记预算和一个使你在发票上惊讶的预算之间的区别。

Juno标记 四字符每标记的规则在代码、JSON 和非拉丁脚本上中断,这是你的真实流量所在,所以用实际的标记器预算。非拉丁语言可以花费相同含义标记的数倍,一个真实的成本和公平性差距值得按语言测量。剥离装饰格式以节省标记,并提供干净的文本,以便稀有或格式错误的标记不会为你购买奇怪的行为。

上下文窗口

**上下文窗口**是模型一次可以接收多少文本,以标记为单位测量。把它想象成模型的桌子大小。涉及单个请求的所有东西必须一次符合那个桌子:你的指令、到目前为止的对话、你粘贴的任何文档和模型正在写的回复。

为什么一开始就有一个限制?它来自预测如何工作。要选择下一个标记,模型权衡输入中的每个标记如何与其他每个标记相关,所以它可以告诉"它"指三个句子回的猫。那个全到全比较就是让模型追踪一段通道的含义,它也是使长输入处理昂贵的原因。提供商设置了一个上限,上下文窗口,以保持每个请求可管理。

当桌子满了时,一些东西必须从桌子上拿下来。如果一个对话运行得足够长以溢出窗口,最早的部分会消失,模型不再能看到它们。这就是为什么一个长聊天似乎在开始处"忘记"你说的东西的原因。它在任何人类意义上都没有忘记;这些标记离开了桌子。它也有助于知道模型倾向于最紧密关注它在桌子上的开始和结束,并可以失去踪迹埋在中间的东西,所以当你填充窗口时,你放重要文本的地方很重要。

现在要点,它捕获了几乎每个初学者,它比其他所有东西更重要。模型在单独请求之间没有记忆。记住它的数字是冻结的。每个调用从一个空白桌子开始。模型不记得你的最后一个问题、你的名字或一分钟前的任何东西。

一个聊天应用感起来像一个流动的对话只因为应用安静地用每个新消息重新发送整个历史。连续性是软件在模型周围构建的东西,不是模型有的东西。

这单一的事实塑造了你从这里构建的所有东西。如果你想模型知道一些东西,你必须把它放在那个请求的桌子上:到目前为止的对话、用户的详细信息、相关文档,所有它,每次。本手册的大部分真的是关于做那一件事好的,把正确的文本放在桌子上。

Juno上下文窗口 上下文窗口是模型的桌子:每个请求必须适应它,当它溢出时最早的文本消失。模型在调用之间保持没有记忆,所以应用每次重新发送整个历史来伪造连续的聊天。你的工作从这里是在每个单独请求中把正确的文本放在那个桌子上。

把上下文窗口看作一个固定的标记预算,一个请求得到花费,涵盖你的指令、运行对话、任何粘贴的文档和正在生成的答案。窗口存在是因为模型如何读取输入:一个称为**注意力**的机制比较每个标记对比每个其他标记来算出什么与什么有关。那个比较就是让模型将"它"解析回它指向的名词,其成本大约随输入长度的平方增长。将标记加倍,你将工作加倍超过,这是长输入缓慢并累计成本的真实原因。

适应窗口不等于模型使用所有在其中的东西。有一个良好记录的效应被称为**丢失在中间**:模型最可靠地关注输入的开始和结束,可以略过停放在中心的材料。所以把你最重要的指令和数据放在提示的顶部或底部附近,而不是埋在粘贴文本的墙中。

这另一半是关于记忆,关键事实是模型是**无状态的**:它在单独请求之间记住一切。每个调用以一个空窗口开始,所以模型知道对话到目前为止的唯一方式是你每次都重新发送它。重新发送和塑造那个历史是你的工作,不是模型的。随着聊天超过窗口增长,通过修剪旧的轮或用一个短摘要替换它们来自己管理它,以便你保留的标记是仍然重要的。

这将上下文构造置于与这些模型构建的中心。决定什么进入窗口、什么顺序以及如何压缩之前发生的事情是大部分工作,而提示是你学会刻意塑造它的地方。

Juno上下文窗口 窗口是一个标记预算,涵盖指令、历史、文档和回复;注意力使长输入花费大约其长度的平方。模型承受丢失中间效应,所以把重要的东西放在开始或结束附近。模型是无状态的,所以重新发送和修剪对话历史在你上,每个调用。

把上下文窗口当作上限,而不是目标。它是一个单个请求得到的标记预算,跨越你的指令、运行历史、检索文档和输出。

你放在其中的每个标记花费金钱和延迟,因为注意力步骤(模型运行的所有到全标记比较来读取输入)大约随长度的平方缩放。更糟的是,有效召回在你达到限制之前降级:丢失在中间效应意味着埋在中心的材料的准确性降低,即使它技术上适应。所以策划上下文而不是倾倒所有东西,当源数据很大时,用RAG只检索相关片段而不是粘贴整个语料库。

顺序是一个杠杆,而不是一个细节。提供商可以通过**提示缓存为一个不改变的前缀重新使用计算,其中缓存的内部状态是KV 缓存**,模型对它已经读过的标记的存储工作。把稳定的内容放在第一个(系统指令、固定参考资料)和可变的内容最后,重复调用变得更便宜和更快,因为提示的前面从缓存中服务。无意中重新排序那个前缀并你使缓存无效并再次全价支付。

跨轮的内存不是一个功能模型有;它是你进行的工程选择,每个选项以自己的方式失败:

  • 平凡的窗口化,保持最近的轮,是便宜的但无声地丢弃早期事实用户仍然期望你知道。
  • 总结保持更多历史在更少标记中但丢失细节并可以无声地编码它自己的错误。
  • 检索仅拉回相关的但完全取决于你的索引返回正确的片段。

按使用案例选择,并假设无论你选择什么最终都会浮出错误的东西;为它仪表而不是相信它。

Juno上下文窗口 窗口是一个上限,不是一个目标:成本和延迟随每个标记爬升,召回在你打中限制之前腐烂,所以策划和对任何大的事物倚靠检索。稳定的内容第一,可变的最后,所以提示缓存(KV 缓存)实际上回报。跨轮的内存是你在窗口化、总结和检索之间的设计选择,我已经被所有三个抓住,所以仪表你选择的一个。

模型不知道什么

所有一个模型的知识在它训练时被烤入,所以它只知道在那个训练数据中的东西,那个数据是聚集到过去某个地点的。两个限制直接脱颖而出。

首先,它不知道在其截断之后发生的任何东西。问最后一周的新闻或这个月出来的库,它没有真正的想法,虽然它可能高兴地生成一个看似合理的答案。其次,它从不知道任何私人的东西。你的公司的内部文档、一个用户的订单历史、你的数据库的内容:都没有在公开文本中它训练,所以它不能知道它,无论你多么好地要求。

也有一个更安静的限制。模型通常无法告诉你它"知道"的东西来自哪里,因为知识混合在里面而不是作为单独、来源的事实归档。它可以为你写一个引用,但它是预测一个引用应该看起来像什么,而不是查看一个真实的。

这是你将稍后遇到的一个技术被称为检索或RAG的原因。如果你想要一个模型回答关于最近事件或你自己的私人数据,你不重新训练它。你自己获取相关的文本,并在请求时把它放在桌子上,所以模型在它面前有事实而不是猜测。一个模型是一个推理者在你给它的文本上远多于一个可靠的具体事实的井。

Juno模型不知道什么 一个模型只知道在其训练数据中的东西,到过去的截断,所以它错过最近事件和任何私人的,并且无法可靠地说它的事实来自哪里。当你需要当前或私人信息时,不重新训练:获取相关的文本并在请求中把它交给模型。把模型当作在你给它的东西上推理的东西,而不是作为一个值得信任的记忆。

一个模型的内置知识,其**参数化知识**(在其权重中编码的事实,在训练期间设置的可调数字),在训练截断处冻结。在那个日期之后发生的事都不在那里,私人的都不在里面,因为权重由公开文本形成。所以记忆给你两个可预测的缺口:最近,截断之后的任何东西,以及隐私,任何从不在公开训练数据中的东西。

那两个缺口真的是一个缺口从两边看到,他们以同样的方式关闭:把需要的文本放在请求中。你自己获取最近的文章或相关的数据库行,并与问题一起提供它,所以模型读取事实而不是回忆它。这是RAG后面的核心想法,检索增强生成,你将使用它什么时候答案必须反映当前或专有信息。

参数化知识也不附带来源。事实混合到权重中,而不是存储为具有出处的离散条目,所以模型无法可靠地告诉你某东西来自哪里。它生成的一个引用是为了看起来正确而生成的,而不是从一个记录中检索的,这正是为什么在你提供的文本中地面答案值得努力的原因。

对构建的实用规则:不要问模型从记忆中回忆当前或专有事实。如果一个事实必须正确,获取它并提供它,让模型在它上面推理。

Juno模型不知道什么 参数化知识,在权重中编码的事实,在训练截断处冻结,不附带来源,所以模型错过最近和私人信息,无法可靠地引用任何东西。两个缺口以同样方式关闭:获取相关的文本并把它放在请求中,这是 RAG 背后的想法。作为规则,不要让模型从记忆中回忆当前或专有事实;提供它们并让它在它们上面推理。

模型的参数化记忆,在其权重中保持的知识(在训练期间固定的可调数字),是未版本化和不可审计的。你无法对它进行 diff,指向一个声称生活的地方,或确认它没有漂移。所以对必须是正确、当前或合规的任何东西,不相信模型的说法:在一个检索来源中地面答案并引用那个来源。把内置知识当作一个流畅的先验,而不是一个系统记录。

截断也比单一日期更模糊。训练数据直到那个日期不是一致的:最近的材料更薄,消化得更少,比旧的、覆盖得好的材料,所以最近但前截断的事实被不均匀地知道。一个模型可以是自信的,一年前其截断的东西,而完美地钉一个十年前的事实,这就是为什么"它在截断之前?"是比看起来更弱的保证,为什么你检索任何必须是正确的东西。

为间隙到达正确的工具,因为两个常见的不是可互换的。检索在请求时供给事实,并保持当前当你的来源更新时。微调,继续在你自己的例子上训练,转变形式和行为、语调、格式、模型如何遵循你的约定,它是一个差、陈旧的方式来注入知识:训练的事实再次冻结,难以更新,仍然无来源。使用检索对真的,微调对它如何应该听起来的。

Juno模型不知道什么 参数化记忆是未版本化和不可审计的,所以对任何必须是正确、当前或合规的东西,在一个检索来源中地面答案并引用那个,而不是模型的话。记住截断是模糊的:最近但前截断的事实被不均匀地知道,所以检索任何必须是正确的。并匹配工具到间隙:检索供给事实,微调转变形式和行为,是一个陈旧的知识注入方式。

为什么模型编造事物

有时一个模型用完全的信心陈述一些错误的东西:一个没有人说的引用、一个不存在的函数、一个对从不被写的研究的引用。这被称为一个**幻觉**,在最后几节之后,它应该感觉几乎不可避免,而不是神秘。

原因是模型对"真"对比"假"没有内部感觉。它只有"可能的文本"对比"不可能的文本"。大多数时候这些排成一行,因为在它学到的文本中,真陈述比错误的远多,所以可能的延续通常是正确的。

但当模型打中一个缺口,某件东西它从不被训练,或你的私人数据它从不可能看到,它不停止和旗帜缺口。它无法可靠地告诉什么它不知道。它做唯一的东西它从不做:生成最可能的声音延续。

一个自信的、好形成的、错误的答案通常精确地是什么听起来最可能。同样的机械装置使它流畅使它流畅当它是错误的。

这是坐在一起的部分:幻觉不是一个你能完全提示离开的小故障。你可以减少它,稍后的章节显示如何。告诉模型它被允许说"我不知道"有点帮助。要求它仅从你提供的文本回答帮助多得多,因为现在有一个缺口从冻结训练中填充。但倾向来自模型从根本上是什么,一个有数据概率机器没有事实检查员在里面,所以耐用的修复是结构化的:给它它需要工作的事实而不是希望它们在其训练中,验证答案重要的而不是相信它们。

从这一章过上面所有其他东西进行一个规则:一个模型的信心告诉你一切关于它是否正确。流畅和正确由同一过程生成并所有时间分开。构建如同任何单个答案可能是错的,因为任何单个答案可能是。

Juno为什么模型编造事物 一个幻觉是模型信心地填充一个缺口与文本听起来正确但不是,因为它只知道"可能"而不是"真"。你可以降低它发生的频率,但你无法完全通过提示它提示离开,所以安全的动作是交给模型它需要的事实并检查重要的答案。并记住大一个:一个自信的语调不是证明,所以永不仅仅在确定性上信任。

当一个模型发明一个引用、一个函数或一个引用并用完全的信心陈述它时,那就是一个幻觉,它直接从模型如何工作脱颖而出。模型没有对真的信号。它按"可能的文本"对比"不可能的文本"给延续评分,大多数时候可能和真重叠,因为真陈述主导其训练数据。

幻觉在那个重叠分解的地方尖峰:在其知识的边缘,在稀有或小众主题上,在你的私人数据它从不被训练。那里模型仍然生成其最可能的延续,一个流畅的、好形成的、错误的答案经常是什么评分最高。

所以你无法仅用措辞修复这个,但你可以按他们实际帮助多少对你的缓解进行排名。最大的杠杆通过远是地面化:把真事实放在提示中,告诉模型仅从那个提供的文本回答,理想地引用它。现在那里没有缺口要它从冻结训练中填充。检索正确的文本来提供是它自己的技术,涵盖在RAG中。

下面那个,给模型一个明确的逃生隔间,许可来回答"我不知道"而不是猜测,这移除了一些压力来发明。并保持温度(在标记选择上的随机性刻度盘)对事实工作谦逊,因为高随机性加宽门到不可能、偏离基地延续。

实用后果:限制模型到你提供的上下文,验证重要的输出。当作提示措辞作为对那些结构移动之上的一个小调整,永不作为整个防御。一个听起来肯定的模型已告诉你一切关于它是否正确的,因为流畅和正确来自同一过程并常规地背离。

Juno为什么模型编造事物 幻觉是模型发出流畅的、可能的文本没有对真的内部检查,它在其知识的边缘和在数据它从不看到恶化。按影响排列你的修复:在你提供的文本中地面它(最大杠杆)、给它空间说"我不知道"、告诉它仅从提供的上下文回答并引用它,对事实工作保持 温度 谦逊。限制到上下文并验证重要的输出;不要仅倚靠措辞技巧。

幻觉是模型返回自信的、好形成的文本碰巧是错的,它是架构的属性,不是你修复的一个错误。模型按可能性的延续排名没有附带的真信号,所以在其训练的边缘,稀有主题,新鲜事件,任何私人的,它仍然发出其最可能的猜测。你不会消除这个。工作是设计系统以便一个错误答案在它到达任何重要的东西之前被抓住或包含。

这意味着三个结构动作,都不是提示措辞。验证每个答案的形状:使模型对一个模式返回数据,格式错误或超出范围的输出失败大声而不是流下游,这是什么结构化输出为你购买。用评估测量你的真实幻觉率,一个有已知好答案的持有输出集自动评分,而不是点检查一些提示并称其好。并在成本高的地方保持一个人在循环中,因为没有自动化的守卫抓住所有东西。

在所有这下面的陷阱是校准。模型信心被不好地校准:陈述的确定性不是正确的证据,答案的语调对其真值进行零信息。所以永远不要在模型听起来肯定的地方关门决定。

构建并倾向一个弃权路径,一个认许"我无法从我被给的回答这个",并使弃权便宜以便系统到达而不是发明。那个结构心态,假设任何单个答案可能是错的并限制伤害,是整个安全和限制章节建立在什么。

Juno为什么模型编造事物 你无法删除幻觉,所以为包含进行工程:用模式验证结构,用评估而不是眼睛几个输出测量率,并在被错误昂贵保持一个人。模型信心被不好地校准,所以一个肯定语调不是证据,你永远不在它上面关门。给系统一个便宜、认许的方式来弃权,并比一个自信猜测更倾向它每次。

把它放一起

本章的所有东西是一个想法从不同角度看到。一个模型是一个冻结的数字堆,预测下一个标记,几乎每个行为你将处理脱颖而出。

  • 一次预测一个标记从概率的排名,所以它即兴创作而不是回忆,触摸随机性(温度)意思答案变化。
  • 标记是块它工作在:你的账单的单位,你的大小限制的单位,为什么它无法可靠地计算字母。
  • 上下文窗口是单个请求的桌子,由所有共享,模型在请求之间记住一切,所以连续性是你的工作。
  • 它的知识是在训练截断处冻结的从不包括你的私人数据,这就是为什么你获取事实和把它们放在提示中。
  • 幻觉是一个系统的价格,预测可能的文本没有对真的感觉,通过地面化和检查减少,从不通过聪慧措辞单独。

把这些一起保留,并令人惊讶的很多人工智能工程转向成为一个任务在不同化妆中:把正确的文本放在桌子上,在正确的形状中,在正确的片刻,永不盲目地相信输出。下一章,开放和闭合模型,看模型有什么类型和你如何获得一个,然后提示是你开始向这个预测转动什么你实际想要的地方。

Juno把它放一起 几乎所有关于一个模型的东西来自一个事实:它是一个冻结的数字集合预测下一个标记。从那来变化的答案、基于标记的成本和限制、请求之间的没有记忆、训练截断和幻觉。很多用这些模型构建是让正确的文本放在桌子上并永不盲目地相信输出。

一个事实生成整个章节:一个模型是一个冻结的函数预测来自概率分布的下一个标记。追踪后果,你有你的工作模型:

  • 预测加采样意思输出变化;温度设置多少。
  • 标记是成本的单位、限制的单位,为什么字符级任务属于代码。
  • 上下文窗口是有限和无状态的,所以你重新发送并策划一切模型需要。
  • 知识在截断处冻结和无来源的,所以当前和私人事实来自检索、而不是回忆。
  • 幻觉是结构化的,由地面化和验证减少,而不是由措辞。

在所有这下面的模式是相同的:把正确的文本到上下文中,在正确的形状中,在正确的时间,并验证什么回来。这是剩下的手册构建,开始于开放和闭合模型的风景,然后提示

Juno把它放一起 整个章节是一个事实和它的跌下:一个冻结的下一个标记预测器给你变化的输出、基于标记的成本和限制、无状态、知识截断和幻觉。围绕失败模式构建的工作是一致的:把正确的文本进到上下文中,在正确的形状中,然后验证什么回来。提示是你开始做它的地方。

这里的所有东西减少到一个句子:一个冻结的函数预测你提供的文本上的下一个标记,没有状态、没有真信号,没有计划。你管理的每个生产属性是一个结果:

  • 输出是随机的,所以你测试分布,不单个运行。
  • 成本和延迟跟踪标记,特别是输出,所以你预算和流。
  • 上下文是有限和无状态的,所以记忆是一个有失败模式的工程选择。
  • 参数化知识是冻结的、有损的和无来源的,所以任何负载承载得到地面化和引用。
  • 信心是未校准的,所以你验证而不是相信。

回报是当模型做时这个都不移动。固定一个版本,围绕失败模式构建狼籍,下一个释放是你评估的一个升级,而不是你吸收的一个惊讶。剩下的手册是那个狼籍,它开始于风景,开放和闭合模型,然后提示

Juno把它放一起 一个句子运行章节:一个冻结的、无状态的下一个标记预测器没有真信号。随机输出、基于标记的成本、有限上下文、冻结知识和未校准信心都是结果,你的狼籍存在包含每个。好消息是当模型做时它不移动,所以固定一个版本并围绕失败模式构建。