Files
Story-extractor/docs/故事提取工具-方案设计.md
2026-04-24 16:02:16 +08:00

168 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 直播回放文字稿故事提取工具 — 方案设计文档
## 一、项目概述
### 1.1 背景
手头有大量直播回放导出的文字稿DOCX 格式),其中散落着一些个人生活故事(家长里短类),需要用 AI 自动提取整理,并与讲述者个人信息匹配,最终输出为独立的 DOCX 文档。
### 1.2 目标
构建一个 **Web 端可复用工具**,支持:
- 批量上传和管理文字稿文件
- AI 自动提取故事(过滤讲课/知识点内容)
- 人工确认故事与讲述者的匹配关系
- 为每个讲述者生成独立 DOCX个人信息 + 照片 + 故事正文)
### 1.3 使用场景
- **部署环境:** 局域网
- **用户规模:** 多人使用
- **数据规模:** 20+ 份文字稿,每份上万行
---
## 二、需求分析
### 2.1 输入
| 输入类型 | 格式 | 说明 |
|----------|------|------|
| 直播回放文字稿 | DOCX | 每份上万行,口语化,混合讲课/知识点内容,无明确说话人标记 |
| 讲述者个人信息 | DOCX一人一个 | 包含姓名、照片等个人信息 |
### 2.2 处理要求
1. **故事提取:** 从文字稿中识别并提取个人生活故事(如家庭、情感、生活等),过滤掉纯讲课/知识点内容
2. **长文本切分:** 上万行文字稿需智能切分,确保不截断完整故事(每个故事可能跨半小时到一小时,稀疏分布)
3. **匹配确认:** AI 提取故事后,由人工在界面上确认每个故事对应的讲述者
4. **文档生成:** 按简洁模板生成最终 DOCX
### 2.3 输出
每个讲述者一份 DOCX 文档,结构为:
```
┌─────────────────────────┐
│ 个人信息(含照片) │
├─────────────────────────┤
│ │
│ 故事正文 │
│ │
└─────────────────────────┘
```
### 2.4 扩展性要求
- LLM 可替换(支持升级/切换不同模型)
- 后续可扩展文章搜索引擎等功能
---
## 三、系统架构
```
┌─────────────────────────────────────────────────┐
│ 浏览器前端 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ 文件管理 │ │ 故事提取 │ │ 匹配确认 & 导出 │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└────────────────────┬────────────────────────────┘
│ HTTP API
┌────────────────────┴────────────────────────────┐
│ Python 后端 (FastAPI) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ 文件处理 │ │ LLM 服务 │ │ DOCX 生成 │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 任务队列 │ │ 数据存储 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────┘
```
---
## 四、用户交互流程
### Step 1上传文件
- 上传文字稿 DOCX支持批量显示上传列表
- 上传讲述者信息 DOCX支持批量显示上传列表 + 预览)
### Step 2提取故事
- 选择要处理的文字稿(可多选)
- 点击"开始提取",显示进度
- LLM 实时返回提取结果
- 展示故事列表(摘要 + 原文定位)
### Step 3匹配讲述者
- 左侧:故事列表
- 右侧:讲述者列表
- 拖拽/下拉匹配(或 AI 推荐候选)
- 确认匹配关系
### Step 4预览 & 导出
- 预览最终 DOCX 效果
- 单个导出 / 批量导出
- 下载 ZIP 包
---
## 五、技术栈
| 层级 | 技术 | 理由 |
|------|------|------|
| **前端** | Vue 3 + Element Plus | 组件丰富、中文生态好、拖拽匹配等交互容易实现 |
| **后端** | FastAPI | 异步支持好、自带 API 文档、适合 AI 任务 |
| **LLM** | 抽象接口层,先支持 OpenAI 兼容 API | 后续可无缝切换国产模型/本地模型 |
| **DOCX 处理** | python-docx | 读写 DOCX 的标准库 |
| **任务队列** | Celery + Redis或内置 asyncio | 20+ 文件处理需要异步,避免前端卡死 |
| **数据存储** | SQLite | 轻量、无需额外安装、局域网够用 |
| **部署** | Docker Compose | 一键启动,局域网分发方便 |
---
## 六、核心技术难点与解决方案
| 难点 | 解决方案 |
|------|----------|
| **长文本切分不截断故事** | 两阶段策略:先用 LLM 做"话题分段"(识别话题边界),再对每个话题段判断是否包含故事 |
| **故事 vs 知识点区分** | Prompt 工程 + Few-shot 示例,明确"个人生活故事"的定义和排除规则 |
| **无说话人标记** | 提取故事后展示摘要,由人工在 GUI 上匹配讲述者;后续可加入 AI 推荐候选 |
| **上万行文本的 LLM 上下文** | 话题分段后,每个段落在上下文窗口内处理;超长段落再按语义子段切分 |
---
## 七、项目结构
```
story-extractor/
├── frontend/ # Vue 3 前端
│ ├── src/
│ │ ├── views/ # 页面:文件管理、故事提取、匹配确认、导出
│ │ ├── components/ # 通用组件
│ │ └── api/ # 后端 API 调用
│ └── ...
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── api/ # API 路由
│ │ ├── services/ # 业务逻辑
│ │ │ ├── extractor.py # 故事提取核心
│ │ │ ├── llm.py # LLM 抽象层
│ │ │ ├── docx_parser.py # DOCX 解析
│ │ │ └── docx_generator.py # DOCX 生成
│ │ ├── models/ # 数据模型
│ │ └── main.py
│ └── ...
├── docker-compose.yml
└── README.md
```
---
## 八、待确认事项
- [ ] LLM API 选型OpenAI / 国产模型 / 本地模型)
- [ ] 技术栈最终确认
- [ ] 开发节奏(先跑通核心流程 vs 逐步完善)
- [ ] 讲述者信息 DOCX 的具体字段结构(需看样例)
- [ ] 文字稿样例(需看实际内容以优化切分和提取策略)