多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

MingLi-Bench答案提取揭秘:多级正则模式如何精准捕获模型最终答案

MingLi-Bench答案提取揭秘:多级正则模式如何精准捕获模型最终答案 MingLi-Bench答案提取揭秘多级正则模式如何精准捕获模型最终答案【免费下载链接】MingLi-BenchA benchmark for evaluating LLMs on Chinese traditional fortune telling — Bazi (八字) and Ziwei Doushu (紫微斗数).项目地址: https://gitcode.com/gh_mirrors/mi/MingLi-BenchMingLi-Bench 是一个评测大语言模型LLM中国传统命理八字、紫微斗数能力的开源基准。当模型输出大段推理文字后如何从回复中精准提取最终答案并完成评分是整个评测链路中最容易出错的环节。本文带你拆解 MingLi-Bench 的多级正则答案提取设计6 条按优先级排列的正则模式、取最后一次匹配的关键规则以及提示词与正则如何形成闭环。为什么命理评测需要一个专门的答案提取模块MingLi-Bench 的数据集来自 2022–2025 年全球算命师大赛题源共 160 道标准化选择题覆盖事业、婚姻、健康、财运等 12 个类别见 data/data.json 与原始题源 data/raw/。评分方式非常简单直接预测答案与标准答案精确匹配才得分。但模型的回复往往不是光秃秃的一个字母而是这样的长文从八字来看日主身弱用神在财……综合紫微斗数命宫星曜倾向于是 B。答案B如果提取逻辑只找第一个出现的字母模型在推理过程中顺带提到的 A 就会污染结果。因此 MingLi-Bench 的答案提取必须满足两个要求容忍冗长输出、锁定最终答案。这套逻辑集中在核心评测框架的 _extract_answer 方法中。三步流水线从原始回复到唯一字母答案提取的整体流程是清洗文本 → 多级正则匹配 → 兜底回退。逐级看 第 1 步先清洗响应文本去掉格式噪声在 benchmark.py#L336-L339 中提取前先做两轮清理strip()去掉首尾空白用正则删除 Markdown 强调符号*、_、反引号和各类引号、括号中英文、直角引号、方括号等。这一步的意义在于模型写**答案B**或【答案B】时清洗后都归一化成答案B后面的正则只需面对干净文本不必为每种包装格式写变体。第 2 步6 条正则模式从严格到宽松依次尝试清洗后的文本会依次过一组按优先级排列的正则benchmark.py#L341-L352优先级模式简化捕获的回复形态1答案[:]X标准格式「答案B」2答案是[:]X「答案是 B」3选择[:]X「选择C」4选[:]X「选 D」5整行只有一个字母独立一行的B6句尾字母「……故为 B。」规则是按顺序尝试哪条模式先命中就返回越靠前的模式越严格能明确表达这是答案的回复会优先被识别宽松模式如句尾字母只在前面都落空时才启用避免误伤正文。关键细节命中多条时取最后一次匹配这是整个设计里最精妙的一处benchmark.py#L354-L358对每条模式用finditer找出所有匹配然后返回matches[-1]——最后一个匹配项。为什么因为开启思维链--cot时模型会在推理中途多次提到选项字母。比如先分析「若按 A 走……」最后才给出「答案C」。取最后一次匹配等价于采信模型改口之后的最终结论天然适配 Chain-of-Thought 类回复。第 3 步兜底回退只保留合法选项若 6 条模式全部落空提取器做最后一次兜底benchmark.py#L360-L368用词边界正则找出文中所有独立出现的单字母过滤出 A–F 范围内的合法选项字母依旧取最后一个作为预测答案若一个字母都没找到返回None该题记为不答对而不是猜测。这种宁缺毋滥的处理保证了统计结果不会被随机字母污染。答案提取在更大评测框架中的位置提取出的答案并不孤立它会被写入每道题的评估记录predicted_answer与标准答案比对后汇入整体准确率与分类别准确率_calculate_statistics。项目官方文档中展示的评测架构下图可以看到同一套题目在基线模型与多智能体系统如 Tianfu Agent 的 Sub-Agent 协作推理上都会反复作答、多数投票聚合——每一次投票能否投对都取决于答案提取是否稳定可靠。此外当使用--shuffle-options打乱选项顺序时实现见 loader.py#L226-L337提取出的字母会与打乱后的新答案比对选项映射信息也会随结果落盘方便人工复核。提示词与正则是同一个闭环的两端很多人忽略了答案提取的可靠性一半功劳属于提示词设计。在 _prepare_prompt 中无论是否开启 CoT指令都明确要求模型不 CoT请直接给出答案用答案X的格式X为A、B、C或D开启 CoT请先分析推理过程然后给出答案。最后用答案X的格式给出你的选择也就是说系统先把答案格式约定进提示词正则提取再按约定收口。提示词负责降低提取难度正则负责兜住格式漂移两端配合才构成高鲁棒性的提取闭环。另一套正则用于原始题数据解析值得注意的是项目里还有第二套答案正则 ANSWER_PATTERNS它面向的不是模型回复而是全球算命师大赛的原始题源文本模式覆盖「正确答案X」「A. 选项」等赛事标记习惯且字母范围放宽到 A–H对应 VALID_OPTIONS服务于数据标准化阶段。两套正则一进一出——解析题目、提取答案——共同支撑起原始题源 → 标准数据集 → 模型评测的完整数据链路。快速上手跑通一次评测想亲手验证答案提取效果三步即可需要 Python 3.9git clone https://gitcode.com/gh_mirrors/mi/MingLi-Bench cd MingLi-Bench pip install -r requirements.txt配置好.env中的 API 密钥后先用小样本试跑python -m mingli_bench.cli --model 你的模型名 --year 2025 --cot --sample 5运行结束后默认在logs/下的运行目录中查看results.json含每题predicted_answer与正确性和responses/question_*.txt含完整原始回复与提取结果对照即可逐题检查正则的提取行为。完整参数说明见 README_zh.md 与 mingli_bench/cli.py。总结MingLi-Bench 的答案提取机制看似只是几行正则实则是一套层层设防的工程设计先清洗抹平 Markdown 与括号等格式噪声再分级匹配6 条正则从最严格的答案声明到最宽松的句尾字母依次降级尝试取最后一次匹配专为 CoT 长回复设计锁定模型最终结论合法字母兜底拿不到就返回None绝不猜提示词约定 正则收口两端形成提取闭环。这套多级正则 末次匹配的思路对任何需要让 LLM 做选择题/客观题评分的评测项目不仅是命理基准都是可以直接借鉴的轻量方案。【免费下载链接】MingLi-BenchA benchmark for evaluating LLMs on Chinese traditional fortune telling — Bazi (八字) and Ziwei Doushu (紫微斗数).项目地址: https://gitcode.com/gh_mirrors/mi/MingLi-Bench创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表