资讯动态

lm-evaluation-harness Chat Template 分隔符处理更新:apply_chat_template 模式下 target_delimiter 置空机制解析

发布时间:2026/9/14 17:44:24 来源:尧图企业网站定制
lm-evaluation-harness Chat Template 分隔符处理更新apply_chat_template 模式下 target_delimiter 置空机制解析【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness导读本文围绕 lm-evaluation-harness 中docs/chat-template-readme.md记录的变更展开讲解在请求构造过程中应用 Chat Template 时系统如何将 target delimiter 由默认空白符改为空字符串从而避免 Chat 模型自带格式化约定与默认分隔符系统相互干扰。读者将掌握apply_chat_template的完整行为、target_delimiter在loglikelihood与multiple_choice两类任务中的不同处理逻辑、以及 gen_prefix 对分隔符决策的例外影响并能将这套规则直接用于自建任务 YAML 与 CLI 评估命令的配置。背景默认分隔符与 Prompt 拼接模型在 lm-evaluation-harness 中每个任务对每条样本构造 Prompt 时遵循一个统一约定上下文文本与目标文本之间插入一个target_delimiter。默认值为单个空格 该默认值定义在任务配置类TaskConfig中见 lm_eval/config/task.py。整体拼接关系可表示为doc_to_text(doc) target_delimiter doc_to_target(doc)doc_to_text(doc)从样本中提取问题/上下文target_delimiter默认 可在任务 YAML 中以同名键覆盖doc_to_target(doc)从样本中提取标准答案/目标文本。这一设计对基础模型base model很友好模型被要求预测“一个空白符 答案”从而以最大似然loglikelihood方式打分。但对于经过指令微调、自带对话格式的 Chat 模型空白符插入的位置往往与模板自带的换行、缩进约定冲突导致生成或打分的目标序列与模型在训练时见过的格式不一致。变更内容apply_chat_template 下分隔符置空本次更新的核心改动可概括为一条规则当apply_chat_template为True时构造请求所用的 target delimiter 置为空字符串而不再使用配置的分隔符默认 。其意义在于防止 Chat Template 的格式化结果与默认分隔符系统相互干扰对 multiple-choice 类任务尤其关键因为模板本身已经负责处理空格与换行。原文档给出的直观对比变更前 vs 变更后如下# Before默认分隔符 userQuestion: What color is the sky?\nAnswer:assistant blue # After分隔符为空 userQuestion: What color is the sky?\nAnswer:assistantblue可以看出变更前答案前残留一个多余空格变更后答案紧贴assistant之后的模板原生格式更符合 Chat 模型的训练分布。源码级实现分隔符在请求构造链中的真实走向上述行为并非仅在文档层面声明而是落实在任务请求构造代码中。核心逻辑位于Task.construct_requests()见 lm_eval/api/task.py。对于loglikelihood输出类型请求直接以(ctx, doc_to_target(doc))作为参数对不经过分隔符拼接if self.OUTPUT_TYPE loglikelihood: arguments (ctx, self.doc_to_target(doc))而对于multiple_choice输出类型分隔符逻辑最为关键elif self.OUTPUT_TYPE multiple_choice: choices self.doc_to_choice(doc) target_delimiter self.config.target_delimiter if apply_chat_template: target_delimiter ( self.config.target_delimiter if self.config.gen_prefix and not ends_with_whitespace(self.config.gen_prefix) else ) ... arguments [(ctx, f{target_delimiter}{cont}) for cont in choices]代码显示apply_chat_templateTrue时存在一个带条件的例外若任务配置了gen_prefix且gen_prefix不以空白字符结尾则仍保留target_delimiter其余情况无 gen_prefix或 gen_prefix 以空白结尾一律置空。这意味着“置空分隔符”规则在 gen_prefix例如Answer:场景下会被有意放宽以保证Answer:与答案之间保留必要的间隔而一旦Answer:自带尾部空格间隔又回归空串避免出现双重空格。从源码结构看这一分支是为了同时兼容“模板自带间隔”与“gen_prefix 显式要求间隔”两种诉求。gen_prefix的取值优先级同样定义在任务类中见 lm_eval/api/task.py若其在样本features中则为字段引用否则会经apply_template模板渲染得到。apply_chat_template 的开启路径从 CLI 到 Evaluatorapply_chat_template的取值可以是布尔值或字符串True表示应用模型默认 Chat Template字符串则按名称指定模板见 lm_eval/evaluator.py。在 CLI 层面对应--apply_chat_template参数Python API 的simple_evaluate/evaluate亦接受同名关键字参数。在 evaluator 中开启后通过以下方式把模板能力注入任务上下文见 lm_eval/evaluator.pychat_templatelm.chat_template(apply_chat_template) if apply_chat_template随后在Task.fewshot_context()中chat_template与apply_chat_template一并被使用见 lm_eval/api/task.py消息列表system / few-shot / 评测样本先按build_qa_turn()构造为Message序列apply_chat_template为真时再统一交给chat_template(res)渲染为单轮或对话式文本。需要特别说明的是置空分隔符的生效点位于请求构造construct_requests阶段即实际送入模型的 loglikelihood 打分对而fewshot_context生成的展示文本仍会保留target_delimiter通过build_qa_turn(..., tgt_delimself.config.target_delimiter, ...)见 lm_eval/api/task.py。也就是说--write_out输出的样例文本与真正打分的 continuation 之间可能存在细微差异这正是文档所描述“防止模板格式化与默认分隔符系统相互干扰”的底层原因。如何配置与验证1. 任务侧在 YAML 中显式控制分隔符在自建任务配置中可按需覆盖分隔符相关字段task: my_chat_mc_task output_type: multiple_choice target_delimiter: # 默认即 可显式声明或留空 doc_to_text: Question: {{question}} doc_to_choice: [A, B, C, D] doc_to_target: {{answer}}配合运行时开启 Chat Template 后multiple_choice 请求中的分隔符会自动置空除非命中 gen_prefix 例外分支无需在 YAML 中手工清空。2. 评估侧CLI 与 Python APICLI 方式lm_eval --model hf \ --model_args pretrainedyour-chat-model \ --tasks my_chat_mc_task \ --apply_chat_templatePython 方式等价from lm_eval import simple_evaluate results simple_evaluate( modelhf, model_argspretrainedyour-chat-model, tasks[my_chat_mc_task], apply_chat_templateTrue, fewshot_as_multiturnTrue, # 将 few-shot 示例作为多轮对话 )其中fewshot_as_multiturn控制 few-shot 示例是作为独立 user/assistant 多轮消息True还是折叠进单条 user 消息False与 Chat Template 渲染密切相关默认True见 lm_eval/evaluator.py。3. 验证输出可通过--write_out导出构造出的实际输入文本检查assistant后是否紧贴答案、无多余空格lm_eval --model hf \ --model_args pretrainedyour-chat-model \ --tasks my_chat_mc_task \ --apply_chat_template \ --write_out \ --limit 10同时请求缓存指纹会因apply_chat_template而异——任务缓存键在开启时追加-chat_template后缀见 lm_eval/api/task.py--cache_requests场景下模板开关不会串用旧缓存。常见陷阱与边界不要同时依赖默认空格与模板自带空格对 Chat 模型模板通常已在assistant后包含换行/空格若仍保留默认 会出现双空格或错位这正是本变更消除的问题gen_prefix 例外配置了不带尾部空格的gen_prefix如Answer:时分隔符不会被置空以免Answer:与答案粘连这是刻意保留的行为不是 bugfewshot 与评测样本的分隔符来源不同few-shot 示例使用FewshotConfig中的target_delimiter由fewshot_config或全局配置继承见 lm_eval/config/task.py评测样本使用任务级target_delimiter两者在 Chat 模板场景下的最终渲染均以模板为准缓存指纹区分apply_chat_template会修改缓存键与 tokenizer 指纹如 lm_eval/models/api_models.py 的apply_chat_template实现切换开关后建议清理旧请求缓存避免命中过期结果。总结lm-evaluation-harness 通过将apply_chat_templateTrue场景下的 target delimiter 置空消除了 Chat 模板格式化与默认空格分隔符之间的冲突使 Chat 模型的 loglikelihood 打分与多选任务请求构造更贴近模型原生对话分布。理解construct_requests中置空规则、gen_prefix 例外分支与fewshot_context渲染路径的差异是正确配置--apply_chat_template与编写 Chat 任务 YAML 的关键。相关实现细节可在 lm_eval/api/task.py、lm_eval/evaluator.py 与 lm_eval/config/task.py 中继续深入。【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价