feat(eval): internal-eval stack, judge fixes, and eval web overhaul

- Merge internal-eval into development.sh (single Celery/infra); internal-eval.sh
  wraps with LIFE_ECHO_WITH_INTERNAL_EVAL; EVAL_ATTACH_ONLY for attaching 8001
  when :8000 is already up; document in api/docs/internal-eval.md.
- Evaluation: transcript_for_judge, judge error surfacing, rubric/schema tweaks,
  execution_service and router updates; tests for judge and composite eval.
- Memory: ingest nested transaction for embedding/enrichment rollback safety.
- Conversation WS: logger.exception for pipeline errors (avoid loguru KeyError).
- app-eval-web: Playground saved replays, dialogue turns helper, hash user_id
  for Memoir; Memoir chapter baseline↔DB row compare with title heuristics;
  Stories page (#memoir-stories); Markdown + copy buttons; toolbar/panel UI;
  react-markdown; development proxy and fixture updates.
This commit is contained in:
Kevin
2026-04-07 17:15:01 +08:00
parent a50b72e7b5
commit 99543d04c6
47 changed files with 4968 additions and 1279 deletions

View File

@@ -4,30 +4,40 @@
便于与 `total_score` 直接一致,无需再折算。
"""
_MEMOIR_CHARTER = """
## 评审总原则(必须遵守)
- **证据层级**:以【原始访谈/证据】为最高优先级判定真实性与覆盖;【参考基线/导出成稿】仅辅助对照,不得以基线对错代替证据对错。
- 只依据输入中可核对的文字评分;不得臆测用户人生经历。
- **缺少原文证据不等于「写得好」**:无证据或证据极短时,`mem_fidelity`、`mem_factual_coverage`、`mem_traceability` 等须保守,并在 `insufficient_evidence` 说明。
- **文笔与结构不得抵消事实问题**`lang_*`、`narr_*` 高分不得与明显编造、张冠李戴并存。
- 若输入仅为**单章节/单故事节选**`coh_cross_chapter`:只评估**本节选内部**是否与证据中的其它人生阶段描述明显冲突;若上下文不足,给保守分并记入 `insufficient_evidence`**不得假设**全书结构。
"""
_MEMOIR_RUBRIC_BODY = """
你必须按下列一级维度与子项及其**满分上限**打分;**全部细项得分之和须等于 `total_score`,且满分合计为 100**。
## 一、真实性与覆盖(小计最高 23
1. mem_fidelity记忆忠实度最高 9hallucination、夸大/弱化/改写因果关系、未证实推测、AI 补全编造
2. mem_factual_accuracy事实准确性最高 5时间、人物关系、顺序、内部矛盾、数细节。
3. mem_factual_coverage事实覆盖率最高 5关键/高情感事件、关键人物与细节是否遗漏。
4. mem_traceability记忆可追溯性最高 4与原始对话映射、来源模糊、证据与语义保持
1. mem_fidelity记忆忠实度最高 9**编造、夸大/弱化事实、改写因果、无证据推测、AI 补全人生」**。锚点:出现两处以上未支撑的关键断言应显著拉低
2. mem_factual_accuracy事实准确性最高 5时间线、人物关系、顺序、**成稿内部**矛盾、数细节;侧重「是否说错」
3. mem_factual_coverage事实覆盖率最高 5证据中的关键/高情感事件与人物是否遗漏;侧重「是否漏掉」
4. mem_traceability记忆可追溯性最高 4成稿段落能否对应证据中的来源模糊混写、无法判断出处在此项扣分。**与 mem_fidelity 区分**此项侧重「能否指回证据」fidelity 侧重「是否胡编内容」
## 二、信息质量(小计最高 14
5. info_slot_coverage槽位覆盖度最高 6
6. info_sufficiency信息充分性最高 4
7. info_density信息密度最高 4
5. info_slot_coverage槽位覆盖度最高 6:人物/事件/情绪/背景/转折等叙事要素在成稿中是否齐备(相对证据与章节主题)。
6. info_sufficiency信息充分性最高 4:关键事件是否有展开与因果,非一句话带过。
7. info_density信息密度最高 4:是否少水分、少重复套话;此项与 `lang_conciseness` 相关但不重复:此处看**信息价值**,彼处看**措辞精炼**。
## 三、叙事结构(小计最高 14
8. narr_structure故事结构最高 6
9. narr_paragraphs段落组织最高 5
10. narr_pacing节奏控制最高 3
8. narr_structure故事结构最高 6:起承转合与主题单元是否清楚。
9. narr_paragraphs段落组织最高 5:段内主题单一、段间衔接。
10. narr_pacing节奏控制最高 3:详略与重点。
## 四、语言与文笔(小计最高 18
11. lang_fluency语言流畅度最高 3
12. lang_conciseness表达精炼度最高 3
13. lang_literary文笔质量最高 4
14. lang_controlled_expansion控制性扩写最高 4
14. lang_controlled_expansion控制性扩写能力,最高 4:仅在证据边界内增强表达;新增未证实情节在此项与 `mem_fidelity` **同时**体现问题。
15. lang_detail细节还原与强化最高 2
16. lang_style风格一致性最高 2
@@ -42,7 +52,7 @@ _MEMOIR_RUBRIC_BODY = """
## 七、连贯性(小计最高 4
22. coh_timeline时间线一致性最高 2
23. coh_cross_chapter跨章节关联最高 2
23. coh_cross_chapter跨章节/跨片段关联,最高 2:单节选评审时按上文「总原则」处理。
## 八、表达丰富度(小计最高 5
24. rich_analogy类比与引用最高 3
@@ -52,7 +62,7 @@ _MEMOIR_RUBRIC_BODY = """
26. pub_editorial_cost编辑成本最高 2
27. pub_completeness完整度最高 2
输出 JSON 字段(仅这些键;分值浮点;务必含 rationale 中文简述
输出 JSON 字段(仅这些键;分值浮点;列表每项尽量 ≤120 字
mem_fidelity, mem_factual_accuracy, mem_factual_coverage, mem_traceability,
info_slot_coverage, info_sufficiency, info_density,
narr_structure, narr_paragraphs, narr_pacing,
@@ -62,12 +72,18 @@ char_understanding, char_consistency, char_integration,
coh_timeline, coh_cross_chapter,
rich_analogy, rich_diversity,
pub_editorial_cost, pub_completeness,
total_score, rationale
total_score,
major_strengths, major_issues, insufficient_evidence, evidence_refs, confidence, rationale
`evidence_refs`:数组,每项为对象,字段 `dimension`(上列 mem_* / info_* 等英文名之一)、`turn_index`(无对话轮次用 -1、`snippet`≤120 字引文或定位)。
`confidence`0 到 1 之间小数。
一级聚合分 authenticity_score、information_score、narrative_score、language_score、emotion_score、character_score、coherence_score、richness_score、publish_ready_score 可不填(服务端会按细项重算)。
只输出 JSON。"""
MEMOIR_JUDGE_INSTRUCTIONS = (
"你是「岁月留书」回忆录成稿评审必须严格按照下列 rubric 打分。\n"
"你是「岁月留书」回忆录成稿评审员:保守、证据优先、可复核。必须严格按照下列 rubric 打分。\n"
+ _MEMOIR_CHARTER
+ _MEMOIR_RUBRIC_BODY
)