人人都会AI编程

上下文窗口分配与 Token 管理

更新时间:2026-07-12

在 RAG 系统中,大语言模型并不是直接面对整个知识库,而是通过提示词一次“看到”一小部分内容。模型能一次性处理的最大文本量,由上下文窗口(context window)决定,通常以 Token 为计量单位。一次完整的调用,包含系统指令、检索到的文档片段、用户问题、历史对话,以及模型的输出,都必须容纳在这个窗口内。因此,如何高效地分配有限的 Token,直接决定了回答的质量与成本。

1. 上下文窗口不是“越大越好用”

即便是支持 128K 甚至更长窗口的模型,实际使用中也面临真实约束:

  • 注意力稀释:窗口过长时,模型对中间部分信息的关注度会下降,可能遗漏关键事实。
  • 成本与延迟:输入 Token 越多,单次调用的费用和生成首字延迟越高。
  • 生成空间被压缩:窗口被输入占满,留给回答的生成空间就很少,可能导致回答被中途截断。

因此,窗口管理的关键不是把所有检索结果都“塞进去”,而是为最重要的信息腾出最宝贵的空间

2. Token 预算划分:先做减法

一个实用的做法是预先为不同组件分配 Token 额度,像做月度预算一样:

  • 系统提示(固定开销):角色设定、输出格式要求、引用规则等。通常预留 200~500 Token。
  • 对话历史(如有多轮):保留最近几轮问答,让模型理解上下文。可设置上限,如总计不超过 1000 Token。
  • 用户问题:本身占用的 Token 数一般很少。
  • 检索文档片段:这是核心变量,也是我们需要精细控制的部分。
  • 预留生成空间:确保模型能输出足够长的答案,一般至少预留 1000 Token。

假设模型窗口为 8000 Token,可粗略划分如下:系统提示 300,历史 800,问题 50,预留生成 1500,则留给检索片段的空间约为 5000 Token。这就是检索后拼接时需要遵守的“硬限制”。

3. 如何把检索结果“塞”进预算

检索通常会返回 top‑k 个片段(如 5 或 10 个),每个片段可能长达 500~1000 Token,全部拼接很容易超限。常用管理策略:

  • 按相关度截断:按检索分数从高到低拼接,达到 Token 上限后直接丢弃更远的片段。这利用了一个经验假设——排名靠后的内容边际价值有限。
  • 片段本身截断:对于过长的单个片段,可以只保留与问题最相关的段落,或取开头和结尾各一段(因为关键信息常位于首尾)。
  • 内容去重:如果多个片段内容高度重复,仅保留一个,既省 Token 又避免模型被冗余信息干扰。
  • 使用更紧凑的格式:在拼接时省略无关的元数据(如完整文件路径),保留必要的摘要和引用标识。

真实操作中,常会在检索后增加一个“精排”步骤:用一个更轻量、更便宜的模型或规则,快速选出最终送入生成的片段及其顺序,达到更好的 Token 利用率。

4. 总 Token 不够时:安全回退与降级

无论预算多精细,仍可能遇到问题过于复杂、需要大量背景信息的情况。此时必须避免将残缺的内容塞给模型,导致回答质量断崖式下降:

  • 提示信息不足,请用户具体描述:模型可以回应“您的问题需要更多上下文,能否提供更详细的背景或缩小范围?”
  • 优先级更迭:当对话历史占用过多时,自动压缩历史(使用摘要模型或只保留核心要点),释放空间给新鲜证据。
  • 分步处理:对于需要综合多份长文档的问题,可以先用一次模型调用进行信息提取或总结,再将摘要作为上下文,避免一次性传递全文。

5. 实际调试中的量化建议

  • 先测量,再分配:在正式上线前,记录典型问题的检索片段平均长度、最长长度,据此设定截断阈值。
  • 监控 Token 利用率:在日志中观察每次请求实际使用的输入 Token 数,如果经常接近窗口上限,说明需要收紧分配或重构切块策略。
  • 生成空间不要压得太紧:很多模型的生成质量在输出长度接近窗口限制时明显下滑,预留 20%~30% 的窗口给生成部分比较稳妥。
  • 长上下文模型的策略:即使是 128K 窗口,也建议将检索片段控制在 20K~30K 以内,把注意力集中在高质量内容上,同时控制成本。

6. 一个简化的例子

你所在团队的系统上下文窗口为 4096 Token。按以下原则分配:

  • 系统提示:300 Token
  • 最近 3 轮历史:总计 800 Token
  • 预留生成:1200 Token
  • 剩余给检索片段:约 1800 Token

检索返回 5 个片段,长度分别为 400、600、500、900、300 Token。按相关度排序后,依次累加:400+600=1000,再加 500=1500,仍有余量;加 900 会超出预算,则只保留前三个片段,共 1500 Token。最终提示总输入约 2600 Token,加上 1200 生成的输出,总消耗 3800 Token,在安全范围内。结果既保证了关键信息不遗漏,又给模型留足了表达空间。

上下文窗口分配与 Token 管理,不是在限制 RAG 的能力,而是通过精细的“材料取舍”让模型在有限资源下发挥最优效果。掌握好这门平衡术,就能在信息完整度、回答质量和成本之间,找到符合业务要求的最优配置。