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),仅供参考