MingLi-Bench架构全解:工厂模式+延迟加载如何优雅支持6大LLM服务商
MingLi-Bench架构全解工厂模式延迟加载如何优雅支持6大LLM服务商【免费下载链接】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中国传统命理能力的基准工具题目覆盖八字Bazi与紫微斗数Ziwei Doushu。它通过一套精巧的架构设计——工厂模式统一调度OpenAI、Claude、Gemini、DeepSeek、豆包、OpenRouter六大 LLM 服务商再用延迟加载让每个用户只需安装自己用到的 SDK。本文用通俗的方式带你拆解这套架构新手也能看懂。✨一、MingLi-Bench 是什么30 秒看懂项目MingLi-Bench 的题库来自2022–2025 年全球算命师大赛共160 道选择题横跨事业、健康、婚姻、财运等 12 个人生领域。评测方式简单直接模型作答后按精确匹配判分。核心数据文件文件说明data/data.json160 道标准化选择题data/fortune_api_results.json预计算的八字/紫微命盘评测时注入提示词data/raw/2022–2025 逐年原始考卷项目代码结构一目了然mingli_bench/ ├── cli.py # 命令行入口 ├── benchmark.py # 评测主流程出题 → 调用 → 判分 → 统计 ├── models/ # 模型客户端本文架构重点 │ ├── base.py # 抽象基类 ModelClient │ ├── factory.py # 工厂类 ModelFactory │ └── xxx_client.py # 各服务商客户端实现 ├── data/ # 数据加载与结构定义 └── utils/ # 配置、日志、路径工具二、架构全景一次评测调用的完整链路图MingLi-Bench 项目的架构示意——编排器分发子任务、工具调用与多流派规则汇聚一次评测运行数据按以下链路流动cli.py 解析命令行参数模型名、年份、--cot等ModelFactory.create 根据模型名自动判断服务商并创建对应客户端FortuneTellingBenchmark 用线程池并发出题、收集回答、精确匹配判分结果按模型名归档到logs/目录含逐题明细与汇总报告。整个链路里唯一与具体服务商打交道的位置就是第 2 步的工厂——这正是工厂模式的价值所在。三、工厂模式拆解ModelFactory 如何管理 6 大服务商3.1 一张注册表服务商 → 客户端的映射工厂的核心是一张类级注册表 factory.py#L31-L38_registry { openai: (.openai_client, OpenAIClient), anthropic: (.anthropic_client, AnthropicClient), google: (.google_client, GoogleClient), deepseek: (.deepseek_client, DeepSeekClient), doubao: (.doubao_client, DoubaoClient), openrouter: (.openai_client, OpenAIClient), # 兼容 OpenAI 协议 }注意两点存的是**模块路径 类名字符串**而不是类本身——为延迟加载埋下伏笔openrouter复用OpenAIClient因为 OpenRouter 走的就是 OpenAI 兼容协议一行注册表省掉一整个客户端文件。3.2 模型名自动路由从名字猜出服务商get_provider 用极简规则完成自动识别用户基本不用指定服务商模型名特征路由到含/如openai/gpt-4oOpenRouter特例bytedance/前缀 → 豆包gpt-*、o1-*、o3-*、o4-*OpenAIclaude-*Anthropicgemini-*Googledeepseek-*DeepSeekdoubao-*豆包猜不出来时工厂会明确报错并列出所有支持的命名模式而不是悄悄回退到默认服务商——这在评测场景下非常重要避免分数算错还不知道。3.3 create() 四步走ModelFactory.create 把创建客户端这件事拆成四个清晰步骤加载配置调用 load_config 读取.env中各服务商的 API Key 与默认参数判定服务商优先用用户显式指定的--platform否则按模型名推断延迟解析客户端类通过注册表按需导入下一节细讲合并配置并实例化模型名、API Key、base_url、temperature、max_tokens 按命令行参数 配置文件的优先级合并后传入构造函数。3.4 开闭原则一个方法接入新服务商register_provider 允许外部把新服务商挂进注册表无需改动工厂本身一行代码。想支持新平台只需实现一个继承 ModelClient 的客户端类然后注册即可——典型的对扩展开放、对修改关闭。四、延迟加载为什么按需导入是关键设计4.1 问题六大 SDK 全装很痛苦如果mingli_bench.models在包加载时就 import 全部客户端那么哪怕只跑 OpenRouter也必须先装好anthropic、google-generativeai等一堆用不上的 SDK。4.2 解法只在第一次使用时才 import项目做了两处配合包初始化文件 models/__init__.py只导出抽象基类和工厂不触碰任何具体客户端模块_load_client_class 首次需要某服务商时才用importlib.import_module动态导入对应模块。4.3 附赠体验缺依赖时给出安装处方动态导入失败时工厂不会抛出难以理解的原始报错而是从 _PROVIDER_INSTALL_HINT 中查出对应提示并抛出友好异常例如Provider anthropic requires an extra dependency... Try: pip install anthropic对新手用户来说这个报错即说明书的细节非常加分。五、抽象基类 ModelClient六个客户端的公共骨架base.py 中的 ModelClient 把所有客户端的共性收拢为一处每个具体客户端只需实现一个generate()方法基类统一收拢的能力位置统一系统提示词你是一位精通中国传统命理学的专家…base.py#L18默认参数temperature0.0、max_tokens8192base.py#L21-L22API Key 多环境变量自动探测base.py#L65-L90参数合并工具get_generation_paramsbase.py#L102统一错误日志handle_api_errorbase.py#L92抽象方法generate(prompt)base.py#L119-L131六个客户端的差异被压缩到各家 API 怎么调这一层例如 OpenAIClient.generate 与 AnthropicClient.generate 的对话结构就不同但入参、出参、日志、异常处理完全一致。上游的benchmark.py因此对具体服务商零感知。六、快速上手一条命令切换任意服务商6.1 安装步骤git clone https://gitcode.com/gh_mirrors/mi/MingLi-Bench cd MingLi-Bench pip install -r requirements.txt cp .env.example .env # 只填你要用的服务商的 Key 即可6.2 运行评测# OpenRouter 统一入口模型名带 / 自动识别 python -m mingli_bench.cli --model openai/gpt-4o --year 2025 --cot --astro # 原生服务商按模型名前缀自动路由 python -m mingli_bench.cli --model claude-3-sonnet --cot --astro # 命名无法自动识别时用 --platform 显式指定 python -m mingli_bench.cli --platform doubao --model doubao-seed-2-0-pro --cot --astro跑之前建议先做两个自检python -m mingli_bench.cli --list-models # 查看受支持的模型 python -m mingli_bench.cli --stats # 查看题库统计七、总结这套架构有 3 个点值得借鉴设计点解决的问题源码位置注册表 工厂方法新增服务商只加一行注册不改调用方factory.py延迟导入 SDK用户只装自己用的依赖报错带安装提示factory.py#L56-L71抽象基类收拢共性六个客户端只写差异逻辑评测主流程零感知base.py一句话概括工厂模式管选谁延迟加载管何时装抽象基类管怎么写——三层各司其职让 MingLi-Bench 在保持极简代码量的同时优雅地支撑起了六大 LLM 服务商的评测能力。想深入细节可以直接从 mingli_bench/models/factory.py 和 mingli_bench/benchmark.py 读起。【免费下载链接】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),仅供参考

相关新闻

OpenShell 命令行编排实战:从脚本到自动化流水线

OpenShell 命令行编排实战:从脚本到自动化流水线

1. 从零认识 OpenShell:它到底解决什么问题第一次听到 OpenShell 这个名字,很多人会下意识以为它又是一个"套壳终端"或者"美化版命令行"。我最初也是这么想的,直到真正把它拉下来跑了一遍,才发现方向完全不对…

2026/10/4 6:35:30 阅读更多 →
SharePoint 2019离线安装实战:依赖解耦与合规交付体系

SharePoint 2019离线安装实战:依赖解耦与合规交付体系

/* 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 6:35:30 阅读更多 →
Flutter+OpenHarmony实战:从旋转对称到逆向思维训练App

Flutter+OpenHarmony实战:从旋转对称到逆向思维训练App

我也是被项目逼着才第一次认真把Flutter往OpenHarmony上跑的。原本觉得这套组合只是“能跑就行”,结果做完这款逆向思维训练App之后,反而觉得值得单独写一篇总结——特别是旋转对称这个功能,从数学原理到渲染实现、从手势响应到题目生成&…

2026/10/4 6:35:30 阅读更多 →

最新新闻

JavaWeb小型音乐网站完整案例:从数据库设计到部署排错全解析

JavaWeb小型音乐网站完整案例:从数据库设计到部署排错全解析

/* 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 7:08:47 阅读更多 →
原生Servlet+MySQL财务系统实战:从环境搭建到事务避坑

原生Servlet+MySQL财务系统实战:从环境搭建到事务避坑

简介:这份资源是面向高校计算机相关专业学生与Java Web初学者的一套企业财务管理系统完整实现方案,采用原生Servlet结合MySQL数据库开发,适合用作毕业设计、课程大作业或JavaEE综合实训的参考项目。压缩包整体约117.66MB,内含源码…

2026/10/4 7:08:47 阅读更多 →
ComfyUI云端部署指南:设计师告别本地环境折腾,专注节点工作流创作

ComfyUI云端部署指南:设计师告别本地环境折腾,专注节点工作流创作

1. 先说清楚:设计师到底是被哪一步劝退的我见过太多设计师的桌面是这样的:一本翻开的Stable Diffusion教程折角停在“安装”那一页,旁边是下载到一半的模型文件,屏幕上挂着某个一键整合包的报错弹窗。她们不是不会画图&#xff0c…

2026/10/4 7:08:47 阅读更多 →
UReport2报表设计器集成实践:在线表格与Spring Boot的融合

UReport2报表设计器集成实践:在线表格与Spring Boot的融合

我需要先说明一点:这篇内容来自我实际做过的一个内部运营数据平台项目,不是纯理论整理。当时我们团队规模不大,要在不到一个月的时间里交付几十张报表,还要满足业务侧“表格样式能自己调”的诉求。调研了一圈之后,我们…

2026/10/4 7:08:47 阅读更多 →
125B MoE 如何装进 128GB?MTPLX 内存规划与 n-gram 表 SSD 流式读取实战

125B MoE 如何装进 128GB?MTPLX 内存规划与 n-gram 表 SSD 流式读取实战

125B MoE 如何装进 128GB?MTPLX 内存规划与 n-gram 表 SSD 流式读取实战 【免费下载链接】MTPLX The fastest way to run Qwen 3.8 Flash Next, Qwen 3.8 27B and Ternary Bonsai 2 27B on a Mac: 125 tok/s in OpenCode on an M5 Max, and a 27B model on 16 GB Macs. Native…

2026/10/4 7:08:47 阅读更多 →
Claude Code插件市场配置全攻略:Skills、MCP与第三方模型接入

Claude Code插件市场配置全攻略:Skills、MCP与第三方模型接入

先说个真实经历。上个月我想给本地的Claude Code加一个批量文件处理的技能,去网上逛了一圈,资料要么是课程广告,要么是论坛里一句“我装好了,你试试”,没找到一篇能把安装、配置、排错串起来的完整流程。后来我自己把C…

2026/10/4 7:07:47 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* 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:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* 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:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* 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:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* 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:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* 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:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* 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:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/3 9:42:36 阅读更多 →