4、上下文管理:上下文窗口的理解、关键信息前置、长对话中的上下文压缩技巧

好,咱们聊聊上下文管理。

说实话,这是 Prompt 工程里最容易被忽视,但又最致命的一环。我见过太多人,前面几轮对话还挺正常,聊着聊着模型就开始「失忆」了——要么答非所问,要么重复之前说过的话。你想想看,这多让人抓狂。

为什么会这样?说白了,模型不是人。它没有真正的「记忆」。它看到的,只是你塞进上下文窗口里的那一段文本。窗口有多大,它的「世界」就有多大。

4.1 上下文窗口:模型的「短期记忆」

每个大语言模型都有一个固定的上下文窗口。比如 GPT-4 是 8K 或 32K tokens,Claude 是 100K tokens。这个窗口,就是模型一次能「看到」的最大文本量。

我刚开始做 AI 应用时,踩过一个坑。当时做一个长文档分析工具,用户上传了一本 200 页的技术手册。我心想,Claude 不是有 100K 窗口吗?全塞进去不就完了?结果模型回答到一半,突然开始胡言乱语。后来一查,原来上下文窗口虽然大,但模型对中间部分的注意力会衰减。就像人看书,开头和结尾记得最清楚,中间部分容易模糊。

核心要点:
  • 上下文窗口是有限的,不是无限大
  • 模型对窗口开头和结尾的内容「记忆」更牢
  • 中间部分容易被「稀释」或「遗忘」

所以,别以为窗口大就可以随便塞。你得学会「精打细算」。

4.2 关键信息前置:把最重要的放在最前面

我个人习惯,写 Prompt 时会把最关键的信息放在开头。为什么?因为模型处理文本时,开头部分受到的「注意力」最多。这有点像写论文摘要——你得让读者(模型)第一眼就知道你要干什么。

举个例子,假设你要让模型帮你分析一份销售数据:

❌ 错误写法:
「我这里有一份 2024 年第一季度的销售数据。数据包含产品名称、销售额、地区、时间。请帮我分析一下哪些产品卖得最好。哦对了,数据格式是 CSV 的,第一行是表头。还有,我重点关注华东地区的销售情况。」

✅ 正确写法:
「任务:分析销售数据,重点关注华东地区。
数据格式:CSV,第一行表头。
数据内容:2024 年 Q1 销售数据,包含产品名称、销售额、地区、时间。
请找出销售额最高的 3 款产品。」

你看,第二种写法把「任务」和「重点」放在最前面。模型一上来就知道要干什么,后面的细节只是补充。我在项目中遇到过,同样的任务,只是调整了信息顺序,回答准确率提升了 30% 以上。

小技巧: 把 Prompt 想象成「电梯演讲」。你只有 30 秒,必须把核心诉求说清楚。剩下的时间,才是补充细节。

4.3 长对话中的上下文压缩技巧

长对话是上下文管理的重灾区。你想想看,跟模型聊了 20 轮,前面说了什么,模型可能已经忘得差不多了。这时候怎么办?

我总结了几种实用的压缩技巧:

4.3.1 定期「总结」历史对话

每聊 5-10 轮,就让模型帮你总结一下当前的关键信息。然后把这段总结作为下一轮对话的「前置上下文」。

示例 Prompt:
「请总结我们刚才的对话,提取以下信息:
1. 用户的核心需求
2. 已经确认的关键事实
3. 尚未解决的问题
用 3-5 句话概括。」

嗯,这里要注意。这个总结本身也会占用 tokens。所以我会在总结后面加一句:「请用最简洁的语言,不要多余修饰。」

4.3.2 丢弃「过时」信息

不是所有历史信息都有用。比如,用户一开始说「我想做一款电商 App」,聊了 10 轮后,需求已经细化到「购物车功能怎么设计」。这时候,最初的「电商 App」这个背景信息,其实已经不需要了。你可以直接丢弃,或者压缩成一句话。

我曾经做过一个客服机器人,用户跟它聊了 50 轮。如果不做压缩,上下文窗口早就爆了。我的做法是:每轮对话结束后,只保留「用户意图标签 + 最近 3 轮对话 + 关键实体」。其他全部丢掉。效果出奇的好。

避坑指南: 我曾经犯过一个错误——把所有历史对话都保留,结果模型开始「串戏」。它会把前面聊的 A 项目的信息,错误地应用到后面聊的 B 项目上。所以,该丢就丢,别舍不得。

4.3.3 使用「结构化摘要」替代原始对话

原始对话往往包含大量废话、重复、语气词。这些都可以压缩掉。我习惯用表格来存储关键信息:

轮次 用户意图 关键信息 模型回复要点
1-3 需求澄清 用户想做 B2B 电商,目标客户是中小企业 建议使用微服务架构
4-7 功能讨论 核心功能:订单管理、库存管理、支付对接 推荐使用 Stripe 作为支付网关
8-10 技术选型 前端 React,后端 Python,数据库 PostgreSQL 确认技术栈可行

你看,10 轮对话,压缩成一张表格,不到 200 tokens。模型一看就懂,而且不会丢失关键信息。

4.4 实战:一个完整的上下文管理流程

说了这么多,咱们来走一遍完整的流程。假设你要做一个「AI 编程助手」,帮用户写代码:

  1. 初始阶段: 用户说「我想写一个 Python 爬虫」。你把任务、语言、目标网站放在 Prompt 开头。
  2. 对话中期: 用户说「用 requests 库吧」「加个代理」「保存到 CSV」。每轮对话后,你更新「关键信息」列表,丢弃无关的闲聊。
  3. 对话后期: 用户说「再加个错误重试机制」。这时候,你把前面所有对话压缩成一段摘要:「任务:Python 爬虫。库:requests。功能:代理、CSV 保存。待添加:错误重试。」然后基于这个摘要继续。

这样做的好处是,模型始终聚焦在当前任务上,不会因为历史对话太长而「分心」。

总结一下:
  • 理解上下文窗口的局限性——它不是无限大,也不是均匀分布注意力
  • 关键信息前置——把最重要的放在 Prompt 开头
  • 长对话中定期压缩——用总结、丢弃、结构化摘要三种技巧

说白了,上下文管理就是「断舍离」。你舍得丢,模型才能记得牢。我见过太多人,恨不得把每一轮对话都塞进去,结果模型反而表现更差。记住:少即是多。

好,这一章就到这里。下一章咱们聊聊「角色设定与人格化」——怎么让模型扮演一个特定角色,而不是一个冷冰冰的 AI。