lm-evaluation-harness 如何评估 Qwen3 等推理模型并用 think_end_token 剥离思维链后再计算指标 lm-evaluation-harness 如何评估 Qwen3 等推理模型并用 think_end_token 剥离思维链后再计算指标【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harnessQwen3、DeepSeek-R1 这类推理模型在给出最终答案之前会先生成一段思维链chain-of-thought推理内容。如果把这段思维链原样留给评测框架它会被混进用于计算指标的生成结果里。lm-evaluation-harness 为此提供了think_end_token和enable_thinking两个模型参数在指标计算之前把输出中最后一个think_end_token含该 token 本身之前的内容全部丢弃只保留最终答案部分。前提条件以 docs/interface.md 中的 “Evaluating Thinking/Reasoning Models” 一节为准已安装 lm-evaluation-harness并按所用后端安装了对应的可选依赖。README.md 说明基础包不再包含transformers/torch模型后端需单独安装例如pip install lm_eval[hf]或pip install lm_eval[vllm]使用的是生成式generative任务。文档明确注明enable_thinkingTrue只与生成式任务兼容不能用于 loglikelihood 类任务任务需要配合--apply_chat_template使用使 prompt 走模型自带的 chat template。配置 enable_thinking 与 think_end_token两个参数都通过--model_args传入含义如下enable_thinking在 chat template 中激活思考模式作为 kwarg 传给apply_chat_template。think_end_token标记思考段结束的定界符。文档说明从输出开头到最后一次出现该 token 为止的所有内容都会被丢弃。使用enable_thinkingTrue时think_end_token是必选项。不同后端对think_end_token的取值类型有约束这是配置时最容易出错的地方后端think_end_token取值说明vllm、sglang必须是字符串例如/thinkhf字符串或 token ID整数用 token ID 可避免该 token 的字符串形式偶然出现在普通文本中的边界情况local-chat-completions等 OpenAI 兼容 chat 后端字符串要求 API 服务端返回的 message 内容中确实包含该定界符正确的think_end_token从哪里查到目标模型的tokenizer_config.json里找 chat template 中关闭 thinking 块的那个 token。文档给出的示例是 Qwen3-32B 的tokenizer_config.json其中关闭 thinking 块的 token ID 为 200008即下文 hf 命令中使用的值。执行评估主路径hf 后端默认后端--model的默认值就是hf见 docs/interface.md。文档给出的示例命令pip install lm_eval[hf] lm-eval run --model hf \ --model_args pretrainedQwen/Qwen3-32B,enable_thinkingTrue,think_end_token200008 \ --tasks gsm8k --apply_chat_template这里pretrainedQwen/Qwen3-32B是文档示例中的模型名换成你要评估的推理模型即可同时把think_end_token换成该模型tokenizer_config.json中查到的 token ID。hf 后端同时支持字符串写法如think_end_token/think但 hf 后端文档推荐用 token ID 来规避字符串歧义。可选分支vllm / sglang 后端这两个后端要求think_end_token是字符串。文档示例pip install lm_eval[vllm] lm-eval run --model vllm \ --model_args pretrainedQwen/Qwen3-32B,enable_thinkingTrue,think_end_token/think \ --tasks gsm8k --apply_chat_template可选分支OpenAI 兼容的 chat 后端local-chat-completions等 OpenAI 兼容后端也接受字符串形式的think_end_token但文档附带一个前提API 服务端返回的 message 内容中必须包含该定界符否则无法切割。文档示例base_url为文档示例地址按实际服务端替换lm-eval run --model local-chat-completions \ --model_args modelQwen/Qwen3-32B,base_urlhttp://localhost:8000/v1/chat/completions,think_end_token/think \ --tasks ifeval --apply_chat_template验证思维链确实被剥离指标是否基于剥离后的文本计算可以直接检查模型的原始输出。--log_samples会把所有模型输入/输出保存到磁盘供事后分析使用它时--output_path必填lm-eval run --model hf \ --model_args pretrainedQwen/Qwen3-32B,enable_thinkingTrue,think_end_token200008 \ --tasks gsm8k --apply_chat_template \ --output_path ./results/ --log_samples检查./results/中保存的样本输出应当只剩最终答案部分——按文档规则最后一个think_end_token及其之前的内容都已被丢弃。如果样本里仍能看到思维链说明该模型的后端没有接受到think_end_token类型不符合上文约束、或tokenizer_config.json里查到的 token 不对回到“配置”一节核对参数类型与取值。两个辅助参数可用于快速验证--limit限制每个任务的样本数整数或 0.0–1.0 的百分比文档标注其用途是 “For testing only”适合先跑少量样本确认输出形态--predict_only只保存预测、跳过指标计算隐含--log_samples适合只想确认剥离逻辑、不关心分数时使用。--log_samples与--limit的完整说明见 docs/interface.md。限制与边界enable_thinkingTrue只能用于生成式任务loglikelihood 类任务不可用docs/interface.md 原文说明。因此gsm8k、ifeval这类生成式任务在文档示例中而mmlu等 loglikelihood 任务不适配该参数组合。vllm/sglang后端传 token ID 不受支持必须是字符串hf 后端两者皆可。该功能的引入记录见 README.md 的更新日志2025/07 为hftoken/str、vllm和sglangstr加入think_end_token参数。相关实现入口分别在 lm_eval/models/huggingface.py、lm_eval/models/vllm_causallms.py、lm_eval/models/sglang_causallms.py通用的切割逻辑按最后一个定界符 split 并去除前导空白位于 lm_eval/models/utils.py。如果所用模型不在上述任一后端支持范围内或tokenizer_config.json中找不到关闭 thinking 块的 tokenthink_end_token机制无法套用——文档没有为这类模型提供替代剥离方案。【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考