返回学习路线/阶段 02 · 让模型稳定地完成任务
LESSON 06 / 18

为任务组织正确的上下文

控制上下文预算,保留相关信息,避免把整个聊天记录塞给模型。

25 分钟 · 含动手练习入门上下文记忆边界

学完这一课,你将能够

  • 区分指令、历史与外部资料
  • 按优先级选择上下文
  • 记录信息被截断时的行为

学习目标

  • 区分固定指令、当前任务、历史和外部证据。
  • 用预算挑选本次任务真正需要的信息。
  • 为上下文省略和来源保留可检查的记录。

前置要求:理解一次模型请求和结构化输出。 本节示例使用字符预算演示选择逻辑,不把字符当作真实 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 估计,并核对实际用量。

常见误区

检索更多不必然回答更好,无关材料会增加干扰。 摘要不是记忆数据库,来源与时间信息不能全部丢弃。 不同用户的历史也不能因为“有用”就混入同一个请求。

延伸阅读

下一模块会把数据契约和上下文组织用于实际工具调用。

让这一课,真正成为你的收获

完成练习后标记完成,也可以随时回来复习。

笔记与进度保存在当前浏览器,无需登录

AgentStudy · Learn by building.以理解为起点,以作品为答案