API 参数 max_tokens vLLM max-model-len 模型官方 context length
总结
input_tokens + max_tokens <= max-model-len
1️⃣ 客户端做硬校验(强烈推荐)
if input_tokens + max_tokens > MAX_MODEL_LEN:
raise ValueError("input too long")
2️⃣服务端双保险(可选)
vLLM 实例:
--max-model-len 4096
网关层(Nginx / API Gateway):
请求长度限制
长文本路由到专用实例
一句话精确定义
在 vLLM 中:
--max-model-len= 单个请求在整个生命周期中(prefill + decode)输入 token 数 + 已生成输出 token 数的最大上限
也就是:
max_model_len ≥ input_tokens + output_tokens
一旦超过这个上限,请求会被拒绝或直接 OOM 风险显著上升。
二、为什么它对显存影响这么大(核心原因)
在 vLLM 里,max-model-len 直接决定 KV Cache 的“最大尺寸”。
KV Cache 的分配方式是:
- 启动时一次性预分配
- 按
max-model-len作为最坏情况来算 - 不管你实际请求用不用这么长
也就是说:
即使你每个请求只有 1k token
只要max-model-len = 8192,
KV Cache 就是按 8192 规模切块的。
三、区分三个“容易混淆”的长度概念
这是很多人理解错误的来源。
| 概念 | 含义 | 是否影响 KV Cache |
|---|---|---|
| 模型官方 context length | 模型理论最大上下文 | ❌(只是上限) |
vLLM max-model-len |
服务端允许的最大生命周期 token | ✅(决定 KV Cache) |
API 参数 max_tokens |
本次请求最多生成多少 token | ❌(只影响 decode 步数) |
四、举一个非常具体的例子
场景
- 模型:Qwen1.5-14B
--max-model-len = 8192
请求 A
输入 6000 token
输出 500 token
总计 6500 token
✔ 合法(< 8192)
请求 B
输入 6000 token
输出 3000 token
总计 9000 token
❌ 不合法(超过 max-model-len)
五、为什么“输入很短也 OOM”?
因为 KV Cache 不是按“实际使用”分配的,而是:
KV Cache capacity = 并发上限 × max-model-len
例如:
- 并发 16
- max-model-len 8192
KV Cache 直接按 16 × 8192 的规模预留。
六、在生产环境的正确使用方式
1️⃣ 服务端(vLLM 启动参数)
--max-model-len 4096
--gpu-memory-utilization 0.85
这是一个安全默认值。
2️⃣ 客户端(API 侧约束)
{
"max_tokens": 512
}
并配合:
- 输入长度校验
- 长文本走异步 / 单独队列
七、一个非常重要但常被忽略的点
max-model-len ≠ 我想支持的最长输入
而是:
我愿意为“最坏并发 × 最坏长度”预付多少显存
八、给你一个“工程化推荐表”
以 24GB 消费级卡为例:
| 场景 | max-model-len |
|---|---|
| 智能客服 / RAG | 2048–4096 |
| 代码补全 | 4096 |
| 长文档问答 | 单独实例,8192 |
| 通用聊天 | 4096 |
API max_token
在大模型 API 调用中,max_tokens 是一个“生成侧硬上限”参数,用于限制模型在一次响应中最多可以生成多少个 token。
下面从工程视角把它讲清楚。
一、max_tokens 的精确定义
{
"max_tokens": 512
}
含义是:
本次请求中,模型“最多”生成 512 个 output tokens,达到上限即立刻停止生成(即使语义尚未完成)。
它只约束输出,不包含 input tokens。
二、token 的范围说明(非常关键)
一次完整请求涉及三部分 token:
Total tokens = Input tokens + Output tokens
其中:
-
Input tokens
- system / developer prompt
- user 输入
- 历史对话(conversation / messages)
-
Output tokens
- 模型生成的内容
- 受
max_tokens约束
👉 max_tokens = 512 只限制 Output tokens
三、为什么必须要有 max_tokens
从系统设计角度,它解决 4 个核心问题:
1️⃣ 成本控制(最重要)
大模型计费公式本质是:
费用 ≈ input_tokens × 单价 + output_tokens × 单价
如果不限制 max_tokens:
- 模型可能长时间生成
- 成本不可控
- 在客服、Agent 场景尤其危险
2️⃣ 防止“无限生成 / 跑飞”
在以下场景,模型非常容易生成过长内容:
- 指令不够明确
- 开放式问题(如“详细解释一下……”)
- prompt 中存在循环 / 自我引用
- tool / function call 出错
max_tokens 是最后一道硬保险丝。
3️⃣ 降低延迟(P99 直接相关)
生成 token 是 逐 token 解码:
-
token 越多 → 推理时间越长
-
在 vLLM / Triton / Online Serving 中:
- output token 数量是 主要延迟因子
限制 max_tokens 可以显著降低:
- 单请求 tail latency
- batch 被“长尾请求”拖垮的问题
4️⃣ 保证前端 / 下游系统可控
很多系统对返回内容有约束:
- Web UI 显示长度
- JSON response size
- 日志 / Kafka message 大小
- 下游 parser(如 JSON Schema)
max_tokens 是协议级约束。
四、如果 max_tokens 设得太小会怎样?
这是常见线上问题。
典型症状
- 回答被截断
- JSON 结构不完整
- 列表只生成一半
- 结尾没有句号 / 没有 closing brace
例如:
{
"answer": "本方案的核心优势包括:第一,性能稳定;第二,成本
👉 模型不是“没学会”,是被强行 stop 了
五、max_tokens 与其他参数的关系
1️⃣ 与模型最大上下文长度的关系
假设模型:
context_window = 8192
则必须满足:
input_tokens + max_tokens ≤ 8192
否则:
- 请求直接失败
- 或模型自动截断 input(非常危险)
2️⃣ 与 vLLM / 推理服务的关系
在 vLLM 中:
-
max_tokens会影响:- KV Cache 预分配
- 连续批处理(continuous batching)
-
output token 越大:
- KV Cache 占用越久
- 影响并发吞吐
这也是为什么服务端和客户端都会限制 max_tokens。
3️⃣ 与 stop / eos 的关系
生成停止条件优先级通常是:
- 命中
stoptokens - 生成
eos_token - 达到
max_tokens上限
max_tokens 是兜底停止条件。
六、工程上的推荐取值(经验值)
以你常见的场景为例:
智能客服 / 问答
max_tokens = 256 ~ 512
RAG(事实型回答)
max_tokens = 200 ~ 400
Agent / 复杂推理(隐藏思考)
max_tokens = 800 ~ 1500
JSON / 结构化输出
- 预估结构大小 × 1.3
- 绝不能卡得太死
七、一句话总结
max_tokens是客户端对“大模型输出长度”的硬性上限控制,用于成本、延迟、稳定性和系统安全的兜底约束,而不是能力参数。
如果你愿意,我可以帮你:
- 结合 客服 / RAG / Agent 场景给你一个完整的参数模板
- 或从 vLLM 服务端视角讲
max_tokens如何影响吞吐与 OOM 风险

浙公网安备 33010602011771号