大语言模型(LLM)的每一次调用,就像抛一枚硬币,每一次都是独立的事件,不受之前结果的影响。这种无记忆性是大模型工作方式的一个核心特性,也正是我们理解如何有效利用大模型的关键。本文将深入探讨大模型的无记忆性,以及为何上下文对于获得高质量输出至关重要,并阐述如何在实际应用中进行有效的上下文工程,提升大模型的性能。
无记忆性:大模型的“薛定谔”状态
文章开篇提到,抛硬币的例子很好地诠释了无记忆性的概念。即使你连续抛了九次正面,第十次抛出正面的概率仍然是50%。同样,对于大模型来说,除非你明确地提供历史信息,否则每一次调用都是一个全新的开始。
具体来说,每次你向LLM发送prompt时,它都会根据你当前给定的prompt生成一个响应。它不记得你上次的查询,也不知道你五分钟前问了什么。就像硬币一样,它对过去没有记忆,除非你明确地再次传递该上下文。
将每次LLM调用视为一个伯努利试验,是一种理解其工作原理的有效方式。伯努利试验是指只有两种可能结果的随机试验,例如抛硬币(正面或反面)。每次LLM调用都是一个独立的尝试,旨在产生理想的结果,但成功并非必然,而且不会累积。模型不会从之前的失败中“学习”,除非你将记忆构建到系统中并明确提供必要的上下文。否则,每次调用都像从头开始一样,就像再次抛硬币。
这就引出了一个重要的问题:我们如何才能让大模型“记住”信息,并在后续的交互中使用这些信息呢?答案就在于上下文。
上下文:构建大模型记忆的桥梁
虽然大模型本身具有无记忆性,但它们并非一无所知。在训练阶段,大模型通过海量的数据集学习,并将这些数据中的模式、结构和潜在知识压缩并泛化到复杂的参数网络中。这些参数编码了统计关联、结构和潜在知识——本质上是烘焙到模型权重中的功能性记忆。
换句话说,LLM记住了大量关于语言、事实、风格和推理模式的信息——但仅限于抽象意义,嵌入在其训练的参数中。 这是预训练的记忆,而不是动态记忆。 部署后,模型不会继续从新输入中学习,也不会保留跨调用的对话历史记录,除非我们明确地设计它来这样做。
关键的区别在于:训练时赋予模型内在知识;推理时(即当您提示它时)是无记忆的——除非您手动提供先前交互的上下文。
因此,上下文至关重要。发送给已部署 LLM 的每个 prompt 都必须携带模型生成相关、连贯和成功响应所需的所有信息——就像每次抛硬币都不需要知道上次的结果一样,但结果仍然取决于您抛掷的方式。
例如,如果你想让一个大模型编写一篇关于“气候变化对农业的影响”的文章,你需要在prompt中提供尽可能详细的上下文,包括:
- 目标读者:例如,是面向普通大众还是专业人士?
- 文章风格:例如,是科普性的还是学术性的?
- 重点内容:例如,侧重于哪些地区的农业,以及哪些具体的气候变化因素?
- 字数要求:例如,要求文章长度在2000字左右。
提供的上下文越清晰、越具体,大模型生成的文章就越符合你的期望。反之,如果只给出一个模糊的prompt,例如“写一篇关于气候变化的文章”,那么大模型很可能会生成一篇泛泛而谈的文章,无法满足你的具体需求。
Token依赖性:Bernoulli试验的局限性
虽然我们可以将每次LLM调用视为一个伯努利试验,但这种类比也有其局限性。文章指出,一旦模型开始生成文本,它生成的token就不是独立的事件。
恰恰相反。 LLM 中的token生成遵循一个顺序的、有条件的流程——每个token都是根据它之前的token进行采样的。 这本质上是贝叶斯性质的。 Prompt激活模型内部参数的一个子集,有效地使其与它已经学习的众多概率分布之一对齐。 从那里,它一次生成一个token,每个token都受到先前序列的影响。
也就是说,虽然每个LLM调用都是无记忆的,但调用中的生成是上下文敏感的。 该模型不会盲目猜测——它会根据它在当前prompt和输出流中已经看到的所有内容进行预测。
这个概念非常重要,因为这意味着我们可以通过调整上下文来控制大模型生成文本的走向。
例如,如果你想让大模型编写一个程序,你可以先提供一个清晰的上下文,说明程序的功能、输入输出格式以及所使用的编程语言。然后,你可以逐步地引导大模型生成程序的各个部分,并根据需要进行修改和调整。
在这个过程中,每一个token的生成都依赖于之前的token,而整个程序的质量则取决于我们提供的上下文和引导的策略。
上下文工程:精雕细琢的艺术
理解上下文的重要性,就引出了上下文工程的概念。上下文工程是指通过精心设计prompt和构建上下文,来优化大模型的输出质量。
正确的内容引导模型朝着有意义的、准确的响应方向发展。 它充当一个支架,使模型的行为与您的期望保持一致。 但错误的内容——无论是残缺的、误导性的还是嘈杂的——都会使模型偏离预期的结果。 在这些情况下,该模型并没有“错误”; 它只是遵循给定内容所暗示的统计路径。
在LLM系统中,上下文就是指南针。 没有它,你就是在盲目地导航概率空间。 有了它,您就可以清晰而有目的地将强大的生成引擎导向目标。
上下文工程不仅仅是简单地提供信息,更重要的是要理解大模型的工作原理,并根据其特点来构建上下文。
以下是一些上下文工程的技巧:
- 明确目标:在开始编写prompt之前,明确你希望大模型实现的目标。
- 提供背景信息:提供足够的背景信息,让大模型理解你的意图。
- 使用关键词:使用与目标相关的关键词,引导大模型生成更准确的结果。
- 限定范围:限定大模型生成内容的范围,避免其发散到无关主题。
- 提供示例:提供示例可以帮助大模型理解你的要求,并生成类似风格的内容。
- 逐步引导:将复杂任务分解为多个步骤,逐步引导大模型完成任务。
- 迭代优化:根据大模型的输出结果,不断调整prompt和上下文,直到获得满意的结果。
案例分析:
假设你想让大模型写一篇关于“如何提高工作效率”的文章。
错误的prompt:
“写一篇关于如何提高工作效率的文章。”
改进的prompt(增加上下文):
“你是一位时间管理专家,请为职场人士写一篇关于如何提高工作效率的文章,目标读者是25-35岁的白领,文章风格轻松幽默,字数在1500字左右,需要包含以下几个方面:
- 设定明确的目标
- 制定详细的计划
- 避免拖延症
- 合理利用时间
- 保持专注
- 适当休息”
通过提供更详细的上下文,你可以让大模型生成更符合你期望的文章。
数据支持:
研究表明,精心设计的prompt可以显著提高大模型的输出质量。例如,OpenAI发布的一项研究显示,通过使用更清晰、更具体的prompt,可以将GPT-3的性能提高50%以上。
结论:驾驭无记忆的智能
大模型的无记忆性既是挑战,也是机遇。理解了这一特性,并掌握了上下文工程的技巧,我们就可以更好地驾驭大模型,让其为我们所用。
上下文是大模型理解我们意图的桥梁,也是控制其输出质量的关键。在未来的应用中,我们需要更加重视上下文工程,不断探索新的方法和技术,以充分发挥大模型的潜力。
正如文章结尾所说,在 LLM 系统中,上下文就是指南针。 没有它,你就是在盲目地导航概率空间。 有了它,您就可以清晰而有目的地将强大的生成引擎导向目标。 让我们掌握这个指南针,开启大模型应用的新篇章。