12 KiB
12 KiB
工程类会议纪要生成系统 - 架构设计精要
一、核心设计原则
分阶段生成策略 ⭐⭐⭐
核心思想:按照会议纪要的章节顺序,分阶段提取信息并生成,而不是一次性提取所有信息。
优势:
- 每阶段任务量适中,Agent负载可控
- 可逐步验证结果质量
- 出现问题可重新搜索单个阶段
- 符合人类编写纪要的思维习惯
二、整体架构概览
主窗口 (SKILL.md)
职责:流程编排 + 分阶段调度 + 逐章节生成
Phase 1: 准备阶段
├── 读取周报(主窗口)
├── 读取上周纪要(主窗口)
└── 构建索引(Agent: transcript_indexer)
输出:temp/transcript_index.json
Phase 2: 分章节提取与生成(主窗口调度 + Agent执行)
├── 2.1 生成"一、会议信息"(主窗口,无需会议转写)
├── 2.2 生成"二-1. 重点项目进展情况汇总"(主窗口,主要用周报)
├── 2.3 生成"二-2. 重点项目问题及解决方案"
│ ├── 调用Agent提取问题讨论
│ └── 主窗口合并周报问题
├── 2.4 生成"二-3. 下周工作安排"
│ ├── 调用Agent提取任务安排
│ └── 主窗口合并周报计划
├── 2.5 生成"二-4. 组内成员工作进展"
│ ├── 并行调用多个Agent提取成员反馈
│ └── 主窗口整合周报+反馈+任务
└── 2.6 生成"三、会议总结"
├── 调用Agent提取决策
└── 主窗口从已生成内容归纳总结
Phase 3: 最终输出
└── 主窗口组装完整Markdown并输出文件
三、职责分配
主窗口 (SKILL.md)
负责:
- 流程编排(按章节顺序调度)
- 读取小文件(周报、上周纪要)
- 跨源数据合并(会议 + 周报 + 上周纪要)
- 逐章节生成Markdown
- 最终文件组装输出
不负责:
- 读取大文件(会议转写)
- 分块处理逻辑
- 复杂语义分析
Agent 1: transcript_indexer
输入:无(路径固化) 职责:分块读取会议转写,构建语义索引 输出:
- 文件:
temp/transcript_index.json - 返回:摘要文字
Agent 2: transcript_searcher
输入:搜索意图(自然语言) 职责:基于索引提取特定信息 输出:JSON字符串(直接返回) 特点:轻量级,可多次调用
四、分阶段执行详细设计
Phase 1: 准备阶段
步骤 1.1: 读取周报和上周纪要(主窗口)
**执行**:
1. Glob: `input/成员本周周报/*.md`
2. 提取每个周报:姓名、P0任务、问题、下周计划
3. Glob: `input/上周会议纪要/*.md`
4. 提取"下周工作安排"表格的P0任务
**输出数据结构**:
members_data = {
"闫旭隆": {
"p0_tasks": [...],
"problems": [...],
"next_plan": [...]
},
...
}
last_week_p0_tasks = [...]
步骤 1.2: 构建会议转写索引(Agent)
**调用**:
Task(
subagent_type="transcript_indexer",
description="构建会议转写索引",
prompt="构建会议转写索引"
)
**Agent处理**:
- 分块读取会议转写(2000行/块,overlap 100)
- 为每块打语义标签
- 输出索引到 temp/transcript_index.json
**返回**:
"✅ 索引构建完成,共8块,识别10个主题"
Phase 2: 分章节提取与生成
步骤 2.1: 生成"一、会议信息"(主窗口)
**数据来源**:
- 会议时间:从会议转写文件名提取
- 参会人员:从周报文件名提取
- 记录人:固定"Claude"
**处理**:主窗口直接生成,无需Agent
**输出**:
section_1 = """
一、会议信息
- 会议时间:2025-11-18
- 参会人员:闫旭隆、江争达、...
- 记录整理人:Claude
"""
步骤 2.2: 生成"二-1. 重点项目进展情况汇总"(主窗口)
**数据来源**:
- 上周P0任务:last_week_p0_tasks
- 本周P0任务:members_data[*].p0_tasks
**处理**:主窗口直接处理
1. 取并集(上周P0 ∪ 本周P0)
2. 对每个P0任务:
- 从周报提取进展情况
- 如果周报无记录 → 标记"未完成"
**输出**:
section_2_1 = """
### 1. 重点项目进展情况汇总
| 项目名称 | 负责人 | 截止时间 | 项目进展情况 |
|---------|--------|----------|-------------|
| ... | ... | ... | ... |
"""
**注意**:此章节不需要会议转写(仅展示P0追踪)
步骤 2.3: 生成"二-2. 重点项目问题及解决方案"(Agent + 主窗口)
**步骤 2.3.1: 提取会议问题讨论(Agent)**
调用:
Task(
subagent_type="transcript_searcher",
description="提取问题讨论",
prompt=f"""
提取会议中讨论的所有问题及解决方案。
已知问题(来自周报):{members_data[*].problems}
需提取字段:
- 问题标题
- 问题描述
- 解决方案(列表)
- 责任人
- 截止时间
返回JSON格式。
"""
)
**步骤 2.3.2: 合并数据(主窗口)**
1. 接收Agent返回的problem_results
2. 与周报problems对比去重
3. 互补合并:周报简述 + 会议详细方案
**输出**:
section_2_2 = """
### 2. 重点项目问题及解决方案
#### 问题1: ...
**问题描述**: ...
**解决方案**:
1. ...
**责任人**: ...
**截止时间**: ...
"""
步骤 2.4: 生成"二-3. 下周工作安排"(Agent + 主窗口)
**步骤 2.4.1: 提取会议任务安排(Agent)**
调用:
Task(
subagent_type="transcript_searcher",
description="提取任务安排",
prompt=f"""
提取会议中讨论的下周工作安排。
已知P0任务:{last_week_p0_tasks}
需提取字段:
- 任务名称
- 负责人
- 任务描述
- 优先级(从讨论语气判断P0/P1/P2)
- 截止时间
返回JSON格式。
"""
)
**步骤 2.4.2: 合并数据(主窗口)**
1. 接收task_results
2. 与周报next_plan合并去重
3. 冲突时会议优先
4. 排序:P0 → P1 → P2
**输出**:
section_2_3 = """
### 3. 下周工作安排
| 项目名称 | 负责人 | 下周会前目标 | 优先级 | 截止时间 |
|---------|--------|------------|--------|----------|
| 🔴 ... | ... | ... | P0 | ... |
| ... | ... | ... | P1 | ... |
"""
**保存**:next_week_tasks(供后续章节使用)
步骤 2.5: 生成"二-4. 组内成员工作进展"(并行Agent + 主窗口)⭐
**步骤 2.5.1: 并行提取成员反馈(多个Agent)**
一次性并行调用:
for member in members:
Task(
subagent_type="transcript_searcher",
description=f"提取{member}反馈",
prompt=f"""
提取会议中对 {member} 的反馈(表扬/批评/建议)。
{member}的周报内容:{members_data[member]}
需提取字段:
- 反馈类型(表扬/批评/建议)
- 反馈内容
返回JSON格式。
"""
)
**步骤 2.5.2: 整合数据(主窗口)**
对每个成员:
1. 上周完成:从周报提取
2. 进行中:从周报提取
3. 收到反馈:从Agent返回提取
4. 下周任务:从next_week_tasks筛选该成员 + 周报计划去重
**输出**:
section_2_4 = """
### 4. 组内成员工作进展
#### 闫旭隆
**上周完成**:
- ✅ ...
**收到的反馈/学习建议**:
- ...
**下周任务**:
- [ ] 🔴 P0|...
- [ ] P1|...
"""
**并行优势**:成员反馈提取互不依赖,可同时执行(4-5个Agent并行)
步骤 2.6: 生成"三、会议总结"(Agent + 主窗口)
**步骤 2.6.1: 提取决策(Agent)**
调用:
Task(
subagent_type="transcript_searcher",
description="提取决策事项",
prompt="""
提取会议中的所有关键决策。
特征词:"决定"、"确定"、"采用"、"要求"
需提取字段:
- 决策内容
- 决策上下文
返回JSON格式。
"""
)
**步骤 2.6.2: 归纳总结(主窗口)**
1. 核心议题:从decision_results + next_week_tasks提取高频项目
2. 关键决策:从decision_results提取
3. 下周重点:从next_week_tasks提取P0任务
**输出**:
section_3 = """
三、会议总结
**核心议题**: ...
**关键决策**:
1. ...
**下周工作重点**:
1. ...
"""
Phase 3: 最终输出
**执行**:主窗口
**操作**:
1. 组装所有章节:
final_content = section_1 + section_2_1 + section_2_2 + ...
2. 格式化检查
3. 写入文件:`output/工程类会议纪要_{date}_第X次周会.md`
五、关键设计决策
1. 为什么分阶段而不是一次性提取?
❌ 一次性提取(原方案):
- 同时发起7-8个Agent(任务、问题、决策、4-5个成员反馈)
- 任务量大,Agent负载重
- 难以验证中间结果
- 出错需全部重来
✅ 分阶段提取(新方案):
- 每阶段1-2个Agent任务(成员反馈可并行)
- 任务量适中
- 可逐步验证
- 符合章节生成顺序
2. 哪些阶段可以并行?
可并行(步骤2.5):
- 成员反馈提取(4-5个Agent同时执行)
- 原因:每个成员独立,互不依赖
必须串行:
- 其他章节(有数据依赖)
- 例如:section 2.4生成的next_week_tasks被section 2.5使用
3. 数据传递策略
Agent → 主窗口:
- ✅ 直接返回JSON字符串
- ❌ 不写temp文件(除了索引)
- 原因:单次提取结果<10k tokens,直接传递高效
主窗口内部:
- 使用变量传递中间结果
- 例如:next_week_tasks在步骤2.4生成,步骤2.5使用
4. 主窗口 vs Agent 决策原则 ⭐本项目专用
任务是否需要读取会议转写?
├── 否 → 主窗口直接处理
│ ├── 会议信息(从文件名提取)
│ └── 项目进展(仅用周报,不参考会议转写)
│
└── 是 → **必须调用 transcript_searcher Agent**
├── Agent读取语义索引(temp/transcript_index.json)
├── 定位相关块(基于has_*字段和语义匹配)
├── 精确读取会议转写片段(基于行号范围)
└── 语义提取信息并返回JSON
⚠️ 重要:
- 本项目所有会议转写信息提取都需要语义理解
- 不存在简单关键词搜索场景
- 不使用Grep工具(会议转写72k tokens,需深度语义分析)
六、完整执行流程总结
Phase 1: 准备
├── 主窗口读周报、上周纪要
└── Agent构建索引 → temp/transcript_index.json
Phase 2: 逐章节生成
├── 2.1 会议信息(主窗口直接生成)
├── 2.2 项目进展(主窗口用周报生成)
├── 2.3 问题方案
│ ├── Agent提取会议问题
│ └── 主窗口合并周报问题
├── 2.4 下周安排
│ ├── Agent提取会议任务
│ └── 主窗口合并周报计划
├── 2.5 成员进展
│ ├── 并行Agent提取反馈(4-5个)⭐
│ └── 主窗口整合周报+反馈+任务
└── 2.6 会议总结
├── Agent提取决策
└── 主窗口归纳总结
Phase 3: 输出
└── 主窗口组装Markdown并写文件
关键特点:
- ✅ 分阶段执行,任务量可控
- ✅ 仅成员反馈提取并行(4-5个Agent)
- ✅ 其他阶段串行,确保数据依赖
- ✅ 主窗口负责跨源合并与生成
- ✅ Agent专注会议转写信息提取
七、预估Token消耗
Phase 1:
- 读周报(4个×3k): 12k
- 读上周纪要: 5k
- Agent构建索引: 72k(读会议转写)
小计: ~89k
Phase 2:
- Agent提取问题: 5k(读索引)
- Agent提取任务: 5k
- Agent提取决策: 5k
- Agent提取反馈×4: 20k(并行)
- 主窗口处理: 10k
小计: ~45k
Phase 3:
- 主窗口生成输出: 5k
总计: ~140k tokens(远低于200k限制)
八、后续优化方向
- 动态调整:如果某章节提取不理想,可重新搜索
- 增量生成:边提取边展示部分结果给用户
- 质量检查:主窗口可验证Agent返回的JSON完整性
- 错误恢复:某Agent失败不影响其他章节生成