# Research Summary: LLM Semantic Segmentation for SRT Subtitles **Project:** kb-skills v1.6 - Semantic Segmentation Improvement **Research Date:** 2026-03-21 **Synthesized from:** STACK_SEMANTIC_SEGMENTATION.md, FEATURES.md, ARCHITECTURE.md, PITFALLS.md --- ## Executive Summary **核心发现:无需新增外部依赖,基于现有技术栈实现LLM语义分段** - **技术方案**:使用现有 SimpleAIClient + Pydantic v2 实现两阶段分析(视频类型分类 → 主题分段),无需引入 LangChain、向量数据库等新依赖 - **架构集成**:扩展现有 `SemanticSegmenter`,在 `SRTProcessor` 中新增 LLM 分支,保持向后兼容(可通过 `enable_semantic_segmentation` 参数控制) - **关键风险**:长视频上下文溢出(>10万字符)、LLM输出格式不稳定、分段边界破坏语义完整性 — 需要通过分块策略、多层fallback、边界保护机制缓解 **推荐实施路径**:优先实现MVP(类型识别+语义分段+标题生成),高级特性(分层结构、质量评分、说话人识别)延后至v2.0 --- ## Stack Additions ### 无需新增外部依赖 **所有功能基于现有技术栈实现:** | 现有组件 | 新用途 | 理由 | |---------|--------|------| | **SimpleAIClient** | LLM调用(类型分类、语义分段) | 已集成zhipu/openai/minimax,支持结构化输出 | | **Pydantic v2** | LLM响应验证与解析 | 提供严格的JSON schema验证,支持多层fallback | | **SemanticSegmenter** | 集成点,保持向后兼容 | 现有规则分段保留,新增LLM分支 | ### 明确排除的技术(避免过度工程) | 排除技术 | 理由 | |---------|------| | LangChain | 单次LLM调用无需编排框架 | | 向量嵌入/数据库 | 语义分段不需要检索 | | 专用分段模型 | LLM灵活性更高,无需额外训练 | | 实时流式处理 | 批处理模式已满足需求 | | 多模态分析 | 仅处理SRT文本,无视频帧 | ### 配置策略 **无需新增环境变量**,复用现有AI配置: ```bash # 已有配置,直接复用 AI_API_KEY=your_key AI_PROVIDER=zhipu # or openai, minimax AI_MODEL=glm-5 ``` **可选YAML配置**(`.kb_env.yaml`): ```yaml semantic_segmentation: enabled: true enable_fallback: true default_video_type: mixed min_segment_length: 200 # 字符 max_segment_length: 2000 # 字符 target_segment_count: 5 ``` --- ## Feature Categories ### Table Stakes (MVP必须实现) **用户期望的基础功能,缺失会让产品感觉"不完整":** | 功能 | 复杂度 | 实施优先级 | 说明 | |------|--------|-----------|------| | **视频类型识别** | Medium | P0 | 识别6种类型(tutorial/knowledge/story/interview/commentary/mixed),决定分段策略 | | **主题边界检测** | High | P0 | 基于语义相似度/词频变化检测话题转换点 | | **内容完整性保护** | High | P0 | 避免在句子/论点中间截断,保持语义连贯 | | **自然句边界检测** | Medium | P0 | 中文断句(无明确句号),语义判断停顿 | | **主题标题生成** | Medium | P0 | 为每段生成简洁标题(≤15字) | | **基本分段策略** | Medium | P0 | 至少支持知识类、故事类两种策略 | ### Differentiators (竞争力功能,v2.0考虑) **非必需但有价值的功能:** | 功能 | 复杂度 | 价值 | 建议版本 | |------|--------|------|---------| | **分层主题结构** | High | 支持多级层次(章-节) | v2.0 | | **时间戳对齐** | Medium | 分段与原字幕时间对齐 | v2.0 | | **分段质量评分** | Medium | 给出质量可信度 | v2.0 | | **说话人识别集成** | High | 结合说话人变化优化 | v2.0 | | **可配置分段粒度** | Low | 用户控制分段密度 | v2.0 | | **分段合并建议** | Medium | 检测过短分段并建议合并 | v2.0 | | **主题连贯性分析** | High | 评估分段内部一致性 | v2.0 | ### Anti-Features (明确不构建) **避免的功能陷阱:** | 反功能 | 风险 | 替代方案 | |--------|------|---------| | **固定大小分段** | 破坏语义完整性 | 基于内容边界动态分段 | | **纯关键词匹配** | 无法理解上下文 | 使用LLM语义分析 | | **实时流式分段** | 缺乏全局上下文 | 批处理完整内容 | | **多语言混合处理** | 逻辑复杂降低质量 | 先分离语言再处理 | | **完全自动化无审核** | LLM误判边界 | 提供预览和手动调整 | | **过度细分段** | 碎片化降低可读性 | 设置最小长度阈值 | ### 视频类型与分段策略映射 **不同类型视频的分段特征:** | 视频类型 | 分段依据 | 边界信号 | 标题风格 | 典型长度 | |---------|---------|---------|---------|---------| | **知识类** | 主题/知识点变化 | "接下来"、"其次" | 描述性,反映知识点 | 2-5分钟 | | **故事类** | 情节发展/场景变化 | 时间/地点/人物转换 | 叙事性,反映情节 | 5-10分钟 | | **访谈类** | 问题/话题转换 | 主持人提问 | 问答式,反映主题 | 3-6分钟 | | **新闻类** | 新闻条目 | "接下来是"、"据报道" | 信息性,反映事件 | 1-3分钟 | | **Vlog类** | 活动/场景变化 | 时间跳跃/地点切换 | 描述性,反映活动 | 1-8分钟 | | **混合类** | 综合以上策略 | 多种信号 | 综合风格 | 变化大 | --- ## Architecture Integration ### 集成点:扩展现有 SRTProcessor **最小改动原则**,在现有 `kb_workflow/pipeline/processors/srt.py` 中新增LLM分支: ```python class SRTProcessor(BaseProcessor): def __init__( self, state_manager: Optional[WorkflowStateManager] = None, enable_correction: bool = True, enable_semantic_segmentation: bool = True # 新增参数 ): # ... 现有初始化 ... self.semantic_engine = None # 新增字段 # 延迟初始化LLM引擎 if enable_semantic_segmentation: try: from kb_workflow.srt.semantic_engine import SemanticSegmentationEngine from kb_workflow.deep_analyzer import SimpleAIClient ai_client = SimpleAIClient() if ai_client.api_key: self.semantic_engine = SemanticSegmentationEngine(ai_client=ai_client) except Exception as e: logger.warning(f"Failed to init semantic engine: {e}") async def process(self, input_data: SRTInput) -> SRTOutput: # ... 现有解析代码 ... # 新增:LLM分段分支 if self.semantic_engine and self.enable_semantic_segmentation: logger.info("Using LLM-based semantic segmentation") paragraphs = self._semantic_segment_with_llm(segments, metadata) else: logger.info("Using rule-based segmentation") paragraphs = self.segmenter.segment(segments) # 现有逻辑 # ... 后续处理不变 ... ``` ### 新增模块:SemanticSegmentationEngine **位置**:`kb_workflow/srt/semantic_engine.py` **职责**: - **Stage 1**: 视频类型检测(few-shot分类,输出类型代码) - **Stage 2**: 语义分段(结构化JSON输出,Pydantic验证) - **Fallback**: 三层降级策略(直接解析 → Markdown提取 → 均匀分段) **关键设计**: ```python class SemanticSegmentationEngine: def __init__( self, ai_client: Optional[AIClientProtocol] = None, enable_fallback: bool = True ): self.ai_client = ai_client self.enable_fallback = enable_fallback def detect_video_type(self, text_preview: str, metadata: dict) -> str: """Stage 1: 检测视频类型(tutorial/knowledge/...)""" # 返回类型代码,失败返回 "mixed" def segment_semantically( self, full_text: str, video_type: str, metadata: dict, target_segments: int = 5 ) -> SegmentationResult: """Stage 2: 执行语义分段""" # 返回结构化分段结果,带Pydantic验证 ``` ### Pydantic Schema:严格验证LLM输出 **位置**:`kb_workflow/srt/schemas.py` ```python class VideoSegment(BaseModel): """单个语义分段""" title: str = Field(..., min_length=1, max_length=50) start_index: int = Field(..., ge=0) end_index: int = Field(..., ge=0) summary: str = Field(..., min_length=1, max_length=100) @field_validator('end_index') def validate_bounds(cls, v, info): if 'start_index' in info.data and v <= info.data['start_index']: raise ValueError('end_index must be greater than start_index') return v class SegmentationResult(BaseModel): """完整分段结果""" segments: List[VideoSegment] = Field(..., min_length=1) overall_summary: str = Field(..., min_length=1, max_length=200) @field_validator('segments') def validate_segments(cls, v): # 检查重叠和排序 ... ``` ### 三层Fallback策略 **确保鲁棒性**,LLM失败时优雅降级: 1. **Strategy 1**: 直接JSON解析(理想情况) 2. **Strategy 2**: Markdown代码块提取(常见情况) 3. **Strategy 3**: 启发式均匀分段(保底方案) ```python def parse_llm_response(response_text: str, total_length: int) -> SegmentationResult: # 1. 直接解析 try: return SegmentationResult.model_validate_json(response_text) except Exception: pass # 2. 提取Markdown中的JSON try: json_match = re.search(r'```json\s*(.*?)\s*```', response_text, re.DOTALL) if json_match: return SegmentationResult.model_validate_json(json_match.group(1)) except Exception: pass # 3. 保底:均匀分段 return _generate_fallback_segments(total_length) ``` ### 数据流 ``` SRT Input ↓ [Parse Subtitles] → segments: List[Segment] ↓ [Video Type Detection] → video_type: str (mixed/tutorial/knowledge/...) ↓ [Semantic Segmentation] → SegmentationResult (segments + titles + summaries) ↓ [Extract Paragraphs] → paragraphs: List[str] (基于start_index/end_index) ↓ [ASR Correction] → corrected_paragraphs: List[str] ↓ [Deep Analysis] → analysis_results ``` --- ## Watch Out For ### 严重陷阱(必须避免) #### 1. 上下文窗口溢出导致长视频处理失败 **风险**:B站知识类视频常达1-2小时,字幕超10万字符,直接发送会触发API错误或内容截断。 **缓解策略**: - **分块处理**:先按现有时间间隔(3秒停顿)预分块,再合并至80k token以下 - **两阶段分析**:Stage 1用小模型快速扫描定位潜在边界,Stage 2仅对可疑区域深度分析 - **Token计数**:使用 `tiktoken` 实时计算,动态调整分段策略 **实施阶段**:Phase 1 (架构设计时必须考虑) --- #### 2. LLM输出格式不稳定导致解析失败 **风险**:LLM可能返回: - 纯文本而非JSON - JSON包裹在Markdown代码块中 - 缺少必需字段 - 字段类型错误(如字符串而非数字) **缓解策略**: - **多层fallback**:直接解析 → Markdown提取 → 启发式分段 - **严格的Pydantic验证**:字段类型、范围、业务规则(如 `end_index > start_index`) - **Prompt工程**:明确要求"只输出JSON,不要其他内容",提供示例格式 **实施阶段**:Phase 1 (核心功能) --- #### 3. 分段边界破坏语义完整性 **风险**:在句子中间或论点未完成时截断,导致分段语义破碎。 **缓解策略**: - **句边界保护**:检测标点符号(句号、问号、感叹号),优先在这些位置分段 - **修辞结构识别**:检测并列结构("首先、其次、最后"),不在其间截断 - **最小长度保护**:设置 `min_segment_length=200`,避免碎片化 - **Post-processing**:合并过短分段(<200字符)到相邻分段 **实施阶段**:Phase 1 (核心功能) + Phase 2 (优化) --- #### 4. 分段不一致性(同一视频多次运行结果不同) **风险**:LLM的随机性导致同一内容多次分段结果差异大,影响可复现性。 **缓解策略**: - **温度参数设置**:`temperature=0.1`(低温度保证稳定性) - **Seed固定**:如果API支持,使用固定seed - **结果缓存**:对同一视频缓存分段结果(基于内容hash) **实施阶段**:Phase 2 (鲁棒性增强) --- #### 5. 成本失控(高频LLM调用导致费用激增) **风险**:每个视频都需要2次LLM调用(类型检测+分段),大量处理时成本显著。 **缓解策略**: - **智能缓存**:相似内容(如同一UP主、同一系列)复用视频类型 - **分段数量自适应**:短视频(<5分钟)减少目标分段数 - **批量处理折扣**:如果API支持,使用batch模式 - **监控告警**:设置月度成本上限,超限时降级为规则分段 **实施阶段**:Phase 2 (成本优化) --- ### 中等风险(需要注意) #### 6. 中文断句不准确 **风险**:中文没有明确句号,LLM可能在短语中间断句。 **缓解策略**: - **语义停顿检测**:基于短语结构判断停顿位置 - **标点符号优先**:优先在逗号、分号处分段 - **LLM辅助断句**:对歧义情况让LLM判断 --- #### 7. 幻觉检测缺失(LLM生成不存在的标题) **风险**:LLM可能生成与内容不符的标题或摘要。 **缓解策略**: - **关键词提取验证**:标题应包含分段中的关键词 - **后处理验证**:检查标题词汇是否在原文中出现 - **用户反馈机制**:v2.0提供手动调整界面 --- ### 低风险(可接受) #### 8. 分段数量不精确 **风险**:请求5个分段,LLM返回3个或7个。 **缓解策略**: - **Prompt明确要求**:"必须分为5个段落" - **Post-processing调整**:过多则合并,过少则拆分(基于子主题) - **接受偏差**:±1个分段可接受 --- ## Implications for Roadmap ### 建议阶段结构 基于技术依赖和风险优先级,建议分为3个阶段: #### **Phase 1: MVP核心功能** (2-3周) **目标**:实现基础的LLM语义分段,验证可行性 **交付物**: - ✅ 视频类型识别(6种类型) - ✅ 语义边界检测(基于LLM) - ✅ Pydantic Schema验证 - ✅ 三层fallback策略 - ✅ 基础标题生成(≤15字) - ✅ SRTProcessor集成(向后兼容) **必须避免的陷阱**: - LLM-1: 上下文窗口溢出(实施分块策略) - LLM-2: 输出格式不稳定(多层fallback) - LLM-3: 边界破坏完整性(句边界保护) **测试重点**: - 短视频(<10分钟)的端到端处理 - 不同类型视频的分段质量 - Fallback机制触发路径 --- #### **Phase 2: 鲁棒性增强** (1-2周) **目标**:提高稳定性和可控性 **交付物**: - ✅ 成本优化(缓存、批量处理) - ✅ 分段一致性保证(低温度、seed) - ✅ Post-processing优化(合并过短分段) - ✅ 配置化参数(YAML配置支持) - ✅ 监控和日志(分段质量指标) **必须避免的陷阱**: - LLM-4: 分段不一致性(temperature控制) - LLM-5: 成本失控(缓存策略) **测试重点**: - 长视频(>1小时)的分块处理 - 边缘情况(极短视频、单一主题) - 成本监控 --- #### **Phase 3: 高级特性(v2.0)** (延后) **目标**:增强用户体验和竞争力 **交付物**: - 🔲 分层主题结构(章-节) - 🔲 分段质量评分 - 🔲 说话人识别集成 - 🔲 手动调整界面 - 🔲 时间戳对齐 **延后理由**: - 需要额外技术调研(如说话人分离) - 对MVP价值非关键 - 增加复杂度和测试成本 --- ### Research Flags **需要 `/gsd:research-phase` 的阶段**: | 阶段 | 研究需求 | 理由 | |------|---------|------| | Phase 1 | ❌ 不需要 | 技术方案已明确,STACK.md提供完整实现指南 | | Phase 2 | ❌ 不需要 | 鲁棒性模式已成熟(PITFALLS.md已覆盖) | | Phase 3 | ✅ 需要 | 说话人识别、分层结构等需要额外技术调研 | **可直接进入实施的阶段**: - **Phase 1**: 技术栈已验证,架构模式清晰,可直接开始编码 - **Phase 2**: 基于Phase 1的反馈进行优化,无需额外研究 --- ## Confidence Assessment | 领域 | 信心等级 | 说明 | |------|---------|------| | **技术栈** | **HIGH** | 基于现有SimpleAIClient和Pydantic,无需新依赖 | | **功能定义** | **HIGH** | FEATURES.md基于2025-2026年学术论文,源质量高 | | **架构集成** | **HIGH** | ARCHITECTURE.md提供完整集成方案,与现有代码兼容 | | **陷阱识别** | **HIGH** | PITFALLS.md结合了pipeline、反爬虫、LLM三类陷阱 | **总体信心:HIGH** **已识别的差距**: - **中文句边界检测**:现有方法(标点符号+语义停顿)可能不够精确,需要在Phase 2测试中验证 - **分段质量评估**:缺少客观评估指标,需要在Phase 2定义评估标准 - **说话人识别集成**(v2.0):需要额外调研技术方案 --- ## Sources ### 高质量来源(学术/官方文档) - [Chapter-Llama: Efficient Chaptering in Hour-Long Videos with LLMs (CVPR 2025)](https://arxiv.org/html/2504.00072v1) - [LLM-Enhanced Semantic Text Segmentation - MDPI Applied Sciences 2025](https://www.mdpi.com/2076-3417/15/19/10849) - [Beyond Transcripts: A Renewed Perspective on Audio Chaptering - arXiv 2025](https://arxiv.org/html/2602.08979v1) - [Multimodal Fusion and Coherence Modeling for Video Topic Segmentation - ACL Findings 2025](https://aclanthology.org/2025.findings-acl.904.pdf) - [The Complete Guide to Using Pydantic for Validating LLM Outputs](https://machinelearningmastery.com/the-complete-guide-to-using-pydantic-for-validating-llm-outputs/) ### 中等质量来源(实践指南/行业博客) - [Automate Video Chaptering with LLMs and TF-IDF](https://towardsdatascience.com/automate-video-chaptering-with-llms-and-tf-idf-f6569fd4d32b/) - [AI-Based Video Analyzer for Automated Chaptering and Summarization](https://medium.com/codex/ai-based-video-analyzer-for-automated-chaptering-and-summarization-2ca65f35b687) - [Best Chunking Strategies for RAG (and LLMs) in 2026](https://www.firecrawl.dev/blog/best-chunking-strategies-rag) ### 项目内部来源 - `STACK_SEMANTIC_SEGMENTATION.md`: 技术栈和Prompt工程 - `FEATURES.md`: 功能分类和视频类型策略 - `ARCHITECTURE.md`: 集成方案和数据流 - `PITFALLS.md`: 三类陷阱(Pipeline、反爬虫、LLM分段) --- ## Next Steps 1. **立即开始Phase 1实施**:技术方案已明确,无需额外研究 2. **准备测试数据集**:收集不同类型、不同长度的B站视频字幕 3. **定义评估标准**:制定分段质量的主观评估标准(用户测试)和客观指标(分段长度分布、边界位置合理性) 4. **成本监控设置**:在实施前建立LLM调用追踪机制 --- **Research synthesis complete. Ready for roadmap definition.**