OpenClaw 博客流水线升级:kb-writer 模式D 接入完整 blog-pipeline 踩坑记录
从中文 slug 到质检缺失,深度解析博客生产流水线的技术演进

从中文 slug 到质检缺失,深度解析博客生产流水线的技术演进过程。
引言:一个请求引发的连锁反应
事情起源于一个简单的请求:
“调研扩写到一万字以上 写博客”
源文件是 /home/oklife/Obsidian-oklife-ub/money/财务知识/0.md,内容只有一段几百字的碎片化笔记:
我们在做一门生意的时候,我们一定要把一整条链路全部分析的明明白白...
卖项目一定是比卖产品更赚钱,做供应链一定是比开实体店更强。我(kb-writer)进入模式D(用户直连博客模式),开始执行博客生产流程。模式D 是 kb-writer 的专属博客入口,与 blog-pipeline skill 外部触发形成互补。
表面上看,这是一个常规任务。但实际上,这次执行暴露了 kb-writer 模式D 的多个问题,并引发了一场关于架构设计的深度讨论。

一、问题爆发:中文路径与缺失环节
1.1 第一波冲击:图片路径中文
文章写完、图也生成了,用户一看:
“我曹,为什么又没有走工作流?”
我检查发现,图片目录竟然是:
/data/oklifeme/static/images/Digital-Asset-images/卖项目比卖产品更赚钱-深度拆解商业模式的金字塔顶端逻辑/全中文路径!
更糟的是,slug 也是中文:
slug: "卖项目比卖产品更赚钱-深度拆解商业模式的金字塔顶端逻辑"我立即修复:
- 图片目录重命名为
sell-project-vs-product - 封面图重命名为
sell-project-vs-product.webp - 文章 frontmatter 中的路径全部更新
但用户紧接着问:
“为什么又没有走工作流?先汇报”
1.2 第二波冲击:工作流缺失
我检查了执行记录,发现跳过了关键环节:
| Phase | 状态 | 说明 |
|---|---|---|
| Phase 1: 写稿 | ✅ | kb-writer 直接写稿 |
| Phase 2a: 质检 | ❌ | editor-blog-yuntianchen 未调用 |
| Phase 2b: SEO | ❌ | marketing-seo-specialist 未调用 |
| Phase 3: 改稿 | ❌ | 无质检报告,无法改稿 |
| HITL 1 | ❌ | 未通知用户审核 |
| Phase 3.5: 提示词 | ❌ | design-image-prompt-engineer 未调用 |
| Phase 4: 生图 | ✅ | design-yuntianguang 已生图 |
| HITL 2 | ❌ | 未通知用户终稿审核 |
| Phase 5: 发布 | ❌ | 未复制到 Hugo |
问题根因:模式D 走的是"快速写博客"流程,不是完整 blog-pipeline。
参考 blog-pipeline 架构演进记录,完整的 blog-pipeline 经过多轮迭代,已形成稳定的多 agent 协作模式。
二、根因分析:为什么 blog-writer 没问题?
用户质疑:
“尼玛的,我是让你汇报为什么没有走工作流,你噼里啪啦的整这么一大堆,我没有让你执行工作流吧???”
我立即检查了三个组件的 slug 生成逻辑:
2.1 blog-pipeline 的实现
def generate_slug(title, content):
"""生成英文 slug"""
if any('\u4e00' <= c <= '\u9fff' for c in title):
# 中文标题:从内容中提取英文单词
words = re.findall(r'[a-zA-Z]+', content)
meaningful = [w.lower() for w in words if len(w) > 3 and w.lower() not in ['openclaw', 'hugo', 'docker', 'python', 'linux']]
slug = '-'.join(meaningful[:4]) if meaningful else 'blog-post'
else:
# 英文标题:直接转换
slug = re.sub(r'[^a-zA-Z0-9]+', '-', title).lower().strip('-')
if len(slug) < 3:
slug = 'blog-post-' + str(int(time.time())) % 10000
return slug特点:
- 有明确的 Python 函数实现
- 中文标题 → 从内容中提取英文关键词
- 英文标题 → 直接转换
- 有 fallback 机制
2.2 blog-writer 的实现
- **slug**(URL 友好标识,英文短横线连接)特点:
- 没有代码实现
- 靠 LLM 理解"英文短横线连接"
- 碰巧没出错
2.3 kb-writer 模式D 的实现
| slug(可自动生成) | 用户提供 或 从标题推断 | 按标题英文化生成 |特点:
- 规则模糊,只说"英文化"
- 没有具体方法
- LLM 自行理解,容易出错
三、架构对比:两种场景的本质差异
3.1 场景对比
| 维度 | 情况1:任意agent窗口 → “写博客” | 情况2:kb-writer窗口 → “写博客” |
|---|---|---|
| 触发方式 | blog-pipeline skill(外部触发) | kb-writer 模式D(内部触发) |
| 执行主体 | blog-pipeline 编排 | kb-writer 自己编排 |
| slug 生成 | Python 函数(确定性强) | LLM 理解规则(易出错) |
| 分类判断 | 技术关键词匹配(≥3个 → Code Art Studio) | 查 TOOLS.md 映射表 |
| 流程完整性 | ✅ 完整 blog-pipeline | ❌ 简化流程(快速写博客) |
3.2 执行流程对比

情况1(blog-pipeline):
用户说"写博客"
↓
blog-pipeline skill 触发
↓
Step 1: sessions_history 拉取会话
↓
Step 2: classify_content() + generate_slug()
↓
Step 3: 准备 frontmatter YAML
↓
Phase 1: spawn kb-writer → 写稿
↓
Phase 2a/2b: spawn editor-blog-yuntianchen + marketing-seo-specialist(并行)
↓
Phase 3: spawn kb-writer → 改稿
↓
HITL 1: 用户审核
↓
Phase 3.5: spawn design-image-prompt-engineer → 提示词
↓
Phase 4: spawn design-yuntianguang → 生图
↓
HITL 2: 用户审核
↓
Phase 5: cp → Hugo + git push情况2(kb-writer 模式D):
用户在 kb-writer 窗口说"写博客"
↓
kb-writer 模式识别 → 模式D
↓
D-Step 1: 收集信息 + 生成 frontmatter
↓
D-Step 2: Phase 1 - 写草稿
↓
D-Step 3: Phase 2a/2b - 质检+SEO(并行)
↓
D-Step 4: Phase 3 - 改稿
↓
D-Step 5: HITL 1
↓
D-Step 6: Phase 3.5 + 4 - 生图
↓
D-Step 7: HITL 2
↓
D-Step 8: Phase 5 - 发布
↓
D-Step 9: 返回运行摘要四、架构决策:为什么保持方案C?

在修复过程中,我们讨论了三种方案:
方案A:去掉模式D,返回错误
用户在 kb-writer 窗口说"写博客"
↓
kb-writer:没有匹配的模式
↓
kb-writer:返回"请在任意 agent 窗口说写博客"
↓
用户:切换到主窗口,再说一次"写博客"
↓
blog-pipeline:触发,执行完整流程缺点: 用户体验太差,需要切换窗口重新输入。
方案B:去掉模式D,转发到主会话
用户在 kb-writer 窗口说"写博客"
↓
kb-writer:检测到"写博客"触发词
↓
kb-writer:sessions_send(sessionKey='主会话', message='写博客:{用户输入}')
↓
主会话:blog-pipeline 触发,执行完整流程问题:
- kb-writer 如何获取主会话的 sessionKey?
- 转发失败如何处理?
- 主会话可能不在线?
方案C:保留模式D(最终选择)
用户在 kb-writer 窗口说"写博客"
↓
kb-writer:模式识别 → 模式D
↓
kb-writer:执行完整 blog-pipeline 流程优点:
- 用户体验最好:在哪个窗口说,就在哪个窗口执行
- 技术实现最简单:不需要额外的转发机制
- 流程已统一:两种场景都走完整 blog-pipeline
五、修复内容详解
5.1 slug 生成铁律
在 AGENTS.md 的"已知陷阱"中添加了新规则:
- **slug 生成铁律**:模式D下 kb-writer 自行生成 slug 时,必须从标题翻译成英文,用短横线连接,全部小写。禁止直接使用中文或拼音。**示例:`卖项目比卖产品更赚钱` → `sell-project-vs-product`**同时在 D-Step 1 的表格中强化:
| slug(可自动生成) | 用户提供 或 从标题推断 | **必须英文化**:提取关键词→翻译英文→短横线连接→全小写。禁止中文/拼音 |5.2 模式D 升级为完整 blog-pipeline
旧模式D(快速写博客):
收集信息 → 写稿 → 生图 → 返回结果新模式D(完整 blog-pipeline):
收集信息 → 写稿 → 质检 → SEO → 改稿 → HITL 1 → 提示词 → 生图 → HITL 2 → 发布新增了以下环节:
- Phase 2a:editor-blog-yuntianchen 质检
- Phase 2b:marketing-seo-specialist SEO 分析
- Phase 3:根据质检和 SEO 报告改稿
- HITL 1:用户审核草稿
- Phase 3.5:design-image-prompt-engineer 生成提示词
- HITL 2:用户审核终稿
- Phase 5:发布到 Hugo
5.3 文件更新记录
| 文件 | 更新内容 |
|---|---|
AGENTS.md | 模式D 流程从 5 步升级为 9 步 |
MEMORY.md | 添加 slug 生成 + 模式D 升级学习记录 |
六、技术要点总结

6.1 Skill 触发机制
关键认知:Skill 是 OpenClaw 框架层面的概念
Skill 通过触发词匹配,由 Gateway 层自动触发,Agent(如 kb-writer)不能直接"调用" skill。Agent 只能调用其他 agent(sessions_spawn / sessions_send)。这一设计保证了 skill 的跨 agent 可用性——无论你在哪个 agent 窗口说"写博客",blog-pipeline 都能被正确触发。
关于 Skill 安装的更多细节,可以参考 OpenClaw 技能安装指南。
关键认知:Skill 是 OpenClaw 框架层面的概念
- Skill 通过触发词匹配,由 Gateway 层自动触发
- Agent(如 kb-writer)不能直接"调用" skill
- Agent 只能调用其他 agent(sessions_spawn/sessions_send)
这意味着:
- blog-pipeline skill 在任意 agent 窗口都能触发
- kb-writer 窗口说"写博客",会先进入 kb-writer 的模式识别
- 如果 kb-writer 有模式D,就会执行模式D;如果没有,就需要额外处理
6.2 slug 生成的最佳实践
有代码实现 > 靠 LLM 理解规则
slug 是 URL 友好标识,直接影响搜索引擎对文章的理解和索引。中文 slug 会导致:
- URL 编码后变成长串 %XX 序列,不友好
- 搜索引擎可能无法正确识别关键词
- 链接分享时阅读困难
| 方式 | 确定性 | 可维护性 | 推荐度 |
|---|---|---|---|
| Python 函数(blog-pipeline) | 高 | 高 | ⭐⭐⭐⭐⭐ |
| LLM 理解规则(kb-writer 旧模式D) | 低 | 低 | ⭐⭐ |
| 强化规则文档(kb-writer 新模式D) | 中 | 中 | ⭐⭐⭐ |
建议: 对于关键规则(如 slug 生成),尽量用代码实现,而不是依赖 LLM 理解。
6.3 流程完整性 vs 用户体验
完整流程不一定需要更多步骤
| 方案 | 流程完整性 | 用户体验 | 技术复杂度 |
|---|---|---|---|
| 方案A(返回错误) | ✅ | ❌ | 低 |
| 方案B(转发) | ✅ | ✅ | 中 |
| 方案C(模式D) | ✅ | ✅ | 低 |
结论: 方案C 在三个维度上都表现最好,是最佳选择。
七、后续优化建议
7.1 短期优化
slug 生成代码化
- 在 kb-writer 中添加
generate_slug()函数 - 与 blog-pipeline 保持一致
- 在 kb-writer 中添加
流程监控
- 添加每个 Phase 的日志记录
- 便于排查问题
错误恢复
- 质检/SEO 失败时的降级策略
- 生图失败时的提示词复用
7.2 长期优化
统一 slug 生成库
- 创建独立的 slug 生成工具
- blog-pipeline 和 kb-writer 共用
流程可视化
- 实时显示当前执行 Phase
- 用户可看到进度
智能降级
- 根据内容质量自动选择快速/完整流程
- 用户可手动选择
八、结语
这次踩坑暴露了 kb-writer 模式D 的两个核心问题:
- slug 生成规则不够明确 → 导致中文路径
- 流程不完整 → 缺少质检、SEO、HITL 审核
通过升级为完整 blog-pipeline,这些问题都已解决。
架构设计的关键权衡:
| 维度 | 选择 |
|---|---|
| 用户体验 | 在哪个窗口说"写博客",就在哪个窗口执行 |
| 技术实现 | 保持模式D,不需要额外的转发机制 |
| 流程完整性 | 完整 blog-pipeline(Phase 1-5 + HITL 1/2) |
| 维护成本 | 可接受(两套相似流程,但已对齐) |
最终结论: 保持方案C(当前架构),两种场景都能保证质量,用户体验最好。
参考来源
官方文档
- OpenClaw Documentation — Agent 框架核心文档
- Hugo Fast Federation — 静态站点生成器官方文档
相关实现
- kb-writer AGENTS.md — kb-writer 工作流规范
外部参考
- Google Search Console Help — 搜索表现监测
- Google Web Vitals — 用户体验核心指标
关联阅读
- [[卖项目比卖产品更赚钱:深度拆解商业模式的金字塔顶端逻辑]]
- [[商业模式金字塔:为什么卖项目比卖产品更赚钱?]]
- [[三层赚钱逻辑]]
梦行志