FDE Day 2 学习手册 · 采样参数与结构化输出
W1 Day2 · A 级(必须掌握,面试核心)· 4h · 学完能讲透"模型如何从概率分布生成 token、如何让输出稳定可解析"
本日定位: Day1 讲了"模型怎么算",Day2 讲"模型怎么选 token + 怎么让输出可控"。这是工程落地里每天都要调的参数,也是面试高频考点。
学完能回答: ① 不同场景下 Temperature/Top P/Top K 怎么选;② 结构化输出从请求到校验的完整流程;③ 输出不稳定时怎么重试和降级。
使用方法: 通读原理 → 重点看「面试话术」「易错点」→ 做自测清单 → 配合《Day2 评测题.md》。选中不熟的词可标注(左下★重要 / 右下📌待查)。
一、采样本质:从 logits 到 token
模型每次生成一个 token 前,最后一层会输出整个词表上每个 token 的未归一化分数 (logits,形状 = 词表大小,如 15 万维)。采样就是把这个分数分布转成"下一个 token 选谁"的过程:
logits → softmax(归一化为概率)→ 采样策略(Temperature / Top P / Top K)→ 按概率随机抽一个 token
logits :模型对每个候选 token 的"偏好分",分数越高越可能。
softmax :把 logits 归一化为概率分布(加起来=1)。
采样 :按概率分布随机抽一个 token。如果直接按 softmax 概率抽,叫"随机采样";如果永远选概率最大的,叫"贪心解码(greedy)"。
Temperature / Top P / Top K 都是对第 2、3 步之间 的干预:先改概率分布形状,再采样。
采样是"在概率分布上掷骰子"。贪心=永远选最高分(确定性但重复);随机采样=按概率抽(多样但可能跑偏)。Temperature/TopP/TopK 是调节这把骰子的"随机程度"。
二、Temperature(温度)
2.1 原理
Temperature(T)在 softmax 之前对 logits 做缩放:用 logits / T 代替原 logits。
softmax( logits / T )
T → 0 :logits / T 被放大,分布变得极尖锐,趋近贪心解码 (几乎只选最高分 token)。
T = 1 :不缩放,按原始 softmax 概率采样。
T → ∞ :logits / T 趋近 0,分布趋近均匀 (每个 token 等概率,输出乱码)。
2.2 对生成的影响
T 分布 输出特征 适用场景
0 极尖(贪心) 确定性、重复性高、保守 代码生成、结构化抽取、分类、事实问答
0.3 较尖 稳定、略有变化 翻译、摘要、企业 RAG 问答
0.7 中等 平衡 通用对话、Agent 工具调用
0.9~1.0 较平 多样、有创意 创意写作、头脑风暴
≥1.2 很平 发散、易跑题 一般不用(容易乱)
2.3 工程取值经验
需要稳定可解析 (JSON、抽取、分类):T=0 或 ≤0.2。
RAG 问答 :T=0.1~0.3,既要稳定又容许少量表述差异。
Agent 工具调用 :T=0~0.3,工具参数必须准确,不能乱发挥。
对话/写作 :T=0.7~0.9。
Temperature 越低分布越尖、越确定;越高越平、越随机。T=0 等于贪心解码。企业工程任务(抽取、JSON、工具调用)几乎都用低 T(0~0.3),创意任务才用高 T。
① Temperature 不改变 logits 的排序 (谁分最高还是谁分最高),只改变分布尖锐度,所以 T 不会让"错答案"变成"对答案",只会让"对答案"更稳或更不稳。② T=0 仍可能出错——如果模型本身 logits 最高那个 token 就是错的,低 T 反而把错误锁死。③ 很多人以为"调高 T 能让模型更聪明",错,T 只调随机性,不调能力。
三、Top P(核采样 Nucleus Sampling)
3.1 原理
Top P 按概率从高到低累加 ,只保留累计概率达到 P 的最小 token 集合 ,把这个集合之外的概率清零,再在集合内重新归一化采样。
按概率降序排列 → 累加直到 ≥ P → 保留这些 token → 其余清零 → 重新归一化 → 采样
例:词表概率 [0.5, 0.3, 0.1, 0.05, 0.02, ...],P=0.9 → 累加 0.5+0.3+0.1=0.9 达到 P → 保留前 3 个,其余清零,前 3 个重新归一化为 [0.556, 0.333, 0.111] 采样。
3.2 关键特征
动态数量 :保留的 token 数不固定。分布尖锐时可能只保留 1-2 个;分布平缓时可能保留几十个。
P=1 :不裁剪,等价于不启用 Top P。
P 很小(如 0.1) :只保留极高概率 token,趋近贪心。
3.3 取值经验
通用对话:P=0.9(保留前 90% 概率质量,去掉长尾噪声)。
需要稳定:P=0.1~0.5 或直接用 T=0。
创意:P=0.95~1.0。
Top P 是"按概率质量动态截断"——分布越尖保留越少,越平保留越多。它去掉长尾低概率 token 的噪声,但保留多样性。常用 P=0.9。
① Top P 和 Temperature 不是互斥 ,可以同时用,但通常调一个就够,避免互相干扰。② Top P 的"动态"是它和 Top K 的核心区别:Top P 保留的 token 数随分布变化,Top K 固定数量。③ P 不是"保留前 P% 的 token",而是"保留累计概率达到 P 的最小集合"。
四、Top K
4.1 原理
Top K 只保留概率最高的 K 个 token ,其余清零,重新归一化采样。K 是固定数量。
按概率降序取前 K 个 → 其余清零 → 重新归一化 → 采样
4.2 与 Top P 的区别
维度 Top K Top P
保留数量 固定 K 个 动态(按累计概率)
分布尖锐时 仍保留 K 个(可能含低概率噪声) 只保留少数(自适应)
分布平缓时 只保留 K 个(可能太少) 保留较多(自适应)
适用 词表大、想简单截断 更常用,自适应好
4.3 取值经验
K=1:等价贪心。
K=40~50:常用默认(很多模型默认 K=40)。
K 大:保留更多,更多样;K 小:更确定。
Top K 固定保留前 K 个 token,Top P 按累计概率动态保留。现代 API 更推荐用 Top P(自适应),Top K 多作为兼容参数。两者本质都是"截断长尾低概率 token"。
五、Temperature / Top P / Top K 组合使用
5.1 生效顺序
多数 API 的内部顺序是:Top K → Top P → Temperature → 采样 。即先按 K 截断,再按 P 截断,再用 T 调整分布尖锐度,最后采样。但不同 API 实现略有差异,以官方文档为准。
5.2 常见组合配方
场景 T Top P Top K 说明
代码/JSON/抽取 0 — — 贪心,最稳定
RAG 问答 0.1~0.3 1(关) — 低 T 即可,不叠 Top P
Agent 工具调用 0~0.3 1 — 参数必须准
通用对话 0.7 0.9 40 平衡多样与稳定
创意写作 0.9 0.95 50 多样
工程上别三个一起调,容易互相干扰且难调试。原则:要稳定就 T=0 或低 T + 关 Top P;要多样就中 T + Top P=0.9。RAG/Agent 场景优先用低 T ,因为输出要可解析、可校验。
不要"温度 0.7 + Top P 0.1 + Top K 100"这种乱组合——参数相互影响,效果不可预测,出问题难定位。生产环境参数要固化在配置里 (按场景预设配方),不要让每次调用都随便传。
六、Stop Sequences(停止序列)
6.1 作用
Stop Sequences 是一组字符串,模型生成时一旦输出中出现这些字符串就立即停止 (停止符本身通常不包含在返回内容里)。
6.2 用途
控制输出边界 :让模型只生成"答案部分",遇到"下一个问题"标志就停。
多段输出分隔 :如让模型生成"思考过程\n\n答案",用 \n\n答案 之前的内容作为思考。
工具调用收尾 :工具调用 JSON 后跟一个 之类停止符,截断多余内容。
6.3 与 max_tokens 的关系
生成会在遇到 stop 序列 或达到 max_tokens 或生成结束符 EOS 三者之一时停止。max_tokens 是硬上限(防超长),stop 是语义边界(防多余)。
Stop Sequences 是"语义刹车",用来在指定标志处截断输出,控制输出边界。max_tokens 是"硬刹车"防超长。两者配合:stop 管语义,max_tokens 兜底。
① Stop 是字符串匹配 ,区分大小写、精确匹配,且停止符本身一般不返回 给用户(各 API 行为略有差异,要测)。② Stop 太短(如单个字)可能误触发;太长可能永不触发。③ 别把 stop 当正则用,它就是纯字符串匹配。
七、Structured Output / JSON Schema
7.1 两种机制
机制 保证什么 不保证什么
JSON Mode 输出是合法 JSON 语法(能 parse) 字段名/类型/值对不对
JSON Schema / Structured Output 输出符合指定 schema(字段名、类型、必填、枚举) 字段值 的语义对不对(可能字段填了但内容是幻觉)
7.2 实现原理(了解)
约束解码(Constrained Decoding) :在采样阶段用 grammar/状态机限制,只允许生成符合 schema 的 token(如生成 JSON 时强制引号、括号匹配)。这是最稳的方式。
Logits 偏置 / Grammar 约束 :对不符合语法的 token logits 置 -∞。
Prompt 引导 :只在 prompt 里要求输出 JSON,靠模型自觉(最不稳,可能漏字段或加废话)。
7.3 各家 API 支持
Qwen(通义) :response_format 支持 JSON Mode,部分支持 JSON Schema(具体看模型版本)。
DeepSeek :response_format json_object(JSON Mode)。
Claude(Anthropic) :通过 tool_use / 强制 tool 返回实现结构化,或 prompt + 预填充 JSON 引导。
7.4 适用场景
工具调用参数生成(必须结构化)。
信息抽取(从文本抽字段成 JSON)。
多步流程的中间状态传递。
RAG 的引用 + 答案结构化输出。
结构化输出是 Agent / 工程化的基石——下游要 parse JSON、调工具、存数据库,输出必须可解析。生产里优先用 JSON Schema(约束解码)> JSON Mode > 纯 prompt 引导 。但记住:结构化只保证"形对",不保证"值对",仍要校验语义。
JSON Mode 保证语法合法,JSON Schema 进一步保证字段/类型符合定义。底层靠约束解码(grammar 限制 token)。结构化是工程化的前提,但只管"形"不管"义",值仍可能错,必须校验。
① 不要以为开了 JSON Schema 就万事大吉——模型可能把"保单号"字段填成"我不确定",语法对但语义错。② 约束解码会让模型"硬塞"字段,有时牺牲内容质量(为凑结构编造值)。③ 不同 API 对 schema 支持深度不同(嵌套、枚举、union),要测兼容性。④ 复杂 schema(深层嵌套、可选字段)成功率下降,尽量简化 schema。
八、输出校验与失败重试
8.1 为什么要校验
即使开了结构化输出,仍可能:字段缺失、类型错、枚举值非法、内容是幻觉、超出业务范围。所以拿到模型输出后必须校验 ,不能直接信任。
8.2 校验工具
Pydantic(Python) :定义数据模型,自动校验类型/必填/约束,校验失败抛明确错误。是 LLM 工程化最常用的校验库。
JSON Schema 校验 :用 jsonschema 库按 schema 校验。
业务规则校验 :字段值范围、引用是否存在、金额合理性等,schema 校验不到的。
8.3 重试策略
策略 做法 适用
固定重试 失败就原样重发 N 次 偶发格式错误
带反馈重试(推荐) 把校验错误信息拼进 prompt 再请求:"上次输出缺少 policy_no 字段,请补全" 系统性错误,模型能据反馈修正
降 T 重试 失败后降低 Temperature 再试 随机性导致的错误
降级 fallback 重试仍失败→正则提取/默认值/转人工 兜底,不能让流程卡死
8.4 代码骨架(Pydantic + 带反馈重试)
from pydantic import BaseModel, ValidationError
import re
class ClaimResult(BaseModel):
policy_no: str
amount: float
risk_level: str # low/medium/high
reason: str
def extract_with_retry(text, max_retry=3):
msgs = [{"role": "user", "content": f"从以下材料抽取理赔信息,输出 JSON:\n{text}"}]
last_err = ""
for i in range(max_retry):
prompt = msgs if not last_err else msgs + [{"role": "user", "content": f"上次输出错误:{last_err},请修正后重新输出 JSON"}]
raw = call_llm(prompt, temperature=0.1 if i == 0 else 0.0, response_format="json")
try:
return ClaimResult.model_validate_json(raw)
except ValidationError as e:
last_err = str(e)
# 兜底降级:正则提取或转人工
return fallback_extract(text)
校验 + 重试是"让 LLM 输出真正可用"的关键一环。生产里必做三层 :① Pydantic/Schema 校验形;② 业务规则校验义;③ 失败带反馈重试 + 降级兜底。重试次数要记 Trace 和成本(重试多花 token)。
结构化输出只保证"形对",工程上必须 Pydantic 校验 + 业务校验 + 失败带反馈重试 + 降级兜底。带反馈重试(把错误信息喂回去)比无脑重试有效得多。
九、模型幻觉与拒答
9.1 幻觉类型
事实幻觉 :编造不存在的事实(虚构保单条款、捏造药品名)。
格式幻觉 :输出格式对但内容错(JSON 里 policy_no 填了"无")。
指令幻觉 :没遵守指令(要求拒答却硬答)。
9.2 缓解手段
RAG :给模型真实知识,减少编造。
结构化约束 + 校验 :限制输出形,校验值。
低 Temperature :减少随机编造。
自洽性检查 :多次生成取多数,或生成后自检。
引用溯源 :要求每条结论附引用,无引用即拒答。
9.3 拒答(Refusal)
企业知识库场景,无答案时应该拒答 ,而不是硬编。工程上要:
明确告诉模型"知识库里没有就回答'我不知道'"。
让模型输出 should_refuse 字段或固定拒答文案。
检测拒答信号(如输出含"我不知道"/"未找到"),不要当正常答案返回。
评测集里专门留 should_refuse=true 的 case,测拒答准确率。
幻觉分事实/格式/指令三类,靠 RAG + 结构化 + 低 T + 自洽 + 引用缓解。企业场景"该拒答时拒答"比"硬编"更重要——拒答准确率是 RAG 评测的核心指标之一。
① 别只追求"答得多",拒答能力 往往更难、更关键——模型爱"自信地编",让它"承认不知道"需要专门 prompt + 评测。② 检测拒答别只靠关键词匹配("我不知道"),模型可能换说法("未查询到相关条款"),要结合 should_refuse 字段。
十、实战要点(Qwen / DeepSeek / Claude)
10.1 调结构化输出
Qwen :参数 response_format={"type": "json_object"},prompt 里要明确出现 "json"。
DeepSeek :response_format={"type": "json_object"}。
Claude :用 tool_use 强制结构化,或 prompt 末尾预填充 { 引导 JSON 开始。
10.2 Pydantic 定义
from pydantic import BaseModel, Field
from typing import Literal
class ClaimExtract(BaseModel):
policy_no: str = Field(description="保单号")
drug_name: str = Field(description="药品名称")
amount: float = Field(ge=0, description="理赔金额")
risk_level: Literal["low", "medium", "high"]
should_refuse: bool = Field(description="无法判断时为 true")
10.3 工程 checklist
低 T(0~0.2)+ 结构化输出 + Pydantic 校验。
失败带反馈重试 ≤3 次,超限降级。
记录每次原始输出、校验错误、重试次数到 Trace。
评测集覆盖:正常 case + 格式错 case + 应拒答 case + 边界值 case。
十一、面试达标线①:采样参数如何选
场景 T Top P 理由
代码/JSON 生成 0 关 要确定性,不能随机
RAG 问答 0.1~0.3 1(关) 稳定为主,低 T 即可
Agent 工具调用 0~0.2 关 参数必须准
信息抽取 0 关 结构化抽取要稳
通用对话 0.7 0.9 平衡
创意写作 0.9 0.95 多样
核心原则:要稳定可解析→低 T(0~0.2)+ 关 Top P;要多样→中高 T + Top P=0.9。工程任务几乎都用低 T,别三个参数一起调。
十二、面试达标线②:结构化输出从请求到校验的完整流程
定义 Schema → 构造 Prompt → 调 API(response_format + 低 T)→ 拿到原始输出 → JSON parse → Pydantic 校验形 → 业务规则校验义 → 通过则用 / 失败则带反馈重试 → 重试超限则降级兜底 → 全程记 Trace
定义 Schema :用 Pydantic 写数据模型,字段类型/约束/description 齐全。
构造 Prompt :明确要求输出 JSON,给出字段说明和示例(few-shot)。
调 API :低 T + response_format=json,必要时 stop 控制边界。
parse :json.loads,失败进重试。
Pydantic 校验 :类型/必填/枚举/范围,失败带错误反馈重试。
业务校验 :保单号是否存在、金额合理性、风险等级合法性。
重试 :带反馈重试 ≤3 次,每次降 T。
降级 :正则提取 / 默认值 / 转人工,不能让流程卡死。
Trace :记录原始输出、校验错误、重试次数、最终结果、token 成本。
十三、Day 2 自测清单
能解释 logits → softmax → 采样 的完整过程,说清采样参数在哪一步干预。
能说清 Temperature 的原理(logits/T)和对分布的影响,以及 T=0/0.3/0.7/0.9 各适用场景。
能区分 Top P(动态累计概率)和 Top K(固定数量),说出谁更自适应。
知道三者的生效顺序和常见组合配方,明白为什么不要三个一起乱调。
能解释 Stop Sequences 的作用,以及和 max_tokens、EOS 的关系。
能区分 JSON Mode 和 JSON Schema,知道约束解码的原理。
知道为什么结构化输出后仍要校验(形对不代表义对)。
能写出 Pydantic + 带反馈重试的代码骨架。
能说出幻觉的三类和缓解手段,以及为什么"拒答能力"很关键。
能讲清结构化输出从请求到校验的完整流程(达标线②)。
十四、高频面试题速记卡
Q:Temperature 越高输出越随机,那调高 T 能让模型更聪明吗?
不能。T 只调随机性不调能力,调高反而易跑偏。能力由模型本身和知识决定。
Q:Top P 和 Top K 有什么区别?
Top P 按累计概率动态截断(自适应),Top K 固定保留前 K 个。Top P 更常用。
Q:T=0 为什么还会出错?
T=0 是贪心,选 logits 最高的 token;若模型本身最高分那个就是错的,低 T 反而锁死错误。
Q:JSON Mode 和 JSON Schema 有什么区别?
JSON Mode 保证语法合法(能 parse),JSON Schema 进一步保证字段/类型符合定义(靠约束解码)。
Q:开了结构化输出为什么还要校验?
结构化只保证"形对"(语法/字段),不保证"义对"(值可能幻觉、超范围),必须 Pydantic + 业务校验。
Q:输出校验失败怎么重试?
带反馈重试(把校验错误喂回 prompt)> 无脑重试;可降 T;超限降级(正则/默认值/人工)。
Q:Stop Sequences 和 max_tokens 什么关系?
Stop 是语义刹车(遇指定字符串停),max_tokens 是硬刹车(防超长)。生成在 stop / max_tokens / EOS 任一触发时停。
Q:RAG 问答的 Temperature 怎么选?
0.1~0.3,稳定为主,关 Top P。要可解析、可引用,不能乱发挥。
Q:为什么拒答能力比答题能力还重要?
企业场景"硬编"比"不知道"危害大(误导决策)。拒答准确率是 RAG 核心评测指标。
Q:采样参数三个一起调会怎样?
互相干扰、效果不可预测、出问题难定位。生产应按场景预设配方固化,别每次随便传。
FDE Day2 学习手册 · 采样参数与结构化输出(面试级)· 配合《Day2 评测题.md》自测
📌 待查 ★ 重要
★0
📌0