docs: complete project research
This commit is contained in:
@@ -0,0 +1,427 @@
|
||||
# Architecture Research
|
||||
|
||||
**Domain:** Skill-based Workflow Orchestration System
|
||||
**Researched:** 2026-03-13
|
||||
**Confidence:** HIGH
|
||||
|
||||
## Standard Architecture
|
||||
|
||||
### System Overview
|
||||
|
||||
技能型工作流编排系统采用分层架构,将处理逻辑、状态管理和执行协调分离。基于当前研究和行业最佳实践,推荐以下四层架构:
|
||||
|
||||
```
|
||||
+---------------------------------------------------------------+
|
||||
| Orchestration Layer |
|
||||
| [Workflow Coordinator] [State Manager] [Error Handler] |
|
||||
+---------------------------------------------------------------+
|
||||
| Skill Definition Layer |
|
||||
| [SKILL.md specs] [Schema Definitions] [Trigger Rules] |
|
||||
+---------------------------------------------------------------+
|
||||
| Execution Layer |
|
||||
| [Platform Skills] [Processing Skills] [Analysis Skills] |
|
||||
+---------------------------------------------------------------+
|
||||
| Infrastructure Layer |
|
||||
| [File System] [External APIs] [AI Services] [State Store] |
|
||||
+---------------------------------------------------------------+
|
||||
```
|
||||
|
||||
### Component Responsibilities
|
||||
|
||||
| Component | Responsibility | Typical Implementation |
|
||||
|-----------|----------------|------------------------|
|
||||
| Workflow Coordinator | 协调多个技能的执行顺序、依赖管理 | kb-workflow 主控模块 |
|
||||
| State Manager | 步骤级状态持久化、断点续传支持 | workflow_state.json + 原子写入 |
|
||||
| Error Handler | 错误分类、降级策略、重试逻辑 | 统一错误处理模块 |
|
||||
| Skill Registry | 技能发现、能力声明、Schema 注册 | SKILL.md + JSON Schema |
|
||||
| Platform Skills | 平台特定内容获取(B站/知乎) | kb-bilibili-*, kb-zhihu-* |
|
||||
| Processing Skills | 内容转换(语音识别/OCR) | kb-whisper, kb-funasr, kb-ocr |
|
||||
| Analysis Skills | AI 深度分析、报告生成 | kb-deep-analyzer |
|
||||
|
||||
## Recommended Project Structure
|
||||
|
||||
```
|
||||
kb-skills/
|
||||
+-- skills/ # 技能模块目录
|
||||
| +-- core/ # 核心基础设施
|
||||
| | +-- state_manager.py # 状态管理
|
||||
| | +-- schema_registry.py # Schema 注册
|
||||
| | +-- pipeline.py # 管道执行引擎
|
||||
| | +-- error_handler.py # 错误处理
|
||||
| |
|
||||
| +-- platforms/ # 平台技能
|
||||
| | +-- bilibili/ # B站技能组
|
||||
| | | +-- SKILL.md
|
||||
| | | +-- metadata.py
|
||||
| | | +-- content.py
|
||||
| | +-- zhihu/ # 知乎技能组
|
||||
| | +-- SKILL.md
|
||||
| | +-- metadata.py
|
||||
| | +-- content.py
|
||||
| |
|
||||
| +-- processing/ # 处理技能
|
||||
| | +-- whisper/ # 语音识别
|
||||
| | +-- funasr/ # 中文语音识别
|
||||
| | +-- ocr/ # OCR 处理
|
||||
| |
|
||||
| +-- analysis/ # 分析技能
|
||||
| +-- deep_analyzer/ # 深度分析
|
||||
|
|
||||
+-- schemas/ # JSON Schema 定义
|
||||
| +-- workflow_state.schema.json
|
||||
| +-- skill_output.schema.json
|
||||
| +-- platform_metadata.schema.json
|
||||
|
|
||||
+-- workflows/ # 工作流定义
|
||||
| +-- video_pipeline.yaml # 视频处理流程
|
||||
| +-- article_pipeline.yaml # 文章处理流程
|
||||
|
|
||||
+-- cli.py # 统一 CLI 入口
|
||||
+-- config.py # 配置管理
|
||||
```
|
||||
|
||||
### Structure Rationale
|
||||
|
||||
- **skills/core/:** 核心基础设施,所有技能共享的状态管理、Schema 验证和管道执行
|
||||
- **skills/platforms/:** 按平台组织,每个平台有自己的元数据提取和内容下载技能
|
||||
- **skills/processing/:** 内容转换技能,独立于平台
|
||||
- **skills/analysis/:** AI 分析技能,作为管道的最后阶段
|
||||
- **schemas/:** 统一的 JSON Schema 定义,确保接口一致性
|
||||
- **workflows/:** 声明式工作流定义,指定技能组合和执行顺序
|
||||
|
||||
## Architectural Patterns
|
||||
|
||||
### Pattern 1: Pipeline Orchestration (管道编排)
|
||||
|
||||
**What:** 将处理流程建模为一系列串联的步骤,每个步骤接收输入、执行处理、产生输出。
|
||||
|
||||
**When to use:** 可预测的、重复性的任务,如内容处理管道。
|
||||
|
||||
**Trade-offs:**
|
||||
- 优点:确定性执行、易于调试、支持断点续传
|
||||
- 缺点:灵活性有限,不适合需要动态决策的场景
|
||||
|
||||
**Example:**
|
||||
|
||||
```python
|
||||
# Pipeline definition
|
||||
class ContentPipeline:
|
||||
steps = [
|
||||
("parse", LinkParserSkill),
|
||||
("metadata", MetadataSkill), # depends on parse
|
||||
("download", ContentSkill), # depends on metadata
|
||||
("transcribe", TranscribeSkill), # conditional: only for video
|
||||
("analyze", AnalyzeSkill), # depends on download + transcribe
|
||||
]
|
||||
|
||||
def run(self, url: str, state: WorkflowState):
|
||||
for step_name, skill in self.steps:
|
||||
if state.is_completed(step_name):
|
||||
continue # Skip completed steps
|
||||
|
||||
result = skill.execute(state.get_step_input(step_name))
|
||||
state.mark_completed(step_name, result)
|
||||
|
||||
if not result.success:
|
||||
return self.handle_error(result.error)
|
||||
```
|
||||
|
||||
### Pattern 2: Step-Level State Management (步骤级状态管理)
|
||||
|
||||
**What:** 每个主要步骤完成后立即持久化状态,支持从任意断点恢复执行。
|
||||
|
||||
**When to use:** 长时间运行的批处理任务,可能因网络、API 限制等原因中断。
|
||||
|
||||
**Trade-offs:**
|
||||
- 优点:断点续传、执行追踪、幂等性保证
|
||||
- 缺点:状态管理开销、需要设计状态 Schema
|
||||
|
||||
**Example:**
|
||||
|
||||
```python
|
||||
# workflow_state.json
|
||||
{
|
||||
"url": "https://www.bilibili.com/video/BV1xx411c7mD",
|
||||
"platform": "bilibili",
|
||||
"content_type": "video",
|
||||
"created_at": "2026-03-13T10:00:00Z",
|
||||
"updated_at": "2026-03-13T10:15:00Z",
|
||||
"steps": {
|
||||
"parse": {
|
||||
"status": "completed",
|
||||
"output": {"video_id": "BV1xx411c7mD"},
|
||||
"completed_at": "2026-03-13T10:00:05Z"
|
||||
},
|
||||
"metadata": {
|
||||
"status": "completed",
|
||||
"output": {"title": "...", "duration": 1800},
|
||||
"completed_at": "2026-03-13T10:00:30Z"
|
||||
},
|
||||
"download": {
|
||||
"status": "in_progress",
|
||||
"output": null,
|
||||
"started_at": "2026-03-13T10:01:00Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Pattern 3: Schema-First Interface Design (Schema 优先接口设计)
|
||||
|
||||
**What:** 先定义输入输出的 JSON Schema,再实现技能逻辑。所有技能遵守统一的接口规范。
|
||||
|
||||
**When to use:** 多人协作、需要接口稳定性和可测试性的项目。
|
||||
|
||||
**Trade-offs:**
|
||||
- 优点:接口清晰、易于测试、支持自动验证
|
||||
- 缺点:前期设计成本、Schema 维护负担
|
||||
|
||||
**Example:**
|
||||
|
||||
```json
|
||||
// schemas/skill_output.schema.json
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"required": ["success", "data"],
|
||||
"properties": {
|
||||
"success": {"type": "boolean"},
|
||||
"data": {"type": "object"},
|
||||
"error": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"code": {"type": "string"},
|
||||
"message": {"type": "string"},
|
||||
"detail": {"type": "string"}
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"duration_ms": {"type": "number"},
|
||||
"tokens_used": {"type": "number"}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Pattern 4: Idempotent Execution (幂等执行)
|
||||
|
||||
**What:** 相同输入重复执行产生相同结果,不会产生副作用(如重复文件)。
|
||||
|
||||
**When to use:** 任何可能需要重试的处理步骤。
|
||||
|
||||
**Trade-offs:**
|
||||
- 优点:安全重试、简化错误恢复
|
||||
- 缺点:需要设计去重逻辑
|
||||
|
||||
**Example:**
|
||||
|
||||
```python
|
||||
class ContentSkill:
|
||||
def execute(self, input: dict) -> SkillOutput:
|
||||
# Generate deterministic filename from input
|
||||
content_hash = hashlib.sha256(input['url'].encode()).hexdigest()[:12]
|
||||
output_path = self.get_output_dir() / f"{content_hash}.mp4"
|
||||
|
||||
# Check if already exists
|
||||
if output_path.exists():
|
||||
return SkillOutput(success=True, data={"path": str(output_path), "cached": True})
|
||||
|
||||
# Download content
|
||||
self.download_content(input['url'], output_path)
|
||||
return SkillOutput(success=True, data={"path": str(output_path), "cached": False})
|
||||
```
|
||||
|
||||
## Data Flow
|
||||
|
||||
### Content Processing Pipeline
|
||||
|
||||
```
|
||||
[URL Input]
|
||||
|
|
||||
v
|
||||
+-------------+ +----------------+
|
||||
| Link Parser | --> | Platform/Type |
|
||||
+-------------+ | Detection |
|
||||
+----------------+
|
||||
|
|
||||
+---------------+---------------+
|
||||
| |
|
||||
v v
|
||||
+-------------+ +-------------+
|
||||
| Bilibili | | Zhihu |
|
||||
| Pipeline | | Pipeline |
|
||||
+-------------+ +-------------+
|
||||
| |
|
||||
+------+------+ +-------+-------+
|
||||
| | | |
|
||||
v v v v
|
||||
[Metadata] [Download] [Metadata] [Download]
|
||||
| | | |
|
||||
+------+------+ +-------+-------+
|
||||
| |
|
||||
v v
|
||||
+-------------+ +-------------+
|
||||
| Video? | | Article |
|
||||
| - Whisper | | - Direct |
|
||||
| - FunASR | | Extract |
|
||||
| - OCR | +-------------+
|
||||
+-------------+ |
|
||||
| |
|
||||
+---------------+--------------+
|
||||
|
|
||||
v
|
||||
+-----------------+
|
||||
| Deep Analyzer |
|
||||
| (AI Analysis) |
|
||||
+-----------------+
|
||||
|
|
||||
v
|
||||
+-----------------+
|
||||
| Archive to |
|
||||
| Knowledge Base |
|
||||
+-----------------+
|
||||
```
|
||||
|
||||
### State Management Flow
|
||||
|
||||
```
|
||||
[Workflow Start]
|
||||
|
|
||||
v
|
||||
+------------------+
|
||||
| Load/Init State | <-- workflow_state.json
|
||||
+------------------+
|
||||
|
|
||||
v
|
||||
+------------------+ +------------------+
|
||||
| For Each Step | --> | Check Status |
|
||||
+------------------+ | - completed? skip|
|
||||
| | - failed? retry |
|
||||
v | - pending? run |
|
||||
+------------------+ +------------------+
|
||||
| Execute Step | |
|
||||
+------------------+ v
|
||||
| +------------------+
|
||||
v | Mark Completed |
|
||||
+------------------+ | Save State |
|
||||
| Validate Output | -->| (atomic write) |
|
||||
+------------------+ +------------------+
|
||||
|
|
||||
v
|
||||
[Next Step / Complete]
|
||||
```
|
||||
|
||||
### Key Data Flows
|
||||
|
||||
1. **URL to Metadata:** URL -> Link Parser -> (platform, type, id) -> Platform Metadata Skill -> Metadata JSON
|
||||
2. **Metadata to Content:** Metadata JSON -> Content Skill -> (video file / article text)
|
||||
3. **Content to Transcript:** Video File -> Transcribe Skill (Whisper/FunASR) -> Transcript JSON
|
||||
4. **Content + Transcript to Analysis:** Content + Transcript -> Deep Analyzer -> Analysis Report
|
||||
|
||||
## Scaling Considerations
|
||||
|
||||
| Scale | Architecture Adjustments |
|
||||
|-------|--------------------------|
|
||||
| 1-100 items/day | 当前架构足够,单进程执行 |
|
||||
| 100-1000 items/day | 添加任务队列,并行处理独立任务 |
|
||||
| 1000+ items/day | 分布式任务调度,API 请求限流,缓存层 |
|
||||
|
||||
### Scaling Priorities
|
||||
|
||||
1. **First bottleneck:** 外部 API 限流(B站/知乎)。解决方案:请求队列 + 指数退避重试
|
||||
2. **Second bottleneck:** AI 分析耗时。解决方案:批处理 + 并行分析
|
||||
|
||||
## Anti-Patterns
|
||||
|
||||
### Anti-Pattern 1: Global State Mutation
|
||||
|
||||
**What people do:** 在多个技能间共享可变全局状态
|
||||
|
||||
**Why it's wrong:** 难以追踪状态变化、难以测试、难以恢复
|
||||
|
||||
**Do this instead:** 每个步骤从 state 读取输入,将输出写回 state,状态变更通过 state manager 集中管理
|
||||
|
||||
### Anti-Pattern 2: Implicit Dependencies
|
||||
|
||||
**What people do:** 技能之间通过隐式约定传递数据(如固定文件路径)
|
||||
|
||||
**Why it's wrong:** 脆弱的耦合,修改一个技能可能破坏其他技能
|
||||
|
||||
**Do this instead:** 在 workflow_state.json 中显式声明依赖关系,通过 state manager 传递数据
|
||||
|
||||
### Anti-Pattern 3: Silent Failure
|
||||
|
||||
**What people do:** 捕获异常后只打印日志,继续执行
|
||||
|
||||
**Why it's wrong:** 下游步骤收到无效输入,产生难以调试的错误
|
||||
|
||||
**Do this instead:** 明确的失败处理策略 - 要么终止并记录,要么降级并提供默认值
|
||||
|
||||
### Anti-Pattern 4: Non-Idempotent Operations
|
||||
|
||||
**What people do:** 每次执行都创建新文件(如 `output_1.mp4`, `output_2.mp4`)
|
||||
|
||||
**Why it's wrong:** 重试产生垃圾文件,磁盘占用增长
|
||||
|
||||
**Do this instead:** 基于输入生成确定性文件名,已存在则跳过
|
||||
|
||||
## Integration Points
|
||||
|
||||
### External Services
|
||||
|
||||
| Service | Integration Pattern | Notes |
|
||||
|---------|---------------------|-------|
|
||||
| Bilibili API | HTTP + Cookie Auth | 需要 BILIBILI_COOKIE 环境变量 |
|
||||
| Zhihu API | HTTP + Cookie Auth | 需要 ZHIHU_COOKIE 环境变量 |
|
||||
| AI Provider | OpenAI-compatible API | 需要 AI_API_KEY 环境变量 |
|
||||
| HuggingFace | API + Local Cache | 需要 HF_TOKEN 环境变量 |
|
||||
| Git | Command Line | 需要 KB_GIT_USER/EMAIL 配置 |
|
||||
|
||||
### Internal Boundaries
|
||||
|
||||
| Boundary | Communication | Notes |
|
||||
|----------|---------------|-------|
|
||||
| Orchestrator <-> Skills | JSON via stdin/stdout | 标准化输入输出格式 |
|
||||
| Skills <-> State Manager | File I/O | workflow_state.json |
|
||||
| Skills <-> External APIs | HTTP | 统一错误处理和重试 |
|
||||
|
||||
## Build Order Implications
|
||||
|
||||
基于组件依赖关系,建议的构建顺序:
|
||||
|
||||
### Phase 1: Foundation (基础设施)
|
||||
1. **State Manager** - 所有后续组件的基础
|
||||
2. **Schema Registry** - 定义统一的输入输出格式
|
||||
3. **Error Handler** - 统一错误处理模式
|
||||
|
||||
### Phase 2: Core Skills (核心技能)
|
||||
4. **Link Parser** - 入口点,无依赖
|
||||
5. **Platform Metadata Skills** - 依赖 Link Parser 输出
|
||||
6. **Platform Content Skills** - 依赖 Metadata 输出
|
||||
|
||||
### Phase 3: Processing Skills (处理技能)
|
||||
7. **Whisper/FunASR** - 依赖视频文件
|
||||
8. **OCR Processor** - 依赖视频截图
|
||||
|
||||
### Phase 4: Analysis Skills (分析技能)
|
||||
9. **Deep Analyzer** - 依赖内容和转录文本
|
||||
|
||||
### Phase 5: Orchestration (编排层)
|
||||
10. **Pipeline Engine** - 组合所有技能
|
||||
11. **Workflow Definitions** - 声明式流程定义
|
||||
|
||||
## Sources
|
||||
|
||||
- [AI Architecture Patterns 101: Workflows, Agents, MCPs, and A2A Systems](https://aipmguru.substack.com/p/ai-architecture-patterns-101-workflows) - HIGH confidence, comprehensive pattern overview
|
||||
- [Data Pipeline Architecture: 5 Design Patterns with Examples - Dagster](https://dagster.io/guides/data-pipeline-architecture-5-design-patterns-with-examples) - HIGH confidence, pipeline patterns
|
||||
- [Agentic Workflows in 2026: The ultimate guide - Vellum](https://www.vellum.ai/blog/agentic-workflows-emerging-architectures-and-design-patterns) - HIGH confidence, agent architecture patterns
|
||||
- [State of Open Source Workflow Orchestration Systems 2025](https://www.pracdata.io/p/state-of-workflow-orchestration-ecosystem-2025) - MEDIUM confidence, ecosystem overview
|
||||
- [ML Pipeline Architecture Design Patterns - Neptune.ai](https://neptune.ai/blog/ml-pipeline-architecture-design-patterns) - MEDIUM confidence, ML-specific patterns
|
||||
|
||||
---
|
||||
|
||||
*Architecture research for: Skill-based Workflow Orchestration System*
|
||||
*Researched: 2026-03-13*
|
||||
Reference in New Issue
Block a user