Day2 学习手册 1.采样本质2.Temperature3.Top P4.Top K5.组合 6.Stop7.结构化输出8.校验重试9.幻觉拒答10.实战 达标线①达标线②自测速记

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
  1. logits:模型对每个候选 token 的"偏好分",分数越高越可能。
  2. softmax:把 logits 归一化为概率分布(加起来=1)。
  3. 采样:按概率分布随机抽一个 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 )

2.2 对生成的影响

T分布输出特征适用场景
0极尖(贪心)确定性、重复性高、保守代码生成、结构化抽取、分类、事实问答
0.3较尖稳定、略有变化翻译、摘要、企业 RAG 问答
0.7中等平衡通用对话、Agent 工具调用
0.9~1.0较平多样、有创意创意写作、头脑风暴
≥1.2很平发散、易跑题一般不用(容易乱)

2.3 工程取值经验

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 关键特征

3.3 取值经验

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 KTop P
保留数量固定 K 个动态(按累计概率)
分布尖锐时仍保留 K 个(可能含低概率噪声)只保留少数(自适应)
分布平缓时只保留 K 个(可能太少)保留较多(自适应)
适用词表大、想简单截断更常用,自适应好

4.3 取值经验

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 常见组合配方

场景TTop PTop K说明
代码/JSON/抽取0贪心,最稳定
RAG 问答0.1~0.31(关)低 T 即可,不叠 Top P
Agent 工具调用0~0.31参数必须准
通用对话0.70.940平衡多样与稳定
创意写作0.90.9550多样
工程上别三个一起调,容易互相干扰且难调试。原则:要稳定就 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 用途

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 实现原理(了解)

7.3 各家 API 支持

7.4 适用场景

结构化输出是 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 校验工具

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 幻觉类型

9.2 缓解手段

9.3 拒答(Refusal)

企业知识库场景,无答案时应该拒答,而不是硬编。工程上要:

幻觉分事实/格式/指令三类,靠 RAG + 结构化 + 低 T + 自洽 + 引用缓解。企业场景"该拒答时拒答"比"硬编"更重要——拒答准确率是 RAG 评测的核心指标之一。
① 别只追求"答得多",拒答能力往往更难、更关键——模型爱"自信地编",让它"承认不知道"需要专门 prompt + 评测。② 检测拒答别只靠关键词匹配("我不知道"),模型可能换说法("未查询到相关条款"),要结合 should_refuse 字段。

十、实战要点(Qwen / DeepSeek / Claude)

10.1 调结构化输出

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

十一、面试达标线①:采样参数如何选

场景TTop P理由
代码/JSON 生成0要确定性,不能随机
RAG 问答0.1~0.31(关)稳定为主,低 T 即可
Agent 工具调用0~0.2参数必须准
信息抽取0结构化抽取要稳
通用对话0.70.9平衡
创意写作0.90.95多样
核心原则:要稳定可解析→低 T(0~0.2)+ 关 Top P;要多样→中高 T + Top P=0.9。工程任务几乎都用低 T,别三个参数一起调。

十二、面试达标线②:结构化输出从请求到校验的完整流程

定义 Schema → 构造 Prompt → 调 API(response_format + 低 T)→ 拿到原始输出 → JSON parse → Pydantic 校验形 → 业务规则校验义 → 通过则用 / 失败则带反馈重试 → 重试超限则降级兜底 → 全程记 Trace
  1. 定义 Schema:用 Pydantic 写数据模型,字段类型/约束/description 齐全。
  2. 构造 Prompt:明确要求输出 JSON,给出字段说明和示例(few-shot)。
  3. 调 API:低 T + response_format=json,必要时 stop 控制边界。
  4. parse:json.loads,失败进重试。
  5. Pydantic 校验:类型/必填/枚举/范围,失败带错误反馈重试。
  6. 业务校验:保单号是否存在、金额合理性、风险等级合法性。
  7. 重试:带反馈重试 ≤3 次,每次降 T。
  8. 降级:正则提取 / 默认值 / 转人工,不能让流程卡死。
  9. Trace:记录原始输出、校验错误、重试次数、最终结果、token 成本。

十三、Day 2 自测清单

十四、高频面试题速记卡

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》自测
📌 待查★ 重要