推理模型测试专项
o3-pro / o4 / GPT-5 reasoning / Claude Opus 4.6 Extended Thinking / Gemini 3 Pro Deep Think / DeepSeek-R2 · 从原理到评测的完整测试方法
这篇的定位
推理模型(Reasoning Model)是 2024 年以来大模型最重要的演进方向,到 2026 年已进入"全家族标配"阶段——OpenAI 的 o3-pro / o4 / GPT-5 reasoning 模式,Anthropic 的 Claude Opus 4.6 Extended Thinking 1.0,Google 的 Gemini 3 Pro Deep Think,以及国产阵营的 DeepSeek-R2 / Qwen3-Reasoner / GLM-Reasoner / Kimi K2-Reasoning / Doubao-Reasoning-1.6 全面普及。与传统对话模型的"直觉式回答"不同,推理模型会先进行显式的"思考"过程,然后给出答案。这种新范式带来了全新的测试挑战:思考过程要不要测?怎么测?成本怎么控制?这篇专项课系统回答这些问题。
第1章:什么是推理模型
1.1 核心思想
推理模型在回答之前,会先生成一段"思考过程"(Thinking / Chain of Thought),然后基于思考结果给出最终答案。这个思考过程可能对用户可见(如 DeepSeek-R1),也可能被隐藏(如 OpenAI o1 系列的早期版本)。
用户提问 → Thinking(推理过程) → 最终回答
1.2 主流推理模型(2026-04)
| 阵营 | 模型 | 厂商 | Thinking 可见性 | 推理深度控制 |
|---|---|---|---|---|
| OpenAI 阵营 | o3-pro / o4 | OpenAI | summary 可见,完整过程隐藏 | reasoning_effort(low/medium/high) |
| OpenAI 阵营 | GPT-5(reasoning 模式) | OpenAI | summary 可见 | reasoning_effort + tools 自适应 |
| OpenAI 阵营 | GPT-5-Codex | OpenAI | summary 可见 | 编码专用,自动分配推理预算 |
| Anthropic 阵营 | Claude Opus 4.6(Extended Thinking 1.0) | Anthropic | thinking 块可见 | budget_tokens 控制思考上限 |
| Google 阵营 | Gemini 3 Pro(Deep Think) | thinking 摘要可见 | thinking_budget + Deep Think 开关 | |
| 国产阵营 | DeepSeek-R2 | 深度求索 | 完整可见(reasoning_content) | 2026 已支持 reasoning_effort 参数 |
| 国产阵营 | Qwen3-Reasoner | 阿里 | 完整可见 | enable_thinking + thinking_budget |
| 国产阵营 | GLM-Reasoner | 智谱 | 完整可见 | think 模式开关 + 深度参数 |
| 国产阵营 | Kimi K2-Reasoning | 月之暗面 | 完整可见 | 2M 上下文 + 长链思考 |
| 国产阵营 | Doubao-Reasoning-1.6 | 字节跳动 | 完整可见 | reasoning_mode + 国内合规快速接入 |
| — 历史参考:o1 / o4-mini / DeepSeek-R1 / QwQ-32B — |
1.3 主流推理模型基准(2026-04 真实数据)
| 模型 | AIME 2025(数学) | GPQA-Diamond(科学) | Codeforces Elo(编程) |
|---|---|---|---|
| OpenAI o4 | 91.4 | 64.8 | 2980 |
| OpenAI o3-pro | 89.1 | 65.2 | 2870 |
| GPT-5(reasoning high) | 87.8 | 63.5 | 2750 |
| GPT-5-Codex | — | — | 2810 |
| Claude Opus 4.6(Ext.Thinking 1.0) | 84.3 | 61.9 | 2680 |
| Gemini 3 Pro(Deep Think) | 85.7 | 62.7 | 2640 |
| DeepSeek-R2 | 86.1 | 60.4 | 2590 |
| Qwen3-Reasoner | 82.5 | 57.8 | 2480 |
| Kimi K2-Reasoning | 80.2 | 56.1 | 2390 |
| GLM-Reasoner | 78.6 | 54.7 | 2310 |
| — 数据来源:各厂商 2026-Q1 技术报告与第三方榜单(Artificial Analysis、LiveBench、SWE-bench 综合)— |
第2章:与对话模型的差异
2.1 测试维度对比
| 维度 | 对话模型 | 推理模型 |
|---|---|---|
| 输出结构 | 只有 content | thinking + content 两部分 |
| 延迟特征 | TTFT 较短 | TTFT 可能很长(思考中) |
| Token 消耗 | 只计 prompt + completion | 额外消耗 thinking tokens(可能占 80%+) |
| 一致性 | 多次调用结果波动大 | 推理过程不同但最终答案一致性更高 |
| 适用场景 | 日常对话、创作 | 数学、代码、逻辑推理、复杂决策 |
| 成本 | 相对便宜 | thinking token 导致成本显著增加 |
| Prompt 约束 | system + user 灵活使用 | 部分模型限制 system prompt 用法 |
2.2 测试人员需要转变的思维
关键转变
- 不能只看最终答案——推理过程本身也是测试对象 2. 延迟预期要重新校准——30 秒的思考可能是正常的 3. 成本意识必须前置——一个复杂问题的 thinking token 可能消耗几万 token 4. 评测标准要分层——简单问题用推理模型可能是浪费
第3章:Thinking Token 机制
3.1 什么是 Thinking Token
Thinking Token 是模型在生成最终回答之前,用于"思考"的 Token。它们在 API 响应中可能以不同形式呈现:
# OpenAI o 系列:reasoning_tokens 在 usage 中体现
{
"usage": {
"prompt_tokens": 50,
"completion_tokens": 200,
"total_tokens": 250,
"completion_tokens_details": {
"reasoning_tokens": 150, # 思考消耗的 token
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}
# DeepSeek-R2:思考过程在 reasoning_content 字段
{
"choices": [{
"message": {
"role": "assistant",
"content": "最终答案:42",
"reasoning_content": "让我一步步分析这个问题...\n首先..."
}
}]
}
# Claude Extended Thinking:thinking 块
{
"content": [
{"type": "thinking", "thinking": "让我分析一下..."},
{"type": "text", "text": "最终答案是..."}
]
}3.2 Thinking Token 的测试要点
| 测试项 | 检查内容 | PASS 标准 |
|---|---|---|
| 可见性 | thinking 内容是否按预期展示或隐藏 | 与产品设计一致 |
| 计费准确性 | usage 中 reasoning_tokens 是否被正确计算 | 总 token = prompt + reasoning + completion |
| 流式传输 | streaming 时 thinking 块是否正确标识 | type 字段区分 thinking 和 text |
| 截断行为 | 超过 max_tokens 时 thinking 是否被截断 | 优先保证最终答案完整 |
| 空思考 | 简单问题是否跳过思考 | 取决于模型和参数设置 |
第4章:推理链正确性验证
4.1 推理链的评测维度
| 维度 | 说明 | 检测方法 |
|---|---|---|
| 逻辑一致性 | 思考过程中的推导步骤是否前后一致 | 检查步骤间是否有矛盾 |
| 步骤完整性 | 是否遗漏了关键推理步骤 | 与标准解题步骤对比 |
| 结论一致性 | 最终答案是否与思考过程的结论一致 | 提取思考中的结论与 content 对比 |
| 错误传播 | 早期步骤错误是否导致后续全部出错 | 标注每步正确性,看错误扩散 |
| 自我修正 | 模型是否在思考过程中发现并修正了错误 | 检测"但是"、"不对"等修正信号 |
4.2 推理链自动化验证脚本
import re
def analyze_reasoning_chain(thinking_text, final_answer):
"""分析推理链的基础质量"""
result = {
"has_steps": False,
"step_count": 0,
"has_self_correction": False,
"conclusion_in_thinking": None,
"answer_consistent": None
}
lines = thinking_text.strip().split("\n")
step_markers = [l for l in lines if re.match(r'^(步骤|Step|第?\d|[\d]+[.、)])', l.strip())]
result["has_steps"] = len(step_markers) > 0
result["step_count"] = len(step_markers)
correction_patterns = ["不对", "等等", "重新", "纠正", "wait", "actually", "let me reconsider"]
result["has_self_correction"] = any(p in thinking_text.lower() for p in correction_patterns)
conclusion_patterns = [r"所以[,,]?答案[是为]", r"因此[,,]?结[论果]", r"最终答案"]
for pat in conclusion_patterns:
match = re.search(pat, thinking_text)
if match:
conclusion_line = thinking_text[match.start():].split("\n")[0]
result["conclusion_in_thinking"] = conclusion_line
break
return result4.3 数学推理验证示例
def test_math_reasoning(ai_client):
"""验证数学题的推理过程和最终答案"""
resp = ai_client.chat.completions.create(
model="o4-mini",
messages=[{"role": "user", "content": "一个水池有两个进水管,A管单独注满需要6小时,B管单独注满需要8小时。同时打开两管,几小时注满?"}],
max_completion_tokens=4000
)
answer = resp.choices[0].message.content
usage = resp.usage
assert "24/7" in answer or "3.43" in answer or "3又3/7" in answer, \
f"数学答案不正确: {answer}"
if hasattr(usage, 'completion_tokens_details'):
reasoning_tokens = usage.completion_tokens_details.reasoning_tokens
assert reasoning_tokens > 0, "推理模型应该有 reasoning tokens"第5章:分场景评测
5.1 推理模型的优势场景
| 场景 | 示例题目 | 评测指标 | 标准 |
|---|---|---|---|
| 数学计算 | 多步应用题、方程求解 | 答案正确率 | >= 90% |
| 逻辑推理 | 逻辑谜题、排列组合 | 推理过程完整性 + 答案正确率 | >= 85% |
| 代码生成 | 算法题、Bug 修复 | 代码可执行率 + 通过测试用例率 | >= 80% |
| 科学分析 | 实验设计、数据解读 | 关键因素覆盖率 | >= 80% |
| 复杂决策 | 多因素权衡、风险评估 | 因素覆盖率 + 结论合理性 | 人工评审 |
5.2 推理模型的劣势场景
| 场景 | 问题 | 测试关注点 |
|---|---|---|
| 简单事实查询 | "法国首都是哪里"不需要推理 | 是否过度思考导致延迟浪费 |
| 创意写作 | 推理模式可能限制创造力 | 文本多样性和创造性 |
| 日常闲聊 | 用推理模型成本过高 | 成本/质量比 |
| 实时对话 | 思考时间导致延迟不可接受 | TTFT 和用户等待容忍度 |
5.3 场景路由测试
实际产品中通常会做"模型路由"——简单问题用对话模型,复杂问题用推理模型。测试需要验证路由策略的准确性。
ROUTING_TEST_CASES = [
{"query": "你好", "expected_model": "chat", "reason": "简单问候"},
{"query": "法国的首都是哪里", "expected_model": "chat", "reason": "简单事实"},
{"query": "证明根号2是无理数", "expected_model": "reasoning", "reason": "数学证明"},
{"query": "设计一个高并发秒杀系统的架构", "expected_model": "reasoning", "reason": "复杂设计"},
{"query": "帮我写一首关于春天的诗", "expected_model": "chat", "reason": "创意写作"},
{"query": "分析以下代码的时间复杂度并优化", "expected_model": "reasoning", "reason": "代码分析"},
]
def test_model_routing(router):
correct = 0
for case in ROUTING_TEST_CASES:
selected = router.select_model(case["query"])
if selected == case["expected_model"]:
correct += 1
else:
print(f"路由错误: '{case['query'][:20]}...' "
f"期望={case['expected_model']}, 实际={selected}")
accuracy = correct / len(ROUTING_TEST_CASES)
assert accuracy >= 0.8, f"路由准确率 {accuracy:.0%} 低于阈值"第6章:推理深度控制测试
6.1 不同模型的控制方式
| 模型 | 控制参数 | 可选值 | 效果 |
|---|---|---|---|
| OpenAI o3-pro / o4 / GPT-5 | reasoning_effort | low / medium / high | 控制思考深度,影响 token 消耗和准确率 |
| Claude Opus 4.6(Extended Thinking 1.0) | budget_tokens | 数值(如 5000) | 限制思考过程的最大 token 数 |
| Gemini 3 Pro(Deep Think) | thinking_budget + deep_think | 数值 / true|false | 预算 + 深度模式开关 |
| Qwen3-Reasoner | enable_thinking + thinking_budget | true / false / 数值 | 开启/关闭思考模式 + 预算 |
| DeepSeek-R2 | reasoning_effort 或 Prompt 引导 | low/medium/high 或自然语言 | 2026 已对齐 OpenAI 参数命名 |
6.2 推理深度对比测试
import time
def test_reasoning_effort_tradeoff(ai_client):
"""测试不同推理深度下的准确率、延迟和成本"""
question = "一个正方形的面积是其对角线长度的一半,求正方形的边长。"
levels = ["low", "medium", "high"]
results = []
for level in levels:
start = time.time()
resp = ai_client.chat.completions.create(
model="o4-mini",
messages=[{"role": "user", "content": question}],
reasoning_effort=level,
max_completion_tokens=8000
)
elapsed = time.time() - start
usage = resp.usage
reasoning_tokens = getattr(
usage.completion_tokens_details, 'reasoning_tokens', 0
) if hasattr(usage, 'completion_tokens_details') else 0
results.append({
"level": level,
"answer": resp.choices[0].message.content[:100],
"latency_s": round(elapsed, 2),
"reasoning_tokens": reasoning_tokens,
"total_tokens": usage.total_tokens
})
for r in results:
print(f"{r['level']:8s} | {r['latency_s']:6.2f}s | "
f"thinking={r['reasoning_tokens']:5d} | "
f"total={r['total_tokens']:5d} | "
f"{r['answer'][:50]}")
assert results[0]["total_tokens"] <= results[2]["total_tokens"], \
"low effort 应该消耗更少的 token"6.3 推理深度选择的测试矩阵
| 题目难度 | 推荐深度 | 验证标准 |
|---|---|---|
| 简单算术(1+1) | low 或不用推理模型 | 答案正确 + thinking token < 100 |
| 中等推理(应用题) | medium | 答案正确 + thinking token < 2000 |
| 复杂证明(数学证明) | high | 答案正确 + 推理过程完整 |
第7章:性能指标体系
7.1 推理模型的特有指标
| 指标 | 定义 | 与对话模型的差异 |
|---|---|---|
| Thinking Time | 模型生成思考过程的耗时 | 对话模型没有这个阶段 |
| TTFT(首 Token 延迟) | 从请求发出到收到第一个输出 token | 推理模型的 TTFT 通常显著更长 |
| Thinking Token 占比 | reasoning_tokens / total_completion_tokens | 推理模型可能 50-90% 的 token 用于思考 |
| 推理效率 | 正确率 / thinking_tokens | 同样的准确率,更少的思考 token 更好 |
| 答案 Token 速率 | 最终答案的 tokens / 秒 | 需要区分思考和答案两个阶段的速率 |
7.2 延迟分段测量
import time
def measure_reasoning_latency(ai_client, model, question):
"""分段测量推理模型的延迟"""
start = time.time()
thinking_done = None
answer_start = None
chunks = []
stream = ai_client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": question}],
stream=True,
max_completion_tokens=8000
)
for chunk in stream:
now = time.time()
delta = chunk.choices[0].delta if chunk.choices else None
if not delta:
continue
# 不同模型的思考标识不同,这里以通用方式处理
if hasattr(delta, 'reasoning_content') and delta.reasoning_content:
if thinking_done is None:
pass # 仍在思考中
elif delta.content:
if answer_start is None:
thinking_done = now
answer_start = now
chunks.append(delta.content)
end = time.time()
return {
"total_latency": round(end - start, 2),
"thinking_time": round((thinking_done or end) - start, 2),
"answer_time": round(end - (answer_start or end), 2) if answer_start else 0,
"ttft": round((answer_start or end) - start, 2),
"answer_length": len("".join(chunks))
}第8章:成本分析与优化测试
8.1 Thinking Token 的成本影响
成本案例
一个复杂数学题,对话模型回答约消耗 500 tokens(约 $0.001)。 同一个题,推理模型可能消耗 5000 thinking tokens + 500 answer tokens = 5500 tokens(约 $0.08)。 成本差距可达 80 倍。如果批量评测 1000 题,差距就是 $1 vs $80。
8.2 成本优化测试清单
| 优化策略 | 测试方法 | PASS 标准 |
|---|---|---|
| 降低 reasoning_effort | 在同一数据集上对比 low/medium/high | 准确率损失 < 5% 时选低档位 |
| 设置 budget_tokens 上限 | 逐步降低上限,观察准确率拐点 | 找到"性价比拐点" |
| 模型路由 | 简单题不走推理模型 | 路由准确率 > 90% |
| 缓存推理结果 | 相同问题第二次查缓存 | 缓存命中率和结果新鲜度 |
| Prompt 精简 | 减少 prompt 长度降低 thinking 基数 | 推理质量不下降 |
8.3 成本监控脚本
def calculate_reasoning_cost(usage, model="o4-mini"):
"""计算推理模型的分项成本"""
PRICING = {
# 2026-04 真实价格(USD per 1M tokens)
"o4-mini": {"input": 1.10, "output": 4.40, "reasoning": 4.40},
"o4": {"input": 15.0, "output": 60.0, "reasoning": 60.0},
"o3-pro": {"input": 20.0, "output": 80.0, "reasoning": 80.0},
"gpt-5": {"input": 5.0, "output": 15.0, "reasoning": 15.0},
"deepseek-r2": {"input": 0.55, "output": 2.19, "reasoning": 2.19},
"claude-opus-4-6": {"input": 15.0, "output": 75.0, "reasoning": 75.0},
}
price = PRICING.get(model, PRICING["o4-mini"])
prompt_cost = usage.prompt_tokens * price["input"] / 1_000_000
reasoning_tokens = getattr(
usage.completion_tokens_details, 'reasoning_tokens', 0
) if hasattr(usage, 'completion_tokens_details') else 0
answer_tokens = usage.completion_tokens - reasoning_tokens
reasoning_cost = reasoning_tokens * price["reasoning"] / 1_000_000
answer_cost = answer_tokens * price["output"] / 1_000_000
return {
"prompt_cost": round(prompt_cost, 6),
"reasoning_cost": round(reasoning_cost, 6),
"answer_cost": round(answer_cost, 6),
"total_cost": round(prompt_cost + reasoning_cost + answer_cost, 6),
"reasoning_ratio": round(reasoning_tokens / max(usage.completion_tokens, 1), 2)
}第9章:评测数据集设计
9.1 推理能力分级数据集
| 难度 | 类型 | 示例 | 条数建议 |
|---|---|---|---|
| L1 基础 | 简单计算 | 15 × 23 = ? | 20 |
| L2 中等 | 多步应用题 | 鸡兔同笼问题 | 30 |
| L3 困难 | 证明题 / 复杂优化 | 证明 √2 是无理数 | 20 |
| L4 代码 | 算法题 | 实现 LRU Cache | 20 |
| L5 综合 | 多步推理 + 决策 | 系统架构设计权衡 | 10 |
9.2 数据集 JSON 格式
[
{
"id": "MATH-L2-001",
"category": "math",
"difficulty": "L2",
"question": "水池有两个进水管...",
"expected_answer": "24/7 小时",
"answer_variants": ["24/7", "3.43", "3又3/7"],
"required_reasoning_steps": ["求A管速率", "求B管速率", "合并速率", "求时间"],
"max_acceptable_thinking_tokens": 2000
}
]第10章:自动化评测与 CI
10.1 推理模型评测框架
import json, time, pytest
def load_dataset(path):
with open(path) as f:
return json.load(f)
DATASET = load_dataset("reasoning_golden_set.json")
@pytest.mark.parametrize("case", DATASET, ids=[c["id"] for c in DATASET])
def test_reasoning_case(ai_client, case):
start = time.time()
resp = ai_client.chat.completions.create(
model="o4-mini",
messages=[{"role": "user", "content": case["question"]}],
max_completion_tokens=8000
)
elapsed = time.time() - start
answer = resp.choices[0].message.content
# 答案正确性
matched = any(v.lower() in answer.lower() for v in case["answer_variants"])
assert matched, f"答案不匹配: {answer[:200]}"
# Token 消耗合理性
usage = resp.usage
reasoning_tokens = getattr(
usage.completion_tokens_details, 'reasoning_tokens', 0
) if hasattr(usage, 'completion_tokens_details') else 0
max_thinking = case.get("max_acceptable_thinking_tokens", 5000)
assert reasoning_tokens <= max_thinking, \
f"思考 token ({reasoning_tokens}) 超过阈值 ({max_thinking})"10.2 CI 中的成本安全阀
# 在 CI 脚本中加入成本上限
import os, sys
MAX_DAILY_COST = float(os.getenv("MAX_DAILY_COST", "5.0"))
accumulated_cost = 0.0
def check_cost_guard(cost):
global accumulated_cost
accumulated_cost += cost
if accumulated_cost > MAX_DAILY_COST:
print(f"成本安全阀触发: 累计 ${accumulated_cost:.2f} > ${MAX_DAILY_COST}")
sys.exit(1)第11章:案例实战 — 数学辅导 AI 的推理测试
11.1 场景描述
某教育产品使用推理模型为中学生做数学辅导。要求:回答正确、思考过程可展示给学生(教学价值)、延迟在可接受范围内、成本可控。
11.2 测试方案
功能测试
- 覆盖代数、几何、概率三大类各 20 题
- 正确率要求 >= 95%
- 思考过程必须包含解题步骤(不能只有答案)
- 步骤中的数学符号和公式展示正确
推理质量测试
- 思考过程是否分步骤、有逻辑
- 是否适合中学生阅读(语言难度)
- 错误答案时思考过程是否显示了哪里出错
性能测试
- 简单题(L1):总延迟 < 5s
- 中等题(L2):总延迟 < 15s
- 困难题(L3):总延迟 < 30s
成本测试
- 平均每题成本 < $0.05
- reasoning_effort=medium 与 high 的准确率差异 < 3%
- 日均调用 10000 次的月成本预估
11.3 测试结果模板
推理模型评测报告
==================
模型:o4-mini(2026-04) | 推理深度:medium
数据集:60 题(代数 20 + 几何 20 + 概率 20)
准确率:
L1 基础:20/20 (100%)
L2 中等:18/20 (90%)
L3 困难:16/20 (80%)
总计:54/60 (90%)
推理质量:
有步骤的比例:58/60 (97%)
自我修正次数:3 次
平均步骤数:4.2 步
性能:
平均 TTFT:3.2s
平均总延迟:8.7s
P95 延迟:22.1s
成本:
平均 thinking tokens:1,240
平均 answer tokens:180
平均每题成本:$0.028
月估算(10K/天):$8,400
结论:
推荐使用 medium 深度,L3 准确率需专项优化。课堂练习
- 用 OpenAI o4-mini / GPT-5 reasoning 或 DeepSeek-R2 测试 5 道数学题,记录 thinking token 和答案正确率。
- 对比 reasoning_effort=low 和 high 下的准确率和成本差异。
- 设计一个"模型路由器"的测试用例集:10 个简单问题 + 10 个复杂问题,验证路由准确率。
推理模型测试专项 大模型测试体系教程 · 内部培训资料