目录

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 的多个问题,并引发了一场关于架构设计的深度讨论。

问题爆发可视化,左侧红色警告光的中国路径文件树,右侧断裂缺失的管道链条,象征中文 slug 和缺失流程的问题

一、问题爆发:中文路径与缺失环节

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: SEOmarketing-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 执行流程对比

blog-pipeline 完整流程图,9 个六边形节点横向排列,金色高亮修复段,进度光流从左向右,展示 Phase 1-5 + HITL 1/2 的执行顺序和各 agent 职责

情况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) / 蓝(方案B) / 绿金(方案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 触发,执行完整流程

问题:

  1. kb-writer 如何获取主会话的 sessionKey?
  2. 转发失败如何处理?
  3. 主会话可能不在线?

方案C:保留模式D(最终选择)

用户在 kb-writer 窗口说"写博客"
    ↓
kb-writer:模式识别 → 模式D
    ↓
kb-writer:执行完整 blog-pipeline 流程

优点:

  1. 用户体验最好:在哪个窗口说,就在哪个窗口执行
  2. 技术实现最简单:不需要额外的转发机制
  3. 流程已统一:两种场景都走完整 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 升级学习记录

六、技术要点总结

slug 生成方案对比,三列对比:蓝色Python代码(确定)/ 绿色Markdown(LLM理解)/ 红色噪点规则(模糊),体现确定性与模糊性的差异

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 会导致:

  1. URL 编码后变成长串 %XX 序列,不友好
  2. 搜索引擎可能无法正确识别关键词
  3. 链接分享时阅读困难
方式确定性可维护性推荐度
Python 函数(blog-pipeline)⭐⭐⭐⭐⭐
LLM 理解规则(kb-writer 旧模式D)⭐⭐
强化规则文档(kb-writer 新模式D)⭐⭐⭐

建议: 对于关键规则(如 slug 生成),尽量用代码实现,而不是依赖 LLM 理解。

6.3 流程完整性 vs 用户体验

完整流程不一定需要更多步骤

方案流程完整性用户体验技术复杂度
方案A(返回错误)
方案B(转发)
方案C(模式D)

结论: 方案C 在三个维度上都表现最好,是最佳选择。


七、后续优化建议

7.1 短期优化

  1. slug 生成代码化

    • 在 kb-writer 中添加 generate_slug() 函数
    • 与 blog-pipeline 保持一致
  2. 流程监控

    • 添加每个 Phase 的日志记录
    • 便于排查问题
  3. 错误恢复

    • 质检/SEO 失败时的降级策略
    • 生图失败时的提示词复用

7.2 长期优化

  1. 统一 slug 生成库

    • 创建独立的 slug 生成工具
    • blog-pipeline 和 kb-writer 共用
  2. 流程可视化

    • 实时显示当前执行 Phase
    • 用户可看到进度
  3. 智能降级

    • 根据内容质量自动选择快速/完整流程
    • 用户可手动选择

八、结语

这次踩坑暴露了 kb-writer 模式D 的两个核心问题:

  1. slug 生成规则不够明确 → 导致中文路径
  2. 流程不完整 → 缺少质检、SEO、HITL 审核

通过升级为完整 blog-pipeline,这些问题都已解决。

架构设计的关键权衡:

维度选择
用户体验在哪个窗口说"写博客",就在哪个窗口执行
技术实现保持模式D,不需要额外的转发机制
流程完整性完整 blog-pipeline(Phase 1-5 + HITL 1/2)
维护成本可接受(两套相似流程,但已对齐)

最终结论: 保持方案C(当前架构),两种场景都能保证质量,用户体验最好。


参考来源

官方文档

相关实现

外部参考

关联阅读

  • [[卖项目比卖产品更赚钱:深度拆解商业模式的金字塔顶端逻辑]]
  • [[商业模式金字塔:为什么卖项目比卖产品更赚钱?]]
  • [[三层赚钱逻辑]]