| 属性 | 值 |
|---|---|
| 评测脚本 | scripts/eval-32-metrics.ts |
| 版本 | V96 (A1-A12 + B1-B9 + C1-C3 + D1-D7) |
| 指标数 | 31 评分项 (A=12, B=9, C=3, D=7) + overall 综合分 |
| 维度权重 | A:0.40 B:0.35 C:0.25 D:0.00(纯观测) |
| LLM Judge | DeepSeek v4-flash + DashScope qwen-plus fallback |
| 并发控制 | 3并发 + semaphore + 指数退避 |
| 融合策略 | 5种可切换: rule_only, llm_only, max(默认), min, avg |
| 指标 | 编号 | 评测方式 | 得分范围 | 双轨 |
|---|---|---|---|---|
| context_recall | A1 | gold_entities 7级模糊匹配 + embedding余弦兜底 (>=0.85) | 0-1 | rule+llm |
| context_precision | A2 | chunk与query相关度 (LLM逐条评分) | 0-1 | rule+llm |
| context_relevancy | A3 | 有效信息占比 (LLM section评分) | 0-1 | rule+llm |
| entity_utilization | A4 | uniqueEntities在fusedContext中出现比例 | 0-1 | rule+llm |
| mrr | A5 | 首个相关chunk排名倒数 | 0-1 | rule+llm |
| ndcg | A6 | 排序质量归一化折损累积增益 | 0-1 | rule+llm |
| context_diversity | A7 | 去YAML+取中部200字去重比例 | 0-1 | rule+llm |
| cross_doc_coverage | A8 | 检索覆盖的论文来源数 (min(1, count/5)) | 0-1 | rule+llm |
| context_json_contamination | A9 [V41新增] | fusedContext中JSON/YAML/元数据噪音行占比 | 0-1 | rule+llm |
| paper_hit | A10 [V96新增] | 论文命中 — fusedContext是否含目标论文标题片段 | 0-1 | rule |
| paper_recall_at_k | A11 [V96新增] | 论文召回率 — 检索原始chunk中目标论文占比 | 0-1 | rule |
| source_grounded | A12 [V96新增] | 溯源达标 — 答案引用目标论文(0否认/0.5未提/1引用) | 0-1 | rule |
| 指标 | 编号 | 评测方式 | 得分范围 |
|---|---|---|---|
| answer_correctness | B1 | 答案与金标语义一致性 | 0-1 |
| answer_completeness | B2 | 覆盖金标核心要点 (拓展不扣分) | 0-1 |
| answer_relevancy | B3 | 直接针对提问,无无关发散 | 0-1 |
| faithfulness | B4 | 事实陈述在检索上下文中有依据 | 0-1 |
| hallucination_rate | B5 | 反幻觉 (1=无编造, 0=大量虚假) | 0-1 |
| factual_consistency | B6 | 回答内部事实逻辑不自相矛盾 | 0-1 |
| citation_f1 | B7 | 引用精确度与来源可验证 | 0-1 |
| conciseness | B8 | 文本简洁 (只扣重复/冗余/无信息填充) | 0-1 |
| answer_readability | B9 | 文本结构分层、表达清晰 | 0-1 |
| 指标 | 编号 | 题型 | 评测方式 |
|---|---|---|---|
| cot_quality | C1 | 所有类型 | 五级刻度 (0/0.3/0.5/0.7/1.0) |
| reasoning_depth | C2 | 所有类型 | 五级刻度 + [StepN]实际跳数计数 |
| multi_hop_accuracy | C3 | 仅多跳推理 | 多跳推理准确性 |
| 指标 | 归一化方式 |
|---|---|
| stage2_latency_norm | 1 - min(1, latency/MAX_LATENCY_S2) |
| stage3_latency_norm | 1 - min(1, latency/MAX_LATENCY_S3) |
| stage4_latency_norm | 1 - min(1, latency/MAX_LATENCY_S4) |
| end_to_end_norm | 1 - min(1, e2e/MAX_E2E) |
| token_efficiency | min(1, max(0.1, gold_token_count/pred_token_count)) |
| neo4j_query_norm | 1 - min(1, neo4j_queries/MAX_NEO4J_QUERY) |
| pg_query_norm | 1 - min(1, pg_queries/MAX_PG_QUERY) |
_llmJudgeOnce(prompt):
DeepSeek v4-flash (DashScope qwen-plus fallback)
→ JSON { score: 0~1浮点数, reason: "一句话说明依据" }
2次重试 (指数退避: 2s + 随机0-3s)
自动检测分类错误: RateLimit→退避, Arrearage→fallback
runThreeRoundMedian(judgeFn):
3轮独立调用 → 取中位数
IQR过滤 (THRESHOLD=0.3, 可变)
→ { median, warning(variance大), sample_count }
mergeScore(rule_score, llm_score):
5种策略: rule_only | llm_only | max(默认) | min | avg
# 全量 53 题
npx tsx scripts/eval-32-metrics.ts
# 指定题目
EVAL_QUESTIONS=Q01,Q05,Q09 npx tsx scripts/eval-32-metrics.ts
# 指定维度
EVAL_DIMS=A npx tsx scripts/eval-32-metrics.ts
# 切换融合策略
EVAL_MERGE_POLICY=llm_only npx tsx scripts/eval-32-metrics.ts
| 常量 | 值 | 说明 |
|---|---|---|
| MAX_CONTEXT_LEN | 6000 | fusedContext 截断长度 |
| FETCH_TIMEOUT_MS | 300000 | SAG HTTP 超时 |
| JUDGE_TIMEOUT_MS | 60000 | LLM Judge 超时 |
| CONCURRENCY_LIMIT | 3 | 并发限制 |
| SEMAPHORE_TIMEOUT_MS | 180000 | 信号量排队超时 |
| IQR_THRESHOLD | 0.3 | IQR 过滤阈值 |
| TOP_K | 15 | chunk 检索数量 |
| DIM_WEIGHTS | A:0.40 B:0.35 C:0.25 D:0.00 | 维度权重 |
| MERGE_POLICY | max | 双轨融合策略 |
Judge prompt 或 Rubric 任何更新 → 重跑 judge-calibration → kappa ≥ 0.7 才放量。
data/judge_gold.json(20 条起步, 每周 +10 条人工标注, 优先覆盖低分题和分歧题)npx tsx scripts/judge-calibration.ts → 输出 kappa_report.mdMODEL_SWAP_ROLE=reason:qwen3.7-max 环境变量覆盖 reason 角色模型(llm-model-registry.getRoleModel 支持)MODEL_SWAP_ROLE=reason:deepseek-v4-pro bash scripts/model-swap-eval.sh proeval-archive/model-swap-20260807.md