7e0acef4f9
- Add complete skill set including feishu, github, ci-gen, etc. - Add workspace documentation (AGENTS.md, SOUL.md, etc.) - Add memory system and project context
297 lines
9.9 KiB
Markdown
297 lines
9.9 KiB
Markdown
# Obsidian 知识库维护技能 - 完整实施计划(含长视频分段)
|
|
|
|
**目标:** 构建可扩展的多源内容知识库维护系统,支持B站/YouTube/知乎/本地Markdown汇入Obsidian,并解决超长视频上下文溢出问题
|
|
**方法:** 模块化架构 + 源适配器模式 + 主题聚合机制 + 动态分段分析
|
|
**预估总时间:** ~5-7小时(可并行)
|
|
|
|
---
|
|
|
|
## 核心特性
|
|
|
|
### 多源内容支持
|
|
- B站收藏夹/UP主视频
|
|
- YouTube频道/播放列表
|
|
- 知乎专栏/回答
|
|
- 本地Markdown文件
|
|
|
|
### 智能分析流程
|
|
1. **轻量扫描** - 一句话摘要 + 质量评分
|
|
2. **Inbox管理** - 候选列表,用户确认后再分析
|
|
3. **深度分析** - 结构化笔记生成
|
|
4. **长视频分段** - 30分钟+视频自动分段处理
|
|
5. **主题聚合** - 相似内容自动归类
|
|
6. **Git同步** - 自动commit/push
|
|
|
|
---
|
|
|
|
## 多代理并行模型分配策略
|
|
|
|
**统一使用最强模型:`kimi-coding/k2p5`**
|
|
|
|
| Checkpoint | 任务类型 | 模型 |
|
|
|-----------|---------|------|
|
|
| **Checkpoint 1-2** | 项目脚手架、数据模型 | `kimi-coding/k2p5` |
|
|
| **Checkpoint 3** | B站适配器开发 | `kimi-coding/k2p5` |
|
|
| **Checkpoint 4-5** | 内容处理管道 + 分段分析 | `kimi-coding/k2p5` |
|
|
| **Checkpoint 6** | CLI命令实现 | `kimi-coding/k2p5` |
|
|
| **Checkpoint 7-8** | 模板与测试 | `kimi-coding/k2p5` |
|
|
|
|
---
|
|
|
|
## Checkpoint 1: 项目脚手架与配置 (~30min)
|
|
|
|
- [ ] Task 1.1: 创建技能目录 `skills/obsidian-kb/`
|
|
- **Action:** 创建目录结构
|
|
```
|
|
obsidian-kb/
|
|
├── src/
|
|
│ ├── __init__.py
|
|
│ ├── cli.py # 命令行入口
|
|
│ ├── config.py # 配置管理
|
|
│ ├── models.py # 统一元数据模型
|
|
│ ├── pipeline.py # 内容处理管道
|
|
│ ├── storage.py # 本地存储/Inbox管理
|
|
│ ├── git_sync.py # Git同步
|
|
│ ├── content_chunker.py # 长视频分段工具 [新增]
|
|
│ └── sources/
|
|
│ ├── __init__.py
|
|
│ ├── base.py # 源适配器基类
|
|
│ ├── bilibili.py # B站适配器
|
|
│ ├── youtube.py # YouTube适配器
|
|
│ ├── zhihu.py # 知乎适配器
|
|
│ └── local.py # 本地Markdown扫描
|
|
│ └── templates/
|
|
│ ├── light_video.md
|
|
│ ├── tutorial_video.md
|
|
│ ├── article.md
|
|
│ └── topic_index.md
|
|
├── tests/
|
|
└── requirements.txt
|
|
```
|
|
|
|
- [ ] Task 1.2: 创建 `SKILL.md`
|
|
- **Verify:** 包含命令: `/kb-subscribe`, `/kb-inbox`, `/kb-process`, `/kb-skip`, `/kb-status`, `/kb-search`
|
|
|
|
- [ ] Task 1.3: 创建配置模板 `config.yaml.example`
|
|
- **Verify:** 包含: kimi_api_key, git_repo, git_token, obsidian_path, quality_threshold, chunking配置
|
|
|
|
---
|
|
|
|
## Checkpoint 2: 核心数据模型与存储 (~40min)
|
|
|
|
- [ ] Task 2.1: 实现 `models.py` - 统一元数据模型
|
|
- **Action:** 定义 Content 类,包含核心字段
|
|
- **字段:** id, source, source_id, url, title, author, description, duration, content_type, transcript, etc.
|
|
|
|
- [ ] Task 2.2: 实现 `storage.py` - Inbox/Topics存储管理
|
|
- **Action:** Inbox队列管理、Topics目录结构、主题聚合检测
|
|
|
|
- [ ] Task 2.3: 实现 `git_sync.py` - Git自动同步
|
|
- **Action:** 检测变更、自动生成commit message、执行commit+push
|
|
|
|
---
|
|
|
|
## Checkpoint 3: 源适配器基类与B站实现 (~60min)
|
|
|
|
- [ ] Task 3.1: 实现 `sources/base.py` - 源适配器基类
|
|
- **Action:** 定义抽象基类 SourceAdapter
|
|
- **方法:** fetch_new(), extract_content(), get_transcript()
|
|
|
|
- [ ] Task 3.2: 实现 `sources/bilibili.py` - B站适配器
|
|
- **Action:**
|
|
- fetch_new(): 获取收藏夹/UP主动态
|
|
- extract_content(): 从URL提取元数据
|
|
- get_transcript(): 获取字幕(支持AI字幕和CC字幕)
|
|
|
|
- [ ] Task 3.3: 实现 `sources/local.py` - 本地Markdown扫描
|
|
- **Action:** 扫描指定目录的Markdown文件,提取YAML frontmatter
|
|
|
|
- [ ] Task 3.4: 创建源注册表 `sources/__init__.py`
|
|
- **Action:** SourceRegistry,支持动态注册新适配器
|
|
|
|
---
|
|
|
|
## Checkpoint 4: 内容处理管道 (~50min)
|
|
|
|
- [ ] Task 4.1: 实现轻量扫描阶段
|
|
- **Action:** 调用AI生成一句话摘要、提取关键词、质量评分(0-10)
|
|
|
|
- [ ] Task 4.2: 实现深度分析阶段
|
|
- **Action:** 根据content_type和duration选择分析策略
|
|
- **策略:**
|
|
- 短视频(<10min): 轻量结构
|
|
- 长教程(>10min): 详细时间轴拆解
|
|
- 文章: 结构大纲+核心观点
|
|
|
|
- [ ] Task 4.3: 实现自适应模板系统
|
|
- **Action:** 创建模板渲染器,根据content_type选择模板
|
|
|
|
- [ ] Task 4.4: 实现主题聚合检测
|
|
- **Action:** AI对比新内容与现有Topics,计算相似度
|
|
|
|
- [ ] Task 4.5: 实现 `pipeline.py` - 整合所有阶段
|
|
- **Action:** 编排: 轻量扫描→入库→深度分析→生成笔记→Git同步
|
|
|
|
---
|
|
|
|
## Checkpoint 5: 长视频分段分析 (~45min) [新增]
|
|
|
|
### 5.1 基础结构搭建
|
|
|
|
- [ ] Task 5.1.1: 创建 `src/content_chunker.py` 模块
|
|
- **Action:** 实现 `ContentChunker` 类
|
|
- **方法:**
|
|
- `chunk_by_duration(srt_text, chunk_duration_seconds)` - 按时长分割
|
|
- `chunk_by_count(srt_text, num_chunks)` - 按段数分割
|
|
- `estimate_chunks(duration_seconds)` - 估算段数
|
|
- **返回:** `List[Chunk]`,每个Chunk包含text, start_time, end_time
|
|
|
|
- [ ] Task 5.1.2: 实现 `get_chunking_strategy(duration_seconds)` 函数
|
|
- **策略:**
|
|
- <10分钟: direct(直接分析)
|
|
- 10-30分钟: truncate(截断至8000字符)
|
|
- 30-60分钟: chunk_2(分2段)
|
|
- 60分钟+: chunk_N(每15分钟一段)
|
|
|
|
- [ ] Task 5.1.3: 更新 `config.yaml` 添加分段配置
|
|
```yaml
|
|
chunking:
|
|
long_video_threshold: 1800 # 30分钟(秒)
|
|
medium_video_threshold: 3600 # 60分钟(秒)
|
|
chunk_duration: 900 # 每段15分钟(秒)
|
|
max_chars_per_chunk: 6000 # 每段最大字符数
|
|
summary_max_length: 500 # 每段摘要最大字数
|
|
```
|
|
|
|
- [ ] Task 5.1.4: 更新 `config.py` 读取chunking配置
|
|
|
|
### 5.2 MultiAIClient 改造
|
|
|
|
- [ ] Task 5.2.1: 修改 `_deep_analyze()` 方法
|
|
- **Action:** 添加时长判断逻辑
|
|
```python
|
|
if duration >= 1800: # 30分钟以上
|
|
return self._analyze_in_chunks(content_text, duration)
|
|
```
|
|
|
|
- [ ] Task 5.2.2: 实现 `_analyze_in_chunks(content_text, duration)`
|
|
- **Action:**
|
|
- 根据时长决定分段数(30-60分→2段,60分+→每15分钟一段)
|
|
- 循环每段,调用 `_analyze_chunk()` 获取摘要
|
|
- 收集所有段摘要
|
|
- 调用 `_merge_summaries()` 生成最终结果
|
|
|
|
- [ ] Task 5.2.3: 实现 `_analyze_chunk(chunk_text)`
|
|
- **Action:** 调用AI生成单段摘要(限制500字)
|
|
|
|
- [ ] Task 5.2.4: 实现 `_merge_summaries(summaries, content_type)`
|
|
- **Action:** 将所有段摘要合并,生成完整分析报告
|
|
|
|
### 5.3 测试验证
|
|
|
|
- [ ] Task 5.3.1: 创建 `tests/test_chunking.py`
|
|
- **Action:** 测试 ContentChunker 的分割逻辑
|
|
- **覆盖:** 正常分割、短文本、空文本
|
|
|
|
- [ ] Task 5.3.2: 创建测试数据 `tests/fixtures/sample_long_video.srt`
|
|
- **Action:** 模拟1小时视频字幕(约15000字符)
|
|
|
|
- [ ] Task 5.3.3: 创建测试脚本 `test_long_video.py`
|
|
- **Action:** 手动测试长视频分析流程
|
|
|
|
---
|
|
|
|
## Checkpoint 6: CLI命令实现 (~40min)
|
|
|
|
- [ ] Task 6.1: 实现 `/kb-subscribe` 命令
|
|
- **Action:** 支持订阅B站收藏夹、UP主、YouTube频道
|
|
|
|
- [ ] Task 6.2: 实现 `/kb-inbox` 命令
|
|
- **Action:** 显示待处理候选列表,带摘要和评分
|
|
|
|
- [ ] Task 6.3: 实现 `/kb-process` 命令
|
|
- **Action:** 处理指定ID或全部确认的内容
|
|
- **注意:** 长视频自动触发分段分析
|
|
|
|
- [ ] Task 6.4: 实现 `/kb-skip` 命令
|
|
- **Action:** 跳过指定内容,记录跳过原因
|
|
|
|
- [ ] Task 6.5: 实现 `/kb-status` 命令
|
|
- **Action:** 显示同步状态、Inbox数量、今日处理量
|
|
|
|
- [ ] Task 6.6: 实现 `/kb-search` 命令
|
|
- **Action:** 搜索已处理的笔记
|
|
|
|
---
|
|
|
|
## Checkpoint 7: 模板与文档 (~30min)
|
|
|
|
- [ ] Task 7.1: 创建所有Markdown模板
|
|
- light_video.md
|
|
- tutorial_video.md
|
|
- article.md
|
|
- topic_index.md
|
|
|
|
- [ ] Task 7.2: 完善 `SKILL.md` 使用文档
|
|
|
|
- [ ] Task 7.3: 创建 `README.md`
|
|
|
|
---
|
|
|
|
## Checkpoint 8: 测试与验证 (~30min)
|
|
|
|
- [ ] Task 8.1: 编写单元测试
|
|
- **Action:** 测试核心模块: models, storage, pipeline, chunking
|
|
|
|
- [ ] Task 8.2: 集成测试
|
|
- **Action:** 端到端测试: 订阅→爬取→分析(含长视频分段)→生成→同步
|
|
|
|
- [ ] Task 8.3: 手动验证
|
|
- **Action:** 实际处理1-2个B站视频(含长视频),检查输出
|
|
|
|
---
|
|
|
|
## Verification Criteria
|
|
|
|
- [ ] 所有Checkpoints完成
|
|
- [ ] 可以订阅B站收藏夹并获取新内容
|
|
- [ ] Inbox预览功能正常,显示摘要和评分
|
|
- [ ] 确认处理后生成格式正确的Markdown
|
|
- [ ] **长视频(30分钟+)能正常分段分析,不抛Context overflow错误**
|
|
- [ ] 相似内容自动归入同一主题
|
|
- [ ] Git自动同步工作正常
|
|
- [ ] 代码通过基本测试
|
|
- [ ] 文档完整可理解
|
|
|
|
---
|
|
|
|
## 视频处理策略总结
|
|
|
|
| 视频时长 | 处理策略 | API调用次数 |
|
|
|---------|---------|------------|
|
|
| < 10分钟 | 直接完整分析 | 1次 |
|
|
| 10-30分钟 | 截断至8000字符分析 | 1次 |
|
|
| 30-60分钟 | 分2段分析 | 3次(2段摘要+1次合并) |
|
|
| 60分钟+ | 每15分钟一段 | N+1次(N段+1次合并) |
|
|
|
|
---
|
|
|
|
## 执行选项
|
|
|
|
**选项1: 单代理顺序执行**
|
|
- 在当前会话中按Checkpoint顺序执行
|
|
- 每个Checkpoint完成后汇报进度
|
|
|
|
**选项2: 多代理并行(推荐)**
|
|
- 同时启动多个子代理并行工作
|
|
|
|
| 代理 | Checkpoint | 任务 |
|
|
|------|-----------|------|
|
|
| 代理A | 1-2 | 项目基础 + 数据模型 |
|
|
| 代理B | 3 | B站适配器 |
|
|
| 代理C | 4-5 | 内容处理管道 + 分段分析 |
|
|
| 代理D | 6 | CLI命令 |
|
|
| 代理E | 7-8 | 模板 + 测试 |
|
|
|
|
**选择哪种执行方式?**
|