news 2026/10/4 1:51:51

告别位置偏差:MingLi-Bench 无固定点选项打乱算法原理深析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别位置偏差: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-Bench

MingLi-Bench是用于评测大语言模型(LLM)中国传统命理推理能力的基准测试项目,覆盖八字(Bazi)与紫微斗数(Ziwei Doushu)两大类命盘,以 160 道来自全球算命师大赛(2022–2025)的选择题按精确匹配计分。本文带你深入它的选项打乱(shuffle options)算法,解析其"无固定点"(derangement)打乱机制,彻底告别选择题评测中的位置偏差。

什么是位置偏差(Position Bias)?

很多模型在做选择题时,存在对某个选项位置的"先天偏好"——比如更倾向于选A,或者喜欢第一个、最后一个选项。如果题库中正确答案长期固定在某个字母上,模型"蒙"对的概率会远高于 25%,评测分数就会虚高,失去参考价值。

MingLi-Bench 的解决方案很直接:在出题给模型之前,随机打乱每道题的选项顺序,并同步更新正确答案。对应 CLI 参数在 cli.py 中定义:

python -m mingli_bench.cli --model openai/gpt-4o --year 2025 --cot --astro --shuffle-options

加一个--shuffle-options即可开启,参数透传链路见 benchmark.py。

算法核心:三步走实现"无固定点"打乱

整个打乱逻辑集中在 loader.py 的shuffle_question_options方法中,核心流程分三步。

第一步:选项归一化,定位正确答案

不同题目数据格式可能不一致(选项带字母、或纯文本),算法先把每个选项统一成{letter, text}结构(最多支持 A–H 八个选项),再按字母定位出正确答案的下标。若题目缺少选项或答案、或答案在选项中找不到,会记录警告并跳过打乱,保证评测不中断(见 loader.py)。

第二步:以题目 ID 哈希为种子的确定性随机

这是设计上最关键的一手。算法没有使用全局随机源,而是取题目 ID 的哈希值作为随机种子(取模 2³² 防止溢出,见 loader.py):

base_seed = hash(question_id) % (2**32) local_random = random.Random(current_seed)

这样带来两个好处:

  • ✅可复现:同一道题在任何一次运行、任何一台机器上,打乱结果都完全一致;
  • ✅题间独立:每道题使用独立种子,互不影响。

这对基准测试至关重要——跑两轮实验,选项顺序不变,分数差异才可信。

第三步:无固定点校验,打乱直到"每个选项都搬家"

普通随机打乱有个隐患:打乱后某个选项可能还在原位(比如 A 还是 A)。只要有一个选项没动,模型仍有"位置作弊"的空间。

因此算法引入错排(derangement)校验:逐位检查打乱后是否有任何选项留在原位置(loader.py)。一旦发现"固定点",就把种子加 1 重新打乱,最多尝试 100 次:

for attempt in 0..99: seed = base_seed + attempt shuffled = shuffle(range(n), seed) if no option stayed in place: break

4 个选项下,错排概率约为 44%,平均 2–3 次就能命中,100 次上限是纯粹的安全网;万一耗尽,会记录警告并采用最后一次结果,绝不卡死流程。

打乱之后:答案与映射关系全程留痕

打乱不是"藏起答案",而是同步重建题目:

  1. 重排选项并重新编号:按新顺序给选项依次贴上 A、B、C… 的新字母;
  2. 迁移正确答案:原正确答案跟着它的文本一起搬到新位置(如C → B);
  3. 记录映射元数据:把原始答案、新答案和逐字母映射表写入_option_shuffle_info字段(loader.py)。

运行结束后,这份映射会随逐题结果一起落盘到<model>_results.json(见 benchmark.py),你可以逐题核对"模型答的 B 对应原题的哪个选项",评测完全可审计。

为什么这个设计值得借鉴?

  • 🎯消灭位置偏差:错排保证"零选项留在原位",比单纯随机打乱更彻底;
  • 🔁确定性可复现:ID 哈希种子让打乱结果跨运行稳定,实验结果可对比、可复现;
  • 🛡️防御式编程:缺答案跳过、100 次上限兜底、全程日志留痕,160 题全量跑批不翻车。

这套思路同样适用于任何选择题型 LLM 评测:打乱顺序 + 同步答案 + 映射留痕 + 确定性种子,四要素缺一不可。

快速上手

如果你想在自己的评测中加入同样的防偏差机制:

git clone https://gitcode.com/gh_mirrors/mi/MingLi-Bench cd MingLi-Bench pip install -r requirements.txt # 开启选项打乱,只跑 2025 年 40 题 python -m mingli_bench.cli --model gpt-4o --year 2025 --cot --astro --shuffle-options

题库结构可以在 data/data.json 中查看,12 个类别(事业、健康、婚姻、财运等)均可用--categories过滤。评测时建议始终搭配--cot与--astro(预计算命盘),让分数反映模型的真实推理能力,而非排盘计算能力。

小结

MingLi-Bench 用一个不到百行的小函数,优雅地解决了选择题评测中最隐蔽的偏差来源:选项位置。无固定点错排 + 题目级哈希种子 + 完整映射留痕,既保证了公平,又保证了可复现性——这正是"基准测试"四个字的分量所在。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 1:50:07

SVPWM工程实践:PI双闭环解耦下的调制链路优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 1:49:41

Linux内核reset通用框架:功耗子系统中的确定性复位保障

1. 项目概述&#xff1a;为什么“reset通用框架”是功耗子系统里最常被忽略的硬骨头在Linux内核开发圈里&#xff0c;一提到功耗子系统&#xff08;PM subsystem&#xff09;&#xff0c;大家本能想到的是cpuidle、cpufreq、runtime PM这些高频词——它们出现在面试题里、写在驱…

作者头像 李华
网站建设 2026/10/4 1:48:23

AI-Native IP研发流程:从Spec到RTL的自动化实践与避坑指南

1. 从一份规格书到能跑通的电路&#xff0c;中间到底隔着什么做数字芯片这行的朋友大概都有体会&#xff1a;拿到一份 IP 规格书&#xff08;Spec&#xff09;的那一刻&#xff0c;心里是清楚的——功能、接口、时序、寄存器映射&#xff0c;白纸黑字写得明明白白。但从这份 Sp…

作者头像 李华
网站建设 2026/10/4 1:48:16

【电机驱动】使用Jetson Orin NX实现与电机的通信

一开始计划打算直接使用Jetson ORIN NX上的CAN实现与电机的通信&#xff0c;但是在调试的过程中发现ORIN上的CAN使用会存在问题。为了加速开发&#xff0c;后面使用了一块STM32H7的板子实现电机数据的收发&#xff0c;再通过串口与ORIN实现通信。CAN通讯实现&#xff08;失败&a…

作者头像 李华