为任务组织正确的上下文
控制上下文预算,保留相关信息,避免把整个聊天记录塞给模型。
学完这一课,你将能够
- 区分指令、历史与外部资料
- 按优先级选择上下文
- 记录信息被截断时的行为
学习目标
- 区分固定指令、当前任务、历史和外部证据。
- 用预算挑选本次任务真正需要的信息。
- 为上下文省略和来源保留可检查的记录。
前置要求:理解一次模型请求和结构化输出。 本节示例使用字符预算演示选择逻辑,不把字符当作真实 Token。
模型看到的就是本次任务环境
同一个问题,提供不同资料,模型可能给出不同结果。 上下文工程的目标是把正确的信息在正确时机放到请求里。 它包括选择、压缩、排序和删除,也包括决定哪些信息不能跨越边界。
一个请求可以拆成四层:
| 层 | 内容 | 更新频率 |
|---|---|---|
| 稳定指令 | 任务规则与输出契约 | 版本更新时 |
| 当前目标 | 用户这一次要完成什么 | 每次任务 |
| 工作状态 | 已完成步骤、待解决问题 | 每一步 |
| 外部证据 | 检索片段、工具返回 | 按需获取 |
工具返回的文本属于数据,即使其中出现命令式句子,也不能升级成系统指令。 结构化边界帮助组织输入,但权限仍要在工具执行层落实。
上下文为什么不宜无限增长
历史越来越长时,关键要求可能被噪声淹没。 陈旧工具结果可能与新结果冲突,旧偏好也可能已经被用户更正。 额外输入还会占用预算,并增加请求延迟。
优先保留当前目标、不可丢失的约束和与问题直接相关的证据。 对历史保留决定及其依据,不必把每一句闲聊都放进去。 当资料不足时,选择继续检索或说明限制,不要用无关内容填满窗口。
离线实现一个预算选择器
下面用人工指定的相关度排序,重点演示预算和来源记录。
它不是真实检索器,也没有使用模型的 Tokenizer。
保存为 context_budget.py 后运行。
def assemble_context(question, facts, char_budget=100):
if len(question) > char_budget:
raise ValueError("当前问题超过演示预算")
remaining = char_budget - len(question)
selected, omitted = [], []
for fact in sorted(facts, key=lambda x: x["relevance"], reverse=True):
rendered = f'[{fact["id"]}] {fact["text"]}'
if len(rendered) <= remaining:
selected.append(rendered)
remaining -= len(rendered)
else:
omitted.append(fact["id"])
return {
"question": question,
"evidence": selected,
"omitted_ids": omitted,
"remaining_chars": remaining,
}
facts = [
{"id": "policy-v2", "text": "报销需在消费后 30 天内提交。", "relevance": 3},
{"id": "invoice-v1", "text": "报销必须提供有效发票。", "relevance": 2},
{"id": "office-v1", "text": "办公室绿植每周浇水两次。", "relevance": 0},
]
result = assemble_context("报销有什么要求?", facts, char_budget=65)
for key, value in result.items():
print(key, value)观察减少预算时,哪些证据被省略。 真实系统还需要为稳定指令、工具描述、响应输出预留空间。 不能只计算证据文本,再把所有剩余内容忽略。
摘要是一种有损压缩
把长历史总结成一句话可以节省空间,但细节可能丢失。 例如“用户想订票”丢失了日期、预算和是否已付款。 更好的状态通常是明确字段:目的地、日期、预算、待确认项和已执行操作 ID。
不要把摘要当成原始事实的替代品。 保留原始记录或来源引用,以便发现错误时回查。 涉及数字、时间、审批和外部写入时,优先保存原值。
练习与验收
增加两条相互冲突的政策记录,分别带版本号和更新时间。 先过滤失效版本,再执行预算选择;不要只按文本长短选择。
- 当前问题与必要约束不会被静默截断。
- 每段入选证据保留来源 ID。
- 日志能解释哪些资料被省略。
- 预算不足时有明确行为。
在接入真实模型后,将字符预算替换为对应服务的 Token 估计,并核对实际用量。
常见误区
检索更多不必然回答更好,无关材料会增加干扰。 摘要不是记忆数据库,来源与时间信息不能全部丢弃。 不同用户的历史也不能因为“有用”就混入同一个请求。
延伸阅读
下一模块会把数据契约和上下文组织用于实际工具调用。
让这一课,真正成为你的收获
完成练习后标记完成,也可以随时回来复习。
笔记与进度保存在当前浏览器,无需登录