生成参数与输出限制
生成参数与输出限制 · 阅读后完成下方实验与检查题,再用「标记完成」记录进度。
学习目标
读完本课你知道请求体里常用参数各管什么、支持与否以谁为准,能通过 finish_reason 判断回答是自然结束还是被截断,并用小步验证的方式调参,不照搬教程里的配置。
问题场景
你从一篇教程里抄来请求体:temperature: 0.9、max_tokens: 4096。在 A 提供方跑得好好的;换到 B 提供方后要么参数被悄悄忽略,要么直接报错「不支持该字段」。教程没写错,错在「以为所有模型一个样」。
核心解释
OpenAI 兼容接口的请求体常见参数长这样(注释是作用,不是保证):
const body = {
model: cfg.model, // 必填:所用模型标识
messages, // 必填:A04 课的消息数组
temperature: 0.7, // 随机度:低则稳定趋同,高则发散;有的提供方还支持 top_p 等
max_tokens: 1024, // 本次输出上限;部分接口字段名不同或有替代参数
stream: true, // 是否流式返回(A10 课的 SSE 就靠它)
tools: [], // 工具声明(A15 课展开)
};
两条必须建立的口径:
- 参数支持能力因提供方和模型而异。同名字段取值范围可能不同,字段名可能演进,甚至是否生效都不同。所以本课不背参数表——以所用提供方文档为准,接新提供方时先把文档过一遍再配。
- 输出上限有两层:模型自身的单次输出上限是硬顶,请求参数只能在硬顶之内收紧,不能突破。设得再大,也拿不到超过模型上限的输出。
怎么知道回答是被截断还是自然结束?看响应里的 finish_reason:
const choice = data.choices[0];
if (choice.finish_reason === "length") {
// 撞到了输出上限:正文被硬切,后文丢了
// 处理:提高上限、压缩输入,或引导模型分次输出
} else if (choice.finish_reason === "stop") {
// 自然结束(工具调用场景则是 "tool_calls",A15 课展开)
}
被截断的典型症状:回答说到一半戛然而止、代码块只剩开头围栏。排查顺序:先看 finish_reason,再查 max_tokens 与模型上限。
示例拆解
小步验证一套参数是否真的生效,流程如下:
// 1. 先发默认配置,记录 baseline
// 2. 只改一个参数再发(控制变量),对比行为差异
async function probe(overrides: Record<string, unknown>) {
const res = await fetch(`${baseUrl}/chat/completions`, {
method: "POST",
headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` },
body: JSON.stringify({
model,
messages: [{ role: "user", content: "用三点总结 RESTful 设计原则" }],
...overrides, // 例如 { temperature: 0 }
}),
});
if (!res.ok) return { error: res.status }; // 参数不被支持时常在这里暴露
const data = await res.json();
return { text: data.choices[0].message.content, finish: data.choices[0].finish_reason };
}
关键点:
- 一次只改一个参数,否则看不出是哪个在起作用。
- 同一输入多发几次:低随机度下输出应明显趋同,这是验证参数生效的土办法。
- 报错信息里常直接写着「未知参数」或「取值越界」,比猜快得多。
动手任务
- 用
probe分别发temperature: 0和temperature: 1各三次同一输入,观察输出稳定性的差别。 - 把
max_tokens设成 16,看finish_reason是不是length,正文是不是被硬切。 - 查一下你所用提供方的文档:确认它的输出上限参数叫什么、默认值是多少——把结论写成一行注释留给以后的自己。
常见错误
- 照搬教程参数:不同提供方支持能力不同,不受支持的配置要么报错要么被静默忽略,产生「参数无效但没报错」的错觉。
- 不看
finish_reason就当完整回答用:截断的回答后半段丢失,直接入库会存下残次内容。 - 把随机不稳当 bug 修:温度类参数本来就会带来输出差异,要稳定先调低随机度,而不是反复重试碰运气。
- 以为
max_tokens能突破模型上限:它只能收紧,硬顶由模型决定,以提供方文档为准。
检查与复盘
自查清单:
- 能说出 temperature、max_tokens、stream 三个参数各管什么
- 能解释「请求参数上限」与「模型输出硬顶」的关系
- 遇到回答被截断,知道先查
finish_reason再查参数
参考资料
- OpenAI 文档:API Reference - Chat —— 兼容接口常见参数的定义方式(取值以所用提供方文档为准)
- 智谱开放平台文档 —— 本站默认模型所在平台的参数说明入口
- 下一课 A06 把调用包进一个真正的界面:最小 AI 应用的四种状态。
读完这一课了?
标记完成后,工作台会安排接下来的学习。