feat: 回忆录证据血缘与内部评测可追溯,顺带对齐本地评测台与 CI

数据库与模型:新增多版迁移(章节证据快照、对话血缘、记忆事实/时间线 lineage 等),把「成稿 ↔ 对话/记忆」的溯源信息落到表结构里。
业务链路:会话与 WS、回忆录/故事流水线、记忆写入与 enrichment 等跟着接上线索与快照;新增章节证据快照与评测侧 EvalTraceService 等模块,方便组评审用的证据包。
内部评测:自动化 run 与手工 memoir 评审共用可追溯证据;rubric/ judge 相关脚本与文档有配套调整。
app-eval-web:Memoir/实验详情里能展开看证据摘要与 evidence_trace(含对话轮次 id);Vite 代理与 development.sh 注入的 API 端口与当前默认内部评测端口一致,避免改端口后页面连错服务。
工程杂项:GitHub Actions / 仓库说明有更新;各适配器与支付/配额/plan 等多处为小改动或跟随主改动的收尾;新增/扩充了?
This commit is contained in:
Kevin
2026-04-08 15:37:09 +08:00
parent 6772e1269c
commit 309a051038
109 changed files with 4125 additions and 858 deletions

View File

@@ -9,8 +9,8 @@ from typing import Any, Dict, List
from app.agents.memoir.prompts import get_batch_memoir_phase1_prep_prompt
from app.agents.memoir.schemas import BatchPhase1LLMOutput
from app.agents.state_schema import MemoirStateSchema
from app.agents.stage_constants import STAGE_SLOT_KEYS
from app.agents.state_schema import MemoirStateSchema
from app.core.config import settings
from app.core.llm_call import LLMCallError, llm_json_call
from app.core.logging import get_logger

View File

@@ -13,6 +13,8 @@ import re
from dataclasses import dataclass
from typing import Any
from pydantic import ValidationError
from app.agents.memoir.prompts import get_chapter_classification_json_prompt
from app.agents.memoir.schemas import ClassificationOutput
from app.agents.stage_constants import (
@@ -22,7 +24,7 @@ from app.agents.stage_constants import (
)
from app.core.config import settings
from app.core.json_utils import extract_json_payload
from app.core.llm_call import llm_json_call
from app.core.llm_call import LLMCallError, llm_json_call
from app.core.logging import get_logger
logger = get_logger(__name__)
@@ -159,7 +161,7 @@ class ClassificationAgent:
)
if category in CHAPTER_CATEGORIES:
return ChapterClassifyResult(category=category, llm_said_none=False)
except Exception as e:
except (LLMCallError, ValidationError, ValueError, KeyError) as e:
logger.warning("ClassificationAgent LLM 章节分类失败: {}", e)
stage = _detect_stage(text, fallback_stage)

View File

@@ -7,13 +7,13 @@ from __future__ import annotations
from typing import Any, Dict, Optional
from app.agents.stage_constants import CHAPTER_CATEGORIES
from app.agents.memoir.prompts import (
get_creative_title_json_prompt,
get_narrative_json_prompt,
get_narrative_merge_json_prompt,
)
from app.agents.memoir.schemas import MemoirTitleOutput
from app.agents.stage_constants import CHAPTER_CATEGORIES
from app.core.config import settings
from app.core.langchain_llm import invoke_json_object
from app.core.llm_call import llm_json_call

View File

@@ -16,11 +16,11 @@ from app.agents.memoir.batch_phase1_prep import (
)
from app.agents.memoir.classification_agent import (
ClassificationAgent,
_looks_like_fragment_only,
)
from app.agents.memoir.classification_agent import (
_detect_stage as detect_stage_from_keywords,
)
from app.agents.memoir.classification_agent import _looks_like_fragment_only
from app.agents.memoir.extraction_agent import ExtractionAgent, ExtractionResult
from app.agents.stage_constants import normalize_chapter_category, normalize_chat_stage
from app.agents.state_schema import MemoirStateSchema

View File

@@ -10,10 +10,7 @@ from typing import Optional
from app.agents.chat.background_voice import get_background_voice_narrative_block
from app.agents.chat.occupation_context import get_occupation_narrative_hint
from app.agents.stage_constants import STAGE_ERA_HINTS, STAGE_SLOT_KEYS
from app.features.memory.evidence_format import (
dedupe_evidence_chunk_rows,
format_evidence_chunks_for_prompt,
)
from app.features.memory.evidence_format import format_evidence_chunks_for_prompt
def _memoir_fidelity_core_rules() -> str:
@@ -581,6 +578,3 @@ def format_narrative_user_content(oral_text: str, evidence_text: str = "") -> st
"【仅供参考的相关记忆摘录(非本段口述;不得把其中具体事实写成本轮亲历经历,仅可作主题衔接)】\n"
f"{ev}"
)
# dedupe_evidence_chunk_rows / format_evidence_chunks_for_prompt 见 app.features.memory.evidence_format

View File

@@ -9,7 +9,7 @@ from __future__ import annotations
import json
import re
from datetime import timezone
from typing import Any, TYPE_CHECKING
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from app.core.config import Settings