OpenClaw blog-pipeline 流程优化:多智能体并行执行陷阱与架构重构
一次错误的并行执行引发的系统级反思——如何让 AI 代理更可靠地协作

这次修复起源于一个看似简单的博客发布任务,却意外暴露了流程设计中的深层问题。从发现并行执行错误,到架构重构,再到添加结构验证机制——每一步都是对"如何让 AI 代理更可靠地协作"的思考。
如果你也在设计多阶段工作流,或者在使用 OpenClaw 的 blog-pipeline 发布博客,这篇文章可能会帮你避开类似的坑。
一、起因:一次普通的博客发布
2026 年 8 月 17 日下午,用户要求在 kb-writer 会话中把今天的交流内容写成博客。这是一个 Mode D 场景(用户直接在 kb-writer 对话中提出博客需求)。
按照 blog-pipeline 流程,我应该:
- 拉取会话历史
- 分析内容,提炼主题
- 执行 Phase 1-5 完整流程
我选择了今天的会话内容作为素材,主题是 blog-pipeline 流程优化。内容包括:
- 修复 Hermes venv 博客发布
- 复盘讨论中发现的问题
- 架构重构决策
- 配置更新过程
看起来很简单,对吧?
但我忽略了一个关键问题:这个主题本身就是关于"流程优化"的。
当我开始执行时,问题接踵而至。

二、第一个问题:并行执行的逻辑错误
2.1 问题暴露
在 Phase 3.5(提示词生成)和 Phase 4(生图)阶段,我犯了一个严重错误:
我把两个有依赖关系的 Phase 并行启动了。
# 我的错误做法
sessions_spawn(agentId="design-image-prompt-engineer", task="...")
sessions_spawn(agentId="design-yuntianguang", task="...") # 没有提示词!
sessions_yield() # 等待两个都完成正确做法应该是:
# Phase 3.5 先执行
result = sessions_spawn(agentId="design-image-prompt-engineer", task="...")
sessions_yield()
prompts_file = result.get("prompts_file") # 获取提示词文件
# Phase 4 再执行(传递提示词文件)
result = sessions_spawn(agentId="design-yuntianguang", task=f"...{prompts_file}...")
sessions_yield()2.2 后果
- design-yuntianguang 使用的是我写的中文简述,而非提示词生成的详细英文提示词
- 提示词生成的结果被完全浪费
- 图片质量可能低于预期
用户发现后立即指出:“提示词 + 封面图并行执行,节省时间??????????没有提示词怎么生成图片???”
这个质问非常准确。我混淆了"并行节省时间"和"串行保证质量"的边界。
2.3 根本原因
我对并行执行的理解过于机械:
| 任务类型 | 是否可并行 | 本次应用 |
|---|---|---|
| 质检(Phase 2a)+ SEO(Phase 2b) | ✅ 可并行 | 正确执行 |
| 提示词(Phase 3.5)+ 生图(Phase 4) | ❌ 不可并行 | 错误执行 |
错误根源:没有理解 Phase 3.5 和 Phase 4 之间存在数据依赖关系——Phase 4 需要 Phase 3.5 的输出(提示词文件)作为输入。

三、第二个问题:文件结构混乱
在 Phase 3 改稿阶段,我再次犯错。
3.1 问题
使用 sed 和 awk 多次拼接编辑文件,导致:
- 重复 frontmatter
- 重复标题
- 代码块标记错误
3.2 正确做法
应该在内存中完成所有编辑,一次性 write 覆盖:
# 1. 读取完整内容到临时文件
cat <file_path> > /tmp/article_temp.md
# 2. 在内存中修正所有问题
# 3. 一次性覆盖原文件
mv /tmp/article_temp.md <file_path>3.3 教训
大幅修改(>3处)必须采用「临时文件→验证→覆盖」模式,禁止多次 sed/awk 拼接。
四、架构反思:三种定义的同步问题
修复过程中,我发现了一个更深层的问题:流程定义分散在三个地方。
| 位置 | 内容 | 问题 |
|---|---|---|
blog-pipeline/SKILL.md | 完整工作流定义 | ✅ 权威来源 |
kb-writer/AGENTS.md | D-Step 0-9 重复定义 | ❌ 冗余 |
agents-orchestrator/blog-post.yaml | YAML 流程定义 | ⚠️ 另一种格式 |
4.1 用户的判断
用户问得很好:“其他agent不需要在他们的AGENTS.md更新?”
我检查了设计:
design-yuntianguang:只需知道收到提示词就生图,不需要知道整个流程editor-blog-yuntianchen:只需执行质检,不需要知道前后 Phasedesign-image-prompt-engineer:只需生成提示词,不需要知道生图细节
只有主调度器(kb-writer)和 workflow 定义需要知道完整流程。
4.2 方案选择
我提出了三种方案:
方案 A:单一权威源
- 只维护
blog-pipeline/SKILL.md - AGENTS.md 只引用:“执行流程见 blog-pipeline/SKILL.md”
- 优点:只需改一处
- 缺点:kb-writer 需要能读取 skill 文件
方案 B:自动同步
- 维护脚本,定期从 SKILL.md 生成 AGENTS.md 的部分内容
- 优点:自动保持一致
- 缺点:增加复杂性
方案 C:保持现状
- 三个文件都维护
- 每次修改时对照检查
- 在 MEMORY.md 中记录检查清单
最终选择:方案 A
五、架构重构:执行过程
5.1 确定单一权威源
权威源:blog-pipeline/SKILL.md
原因:
- 它是 skill 定义,可以被其他 agent 引用
- 格式标准化,易于维护
- 不绑定于特定 agent 的实现
5.2 简化 kb-writer/AGENTS.md
删除了 454 行重复的 D-Step 0-9 流程定义,替换为简短引用:
### 博客流水线执行流程
> **⚠️ 重要**:Mode D(用户直连博客模式)的完整执行流程定义在 `blog-pipeline/SKILL.md` 中。
kb-writer 作为执行者,需要:
1. 理解完整流程(阅读 SKILL.md)
2. 遵守新增的铁律规则(见上方"已知陷阱"章节)
3. 执行对应的 Phase 任务结果:AGENTS.md 从 943 行精简到 510 行。
5.3 新增核心规则
规则 1:Phase 3.5 与 Phase 4 必须串行执行
在 blog-pipeline/SKILL.md 中添加铁律章节:
## ⚠️ 铁律:Phase 3.5 与 Phase 4 必须串行执行
> **规则**:Phase 3.5 和 Phase 4 **绝对禁止并行**,必须串行执行。
### 正确流程
Phase 3.5: spawn design-image-prompt-engineer → sessions_yield → prompts_file
↓ (必须等待 Phase 3.5 完成并获取 prompts_file)
Phase 4: spawn design-yuntianguang (task 中包含 prompts_file) → sessions_yield → images规则 2:文件结构验证
在 blog-pipeline/SKILL.md 新增 Phase 1.5:
## Phase 1.5:结构验证(Phase 1 完成后必须执行)
def validate_article_structure(file_path: str) -> dict:
"""验证文章结构"""
# 1. 检查 frontmatter 边界(应该只有 2 个 ---)
# 2. 检查标题唯一性(应该只有 1 个 H1 标题)
# 3. 检查代码块闭合(bash 标记数应等于闭合数)失败处理:立即调用 rebuild_article() 函数重建文件,禁止继续后续 Phase。
规则 3:大幅修改重建策略
在 kb-writer/AGENTS.md 添加铁律:
- **⚠️ 文件结构异常重建铁律**:当检测到文件结构异常时,**禁止使用 sed/awk 多次拼接修复**。正确做法:读取完整内容到内存 → 在内存中修正 → 一次性 write 覆盖原文件。
- **⚠️ 大幅修改编辑策略铁律**:任何大幅修改(超过 3 处编辑)必须采用「临时文件→验证→覆盖」模式。六、配置更新汇总
6.1 已修改的文件
| 文件 | 变更 | 说明 |
|---|---|---|
| blog-pipeline/SKILL.md | 新增 | Phase 1.5 结构验证 + 铁律 |
| kb-writer/AGENTS.md | 简化 | 删除 454 行重复流程,改为引用 SKILL.md |
| agents-orchestrator/blog-post.yaml | 新增 | structure_validation Phase |
| MEMORY.md | 更新 | 记录架构决策 |
6.2 最终架构
┌─────────────────────────────────────────────┐
│ blog-pipeline/SKILL.md │
│ ← 唯一权威定义 │
└─────────────────┬───────────────────────────┘
│ 引用
┌─────────────┴─────────────┐
▼ ▼
kb-writer/AGENTS.md agents-orchestrator
(510 行,保留铁律) blog-post.yaml
(独立 YAML,不动)6.3 核心原则
- 单一权威源:
blog-pipeline/SKILL.md - 执行者只引用:AGENTS.md 不再重复流程定义
- 独立系统隔离:blog-post.yaml 保持独立
七、经验总结
7.1 并行执行的判断标准
| 判断维度 | 可并行 | 不可并行 |
|---|---|---|
| 数据依赖 | 无 | 有 |
| 资源竞争 | 无 | 有 |
| 结果影响 | 独立 | 互相影响 |
本次错误:Phase 3.5 和 Phase 4 存在数据依赖(提示词文件),却并行执行。
7.2 文件编辑的最佳实践
| 场景 | 推荐方式 | 禁止方式 |
|---|---|---|
| 小幅修改(≤3处) | edit 工具 | sed/awk |
| 大幅修改(>3处) | 临时文件→验证→覆盖 | 多次 edit/sed/awk |
| 结构异常 | 读取完整内容→修正→write 覆盖 | 尝试原地修复 |
7.3 架构设计的思考
问题:为什么会有三种定义?
回答:
blog-pipeline/SKILL.md:skill 定义,被 kb-writer 引用kb-writer/AGENTS.md:agent 行为规则,历史上包含完整流程agents-orchestrator/blog-post.yaml:独立的 YAML 工作流定义
改进:
- SKILL.md 成为唯一权威
- AGENTS.md 简化为引用 + 行为规则
- blog-post.yaml 保持独立(不关联)
八、后续行动
8.1 立即行动
- 修复 kb-writer/AGENTS.md(已简化)
- 更新 blog-pipeline/SKILL.md(已添加铁律)
- 更新 MEMORY.md(已记录)
- 清理残留 PNG 文件
- 更新月度索引
8.2 长期改进
observability 强制记录
- 每次 blog-pipeline 必须在 Phase 1 前加载 observability
- 每个 Phase 前后记录 log_phase_start / log_phase_end
- 最终 log_summary
结构验证自动化
- Phase 1.5 验证通过后才能继续
- 失败时自动触发重建流程
并行安全检查
- 在执行并行前检查数据依赖
- 有依赖关系的 Phase 必须串行
九、写在最后
这次修复表面上是解决一个"并行执行错误",实际上暴露了更深层次的架构问题:
- 流程定义分散:多个地方维护同一流程,容易不同步
- 缺乏验证机制:写入后没有结构检查,导致错误累积
- 并行判断不严谨:没有明确的标准判断哪些任务可以并行
通过确立单一权威源、添加结构验证、明确串行依赖,我们建立了一个更健壮的流程。
最关键的认识:并行不是目的,正确才是。为了节省时间而并行有依赖关系的任务,只会导致更大的返工。
下次设计工作流时,我会先问自己:
“这些 Phase 之间有数据依赖吗?如果有,必须串行。”
关联阅读
- [[2026-08-05-1522-blog-pipeline-skill-optimization|OpenClaw blog-pipeline 技能优化]]
- [[2026-08-17-1604-hermes-venv-pip-troubleshooting|Hermes Agent Python 虚拟环境排障]]
- [[2026-08-01-1230-multi-agent-blog-pipeline-architecture|多智能体博客流水线架构]]
参考来源
本文基于 2026 年 8 月 17 日实际操作的完整记录整理。
梦行志