feat: L4 AI 诊断报告优化 + Prompt/摘要卡/迁移/文档完善

- 修正 DeepSeek 模型名 deepseek-chat → deepseek-v4-pro
- 摘要块:修复 **粗体** markdown 渲染、左右块可滚动、左块固定粉红色系
- 新增 prompt4(内容摘要卡)+ prompt5(诊断报告)+ 三处 prompt5 优化
- 新增 004 迁移(episodes +content_digest JSONB)、导入脚本、摘要卡生成脚本
- 更新 CLAUDE.md 状态栏/进度/交接备注/关键决策

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
simonkoson
2026-07-03 21:25:38 +08:00
parent 3dd718f53d
commit 9df4868191
15 changed files with 1993 additions and 42 deletions
+78
View File
@@ -0,0 +1,78 @@
"""
一次性脚本:将 AI 生成的内容摘要卡写入 episodes 表的 content_digest 字段
数据来源:ai-labeling/experiments/content_digests/_all_digests.json
前置:先手动执行 backend/sql/004_add_content_digest.sql 添加字段
"""
import sys
import os
import json
from datetime import date
# Windows 终端中文输出
sys.stdout.reconfigure(encoding='utf-8')
sys.stderr.reconfigure(encoding='utf-8')
# 加 backend 到 path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'backend'))
from app.db.session import get_session
from app.models.episode import Episode
from app.models.user import User # FK 解析需要
from sqlmodel import select
# ── 1. 读 digest 数据 ──
project_root = os.path.join(os.path.dirname(__file__), '..')
digest_file = os.path.join(project_root, 'ai-labeling', 'experiments', 'content_digests', '_all_digests.json')
with open(digest_file, 'r', encoding='utf-8') as f:
all_digests = json.load(f)
print(f"读入 {len(all_digests)} 条摘要记录")
# ── 2. 逐条匹配并写入 ──
session = next(get_session())
success = 0
skipped = 0
mismatch = 0
for d in all_digests:
ep_num = d['ep']
digest_date = d['date'] # "2026-04-21" 格式
# 查 episode
ep = session.exec(select(Episode).where(Episode.episode_number == ep_num)).first()
if not ep:
print(f"⚠️ ep{ep_num:02d} 在数据库中不存在,跳过")
skipped += 1
continue
# 校验日期
if str(ep.air_date) != digest_date:
print(f"⚠️ ep{ep_num:02d} 日期不匹配: DB={ep.air_date}, digest={digest_date},跳过")
mismatch += 1
continue
# 写入(只存 digest 字段,不存外壳的 ep/date/title/editor/filename/generated_at
ep.content_digest = d['digest']
session.add(ep)
success += 1
print(f"✅ ep{ep_num:02d} {ep.program_name} <- digest 已写入")
session.commit()
# ── 3. 打印统计 ──
print()
print(f"=== 统计 ===")
print(f"成功写入: {success}")
print(f"跳过(不存在): {skipped}")
print(f"跳过(日期不匹配): {mismatch}")
print(f"总记录: {len(all_digests)}")
# ── 4. 验证:所有 episodes 的 content_digest 状态 ──
print()
print(f"=== 验证: episodes content_digest 状态 ===")
all_eps = session.exec(select(Episode).order_by(Episode.episode_number)).all()
for e in all_eps:
has_digest = "" if e.content_digest is not None else ""
print(f"ep{e.episode_number:02d} | {e.program_name} | {e.air_date} | digest: {has_digest}")