上下文预算是什么
上下文组装是把重排后的片段按 token 预算拼进提示词的过程。总预算等于模型上下文窗口减去提示词模板、对话历史与输出预留。片段超长时要截断或压缩,同时保留引用信息。这一步做不好,要么关键条款被切掉,要么把成本堆高到无法接受。
基本信息
| 预算公式 | 模型窗口 − 模板 − 历史 − 输出预留 = 可用片段预算 |
|---|---|
| 计数方式 | 用实际分词器计数,不按字数估算 |
| 片段排序 | 按重排分数,兼顾首尾位置优势 |
| 超预算处理 | 截断、压缩或直接丢弃低分片段 |
预算项
| 预算项 | 示例(128K 窗口模型) |
|---|---|
| 模型上下文窗口 | 128K tokens |
| 系统与指令提示词 | 约 500 tokens |
| 对话历史 | 约 1000 tokens |
| 检索片段 | 如 3000-6000 tokens |
| 输出预留 | 如 1000-2000 tokens |
按预算组装
按预算组装
budget = 6000
total = 0
parts = []
for hit in hits: # 已按重排分数排序
t = count_tokens(hit.text) # 用实际分词器计数
if total + t > budget:
break
parts.append((hit.text, hit.meta))
total += t
context = "\n\n".join(f"[{i+1}] {t}" for i, (t, m) in enumerate(parts))组装策略
- 给每条片段编号并保留来源字段,生成端才能标注引用
- 按分数从高到低依次填入,预算用尽即停止,避免拼接时再做二次筛选
- 同一文档的相邻片段可合并后再计数,减少重复内容占用的预算
- 长条款截断时优先保留首段与尾段,中间的举例性描述可以省略
- 把最终拼好的上下文字符数与 token 数一起记入日志,便于事后复盘
片段放置与顺序
| 策略 | 做法 | 代价 |
|---|---|---|
| 分数降序 | 最相关的放最前 | 中后段内容利用率可能下降 |
| 首尾优先 | 强相关放两端、弱相关居中 | 需要按模型实测验证增益 |
| 按文档聚合 | 同文档片段相邻放置 | 上下文更连贯,可能牺牲绝对排序 |
不同模型的 token 计数不同(分词器各异);预算要按实际使用的模型计算,不要按汉字或字符数粗略估算。
静默截断是最危险的失败模式:上下文被砍掉一半但流程正常返回,答案看起来合理却遗漏关键条款,必须把截断事件记入日志并告警。