把整篇文档丢给模型时返回 context length exceeded,提示最大上下文只有几千 token。上下文是输入加输出的总和,不是只算你发的那段文字。
先估算实际用量
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
print(len(enc.encode(prompt_text)))
中文大致一个字到两个 token,英文一个单词一到两个 token。留出至少三分之一的余量给输出,否则输入刚好卡满时模型会无话可说。
三种切法按场景选
- 固定长度切块并保留重叠,适合检索和摘要
- 按标题或段落切,语义完整,适合结构化文档
- 先分段摘要再汇总,适合超长材料
多轮对话超限时,保留系统提示加最近几轮,把更早的对话压缩成一段摘要,比直接截断丢失上下文要好。
把超限变成可控错误
调用前先算 token,超过阈值就走分块流程,而不是把整个请求发出去等报错。日志里记录每次的输入长度,能提前发现某类请求在稳定增长。
换用更长上下文的模型只是临时缓解,成本会随长度上升。真正省钱的还是把输入压到必要信息。