Make the scoring implementation auditable by writing the formulas for quality scoring, task scores, pheromones, candidate fusion, consensus, and S07/S09 pass gates. Constraint: The user asked to turn the scoring explanation into a document under the Chinese docs line. Rejected: Leaving formulas only in chat | future reviewers need a repo artifact linked from the docs index. Confidence: high Scope-risk: narrow Directive: Keep future score changes synchronized with SCORING_AND_ACCEPTANCE_FORMULAS.zh-CN.md and the acceptance scripts. Tested: rg formula/index scan; docs secret-pattern scan; git diff --check; .venv/bin/python -B -m unittest tests.test_model_io_report_audit. Not-tested: Did not rerun live S07 because this is a documentation-only formula extraction. Co-authored-by: OmX <omx@oh-my-codex.dev>
8.7 KiB
分数实现与验收判定公式
对象: swarm-minimal 最小蜂群原型
日期: 2026-05-16
范围: 任务分数、输出质量分、信息素分数、候选融合分数、多轮共识分数、S07/S09 验收判定
1. 分数层级
当前项目里的“分数”不是单一模型自评,而是多层规则共同作用:
| 层级 | 分数名 | 用途 |
|---|---|---|
| L1 | 输出质量原始分 Q |
判断单个模型 / Agnet 输出是否满足质量门 |
| L2 | 任务分 task.score |
写入 task pool,作为基础收敛候选分 |
| L3 | 信息素分 P_t |
影响后续任务 claim 顺序,并作为正负反馈记录 |
| L4 | 候选融合分 F |
多个有效候选融合后形成的综合分 |
| L5 | 共识候选分 S_j |
多个审查 Agnet 多轮投票后的候选分 |
| L6 | 验收布尔判定 PASS |
判断整个场景是否满足标准矩阵 |
因此,最终不是“一个高分就通过”,而是“质量门、分数门、状态证据、artifact 证据、共识门同时通过”。
2. 输出质量原始分
每个质量检查项记为:
c_i ∈ {0, 1}
其中:
c_i = 1表示第i个质量检查通过。c_i = 0表示第i个质量检查失败。N表示当前步骤需要检查的质量项总数。
输出质量原始分:
Q = (Σ c_i) / N
质量门通过条件:
quality_pass =
Q >= 0.72
∧ critical_checks_all_passed
S07 外部 GitHub 代码场景中的关键检查项包括:
- 当前 STEP 标记存在。
- 前一步 STEP 标记存在。
- 外部仓库
fastapi/fastapi存在。 - 固定 commit 存在。
- 输出没有漂移到当前仓库。
- 没有拒答、角色拒绝、偏题或质量失败标记。
- 包含 FastAPI 代码语义。
3. 任务分公式
设:
Q为输出质量原始分。i为步骤序号,从 0 开始。R(content)表示输出包含拒答、角色拒绝、偏题或质量失败风险。final_step表示当前步骤是最终 STEP-07。
如果存在质量风险:
task.score = 0.12
如果没有质量风险,但没有通过质量门:
task.score = max(0.05, 0.3 + 0.35Q)
如果通过质量门,且当前是最终 STEP-07:
task.score = 1.0
如果通过质量门,但不是最终步骤:
task.score = min(0.98, 0.62 + 0.28Q + 0.01i)
解释:
0.12是风险输出惩罚分,用于强制拒答、角色拒绝、偏题输出无法进入正常收敛。0.3 + 0.35Q让未通过质量门的输出保留可审计分数,但不会轻易成为最终结果。0.98是中间步骤上限,避免中间步骤压过最终验收步骤。- 最终 STEP-07 通过质量门后给
1.0,表示它满足当前最小验收规则的最终收敛路径。
4. 信息素分数公式
每个 task 有一个信息素分:
P_t
任务创建时:
P_t = 0
任务成功完成时:
P_t ← P_t + task.score
任务失败时:
P_t ← P_t - 1.0
任务 claim 时,在能力匹配且状态为 pending 的任务集合中选择:
claim_task = argmax(P_t)
这表示信息素不是只用来展示分数,它会反过来影响后续 Agnet 领取任务的顺序。
5. 基础收敛公式
基础收敛只在完成任务集合中选择最高任务分:
T_done = {t | status(t) = done}
winner = argmax_{t ∈ T_done}(task.score_t)
最终结果:
accepted_output = winner.output
accepted_score = winner.score
accepted_task_id = winner.id
注意:S07 live 外部代码场景不是只靠这个最高分直接放行。它在基础收敛前后增加了质量门、fallback、多轮质量共识、PostgreSQL/Redis/Blob 证据检查。
6. 候选融合分数公式
候选集合:
C = {c_1, c_2, ..., c_m}
先过滤低分和空文本候选:
U = {c_i | score_i >= min_score ∧ text_i 非空}
按分数降序排列后,对文本逐行去重合并。融合分数采用分数自加权平均:
F = (Σ score_i^2) / (Σ score_i), c_i ∈ U
来源证据:
sources = ordered(candidate.id)
解释:
score_i^2让高分候选权重更大。- 低分噪声会被
min_score过滤。 - 多个高分候选的有效结论会被保留,而不是只选一个最高分文本。
7. 多轮共识分数公式
每个候选 j 有共识分:
S_j
每一轮开始先做分数蒸发:
S_j ← evaporation × S_j
每个审查 Agnet 投票后,候选分累加:
S_candidate ← S_candidate + max(0, confidence_a) × weight_a
其中:
confidence_a是第a个 Agnet 对候选的置信度。weight_a是该 Agnet 的角色权重。
领先候选:
leader = argmax_j(S_j)
领先占比:
leader_share = S_leader / Σ max(0, S_j)
领先差距:
margin = S_leader - S_second
共识收敛条件:
consensus_converged =
leader_share >= threshold
∧ margin >= min_margin
S07 质量共识参数:
threshold = 0.7
min_margin = 0.25
evaporation = 0.82
S09 互相质询共识参数:
threshold = 0.7
min_margin = 0.2
evaporation = 0.85
8. S07 live 外部代码场景通过公式
S07 不是只看 accepted_score。可简化为:
S07_PASS =
three_distinct_models_from_discovery
∧ seven_chain_steps_all_done_in_pg
∧ step_markers_and_previous_links
∧ all_outputs_pass_quality_gate
∧ shared_state_chain_cursor_and_summaries
∧ pheromone_scores_pg_and_redis
∧ shared_state_converged
∧ convergence_pg_and_blob
∧ redis_stream_event_volume
∧ contains_external_fastapi_code_review_material
∧ multi_round_quality_consensus_accepts_chain
∧ final_output_references_external_files
∧ keeps_model_discovery_not_fixed_model
∧ external_github_target_not_local_project
其中分数相关的关键门为:
all_outputs_pass_quality_gate =
∀ step, quality_pass_step = true
pheromone_scores_pg_and_redis =
∀ task, P_task_pg > 0 ∧ P_task_redis > 0
convergence_pg_and_blob =
convergence_exists
∧ completed_tasks = 7
∧ accepted_score >= 0.75
∧ blob_artifact_exists
multi_round_quality_consensus_accepts_chain =
consensus_converged
∧ accepted_candidate = accept_external_chain
∧ round_count >= 2
9. S09 下一阶段边界通过公式
S09 由三项检查组成:
S09_PASS =
scaled_autonomous_claim_pass
∧ candidate_fusion_pass
∧ questioning_consensus_pass
3/5/7 并发 claim 通过条件:
scaled_autonomous_claim_pass =
∀ n ∈ {3, 5, 7},
converged_n
∧ completed_tasks_n = 2n
∧ failed_tasks_n = 0
∧ duplicate_claims_n = ∅
∧ participating_agents_n = n
∧ all_tasks_done_n
候选融合通过条件:
candidate_fusion_pass =
source_candidate_ids = ("quality", "coverage")
∧ expected_terms ⊆ fused.text
∧ low_score_noise ∉ fused.text
互相质询共识通过条件:
questioning_consensus_pass =
converged
∧ accepted_candidate = approve_fused_candidate
∧ round_count >= 2
∧ first_round_converged = false
∧ last_round_converged = true
∧ every_round_has_challenges
∧ every_round_has_revisions
10. 总体验收公式
当前仓库最小闭环验收可以概括为:
MINIMAL_CLOSED_LOOP_PASS =
A01_static_compile
∧ A02_unit_and_deterministic_scenarios
∧ A03_swarm_behavior_acceptance
∧ A04_swarm_vs_traditional_benchmark
∧ A05_consensus_convergence_acceptance
∧ A06_next_boundary_minimal_acceptance
∧ S07_live_external_github_code_reasoning
∧ S08_model_io_report_audit
∧ S09_next_boundary_minimal_acceptance
最终解释:
score 高 ≠ 自动 PASS
真正判定是:
质量门 + 分数门 + 信息素证据 + 状态证据 + artifact 证据 + 多轮共识门 全部通过 = PASS
11. 公式对应实现位置
| 公式 / 机制 | 实现位置 |
|---|---|
输出质量原始分 Q |
examples/run_continuous_reasoning_acceptance.py::assess_output_quality |
任务分 task.score |
examples/run_continuous_reasoning_acceptance.py::score_output |
信息素更新 P_t |
swarm_minimal/core.py::complete_task / fail_task |
| 基础最高分收敛 | swarm_minimal/core.py::converge |
候选融合分 F |
swarm_minimal/core.py::fuse_candidate_outputs |
多轮共识分 S_j |
swarm_minimal/core.py::ConsensusSwarm.run |
| 互相质询共识 | swarm_minimal/core.py::QuestioningConsensusSwarm.run |
| S07 标准矩阵检查 | examples/run_continuous_reasoning_acceptance.py::collect_report |
| S09 下一阶段边界检查 | examples/run_next_boundary_acceptance.py |