嘿,你的"上下文"是谁?
嘿,你的"上下文"是谁?
想象这样一个画面:你正和朋友小美聊得热火朝天,从昨天数学考试那道让你抓狂的附加题,聊到周末要不要一起去万达看新上映的科幻片。聊到一半,你随口说了一句:"就像上次小李推荐我们看的那部特效片一样,结尾绝对炸裂。"小美一脸茫然地看着你:"等等——小李是谁?我们什么时候说过要看电影了?我们刚才不是还在聊那道数学题吗?"
如果你遇上这种场景,你的第一反应大概是笑出来,然后心想:"这丫头是不是穿越了?"但如果小美接下来真的完全忘了你们之前说过的所有事情,只盯着你发呆,问:"你到底想说什么?能不能从头讲?"——这时候你会发现,原本顺畅的对话突然变得磕磕绊绊,像两条平行线再也不相交。
这,就是"丢失了上下文"的灾难现场。
1.1 假如你的朋友突然"失忆"——用日常对话看清"上下文"的本质
我们不妨把上面那个场景玩得再逼真一点。假设小美因为某种神奇的原因,真的每隔一分钟就会清空她脑子里关于你们对话的所有记忆。你会怎么跟她沟通?你会发现,你不得不在每一句话的开头,把之前所有已经讲过的背景信息全部重新讲一遍:
> 你:"小美,我想问你周末要不要一起去看电影。" > 小美:"好呀!什么电影?" > 你:"就是最近上映的那个国产科幻片。" > 小美:"听起来不错,但我为什么要去看?" > 你:"因为上次我们一起看过另一部科幻片,你说很喜欢那种特效,所以我想你可能也会喜欢这一部。" > 小美:"哦哦,听起来挺好的。等等,你说的'上次一起看',是跟谁?什么时候?" > 你:"就是上个月,跟小李一起看的啊。在你家客厅看的爆米花。" > 小美:"我认识小李吗?我忘了,我们刚才说到哪了?"
看到没有?原本一句轻松的话,现在必须重新打包成一段完整的"档案",小美才有可能搞懂你要说什么。如果你们要讨论的内容比较复杂,比如"我们是不是应该一起去做那个需要预约的活动"——你会发现自己根本聊不下去,因为光是交代背景就要花掉全部力气。
人类日常对话的顺畅,建立在一个前提之上:对话双方共享一个持续累积、不断更新的"上下文池"。这个池子里装着:
- **刚才说过的话题**:你们正在聊的是电影还是作业?
- **之前提到的关键信息**:小李是谁、那部电影是什么、上次一起做过什么。
- **你们共同知道的事实**:万达在哪里、周末是哪一天、爆米花是什么口味。
- **说话的"潜规则"**:比如小美知道你讨厌烂片,所以你不用解释为什么你说"绝对炸裂"。
- **对话的当前目标**:是要做决定、还是要吐槽、还是要一起回忆。
当这个池子是完整的、双方都能访问的时候,聊天的效率极高——你不用每次都从"从前有座山"讲起。但一旦这个池子被清空、或者两边看到的池子不一样,对话立刻崩塌。
给"上下文"一个不那么学术化的定义吧——
> 上下文(Context)就是在某个时刻,沟通双方共同拥有的、用以理解当前信息的全部背景知识。它包括之前说过的话、共同知道的事实、对方的意图,以及那些"不必明说但都在场"的前提。
你注意到了吗?这个定义里没有任何一个字提到"AI"。因为"上下文"并不是一个为AI生造的概念,它就是人类沟通的基础设施。只不过——当我们的沟通对象从人类朋友换成了AI之后,这个原本隐形的概念,突然变得关键到无以复加。
为什么?因为人类即使丢失了部分上下文,也能靠常识、靠推理、靠"我大概猜你想说什么"来勉强把对话继续下去。但AI不行。AI的理解能力极度依赖被显式喂给它的上下文。你没有告诉它的,它就真的不知道——它不会像小美突然"失忆"那样只是忘了上一句,而是会从最开始就完全偏离你的本意。
所以这一节我们先记住一件事:上下文不是可有可无的修饰,而是对话能否成立的根基。
---
1.2 AI的"记忆口袋"——它到底装得下多少?
现在我们把目光转向AI。如果你和ChatGPT、文心一言、通义千问这样的AI聊过天,你或许会注意到一个现象:如果你开了一个新对话,问它:"我们刚才聊的那个项目怎么办?"它一定会礼貌地、困惑地反问你:"我们刚才聊过什么项目?"
这是因为——AI的"记忆"和人类的记忆之间,有一个根本性的差异。
人类的记忆是分散的、动态的、有损压缩的。我们记得"上次和小美看过一部特效很炸的电影",但记不清那个特效具体是什么颜色,是几分钟的第几分钟。我们通过直觉、联想、模糊匹配,从海马体和大脑皮层的各个角落把信息调出来。
AI不一样。AI的"记忆"更像是一个有固定大小的"口袋"——我们通常称之为"上下文窗口(Context Window)"。你可以把它想象成一个透明的、只能在短时间内使用的背包。这个口袋有几个非常鲜明的特征:
第一,它是有大小限制的。 不同的AI模型,这个口袋的大小不一样。最早期的一些模型,口袋小到只能装下几千个汉字的信息——这意味着你和它聊天稍微长一点,AI就会"忘记"你们最开始说了什么。现在的顶级模型口袋已经大得多,能装下几十万甚至上百万字的资料。但即便是最大的口袋,也是有限的。没有任何一个AI模型,能装下你这一辈子的所有聊天记录。
第二,它的工作方式是"快照"式的。 当AI生成下一句话时,它并不是像人类那样"回忆上一句说了什么",而是把整个口袋里的所有内容一次性看一遍,然后决定下一句话该怎么写。这就像一个学生在考试时,不能"翻以前写过的草稿",只能盯着面前的试卷。
第三,它会自动滚动覆盖。 一旦口袋装满了新进来的信息,最早的那些信息就会被"挤出去"——就像一个循环队列,先进去的先消失。所以如果你和AI聊了一个很长很长的对话,问它"我们最开始说了啥",它可能就会一脸茫然。
第四,它没有真正的"长期记忆"。 每次新开一个对话,AI都会"重新投胎"——它的口袋清空,从零开始。除非你或者某个工具,主动把过去的对话内容再塞进新对话的口袋里。
这听起来是不是有点像我们刚才想象的小美?但AI比小美还要"纯粹"——它不会主动推理,不会补全背景,口袋里有什么它才能用什么,口袋里没什么它就只能瞎猜。
这里有一个关键概念叫做Token(标记),你需要知道。AI不直接处理汉字或者英文单词,而是把输入的内容切分成一个个"token",每个token大约相当于一个汉字或者半个英文单词。当我们说某款AI的"上下文窗口是8K"时,意思就是它的口袋最多能装8000个token左右的文字信息。一个中文字 ≈ 1.5个token,一个英文字 ≈ 0.5个token。如果你想换算一下:8K 的口袋,大约能装下 4000~5000个汉字。
你可能立刻会问:"那这个口袋太小了呀!一本书几十万字,怎么装得下?"非常好——这个问题,恰恰就是本书后续章节要解决的核心问题。我们不会让AI硬生生去读完整本书。我们会教它"摘要"、"检索"、"外挂记忆"这些技巧。但在那之前,你必须先记住:口袋里装什么、不装什么,用什么顺序装,直接决定了AI能不能给你一个满意的回答。
一个对比小实验
让我们来做个简单的对比。想象你分别和两个"失忆的人"说话:
人甲的规则:他忘记了3分钟前的事,只记得当下和3分钟内的对话。
人乙的规则:他不仅忘记了3分钟前的事,他还忘记了你们之前达成过的所有共识——比如你之前告诉他"我不吃香菜"这件事,现在他完全不记得。
你会发现,和人甲聊天,虽然要不时重提三五句话之前的要点,但大体还能聊下去。和人乙聊天,简直是灾难——你说"和上次一样",他会问"什么一样?";你说"我们说好周末去爬山",他会反问"我们什么时候说好过?"
现代大语言模型的表现,更接近"人乙"。它不会自动从你的描述里推导出"你之前说过的某件事",除非那段事实在它能看到的口袋里。这就是为什么很多新手用户会崩溃:"我明明在前面说过,它怎么后面又问我?!"——因为那段"前面说过"的内容,可能早就被口袋自动挤出去了,或者它根本就没有跨对话被带到新一段聊天里。
所以你可以这样理解:AI的'记忆口袋'既是它理解你的唯一资源,也是它出错的根源之一。口袋满,则AI聪慧无比;口袋空或者口袋里装的全是垃圾,AI就像个金鱼脑。
---
1.3 从输入到回应——AI处理信息的完整流程
知道AI的口袋有限之后,我们就可以更清晰地画出它处理一次对话的全流程了。这一节,我们一起走进AI的"大脑"——至少,是它对你可见的那一面。
我们先用一张流程图把整个过程看清楚:
```mermaid flowchart TD A[用户输入文本] --> B{上下文窗口<br/>是否已满} B -- 没满 --> D[放入上下文窗口] B -- 已满 --> C[截断最早的内容<br/>腾出空间] C --> D D --> E[模型读取全部上下文] E --> F[结合训练学到的知识<br/>进行推理与生成] F --> G[输出一段回应] G --> H{本轮对话<br/>是否继续} H -- 是 --> A H -- 否 --> I[对话结束<br/>口袋清空] ```
下面我们用更具体的话,一步一步地解释这张图在做什么。
第一步:用户输入文本(节点A)
你打开了和AI的一个对话窗口,输入了一句话,比如:"帮我写一首关于秋天的诗,要押韵的,不要太悲伤。"这一刻,你的这段文字会作为"用户消息"被发送过去。
在更复杂的系统里,"用户的输入"并不只是你这一句话——它还包括:你之前在这个对话里说过的所有话、AI之前回复过的所有话、可能还有系统提示词、外部知识库里检索到的相关资料、工具调用的结果等。但对你而言第一步就是这一句输入。
第二步:判断口袋是否已满(节点B)
这是AI系统内部的一次"盘点"。它会检查当前口袋里已经装了多少信息,还可以再装多少。如果还有空间,就直接放进新内容。如果已经满了——
第三步:截断最早的内容(节点C)
系统会按照规则,把口袋最前面(也就是时间上最早的)那些内容挤出去,给新内容腾位置。具体的截断策略因系统而异:可能是简单粗暴地把前N个token砍掉,可能是保留系统提示词不动只砍中间的对话,也可能是用某种摘要算法把早期内容浓缩成几句话。无论哪种,关键事实是:原本在口袋里的内容,可能这一刻就不见了。
第四步:放入上下文窗口(节点D)
新内容被放进口袋,口袋里的内容此刻是"模型可见的全部"。
第五步:模型读取并生成(节点E和F)
模型这一刻的核心动作是——把口袋里所有内容重新读一遍,然后基于它从训练中学到的庞大知识(这些知识固化在它的"参数"里,跟口袋无关,是它出厂就自带的"内置知识库"),来预测下一段文字应该是什么。这个过程不是查表,是逐token的、概率性的生成。你可以理解为:它在心里把口袋里的内容当作题目,然后开始作答。
第六步:输出一段回应(节点G)
模型生成的内容会作为"AI的回复"返回给你,呈现到屏幕上。
第七步:对话是否继续?(节点H)
如果对话继续,那么这一轮AI的回复也会作为"口袋里的新内容"被放进口袋,等待你的下一句输入,开始新一轮循环。如果对话结束,整个口袋随之下一次新对话一起清空。
你可能已经看出来了——这个流程图里有两个隐藏的难题:
1. 口袋满了之后怎么办? 第2步到第3步的"截断"动作,是仓促且粗鲁的。早期的关键信息可能就这么被无声无息地丢了。
2. 口袋里的内容质量,决定了模型生成的质量。 模型本身的能力是固定的——同一个GPT-4或者Qwen-Max,它们的"内置知识库"是不会因为对话而改变的。能改变的,是它"看到的素材"。给它看的素材好、组织得清楚,它就能表演得出色;给它的素材乱、跟问题无关、或者缺了关键前提,它就开始胡编乱造。
这两个难题,正是我们这一整本书要解决的核心。我们要做的工作,用一个时髦的术语来讲,就叫"上下文工程(Context Engineering)"。
---
1.4 上下文工程的五大核心任务——让AI真的"看懂"你
既然AI的表现完全取决于"口袋里装什么、怎么装",那我们就有了一门手艺:精心设计喂给AI的上下文。这门手艺,叫上下文工程。
上下文工程不是单一动作,而是一整套系统的工程实践。它至少包含五类核心任务。我们一一来看。
任务一:上下文收集(Gathering)——把素材找全
第一步是"找资料"。AI需要的素材远不止用户当前这一句话。一个完整的上下文可能包含:
- **系统提示词(System Prompt)**:告诉AI"你是谁、应该怎么表现"。比如"你是一个耐心的初中数学老师,请用通俗易懂的语言讲解"。
- **历史对话**:之前在这段对话里说过什么。
- **用户当前的问题**:刚刚输入的那句话。
- **外部知识**:从知识库里检索到的相关文档、用户上传的文件、工具返回的结果等。
- **环境信息**:当前时间、用户所在地区、应用场景等。
收集这些素材,听起来简单,做起来难。因为你很可能不知道哪些素材是"有用"的。比如用户问:"我家昨天停电了,今天怎么办?"——这是关于"停电",还是关于"今天要做的事",还是关于"电力公司联系方式"?没有更多信息,你根本不知道该去找什么资料。
收集阶段的难点不在于"找得多",而在于"找得准"。漏掉关键素材,AI就会抓瞎;塞进无关素材,AI也会被误导。
任务二:上下文筛选与压缩(Filtering & Compression)——给口袋瘦身
口袋里空间有限,不可能把所有素材都塞进去。第二个任务就是"瘦身"。
筛选就是判断哪些信息是有用的、哪些是噪音。比如一段长对话里,关于"午饭吃什么"的几句寒暄,可能跟回答用户技术问题毫无关系,可以被剔除掉。
压缩则是把长内容变短,但保留关键意思。比如把一份一万字的产品说明书压成五百字的摘要,或者把十轮对话浓缩成一段"到目前为止我们讨论了X、Y、Z三个要点"。
筛选和压缩的目标是:在有限的口袋空间里,塞下尽可能多、尽可能有用的信息。 这是上下文工程里最吃技术功底的活儿。压缩得不好,关键细节就丢了;筛选得不好,干扰信息就留下了。
任务三:上下文的组织与排序(Organization)——摆好货架子
同样是装进一个袋子里的东西,摆放的顺序不一样,模型对它们的"重视程度"也不一样。
研究表明,模型对靠近"口袋开头"和"口袋结尾"的内容更敏感,中间的内容容易被"忽略"。这叫"中间遗忘(Lost in the Middle)"现象。所以排列顺序非常重要。
组织任务还包括:用清晰的标签、标题、分隔符,把不同类型的内容区分开来。比如:
``` [系统提示] 你是一个严谨的AI助手...
[历史对话] 用户:上次我们讨论了…… 助手:我当时的回答是……
[当前问题] 请问接下来该怎么办?
[外部知识] 根据文档A.pdf 第3章的内容…… ```
组织良好的上下文,就像把一家便利店的货架理得整整齐齐,顾客(也就是模型)一眼就能找到自己需要的东西。
任务四:上下文的注入与提示工程(Injection & Prompting)——怎么问出好答案
即使素材找全了、瘦过身了、摆放整齐了,怎么"递给"模型也是有讲究的。
注入讲究的是时机和方式。比如:
- 系统提示词应该放在口袋最前面,因为它设定了整个对话的"基调"。
- 检索到的外部知识应该放在用户问题**之前**,让模型先"看一眼"再回答。
- 工具调用的结果应该紧跟在调用之后出现,方便模型立刻使用。
提示工程(Prompt Engineering)则是更精细的技术:通过措辞、举例(Few-Shot)、思维链(Chain-of-Thought)、角色扮演等方式,引导模型生成更符合预期的答案。一个好的提示,可以让普通的素材发挥出超常的水平;一个差的提示,再好的素材也可能被浪费掉。
任务五:上下文的状态管理(State Management)——长对话的关键
最后一个,也是最复杂的:当对话变得很长很长(几十轮、上百轮),或者同一个AI要在多个任务之间切换时,怎么管理它的"状态"?
状态管理的核心问题是:哪些信息需要长期保留?哪些信息只在当下有用?跨对话时,哪些内容需要被"搬运"到新对话的口袋里?
优秀的AI应用(比如Cursor、Manus、各种Agent产品)背后,都有一套精心设计的状态管理机制——可能是用外部数据库存储关键信息并按需检索,可能是把对话总结成一棵"知识树",也可能是把信息结构化到Markdown文件里再喂给AI。
---
这五个任务,构成了上下文工程的整体框架:
1. 收集——把素材找全 2. 筛选压缩——给口袋瘦身 3. 组织——摆好货架子 4. 注入——怎么递给模型 5. 状态管理——长期怎么维护
在后面的章节里,我们会深入每一个任务,讲解具体的技巧和工具。在这一章,你只需要建立一个心智模型:上下文工程不是凭感觉写一段提示词那么简单,而是把"找素材—挑素材—排素材—递素材—长期管理素材"这套流程做扎实。
然而,光说不练假把式。下面我们就来亲身体验一下:"上下文搞砸"的世界,到底有多糟糕。
---
1.5 传话游戏实验——亲自体验"上下文丢失"的灾难
这一节我们做一个简单的实验。强烈建议你真的找两三个朋友一起做,这样体会更深。
实验名称:手机短信版"传话游戏"
人数:3~5人
工具:微信、QQ 或任何可以"复制粘贴"的聊天工具,不能语音!必须打字!
规则:
1. 第一个人创建一段"原始信息",大约 100~200 字。内容可以是你读过的某本书的简介、某道数学题的题目、某个电影剧情的梗概,越具体越好。 2. 这个人把这段文字单独发给第二个人。不能加上任何额外解释。 3. 第二个人收到后,不准看原文,只能用嘴(或者语音转文字)把这段内容用自己的话说一遍给第三个人。注意:转述过程中不允许回头看原文。 4. 第三个人再用同样方式传给第四个人。 5. 最后一个人把收到的内容完整地打字还原,发到群里,跟原始信息对比。
让我们来模拟一下可能的灾难现场:
假设原始信息是:
> "小明的爷爷是一位退休数学教师,他每天早晨散步时会路过一所小学。有一天,他看到一群孩子在操场上玩跳房子,于是想起小时候自己教学生用粉笔在黑板上画九宫格的往事。他决定重新出山,每周免费去学校教孩子玩跳房子背后的数学规律。"
经过四五个人转述后,你可能会看到这样的"成品":
> "小明的爷爷以前是老师,他看到一个小孩在操场上玩什么东西。小孩在玩跳房子。小明的爷爷想起了自己的童年,说要回到学校教他们数学。"
短短四五个人,"退休教师"、"每天散步路过小学"、"看见一群孩子"、"在黑板上画