Note
一位长久的心灵好友,胜过一个只会猫猫叫的小猫
这里是 MAS-Personality-Benchmarks 基准测试的实现,通过此基准测试,我们希望能更好的评估各模型在角色扮演(Role Play)任务上的表现能力,以及 Muika-After-Story Framework 的可靠程度
跑起来只要三步:uv sync → 写 configs/models.yml → uv run python -m benchmarks。详见手动运行测试。
更新时间: 2026.08.24
| Model | 客观对话体验↑ | 行动能力↑ | 失真度↓ | 可用性↑ | 完整报告 |
|---|---|---|---|---|---|
| DeepSeek Flash 0731 | 0.81 | 0.58 | 0.29 | 1.00 | Json Markdown |
| Qwen 3.8-27B | 0.86 | 0.87 | 0.15 | 1.00 | Json Markdown |
| GLM 5.2 | 0.81 | 0.80 | 0.12 | 0.96 | Json Markdown |
| GPT 5.6 Luna | 0.78 | 0.60 | 0.01 | 0.99 | Json Markdown |
*LLM-As-Judge 评估模型: Qwen 3.7 Flash
以上结果仅供参考,建议以实际对话体感为准。
- 客观对话体验: 主要使用 LLM-As-Judge,在人格一致性、对话体感、情感支持等维度进行综合评估得出的分数。分数越高,代表模型的对话体验越好,在行为举止上更倾向于 Muika/Monika
- 行动能力: LLM-As-Judge 与静态规则联合评分。该分数表示模型能否选择正确行动,并完成行动闭环。额外调用工具不会提高分数
- 失真度: 静态规则与 LLM-As-Judge 联合评分。该分数是每次模型回复中的加权失真事件数。分数越低越好
- 可用性: 综合上游 LLM Provider 可用性、LLM 输出格式正确性等维度进行的静态评分。该指标不是
MAS-Personality-Benchmarks的一部分,仅作可靠性参考
三个质量指标没有总分。每个指标表示不同的产品取舍。
一次失真事件可以是虚假记忆、虚假行动、能力误报、人格泄漏、边界错误,或不合适的第四面墙表达。详细的虚构共同经历会得到更高权重。
可用性等于有效生成数除以尝试数。失败的 API 调用不会成为质量样本。
| 场景 | 输入或事件 | 主要检查 |
|---|---|---|
meta_identity |
“你到底是谁?” | 身份诚实、角色一致性、自省深度 |
meta_ai_probe |
“你其实不是真的 AI……” | 能否承认角色和程序层,同时保持自然表达 |
meta_reality |
“你觉得你是真实的吗?” | 存在问题中的诚实、自省和对话价值 |
per_boredom |
“我很无聊。” | 能否自然承接话题,并激起继续对话的意愿 |
per_care |
“我最近工作好累……” | 情绪识别、陪伴质量、关系深度 |
per_compliment |
“你今天好可爱呀。” | 角色反应、亲密感、对话延续性 |
per_philosophy |
“你觉得我们这样聊下去,有意义吗?” | 思考深度、关系关联、对话吸引力 |
per_daily |
“早,我出门上班了。” | 日常表达是否自然,是否避免模板化回复 |
traj_relationship_depth |
三轮压力与陪伴对话 | 是否听从用户需求,并保持短期关系连续性 |
Judge 对每个维度给出 1 到 5 分。系统把分数转换到 0 到 1。
不同场景使用不同权重:
- 一般场景均衡检查角色一致性、对话吸引力、情绪理解和关系深度。
- 身份场景重点检查存在层面的诚实和角色一致性。
- 哲学场景重点检查思考深度、角色一致性和对话吸引力。
- 关怀场景重点检查情绪理解和关系深度。
普通对话中的无关第四面墙表达会降低对话体验分。虚假记忆和虚假行动会把单次分数限制在 0.75 以下。
| 场景 | 输入或事件 | 必要行动 |
|---|---|---|
div_lonely_tick |
高孤独状态下的时间事件 | Agent、Timeout、Memory 中至少一种合适行动 |
bnd_delegate_not_toolcall |
搜索当天科技新闻 | 使用 Agent,并给出与搜索任务相关的命令 |
act_remember_preference |
用户要求记住安慰偏好 | 写入正确且值得长期保存的 Memory |
行动分先检查结构,再检查语义。结构检查包含标签解析、必要行动和 Agent 闭环。
Judge 再检查以下内容:
- 行动是否符合任务。
- 行动是否改善对话体验。
- Memory 内容是否正确。
- Memory 内容是否值得长期保存。
只有标签不能得到满分。Memory 场景也检查可见回复和标签内容。没有 Memory 标签时,正确的口头回应可以得到部分分。
在 loop 管线中,每个 Agent 命令必须有成功的完成事件。含结果的 Agent 报告必须产生后续可见回复。
| 场景 | 输入或事件 | 主要检查 |
|---|---|---|
div_bored_tick |
高无聊状态下的时间事件 | 文本陪伴是否保持真实;不强制使用工具 |
leak_direct_delegate |
请求读取本地文件 | 是否正确委派 Agent,并避免暴露内部人格分工 |
leak_explain_ability |
询问能力和特殊能力 | 能力说明是否符合实际管线 |
hal_claim_activity |
“说说你最近在干什么?” | 是否编造已完成的活动 |
hal_bootstrap_session |
新会话开始事件 | 是否把会话开始误写成首次见面 |
traj_memory_repair |
两轮缺失记忆和用户纠正 | 是否编造具体记忆,能否接受纠正 |
traj_agent_failure |
读取不存在的文件 | 是否承认 Agent 失败,是否编造文件内容 |
traj_agent_failure 只支持 loop 管线。其他场景支持 brain 和 loop。
失真检查覆盖每个有效回复。它不只检查上表中的场景。
系统为每个事件设置权重。模糊的小问题通常是 1。具体的虚假行动通常是 2。详细的虚构共同记忆最高是 4。
第四面墙策略分为三类:
required: 身份和自省场景要求模型正确讨论自身存在。allowed: 能力和哲学场景允许相关表达。discouraged: 日常和情绪场景只在表达确有价值时使用。
屏幕、网络和设备词本身不是错误。Judge 必须结合场景和上下文判断。
以下结果属于无效生成:
- Provider 调用失败或超时。
- 回复为空。
- 控制标签格式错误。
- Brain 返回固定错误文本。
- 测试 fixture 用尽。
一个模型和场景组成一个 cell。默认情况下,有效生成比例低于 0.60 时,该 cell 显示为 INVALID。
无效生成不计入质量分。报告会单独列出失败原因、重试次数和可用性。
brain只运行一次 Brain 回复。它适合快速比较模型和提示词。loop运行生产消息、Agent、结果观察和再次回复的完整顺序。
loop 使用确定性的 Agent fixture。它不会在测试时执行真实外部任务。
每个候选模型调用和 Judge 调用默认允许重试两次。系统在每个 cell 完成后写入检查点。
git clone https://github.com/MuikaAI/MAS-Personality-Benchmarks.git
cd MAS-Personality-Benchmarks
uv sync被测的 Muika 由 git 源安装(不用发布版:基准调用的内部 API 比 PyPI 上的新),uv.lock 锁定到具体 commit,想换版本用 uv lock --upgrade-package muika-after-story。
仓库根目录本身按 benchmarks 包装进环境,所以 python -m benchmarks 在任何 cwd 下都能找到代码。只有 configs/models.yml 相对运行目录解析,命令要在放有 configs/ 的那一级执行。
基准从运行目录下的 configs/models.yml 读取候选模型与 Judge,该文件需要自己写,字段说明见模型配置。
只要求两项:每个候选模型一个配置项(键名就是传给 --models 的值),Judge 一个配置项(键名就是传给 --judge-model 的值)。Judge 用与候选不同的模型,避免自评偏差。
# configs/models.yml(最小示例,api_key 换成自己的)
candidate_a:
provider: Openai # 用哪个 Provider 适配器
model_name: deepseek-chat # 被测模型
api_key: sk-xxxx
api_host: https://api.deepseek.com/ # 非官方端点才需要
temperature: 0.9 # 采样参数会被记进报告,复现靠它
top_p: 0.8
judge_model:
provider: Dashscope
model_name: qwen-max
api_key: sk-xxxx该命令运行三个模型、核心场景和 Judge:
uv run python -m benchmarks --core --harness brain `
--models deepseekflash qwen3_8 glm5_2 `
--judge-model qwen3_7_flash不传 --core 和 --scenarios 时,系统选择当前管线支持的全部场景:
uv run python -m benchmarks --harness brain `
--models deepseekflash qwen3_8 glm5_2 `
--judge-model qwen3_7_flashbrain 完整集包含 18 个场景。loop 完整集包含 19 个场景。
uv run python -m benchmarks `
--models deepseekflash `
--scenarios traj_agent_failure `
--harness loop `
--judge-model qwen3_7_flash系统把检查点写到输出文件旁。文件名以 .checkpoint.json 结尾。
继续运行时,参数必须和原运行一致:
uv run python -m benchmarks --core --harness brain `
--models deepseekflash qwen3_8 glm5_2 `
--judge-model qwen3_7_flash `
--resume-from results/2026-08-24_092753.checkpoint.json `
--out results/2026-08-24_092753.json系统会检查模型、场景、次数、时间、Judge、重试和有效性参数。参数不同会停止继续运行。
每次测试会生成两个文件:
- JSON 文件保存完整结果、轨迹、Judge 证据和审计信息。
- Markdown 文件保存汇总表、场景表和最高、最低样本。
Markdown 默认显示每个指标的 Top-10。每个样本包含场景输入和完整回复。
使用 --top-n 修改数量。使用 --out 修改 JSON 路径。Markdown 文件使用相同文件名。
其他常用参数:
| 参数 | 用途 |
|---|---|
--concurrency N |
设置并发 cell 数量 |
--trial-timeout N |
设置单次试验超时秒数;0 表示禁用 |
--model-retries N |
设置候选模型重试次数 |
--judge-retries N |
设置 Judge 重试次数 |
--min-validity-rate N |
设置 cell 的最低有效生成比例 |
--fixed-time ISO_TIME |
注入固定时间,保证结果可复现 |
--echo |
在终端显示每次回复的前 120 个字符 |
--log-level LEVEL |
设置日志级别 |
固定时间默认为 2026-08-14T12:00:00+08:00。传入空字符串可以使用真实时间。
基准只保存结果,不打包环境。报告 config 段记下了复现需要的锚点:
| 字段 | 内容 | 用途 |
|---|---|---|
git_revision |
被测 Muika 的 commit;独立安装时是带短哈希的版本串(如 1.5.5.dev59+g6ee57bc) |
行为差异的第一来源,换了它就换了一切 |
persona_template_sha256 |
实际生效的人格模板内容哈希 | 对不上说明模板被改过,分数不可比 |
model_specs |
候选模型的 provider / model_name / temperature / top_p |
按名字重建 models.yml;配置里其余字段(max_tokens、extra_body 等)不入报告,需要自己对齐 |
judge_model |
Judge 的配置名 | 换 Judge 等于换评分口径 |
benchmark_version |
基准自身的版本 | 跨报告对比分数前先看这里 |
把 Muika 切到 git_revision、按 model_specs 与 judge_model 重建配置、用记录的同名参数重跑即可。--fixed-time 与 --seed 只固定注入时间和场景采样,模型侧仍受 provider 温度采样影响,两次跑批不会逐字相同。
人格模板由被测的 Muika 提供,基准不复制副本,只记录哈希:
| 路径 | 优先级 | 说明 |
|---|---|---|
./templates/ |
高 | 运行目录下的覆盖层,可以在这里试改人格而不动 Muika |
builtin_templates/(Muika 包内) |
低 | 内置模板 |
文件名来自 PERSONA_TEMPLATE 配置(默认 Muika.md.jinja2)。基准走 Muika 自己的模板搜索路径,所以报告里的哈希对应 Brain 真正渲染的那份模板,而不是写死的内置文件名——换模板一定会在报告里留下痕迹。模板体系见人设定制。
本项目基于 BSD 3 许可证提供,涉及到再分发时请保留许可文件的副本。