What Is Context, Really? — 上下文到底是什么?
What Is Context, Really? — 上下文到底是什么?
1. 一个让你抓狂的对话 — 为什么 AI 答非所问
想象一个普通的周三晚上。你正在赶明天的英语演讲稿,题目是"My Favorite Scientist"(我最喜欢的科学家)。你决定偷个懒,打开 ChatGPT,在对话框里敲下几个字:
> 你: 介绍一下爱因斯坦。
十秒钟后,屏幕上弹出一段长达五百字的人物小传,从 1879 年的出生地乌尔姆,一直写到 1955 年逝世前给罗素的那封著名信件。一切看起来都很完美,除了一个致命的小问题——你的演讲题目是"我最喜欢的科学家",而你心里其实想介绍的是居里夫人。你只是想先看看 AI 怎么写科学家介绍,回头再替换名字。
更糟糕的是,你的英语老师要求演讲用第一人称写,像这样:
> "When I was young, I dreamed of becoming a scientist. My favorite scientist is Marie Curie, because..."
但 AI 写出来的却是百科全书式的第三人称描述。你没办法直接用,只好全部推翻重写。结果是:你花了比从零开始还多 30 分钟的时间,却只得到一堆没用的文字。
这个故事听起来是不是有点熟悉?也许你自己就经历过。也许你的弟弟妹妹、你的同桌、你的好朋友,都曾经对 AI 抱怨过类似的话:"你根本没听懂我在说什么!""你写的根本不是我想要的!""为什么我换个问题,你就像失忆了一样?"
这些吐槽的背后,其实都指向同一个关键词——Context(上下文)。
上下文(Context) 不是一个抽象的哲学概念,而是一个非常具体的技术事实:它是 AI 在回答你之前,"看到"的全部信息。如果 AI 没看到某些信息,或者看到的顺序错了、格式乱了、过期了,它的回答就会像上面那个例子一样——技术上正确,但实用上一塌糊涂。
> 💡 小词典 / Mini Glossary > - Context(上下文):在 AI 系统中,指模型在生成回答之前能够"看到"的所有输入信息。 > - Prompt(提示词):用户直接输入的那段文字,是上下文的一部分,但不是全部。 > - LLM(大语言模型, Large Language Model):ChatGPT、Claude、Gemini 这一类通过海量文本训练出来的 AI 模型。
那么问题来了:为什么 AI 那么依赖上下文? 没有上下文,它就什么都做不了吗?这个问题的答案,要回到一个更基础的事实——大语言模型的本质是什么。
你可以把 ChatGPT 想象成一个极其博学、但严重失忆的图书管理员。
他读过世界上几乎所有的书(训练数据),他懂几十种语言,他甚至会写诗、会编程、会解数学题。但是,有一个致命的缺陷:每次你推开门走到他面前,他都完全不记得你是谁。他不记得你五分钟前说了什么,不记得你叫"小明",不记得你正在准备一篇英语演讲,也不记得你其实想介绍居里夫人。
他唯一能依靠的,就是你当下推到他面前的那一摞文件。
这摨文件,就是"上下文"。它可能包括:
- 系统设定("你是一个友善的写作助手")
- 你刚才说的话("介绍爱因斯坦")
- 你之前几轮对话的历史("我正在准备演讲"、"用第一人称")
- 你上传的文档("演讲稿模板.pdf")
- AI 之前调用工具得到的结果("当前时间是周三晚上 8 点")
把这些文件全部摆在图书管理员面前,他才能"看懂你的需求"。
而如果我们只给他一张纸条——"介绍爱因斯坦"——他当然只能写出一篇百科条目。他不知道你要写演讲稿,不知道要用第一人称,不知道你其实想写居里夫人,不知道你只有 5 分钟时间。他什么都不知道,因为他被剥夺了上下文。
所以,理解 AI 的第一把钥匙,就是理解:
> 上下文不是"提示词"的同义词,而是 AI 在生成回答前能看到的全部信息。
这一章接下来的内容,会带你把这把钥匙彻底磨亮。我们会用三个生活中常见的类比——对话背景、工作记忆、笔记本——来帮你建立直觉。然后,我们会把一次完整的 AI 对话拆开,看看那些信息是怎么从你的键盘流到模型的大脑里的。最后,你会亲自动手,画一张你自己的 AI 对话流程图,并且把一段真实的聊天记录中的"上下文"全部圈出来。
准备好了吗?让我们开始。
---
2. 上下文的三个层次 — 揭开 AI 看到的世界
如果你曾经好奇过"AI 到底是怎么理解我的问题的",那么这一小节会给你一个非常具体的答案。我们一起来拆解一次看似简单的对话,看看背后其实有三层不同的信息在协同工作。
2.1 第一层:系统提示(System Prompt) — 隐藏在水面下的规则书
假设你打开了 ChatGPT,在界面最上方写着 "Default GPT"(默认模型)。在你还没开口说一句话之前,OpenAI 的工程师其实已经塞给 AI 一大段隐藏的指令,我们叫它 System Prompt(系统提示)。这段提示可能长得像这样:
```text You are ChatGPT, a large language model trained by OpenAI. Knowledge cutoff: 2024-06 Current date: 2025-01-15
Be concise. If you don't know the answer, say so. Refuse to generate harmful content. Use markdown for formatting when appropriate. ```
你看不到这段文字,但它始终存在,就像图书馆里贴在墙上的"借阅规则":
- 不大声喧哗
- 借阅期 14 天
- 损坏书籍要赔偿
无论你问什么,图书管理员都会先遵守这些规则,然后才看你的具体需求。
系统提示的作用,就是给 AI 一个"角色设定"和"行为边界"。它告诉 AI:
- 你是谁(ChatGPT / 一个助手 / 一个数学老师)
- 你知道什么(知识截止到 2024 年 6 月)
- 你应该怎么说话(简洁、礼貌、用 markdown)
- 你不应该做什么(不生成暴力内容、不编造事实)
如果你使用的是定制 GPT 或者 Claude 的 Project,你可以自己修改这段系统提示。你可以把 AI 设定为"一个总是用 emoji 说话的 10 岁小朋友",或者"一个严谨到令人窒息的大学物理教授"。这种设定,会持续影响 AI 在整个对话中的表现。
类比 1:对话背景(Conversation Background)
想象你和一位新认识的留学生朋友第一次吃饭聊天。你们还没有熟到可以互相开玩笑,他也不知道你的兴趣、你的专业、你最近在忙什么。你们的对话会很"礼貌但浅"。
如果在你坐下之前,你们共同的朋友先告诉你:"他叫 Alex,计算机系大三学生,非常喜欢日本动漫和足球,性格有点闷骚,你可以开他玩笑。"——那么你们接下来的对话质量,会完全不一样。
这个"共同朋友的介绍",就是对话背景,也就是系统提示的对应物。它不是你说的某句具体的话,但是它给整段对话定下了基调。
> 🔑 关键判断 / Key Insight > 系统提示决定的是 "AI 是谁、应该怎么说话" 这种全局性的设定。它对你的每一句问题都生效。
2.2 第二层:用户输入(User Input) — 你说的那句话
这是最直观的一层——就是你敲进对话框的那些字。
```text 帮我写一段关于爱因斯坦的英语演讲稿,要求第一人称,300 词左右。 ```
模型看到的就是这段文字本身。它没有任何"魔法",只是字符序列而已。模型会做的是:
1. 分词(Tokenize):把这段文字切成一个个 token(我们下一章会详细讲)。 2. 理解意图:从 token 序列中推断你想要的是"生成英文演讲稿"。 3. 执行生成:基于它的训练数据和上下文,生成回答。
类比 2:工作记忆(Working Memory)
如果你读过一点心理学,你会知道人类也有"工作记忆"这个概念,也就是我们当下正在处理的那一小块信息。比如老师突然问:"上一节课讲的第三个公式是什么?"你的工作记忆会立刻调出最近几分钟内你听到的内容——前提是它还在你的"工作记忆窗口"里。
如果老师问的是你小学三年级学的某个公式,那就不在工作记忆里了,要从"长期记忆"里去翻,可能就翻不出来了。
AI 也是一样。它的"工作记忆",就是当下这一段用户输入。它能用的最近一次训练中学到的知识,会作为"参考背景",但真正决定它当下回答的,是这段用户输入,加上我们马上要讲的第三层。
2.3 第三层:对话历史(Conversation History) — 之前的几轮对话
这是最容易被忽视、但至关重要的一层。
假设你的对话历史是这样的:
``` [Turn 1] 你: 我是高中生,英语演讲比赛明天就要交稿,特别紧张。
[Turn 2] AI: 别紧张!先把题目和大致内容告诉我吧。
[Turn 3] 你: 题目是"My Favorite Scientist",我想介绍居里夫人。
[Turn 4] AI: 好的,我来帮你。
[Turn 5] 你: 介绍一下爱因斯坦。 ```
如果你只给 AI 看 Turn 5 这一条消息,它会以为你要写关于爱因斯坦的演讲。但实际上,你真正想要的是 Turn 5 改成居里夫人,而且要符合 Turn 1 里"高中生、紧张、英语演讲比赛"的语境。
这整个对话历史,就是第三层上下文。
AI 模型本身没有内置记忆(built-in memory),它不会自动"记住"你之前说过什么。每一次你和它对话,前端应用(比如 ChatGPT 的网页、App)都会自动把历史消息打包,重新喂给模型。
这是什么意思?意味着:
> 你看到的"对话历史",其实每次都被重新塞回到模型的输入里,作为新一轮的"上下文"。
下面这张图,可以帮你直观地理解这种"打包-重喂"的过程:
```mermaid sequenceDiagram participant U as User participant App as Chat App participant LLM as AI Model
Note over App,LLM: Turn 1 U->>App: "我是高中生,明天演讲比赛" App->>LLM: System + User Msg LLM-->>App: "别紧张,告诉我题目" App-->>U: 显示回复
Note over App,LLM: Turn 5 U->>App: "介绍爱因斯坦" App->>LLM: System + Turn1-4 + Turn5 LLM-->>App: 生成回答(基于完整历史) App-->>U: 显示回复 ```
这张图显示了一个事实:AI 模型在每一次回答时,看到的"输入"其实包含了完整的对话历史,而不只是你最新敲的那句话。
这也是为什么 AI 有时候会"自作多情"——你提到"那个之前的项目",它就自动帮你接上之前的内容。
类比 3:笔记本(Notebook)
让我们用一个更生活化的类比。
想象你和你的数学家教每周见一次面。但是,这位家教有一种奇怪的"诅咒":每次见面,他都失去上一次见面的所有记忆。
不过,你很聪明。你准备了一个笔记本,每次上课前,都会在第一页写上:
``` 学生:小明 学校:XX 中学 高一 目前在学的章节:二次函数 上次作业错题:第 3、5、9 题 家长的特别要求:多鼓励孩子 上次表扬:小明的几何直觉很好 ```
写完之后,你把这本笔记本交给家教,他读了 30 秒,说:"好的,我记得我们上次在二次函数,小明几何感不错,我们继续。"
这个笔记本,就是上下文。
如果你某一天忘了写笔记本就去找家教,家教就会一脸茫然:"你谁?我们要讲什么?"——这就是没有上下文的对话。
而对话历史,就是这本笔记本上"昨天的笔记"。你每次见家教,都要重新把这本笔记本的当天页面递给他。
> 🔑 关键判断 / Key Insight > AI 没有"长期记忆"。它所谓的"记住你说的话",其实是前端应用把对话历史打包重喂给它。如果你想让 AI 真的"记住"某些重要信息,你得主动把信息放在每次对话的开头——比如写一个"Conversation Starters"(对话开场白),或者在系统提示里说明。
2.4 三层合在一起:完整的"上下文结构"
现在,让我们把这三层拼在一起。一次完整的 AI 调用,模型看到的"输入",从结构上看是这样的:
```text [ System Prompt(系统提示), // 角色设定 + 行为边界 User Message 1(用户第 1 句), AI Response 1(AI 第 1 次回复), User Message 2(用户第 2 句), AI Response 2(AI 第 2 次回复), ... User Message N(用户第 N 句,即你最新的输入), // 还可以包括: Uploaded Documents(上传文档), Tool Results(工具调用结果,如搜索、网络浏览) ] ```
用数学符号可以简洁地表示为:
$$C = \{p_1, p_2, \ldots, p_n\}$$
其中 $C$ 是 Context(上下文)的集合,$p_i$ 是构成上下文的第 $i$ 个"信息单元"——可以是一条消息、一段文档、一个工具返回,等等。$n$ 是这些单元的总数量。
注意 $C$ 是一个集合(Set),而不是一个字符串。这提醒我们:
- 上下文**有顺序**(谁先谁后会影响 AI 的理解,通常最新的消息权重更高)
- 但本质上,它是由**离散的、有边界的信息块**组成的
理解这个集合的结构,对后面章节的"上下文工程"至关重要。因为"上下文工程"的本质,就是决定这个集合 $C$ 里要放什么、按什么顺序放、占多大比例。
> 💡 小词典 / Mini Glossary > - Turn(轮次):一次"用户提问 + AI 回复"的完整回合。一个 10 轮的对话,有 10 个 Turn。 > - Message(消息):Turn 内部的一条具体内容,可以来自用户或 AI。 > - System / User / Assistant 角色:消息的三种"身份标签",帮助模型区分"这是规则"、"这是用户说的"、"这是 AI 自己说的"。
---
3. 一个完整的请求-响应生命周期 — 跟着一次对话走一遍
上一节我们知道了"上下文由哪些东西组成"。这一节,我们要用一个完整的请求生命周期,来回答一个更具体的问题:一段文字,究竟是怎么从你的键盘流到模型的大脑里,又变成屏幕上的回答流回来的?
3.1 一段真实的对话:小明写演讲稿
我们用开篇那个"糟糕的对话"作为案例,但这一次,我们让小明变得聪明一点。他学会了主动提供上下文。
```text [System Prompt - 用户看不到,AI 永远看得到] 你是一位耐心的英语写作教练,擅长帮助高中生写演讲稿。 回答尽量简洁,使用 markdown 格式,语气鼓励但不夸张。
[Turn 1] 小明: 我是高一学生,英语演讲比赛明天截止。 题目是"My Favorite Scientist",我要介绍居里夫人(Marie Curie)。 要求:300 词左右,第一人称,口语化一点,不要太学术。 请先给我一个提纲。
[Turn 2] AI: 好的!这是一个非常适合第一人称演讲的题目。 我建议分三段: 1. 开场:为什么我对居里夫人感兴趣(个人故事) 2. 主体:她的两个关键成就(镭的发现、两次诺贝尔奖) 3. 结尾:她对我的启发 每个段落大约 100 词。要不要我先写开场段?
[Turn 3] 小明: 先别写。我想把开场段改成"我在博物馆看到她的实验记录本"这个故事。 请基于这个开头,生成完整 300 词的演讲稿。
[Turn 4] AI: (生成 300 词的演讲稿,以"那天在科技馆,我看到了..."开头) ```
我们用一张流程图,把这次对话的"请求-响应生命周期"完整画出来:
```mermaid flowchart TD A[小明打开 ChatGPT] --> B[前端读取 System Prompt] B --> C[小明输入 Turn 1] C --> D[前端打包完整上下文] D --> E[系统提示 + Turn 1] E --> F[发送给 LLM] F --> G[LLM 生成 Turn 2 回复] G --> H[前端显示给小明] H --> I[小明输入 Turn 3] I --> J[前端重新打包] J --> K[系统提示 + Turn 1-3 + Turn 3] K --> L[发送给 LLM] L --> M[LLM 生成 Turn 4 回复] M --> N[前端显示给小明] ```
这张图的关键信息是:每一次新的输入,前端都会把之前所有的对话历史重新打包,和新的用户消息一起送给模型。模型从来不会"记着"之前说过什么——它每次都是从零开始,只是被喂了"完整的历史剧本"。
3.2 三个最容易踩的坑
理解了生命周期之后,我们要指出三个新手最常犯的错误:
坑 1:把系统提示和用户输入混在一起
有些同学会把"你是一个友善的写作助手"这种角色设定,写在用户消息里,比如:
> "你是一个友善的写作助手,请你帮高中生写演讲稿,我现在需要..."
这看起来没什么问题,但实际上,角色设定放在不同位置,效果是不一样的。放在系统提示里,它会被持续、稳定地"加权";放在用户消息里,它会被当成一次性的输入,模型可能"读到但没认真对待"。
判断标准: 凡是"贯穿整个对话的规则",都应该放在系统提示里;凡是"当下这一句的具体请求",才放在用户输入里。
坑 2:忘记给文档和工具结果"留位置"
如果你让 AI 帮你总结一份 PDF,或者查询某个 API 的结果,这些"外部信息"也是*