---
phase: 13
plan: 04
type: tdd
wave: 1
depends_on: []
files_modified:
- kb_workflow/srt/semantic_engine.py
- tests/test_semantic_engine.py
autonomous: true
requirements:
- TITLE-01
- TITLE-02
- TITLE-03
must_haves:
truths:
- "系统能为主题/章节类型的分段生成描述性标题"
- "标题简洁准确(5-15字),反映分段的主要内容"
- "论点/观点类型的分段只分段,不加标题"
artifacts:
- path: "kb_workflow/srt/semantic_engine.py"
provides: "标题生成 Prompt 指令和验证"
contains: "VideoSegment.title 字段验证"
- path: "tests/test_semantic_engine.py"
provides: "标题生成测试"
min_lines: 60
key_links:
- from: "SEGMENTATION_PROMPT"
to: "VideoSegment.title"
via: "Prompt 指导 LLM 生成标题"
pattern: "为主题.*生成标题.*5-15字"
- from: "VideoSegment.validate_title_length"
to: "Pydantic 验证"
via: "标题长度限制"
pattern: "len.*title.*15"
---
实现主题标题生成功能
目的:让 LLM 为主题/章节类型分段生成简洁准确的标题,论点/观点分段不加标题
输出:VideoSegment.title 字段和验证,Prompt 中的标题生成指令
@/home/starmen1265/.claude/get-shit-done/workflows/execute-plan.md
@/home/starmen1265/.claude/get-shit-done/templates/summary.md
@.planning/phases/13-llm/13-CONTEXT.md
@.planning/phases/13-llm/13-RESEARCH.md
# User Decision (Locked)
- **标题范围**: LLM 自主判断 — 让 LLM 自行判断哪些分段需要标题(主题/章节类),哪些不需要(观点/对话类),不在 Prompt 中硬性规定
- **标题风格**: 简洁描述型 — 标题应简短(5-15 字),如「机器学习概述」「梯度下降原理」,类似目录结构
- **标题格式**: H2 (##) — 在 Markdown 输出中,标题使用二级标题(##),与现有「## 内容」格式保持一致
- **标题缺失处理**: 跳过标题 — 如果 LLM 无法为某个分段生成合适的标题(如过渡性内容),该分段不加标题,直接以内容开始
主题标题生成
kb_workflow/srt/semantic_engine.py, tests/test_semantic_engine.py
Prompt 设计(用户决策):
- 让 LLM 自主判断哪些分段需要标题
- 标题简洁(5-15字),如「机器学习概述」
- 过渡性内容可将 title 设为 null
Pydantic 验证:
- title: Optional[str] = None
- 标题长度验证(不超过 15 字)
测试验证:
- 主题/章节分段生成标题
- 标题简洁准确
- 论点/观点分段标题为 null
在 VideoSegment 模型中:
1. title: Optional[str] = Field(None, description="分段标题(5-15字)")
2. @field_validator('title') 验证长度
在 SEGMENTATION_PROMPT 中:
1. 添加标题生成指令
2. 说明 LLM 自主判断是否需要标题
3. 标题简洁(5-15字)
4. 无法生成标题时设为 null
测试:
1. test_title_generation() - 验证标题生成
2. test_title_omission() - 验证不需要标题时为 null
Task 1: 实现标题生成功能
kb_workflow/srt/semantic_engine.py, tests/test_semantic_engine.py
RED 阶段 - 测试预期行为:
- test_title_generation: 主题/章节分段生成标题
- test_title_omission: 论点/观点分段不加标题(title=null)
GREEN 阶段 - 实现功能:
- VideoSegment.title: Optional[str] = None
- @field_validator 验证标题长度(5-15 字)
- SEGMENTATION_PROMPT 添加标题生成指令
- 说明 LLM 自主判断是否需要标题
REFACTOR 阶段 - 优化代码:
- 优化标题验证逻辑
在 semantic_engine.py 中实现:
1. 更新 VideoSegment 模型:
```python
class VideoSegment(BaseModel):
title: Optional[str] = Field(
None,
description="分段标题(5-15字),主题/章节类型有标题,观点/对话类型为空"
)
content: str = Field(..., description="分段内容,保持句子完整性")
start_index: int = Field(..., description="在原文中的起始字符位置")
end_index: int = Field(..., description="在原文中的结束字符位置")
@field_validator('title')
@classmethod
def validate_title_length(cls, v: Optional[str]) -> Optional[str]:
if v is not None and len(v) > 15:
raise ValueError("标题长度不应超过 15 字")
return v
```
2. 在 SEGMENTATION_PROMPT 中添加标题指令:
```python
【分段要求】
...
6. 为主分/章节类型的分段生成简洁标题(5-15字),论点/观点类型分段不加标题
【输出格式】
...
"title": "分段标题(如果此分段不需要标题则设为 null)",
...
```
3. 在 Prompt 示例中说明标题判断标准(自主判断)
测试验证:
- 主题分段有标题(如「机器学习概述」)
- 过渡性内容标题为 null
- 标题长度不超过 15 字
pytest tests/test_semantic_engine.py::test_title_generation -x
- VideoSegment.title 字段定义为 Optional[str]
- @field_validator 验证标题长度(5-15 字)
- SEGMENTATION_PROMPT 包含标题生成指令
- 说明 LLM 自主判断是否需要标题
- 测试验证标题生成和省略
- pytest tests/test_semantic_engine.py -v 相关测试通过
- 标题长度验证生效
- Prompt 指令清晰(LLM 自主判断)
1. VideoSegment.title 定义为 Optional[str]
2. @field_validator 验证标题长度(5-15 字)
3. SEGMENTATION_PROMPT 包含标题生成指令
4. 测试验证标题生成和省略