告别位置偏差: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: break4 个选项下,错排概率约为 44%,平均 2–3 次就能命中,100 次上限是纯粹的安全网;万一耗尽,会记录警告并采用最后一次结果,绝不卡死流程。
打乱之后:答案与映射关系全程留痕
打乱不是"藏起答案",而是同步重建题目:
- 重排选项并重新编号:按新顺序给选项依次贴上 A、B、C… 的新字母;
- 迁移正确答案:原正确答案跟着它的文本一起搬到新位置(如
C → B); - 记录映射元数据:把原始答案、新答案和逐字母映射表写入
_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),仅供参考