A05第 1 / 1 课时未开始内容版本 1.0.0 · 核验于 2026-10-26

生成参数与输出限制

生成参数与输出限制 · 阅读后完成下方实验与检查题,再用「标记完成」记录进度。

学习目标

读完本课你知道请求体里常用参数各管什么、支持与否以谁为准,能通过 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 课展开)
};

两条必须建立的口径:

  1. 参数支持能力因提供方和模型而异。同名字段取值范围可能不同,字段名可能演进,甚至是否生效都不同。所以本课不背参数表——以所用提供方文档为准,接新提供方时先把文档过一遍再配。
  2. 输出上限有两层:模型自身的单次输出上限是硬顶,请求参数只能在硬顶之内收紧,不能突破。设得再大,也拿不到超过模型上限的输出。

怎么知道回答是被截断还是自然结束?看响应里的 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 };
}

关键点:

  • 一次只改一个参数,否则看不出是哪个在起作用。
  • 同一输入多发几次:低随机度下输出应明显趋同,这是验证参数生效的土办法。
  • 报错信息里常直接写着「未知参数」或「取值越界」,比猜快得多。

动手任务

  1. 用 probe 分别发 temperature: 0 和 temperature: 1 各三次同一输入,观察输出稳定性的差别。
  2. 把 max_tokens 设成 16,看 finish_reason 是不是 length,正文是不是被硬切。
  3. 查一下你所用提供方的文档:确认它的输出上限参数叫什么、默认值是多少——把结论写成一行注释留给以后的自己。

常见错误

  • 照搬教程参数:不同提供方支持能力不同,不受支持的配置要么报错要么被静默忽略,产生「参数无效但没报错」的错觉。
  • 不看 finish_reason 就当完整回答用:截断的回答后半段丢失,直接入库会存下残次内容。
  • 把随机不稳当 bug 修:温度类参数本来就会带来输出差异,要稳定先调低随机度,而不是反复重试碰运气。
  • 以为 max_tokens 能突破模型上限:它只能收紧,硬顶由模型决定,以提供方文档为准。

检查与复盘

自查清单:

  • 能说出 temperature、max_tokens、stream 三个参数各管什么
  • 能解释「请求参数上限」与「模型输出硬顶」的关系
  • 遇到回答被截断,知道先查 finish_reason 再查参数

参考资料

检查题共 2 题,提交后立即显示解析
答案由服务端判定;答错的题会自动进入复习计划。
Q1读代码中等

阅读非流式调用的响应处理代码。某次调用后 choice.finish_reason 的值是 "length",正文是一段说到一半的话。这说明什么、下一步该查什么?

const data = await res.json();
const choice = data.choices[0];
if (choice.finish_reason === "length") {
  // ?
}
Q2多选中等(多选,全部选对才算正确)

关于 OpenAI 兼容接口的生成参数(temperature、max_tokens、stream 等),下列说法正确的有?(多选)

读完这一课了?

标记完成后,工作台会安排接下来的学习。

Command Palette

Search for a command to run...