每次新对话都要重新讲一遍项目背景?讲到最后,AI 说"我忘了你在开头说了什么"。不是它记性差,是你喂的东西不对。
AI 编程助手的上下文窗口有上限。这个窗口里的每一条信息都有一个隐藏成本:它占用了 AI 的注意力,挤占了真正重要的信息。
一个比喻:上下文窗口是你和 AI 之间的一张桌子。每次你放东西上去,就有东西被挤下去。你不知道什么被挤下去了——它只是消失了。
上下文管理的本质不是"放更多",是"放更少,放更对"。
每次新对话,一股脑把所有背景信息喂给 AI:
# ❌ 全量投喂:800 行上下文一次性塞进去
背景:我们是一个电商团队,后端用 Python 3.12 + FastAPI
数据库是 PostgreSQL,缓存用 Redis,消息队列用 RabbitMQ
项目结构:src/api/、src/models/、src/services/...
上个月重构了用户模块,方案是...
上周踩了三个坑:并发锁、缓存雪崩、消息重试...
今天要做的任务是...800 行上下文。AI 会认真读完——但读到今天要做的任务时,它已经不记得缓存雪崩的细节了,虽然你在开头说过。
# ✅ 热数据(每次新对话必喂,控制在 100 行以内)
# 文件:CONTEXT_HOT.md
当前任务:[一句话]
最近完成:[近 3 天的关键产出]
遗留问题:[当前开放的问题]
已知陷阱:[和当前任务相关的已知坑]
关键约束:[本次任务必须遵守的规则]
# ✅ 冷数据(按需检索,不默认加载)
# 文件:CONTEXT_COLD.md
完整项目背景
技术栈详情
历史决策记录
事故日志每次新对话 AI 只读热数据。 当它需要了解某个历史决策时,你说"参考 CONTEXT_COLD.md 第 3 节关于数据库选型的决策"。
800 行一次性喂进去 = AI 的注意力被稀释。它看到"用户模块重构"和"缓存策略"这两条信息时,不知道哪条和当前任务相关——所以它平等对待所有信息。
100 行热数据 + 按需检索 = AI 的注意力集中在当前任务上。当它确实需要了解某段历史时,那段历史才被加载。
"不知道是否需要"的信息,默认不加。加载的成本比遗漏的成本大——遗漏你可以随时补充,但注意力没了就是没了。
记忆文件里记录了完整的讨论过程:
# ❌ 过程记录:300 行
3 月 15 日讨论数据库选型:
我说:MySQL 还是 PostgreSQL?
AI 说:PostgreSQL 在 JSON 查询上有优势
我说:但我们大部分查询是关系型的
AI 说:那 MySQL 在你的场景下性能更好
我说:但团队对 PostgreSQL 更熟悉
...
(省略 200 行讨论过程)
最终决定:用 PostgreSQL300 行记录,核心信息只有最后一行。
# ✅ 决策摘要:5 行
## 数据库选型(2026-03-15)
决策:PostgreSQL
原因:团队熟悉 + JSON 查询需求(未来会用到)
替代方案:MySQL(关系型查询更快,但团队不熟悉)
约束:所有新表用 UUID 主键,不用自增 ID决策摘要回答三个问题:定了什么、为什么、放弃了什么。 多余的信息——当时的讨论过程、AI 给了多少方案、你犹豫了多久——在上下文管理层面都是噪音。
def distill_to_summary(raw_log):
summary = {
"decision": extract_final_decision(raw_log),
"reason": extract_key_reason(raw_log, max=2),
"alternative": extract_rejected_option(raw_log, max=1),
"constraint": extract_derived_constraint(raw_log),
}
return summary
# 输入:300 行讨论记录
# 输出:5 行决策摘要过程记录留在日志里,决策摘要放在记忆里。 日志用来追溯,记忆用来快速恢复上下文。两者分工不同。
AI 的上下文里,大部分是"肯定信息"——"我们用 Flask"、"路由用装饰器"、"数据库是 PostgreSQL"。
这些信息告诉 AI 每件事的"正确答案"是什么。但 AI 需要的不只是"正确的做法",还需要"我们试过但不行的做法"。
# ❌ 只有肯定信息
技术栈:Python 3.12 + FastAPI
ORM:SQLAlchemy 2.0
# 有一天你让 AI 做性能优化
AI:可以用 raw SQL 替换 ORM 查询来提升性能
你:但我们之前试过 raw SQL,维护成本太高,放弃了
AI:好的,那我换一个方案
# 浪费了一轮对话
# ✅ 否定信息让 AI 不走重复的弯路
技术栈:Python 3.12 + FastAPI
ORM:SQLAlchemy 2.0
已排除方案:
- raw SQL → 维护成本太高(2025-12 决定)
- Redis 做主存储 → 数据一致性风险(2026-01 决定)
- Celery → 太重,用内置 BackgroundTasks(2026-02 决定)"肯定信息"让 AI 知道路在哪。"否定信息"让 AI 知道哪些路是死胡同。 两者的价值同样大,但大多数上下文管理只做前者。
# 每次放弃一个方案时,录一条否定信息
class RejectedSolution:
def __init__(self, what, when, why):
self.entry = {
"方案": what,
"放弃时间": when,
"放弃原因": why
}
# 例子
RejectedSolution(
what="用 Redis 做 session 存储",
when="2026-03",
why="引入额外运维复杂度,内置 session 够用"
)否定信息不需要频繁维护。 一个月录一两条就够了。但一旦录入,它就是永久有价值的——它会防止 AI 在未来给你推荐你已经走过并放弃的路。
不是感觉上的"够不够",是三个可验证的指标:
def context_health_check():
# 1. 新对话首次回答命中上次断点率
# → < 80%:热数据不够精确
# → > 95%:热数据可能太多了(在记无关信息)
# 2. 单次对话中需要人工补充上下文的次数
# → > 3 次:冷热分层没做好
# → = 0:正常
# 3. AI 重复推荐已排除方案的次数
# → > 0:否定信息没有覆盖所有关键决策
# → = 0:合格
pass上下文管理最反直觉的一点:你的目标是让 AI "知道更少但更对",不是"知道更多"。
知道更多 = 注意力被稀释 = 回答质量下降。
知道更少但更对 = 注意力集中在关键信息上 = 回答更精准。
给 AI 喂信息之前,问自己一句:这条信息,不上桌会不会影响当前任务的输出?不会——就不上。
本文所有示例均已脱敏处理。你怎么管理 AI 的上下文?有没有被"喂太多"坑过的经历?欢迎评论区聊。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。