docs(14): capture phase context

This commit is contained in:
2026-03-23 20:51:29 +08:00
parent e445986d6d
commit 2dde3a3dc8
@@ -0,0 +1,113 @@
# Phase 14: 鲁棒性与成本控制 - Context
**Gathered:** 2026-03-23
**Status:** Ready for planning
<domain>
## Phase Boundary
提高 LLM 语义分段的稳定性和成本效率。
**核心能力:**
- LLM 调用失败时的重试和降级策略
- 长视频字幕的分块处理,避免上下文窗口溢出
- 智能缓存,避免重复 LLM 调用
- 详细的日志记录,便于问题诊断
**不包括:**
- 输出格式优化(Phase 15 - 兼容性)
- 新的分段策略(Phase 13 已实现统一策略)
</domain>
<decisions>
## Implementation Decisions
### 重试策略
- **重试次数**: 重试 1 次 — 失败后立即降级到规则分段,简单快速,避免浪费配额
- **重试条件**: 仅可恢复错误触发重试 — 网络错误/超时/限流重试,API 错误(如 400)直接降级
- **重试延迟**: 立即重试 — 失败后立即重试,大多数情况下网络抖动是瞬时的
- **不可恢复错误**: API 错误(4xx)、解析失败、验证失败等直接降级,不重试
### 分块处理
- **分块阈值**: 5000 字符(约 10-15 分钟字幕)— 与 ASRCorrector 的 batch_size 一致,保持代码模式统一
- **分块方式**: 按句子边界分割 — 在句号、问号、感叹号等标点符号后分割,保持语义完整性
- **结果合并**: 直接拼接各分块结果 — 每个分块独立分段后直接拼接,简单快速
- **分块策略**: 长字幕按句子边界分成多个 5000 字符以内的块,每块独立调用 LLM 分段
### 缓存机制
- **缓存键**: 字幕内容哈希(SHA256)— 精确匹配,相同内容一定命中
- **缓存存储**: 本地文件系统 — 存储在 `.planning/cache/semantic/` 目录,简单持久化
- **缓存 TTL**: 永久有效 — 字幕内容不变,分段结果应该一致,手动清理过期缓存
- **缓存内容**: 完整的 SegmentationResult(JSON 格式),包含 video_type 和 segments
### 日志详细程度
- **降级日志**: 记录原因 + 降级方式 — 如 "API key 未配置,降级到规则分段"
- **日志级别**: 区分级别
- 降级:warning 级别
- 重试:info 级别
- 成功:debug 级别
- **重试日志**: 记录重试原因和次数
- **缓存日志**: 记录缓存命中/未命中,使用 debug 级别
### Claude's Discretion
- 具体的重试逻辑实现细节
- 缓存文件命名规则和目录结构
- 分块算法的具体实现(句子边界检测)
- 日志消息的具体措辞和格式
</decisions>
<code_context>
## Existing Code Insights
### Reusable Assets
- **kb_workflow/srt/semantic_engine.py** — UnifiedSegmentationStrategy 类,已有基本降级逻辑(AI 不可用时使用规则分段)
- **kb_workflow/srt/corrector.py** — ASRCorrector 类,有 `_correct_long_text()` 方法处理长文本分批(batch_size=5000,按句子分割)
- **kb_workflow/deep_analyzer/__init__.py** — SimpleAIClient 类,统一的 LLM 调用接口
### Established Patterns
- **Lazy AI Client 初始化**: ASRCorrector 模式 — 在 __init__ 中尝试创建 SimpleAIClient,如果 api_key 为空则设为 None
- **AIClientProtocol**: 定义了 generate(prompt, max_tokens, disable_reasoning) 方法
- **降级策略**: UnifiedSegmentationStrategy.segment() 中已有 try-except,异常时返回规则分段
- **日志模式**: 使用 `logger.info/warning/error`,已在 semantic_engine.py 中使用
### Integration Points
- **UnifiedSegmentationStrategy.segment()**: 需要添加重试逻辑和分块处理
- **SemanticSegmentationEngine**: 可以添加缓存层
- **SimpleAIClient.generate()**: LLM 调用点,需要捕获可恢复错误进行重试
- **缓存目录**: `.planning/cache/semantic/` — 需要创建目录结构
</code_context>
<specifics>
## Specific Ideas
- **分块与 ASRCorrector 一致**: 复用 ASRCorrector 的分批处理模式(batch_size=5000,按句子分割)
- **重试仅网络错误**: 区分可恢复错误(网络、超时、限流)和不可恢复错误(API 错误、解析失败)
- **缓存与内容绑定**: 使用内容哈希而非视频 ID,避免同一视频更新后缓存失效问题
- **日志便于诊断**: 降级时记录具体原因(如 "ConnectionError: 请求超时,重试后仍失败,降级到规则分段")
</specifics>
<deferred>
## Deferred Ideas
- **缓存清理命令**: 自动清理过期缓存的功能 — 延后到未来版本,当前手动删除缓存文件
- **缓存压缩**: 压缩缓存文件以节省空间 — 延后到缓存文件较大时再考虑
- **分块智能合并**: 检测相邻分段语义相似度并合并 — 增加复杂度,当前直接拼接足够
</deferred>
---
*Phase: 14-robustness-cost*
*Context gathered: 2026-03-23*