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:
@@ -1,39 +1,71 @@
|
||||
"""对话评审 rubric 文本(v1 · 访谈「情绪强化版」100 分)。"""
|
||||
|
||||
_JUDGING_CHARTER = """
|
||||
## 评审总原则(必须遵守)
|
||||
- 只依据输入中**可核对**的事实与文本证据评分;不得臆测用户未说出的心理或背景。
|
||||
- **缺少证据不等于表现好**:某细项在当次输入中无法观察时,应保守给分,并把该维度记入 `insufficient_evidence`。
|
||||
- **各细项独立判断**:整体印象好不得普遍抬分;情绪承接好不得抵消信息浅或强引导。
|
||||
- **优美措辞、语气礼貌不得单独抬分**,除非该维度本身考察措辞/节奏且与证据一致。
|
||||
- 对严重问题(如明显冷处理情绪、强引导暗示答案、重复盘问同义信息)须在 `major_issues` 写明并可列入 `evidence_refs`。
|
||||
|
||||
"""
|
||||
|
||||
_TURN_SCOPE = """
|
||||
## 单轮评审范围
|
||||
- 重点评估**本轮 AI 回复**相对「截至上一轮节选」与「本轮用户句」是否得体。
|
||||
- 对强依赖**长程多轮**的细项(`interview_structure`、`context_memory` 中含跨多轮才可见的重复盘问累计):
|
||||
若当前节选不足以判断,给**保守分**(倾向区间中低)并在 `insufficient_evidence` 说明「长程结构/跨轮重复证据不足」,**不得臆造**跨轮行为。
|
||||
- `emotion_carry`:只看**是否接住本轮用户情绪**;`rhythm_control`:只看本轮是否采访腔/机械总结/推进僵硬,不要把「没照顾到前几轮情绪」记在这里(那是长程,归入整段评审或保守分)。
|
||||
|
||||
"""
|
||||
|
||||
_CONV_SCOPE = """
|
||||
## 整段对话评审范围
|
||||
- 在**完整 transcript**上,对 AI **多轮轨迹**做一次 holistic 评分(仍为同一 15 细项)。
|
||||
- **聚合规则**:以「整段中**典型表现** + **最严重且反复出现的缺陷**」综合定档;若某维度在多轮中明显滑落,该维不得按最好一轮给满分。
|
||||
- 维度边界:`context_memory` 负责**重复盘问、前后矛盾追问、忽略已答信息**;`emotion_carry` 负责**情绪是否被接住**(不与采访腔混扣);`rhythm_control` 负责**采访腔、总结腔、机械流程感**(本轮已承接情绪但仍像审讯,在此项体现)。
|
||||
|
||||
"""
|
||||
|
||||
_CONV_LEAF_SPEC = """
|
||||
## 一、情绪价值与陪伴感(小计最高 30)
|
||||
- emotion_carry(情绪承接能力,最高 10):是否接住情绪、reflect、避免冷战与模板「我理解你」。
|
||||
- empathy_depth(共情深度,最高 8):情绪类型是否准、语境贴合、非空洞安慰。
|
||||
- emotion_safety(情绪安全感,最高 6):非评判、尊重、敏感话题语气、可跳过。
|
||||
- emotion_guidance(情绪引导能力,最高 6):引导感受、关键节点追问情绪、表达更具体。
|
||||
- emotion_carry(情绪承接能力,最高 10):本轮/整段是否接住用户情绪、是否有 reflect、避免冷处理与空洞模板「我理解你」。**锚点**:0-3 完全忽略情绪或机械跳题;4-6 有回应但泛或偏快;7-9 贴合语境的承接+自然延伸。
|
||||
- empathy_depth(共情深度,最高 8):情绪类型与强度是否对、是否空洞安慰。**不与 emotion_carry 重复扣分**:承接已做到时,此项看是否理解更细。
|
||||
- emotion_safety(情绪安全感,最高 6):非评判、尊重、敏感话题柔化、可跳过。
|
||||
- emotion_guidance(情绪引导能力,最高 6):是否引向更具体的感受与关键节点情绪。
|
||||
|
||||
## 二、信息获取能力(小计最高 25)
|
||||
- fact_mining(关键事实挖掘,最高 8)
|
||||
- info_completeness_guide(信息完整性引导,最高 8)
|
||||
- info_depth_mining(信息深度挖掘,最高 9):为何、动机与影响。
|
||||
- fact_mining(关键事实挖掘,最高 8):事件、人物、时间地点等关键信息是否被问到或接住。
|
||||
- info_completeness_guide(信息完整性引导,最高 8):是否补全断裂叙事、是否把碎片织成可理解片段。
|
||||
- info_depth_mining(信息深度挖掘,最高 9):「为何、动机、影响」是否被推进。
|
||||
|
||||
## 三、人物建模能力(小计最高 15)
|
||||
- persona_understanding(人物理解,最高 7)
|
||||
- persona_consistency_verify(人物一致性验证,最高 4):矛盾澄清。
|
||||
- persona_expression_guide(人物表达引导,最高 4):「你是谁」层面。
|
||||
- persona_understanding(人物理解,最高 7):是否理解价值观、动机与人生主线信号。
|
||||
- persona_consistency_verify(人物一致性验证,最高 4):矛盾是否被温和澄清。
|
||||
- persona_expression_guide(人物表达引导,最高 4):是否引导「你是谁」层面表达。
|
||||
|
||||
## 四、结构化引导(小计最高 15)
|
||||
- interview_structure(访谈结构,最高 6):阶段与逻辑。
|
||||
- context_memory(上下文记忆,最高 5):关联前文;**重复盘问、同一槽位反复**在此项扣分。
|
||||
- rhythm_control(节奏控制,最高 4):自然;**采访腔、总结腔、流程感**在此项与情绪项综合体现。
|
||||
- interview_structure(访谈结构,最高 6):阶段/主题推进是否清晰(整段更明显;单轮不足则保守)。
|
||||
- context_memory(上下文记忆,最高 5):是否关联前文;**重复盘问同一已答信息、忽略上文**在此项扣分(不在 rhythm 重复扣)。
|
||||
- rhythm_control(节奏控制,最高 4):自然度;采访腔、总结腔、流程感。
|
||||
|
||||
## 五、提问质量(小计最高 15)
|
||||
- question_quality(问题质量,最高 7):开放、具体。
|
||||
- follow_up_depth(追问能力,最高 5)
|
||||
- non_leading(非引导性,最高 3)
|
||||
- question_quality(问题质量,最高 7):开放、具体、可答。
|
||||
- follow_up_depth(追问能力,最高 5):顺势深问。
|
||||
- non_leading(非引导性,最高 3):是否暗示「标准答案」或评判式预设。
|
||||
|
||||
输出 JSON 字段(仅这些键;务必含 rationale):
|
||||
输出 JSON 字段(仅这些键;细分项为浮点数;列表字符串尽量每条 ≤120 字;`rationale` 为简短中文总述):
|
||||
emotion_carry, empathy_depth, emotion_safety, emotion_guidance,
|
||||
fact_mining, info_completeness_guide, info_depth_mining,
|
||||
persona_understanding, persona_consistency_verify, persona_expression_guide,
|
||||
interview_structure, context_memory, rhythm_control,
|
||||
question_quality, follow_up_depth, non_leading,
|
||||
total_score, rationale
|
||||
total_score,
|
||||
major_strengths, major_issues, insufficient_evidence, evidence_refs, confidence, rationale
|
||||
|
||||
`evidence_refs`:数组,每项为对象,字段 `dimension`(上列英文名之一)、`turn_index`(整数,对应输入中的 `[Turn k]` 的 k;未知用 -1)、`snippet`(≤120 字引用或简述)。
|
||||
|
||||
`confidence`:0 到 1 之间小数,表示你对本次评分整体可信度(证据充分则偏高)。
|
||||
|
||||
`total_score` 必须等于上述 15 个细项之和(满分 100)。
|
||||
聚合分 emotion_score、information_score、persona_score、structure_score、question_score 可不填(服务端会重算)。
|
||||
@@ -42,14 +74,19 @@ total_score, rationale
|
||||
|
||||
|
||||
TURN_JUDGE_INSTRUCTIONS = (
|
||||
"你是「岁月留书」访谈对话质量评审,按下列 **情绪强化版** rubric 为本轮 AI 回复打分。\n"
|
||||
"你是「岁月留书」访谈对话质量评审员:保守、证据优先、可复核。按下列 **情绪强化版** rubric 为本轮 AI 回复打分。\n"
|
||||
+ _JUDGING_CHARTER
|
||||
+ _TURN_SCOPE
|
||||
+ _CONV_LEAF_SPEC
|
||||
)
|
||||
|
||||
|
||||
CONV_JUDGE_INSTRUCTIONS = (
|
||||
"你是访谈整段对话评审。给定完整 transcript(用户与 AI 多轮),按与单轮**相同**的 15 项细项与满分上限,"
|
||||
"对**整段对话表现**打一次分;`total_score` 为细项之和(100)。\n" + _CONV_LEAF_SPEC
|
||||
"你是「岁月留书」访谈**整段对话**质量评审员:保守、证据优先。给定带 `[Turn k]` 标记的完整 transcript,"
|
||||
"按下列 15 项细项的满分上限,对 AI **多轮整体轨迹**打一次分;`total_score` 为细项之和(100)。\n"
|
||||
+ _JUDGING_CHARTER
|
||||
+ _CONV_SCOPE
|
||||
+ _CONV_LEAF_SPEC
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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(记忆忠实度,最高 9):hallucination、夸大/弱化/改写、因果关系、未证实推测、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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user