构建真正有效的 AI 应用,重点不在于编写完美的提示词(prompt),而在于控制你输入给模型的信息。如果你曾与助手进行过长谈,却发现它忘记了你十分钟前说过的话,那么你已经体会到了上下文工程(context engineering)失败时的后果。人们很容易认为 AI 的记忆力不好。实际上,你只是触碰到了上下文窗口(context window)的硬性限制。
为了构建保持可靠且响应迅速的系统,你需要理解三个基本概念:token、上下文窗口以及上下文与记忆之间的区别。
Token 才是真正的硬通货
Token 不等于单词。当你向模型发送文本时,分词器(tokenizer)会将其拆分为更小的片段。像 "cat" 或 "the" 这样简短的常用词可能各占用一个 token。而像 "internationalization" 这样密集的术语则会被切分成多个 token。标点符号、空格和特殊字符也都会被计算在内。这至关重要,因为 token 决定了一切:你的 API 账单、响应速度以及输出质量。
如果开发者仅通过计算单词量来规划成本,那无异于盲目飞行。一个包含大量代码括号和长变量名的百字提示词,其消耗可能会远超预期。这就是为什么分词器作为独立工具而存在的原因。在发布功能之前,请使用分词器运行一下你的典型负载(payloads)。你经常会发现,系统指令、格式模板和聊天历史消耗的预算比实际的用户查询还要多。从第一天起,就将 token 视为一种稀缺资源。
上下文窗口是一块固定的白板
上下文窗口是模型在单次请求中能够看到的信息总量。可以把它想象成一块尺寸固定的白板。你可以用系统规则、对话历史、检索到的文档和当前问题来填充它。但一旦表面被填满,就必须做出取舍。旧的笔记必须被擦除、拍照并总结,否则白板就会溢出。
现代模型宣传的上下文窗口从几千个 token 到数十万个 token 不等。人们很容易将更大的窗口视为无限存储空间,但事实并非如此。白板依然是有边界的。当历史记录超过限制时,应用程序必须丢弃旧消息或对其进行压缩。理解这一约束有助于你不再将窗口视为数据库,而是将其视为活跃的工作空间。
上下文不等于记忆
这是一个甚至会让经验丰富的构建者也感到困惑的区别。模型本身是无状态的(stateless)。它不会记得你昨天、上周,或者在另一个会话中十分钟前说过的话。当 AI 似乎记得你比起 JavaScript 更喜欢 Python,或者你喜欢简洁的回答时,这种“记忆”存在于应用层,而非模型本身。
应用程序将这些事实存储在数据库、缓存或内存存储中。在每一次新请求中,它都会将相关的个人资料数据重新注入到提示词中。模型只是在阅读一份包含了第一幕台词的剧本。它没有持久的自我。一旦你内化了这种分离,你的架构就会发生变化。你不再要求模型去记忆,而是开始设计在正确的时间获取正确上下文的系统。
为什么更多的上下文可能会适得其反
常识告诉我们,更多的背景信息应该能产生更好的答案。但往往情况恰恰相反。过多的上下文会产生噪音。如果你只需要修复一个函数,却把整个代码库都交给模型,你就是在强迫它在噪声中寻找信号。研究人员已经发现了“迷失在中间”(Lost in the Middle)效应:模型通常会更加关注提示词开头和结尾的细节,而埋在中间的信息则会被稀释或忽略。这不是一个可以通过巧妙措辞来修复的 bug。这是基于 transformer 架构的一种结构性行为。
臃肿的提示词也会让你痛不欲生。每增加一个 token 都需要计算。延迟会增加,成本会攀升,用户的耐心也会缩减。一个塞满了无关文档的提示词会引入矛盾,用无关的细节分散模型的注意力,并增加响应纠结于错误问题的概率。信息量是精准度的敌人。
如何进行更好的上下文工程
优秀的上下文工程是一场冷酷无情的编辑练习。以下是具体实践方法。
仅发送任务所需的内容。 如果用户询问您的退款政策,请不要包含员工手册、API 文档和上一季度的营销文案。相关性胜过全面性。
使用 RAG 检索相关文档。 检索增强生成(Retrieval-Augmented Generation)允许您搜索大型知识库,并仅将匹配度最高的段落注入到提示词(prompt)中。与其将上千页的手册全部塞进窗口,不如对文档进行嵌入(embed),针对用户的查询进行语义搜索,并仅包含最相关的三个段落。这样模型就能获得它确切需要的内容,同时您的 token 预算也能保持不变。
总结旧对话。 完整的聊天记录既昂贵又充满噪音。请使用持续更新的摘要来替换冗长的消息历史。例如,与其向模型输入三十条往返对话,不如存储一个段落:“用户询问了 Django 部署,遇到了静态文件错误并修复了权限。当前问题是 Postgres 14 上的数据库迁移失败。” 这种摘要可以在不弄乱“白板”的情况下保留状态。
将长期记忆与活跃对话分离。 用户偏好、项目设置和账户历史应属于外部存储器。有选择性地查询该存储器。实时上下文窗口应仅携带当前任务以及维持连续性所需的极简个人上下文。
在生产环境中监控 token 使用情况。 延迟峰值通常直接归因于上下文膨胀。当请求接近模型的限制时,请设置警报。审查日志以识别携带冗余信息的提示词。优化每次都始于同一个问题:在不破坏任务的前提下,我们可以删除什么?
核心启示
最优秀的 AI 应用之所以胜出,并不是因为它们拥有最大的上下文窗口,而是因为它们能够严谨地管理上下文。如果一块巨大的白板上写满了乱七八糟的涂鸦,那它也是毫无用处的。构建能够检索、总结和过滤的系统。这样,您的用户可以获得更快的回答,您的基础设施成本可以保持可预测,而您的模型最终也能专注于真正重要的事情。
来源:AI Context Engineering: Tokens, Context Windows, & Memory
