模型上下文长度怎么调

模型与算力

讲清调大模型上下文长度的几种做法、各自的显存代价,以及什么情况下该改用检索而不是硬堆长度。

本地跑模型时想让它一次吃下整份文档,就把上下文长度往上调,结果要么启动报显存不足,要么速度掉到没法用。这篇按「先确认上限、再算显存、再调参、最后判断该不该调」的顺序讲一遍,给你能直接照做的动作和判断标准。

本地跑模型时想让模型一次吃下整份文档,就把上下文长度往上调,结果要么启动就报显存不足,要么速度掉到没法用。这事儿的坑在于:调长度不是一个动作,而是一串动作——先确认上限、再算显存、再动手改、最后判断到底该不该调。

下面按这个顺序讲一遍,每个环节都给你能直接照做的动作和判断标准。看数字的地方统一去站内对应页面核对当时的数值,别拿记忆里的旧数字做决策。

先搞清楚你能调的其实是三个不同的数

模型位置上限
模型训练时定死的最大位置数,属于能力的硬天花板,超过它要么直接报错,要么输出开始变乱。
框架上下文长度
推理框架启动参数里那个长度,是你在软件层面实际设的值,通常默认远小于模型上限。
请求级缓存分配
服务端按每次请求真正预留的那块 KV 缓存,跟前两个是不同层级的东西。

三者不是一回事。很多人以为自己「把上下文调到多少」,实际改的只是框架参数,而真正吃显存的是第三项。先去 /models 查目标模型的规格页,确认它标注的最大输入是多少,心里有个天花板;再去看框架的默认值,那个才是你真正要改的数。

顺带把概念对齐一下:Token、上下文、温度这几个词很容易被混成一个参数。到 /ai-dict/category/basics 把它们各自的定义对一遍,尤其是把「上下文长度」和「回答长度」分开——前者是输入侧能吃多少,后者是输出侧生成多少,改错参数会让人怀疑人生。

在哪改、改完怎么验证

部署方式改哪里生效方式
Ollama请求参数或模型文件里的对应字段重新加载模型
vLLM启动时的长度参数重启服务
LM Studio加载界面拖滑块重新加载模型
  1. 短请求打底先用一条很短的请求确认服务本身正常,排除是部署坏了而不是长度问题。
  2. 逐步加长输入一点一点把输入加长,同时盯日志里的显存占用和首 token 延迟,别一次拉到顶。
  3. 设成业务真实最长值按「最长的合同全文 + 提示词 + 预留输出」来定,多留一截余量就够了,不需要为了保险留一大截。

验证的时候有个容易忽略的点:长输入下最先崩的往往不是显存,而是并发。你按单请求测通了,不代表两个人同时用还能跑起来。所以验证要分两步——先单请求测通,再加一点并发看日志。

长度翻倍,显存不是翻倍那么简单

除了权重本身,长上下文主要吃两块:一块是 KV 缓存,随长度和并发数往上走;另一块是注意力计算的开销,增长比线性更快。所以显存曲线是往上翘的,不是一条直线——长度翻一倍,占用可能翻不止一倍。

  • KV 缓存的量级跟层数、注意力头维度、精度、序列长度、并发数都相关,不是只看长度一个变量
  • 具体到你的模型和量化档位,用 /models/deploy 和 /tools 里的换算工具跑一遍,别凭感觉估
  • 显存不够时的取舍顺序:先降并发,再看量化档位(到 /ai-dict/category/tech 与量化相关页面对齐口径),最后才考虑换卡
  • 把长度砍半通常比换卡便宜得多,也更立竿见影,先把这一刀砍到位再谈硬件

判断标准很朴素:如果单请求能跑、并发一上来就 OOM,那问题在并发不在长度;如果单请求就跑不动,才轮到长度和量化档位出场。别一上来就怀疑显卡不够。

什么时候不该继续加长

第一,注意力会被稀释。塞进去的内容越多,模型对中间段落的关注往往越弱,「全文喂进去」不一定比「只给相关几段」答得准。第二,成本和延迟双重上升:按量计费的接口,输入越长单价越高,实际单价去 /official-api 和 /tools/token-price-calculator 核对当时的数字;本地部署则是延迟和并发一起掉。

任务类型更划算的做法
从一堆材料里找几条检索,先筛再喂
跨段落整体推理适度加长上下文
通篇改写或一致性校验加长较合理
材料无法预先切分加长是唯一选择

判断标准:如果任务本质是「找几条」,检索通常更划算;只有需要跨段落整体推理、通篇改写这类任务,硬堆长度才有意义。

下一步带上你的模型名、量化档位和准备设的长度,去 /models/deploy 把显存账算清楚,再去 /tools 用换算工具复核一遍,比反复试错快得多。

常见问题

上下文长度调到模型标称的最大值,会更快还是更慢?

通常更慢。首 token 延迟上升明显,因为要先处理整段输入;后续每个 token 的生成速度也会受影响。实际感受取决于你的硬件和并发量,建议用 /tools/speed-test 量出自己的延迟基线再决定,别只看厂商宣传的数字。

调大了上下文,为什么输出反而变差?

常见原因是注意力被稀释,关键信息落在长文中段时容易被忽略;另一个可能是框架按最大长度预分配了缓存,实际利用率很低。先把长度收到业务真实需要的量级试一次,再对比效果,多数情况下收窄反而更好。

本地显存不够,除了换卡还有什么办法?

可以按顺序试:降低并发数、把上下文长度收到够用、换更激进的量化档位、把不常用的层卸载到 CPU。每改一项都测一次速度和效果。如果三项都试过还是不够,说明这台机器不适合这个长度的任务,考虑换更大的卡或改成走接口。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。