使用 Fabric 的 enrich_blog_post 模式:为静态站点增强 Markdown 博客的完整指南
enrich_blog_post 是 Fabric 开源框架中一个专门面向 Markdown 博客写作与发布场景的模式(Pattern),其核心使命是:在保留原文一字不改的前提下,通过结构、排版与视觉元素的增强,让 Markdown 博文能够被静态站点生成器(Static Site Generator,SSG)更优雅地渲染成 HTML。读完本文,你将理解该模式的完整指令语义(身份设定、目标、五步工作流、MarginNote 处理规则、输出纪律),掌握在 Fabric CLI 中调用它的全部方式(含管道输入、输出落盘、流式输出与剪贴板),并学会通过环境变量为其绑定专属模型、通过别名把它变成一条日常命令。
一、模式定位:写给"发布前"的 Markdown 增强器
enrich_blog_post 的模式定义位于 data/patterns/enrich_blog_post/system.md,项目对它的官方描述是:"Enhances Markdown blog files by applying instructions to improve structure, visuals, and readability for HTML rendering"(见 data/patterns/pattern_explanations.md 第 119 条)。CHANGELOG.md 中也记录了该模式的引入历史(见 CHANGELOG.md)。
从模式文件的结构看,它属于 Fabric 中典型的"内容处理类"模式:不生成新观点、不重写文风,而是充当一个发布流水线中的预处理环节——输入是一篇草稿状态或排版粗糙的 Markdown 博文,输出是一份"结构更清晰、更适合渲染成 HTML 页面"的增强版 Markdown。
理解这个定位非常关键,它决定了该模式与 summarize(摘要)、humanize(去 AI 味)、improve_writing(润色)等模式的根本区别:enrich_blog_post 关注的是结构与呈现,而非内容本身。
模式的内部组成
system.md 采用 Fabric 模式的标准分区格式,每个区块承担明确职责:
| 区块 | 作用 | 原文要点 |
|---|---|---|
IDENTITY |
定义 AI 的角色设定 | 一个"超高智商 AI 系统",擅长按照指令增强 Markdown 博客,使其可被 SSG 正确渲染为 HTML |
GOAL |
明确目标 | ① 按 INSTRUCTIONS 增强输入博客的结构、视觉与质量;② 保证最终 HTML 的最大可读性与可欣赏性 |
STEPS |
规定执行流程 | 慢下来逐步思考 → 分析输入内容 → 审阅指令 → 应用增强 → 复查内容完整性 |
INSTRUCTIONS |
具体的增强规则 | ❝ 符号与 NOTE: 段落 → 封装进 <MarginNote></MarginNote> |
OUTPUT INSTRUCTIONS |
输出纪律 | 只加增强、不加删改;不输出代码围栏包装 |
INPUT |
输入占位 | 待处理的博客原文 |
说明:
IDENTITY中"4,312 IQ"这类夸张数字是 Fabric 提示词模式中常见的"角色激励"写法,其作用是引导模型进入高质量输出状态,而非对真实能力的量化声明。
二、五步工作流:从草稿到可发布文稿的执行路径
STEPS 区块规定了模型处理输入时的完整思考与执行顺序,理解这条链路有助于你预判模式行为、排查输出问题:
- 放慢节奏、逐步思考(Slow down and think)——先整体规划如何取得最佳增强效果;
- 分析输入内容——思考原文可以从哪些维度被增强:结构层次、排版可读性、链接补充、视觉标记等;
- 审阅
INSTRUCTIONS——对照下方指令,确定具体应用哪些增强手段; - 应用增强——完美复刻输入博客,不改变任何实质内容,仅按指令对格式、结构、链接等进行增强;
- 完整性复查——确认增强过程中原文没有被改动,只允许增加排版、结构、链接等,不得新增、删除或修改任何措辞。
这条工作流体现了该模式最重要的工程约束:"保真增强"。它把模型定位成一个"排版师"而不是"合作作者"——内容版权与文风完全属于原作者,模型只负责让文稿在静态站点上"更好看"。
三、核心指令解析:❝ 符号与 <MarginNote> 渲染约定
INSTRUCTIONS 区块只有两条规则,但它们是整个模式的灵魂:
规则一:❝ 符号 → MarginNote 封装
原文规定:
如果看到
❝符号,它表示一个<MarginNote></MarginNote>区块——一种类似旁注(aside)或 Callout 的视觉展示形式。观察附近的几行文字,判断哪些内容本应放进该 Callout 中,将它们合并为一行,并在输出阶段移入<MarginNote></MarginNote>标签内。
这意味着输入博客中可能存在作者用 ❝ 标记的"待突出文本",模式需要:
- 识别
❝符号位置; - 从上下文判断该 Callout 应包含的内容范围;
- 将多行相关内容合并为单行;
- 用
<MarginNote>...</MarginNote>标签替换原始标记。
规则二:NOTE: 段落 → 同样的封装处理
任何以 NOTE: 开头的段落/文本,也要应用同样的封装逻辑,移入 <MarginNote></MarginNote> 标签。
为什么需要自定义标签:SSG 生态的常见做法
<MarginNote> 并不是标准 HTML 元素,而是由站点主题/模板约定的自定义渲染约定——静态站点生成器或其配套 CSS 会为该标签(或其对应的 class)定义"旁注/引用块"的视觉样式。这与 Fabric 仓库中另一个模式 data/patterns/md_callout/system.md 的思路一脉相承:后者使用 GitHub 风格的 > [!NOTE]、> [!TIP]、> [!IMPORTANT]、> [!WARNING]、> [!CAUTION] 五种 Callout 类型封装内容。区别在于:
md_callout面向通用 Markdown 平台(如 GitHub 渲染);enrich_blog_post面向自建静态站点,使用项目自定义标签<MarginNote>。
因此,如果你要把增强后的博客部署到自己的 SSG,需要在主题模板中为 <MarginNote> 定义样式(例如侧边留白处的一段高亮引用、或带边框的 Callout 卡片),否则标签会被当作普通文本原样输出。
四、输出纪律:只增强,不增删改
OUTPUT INSTRUCTIONS 区块对模型输出提出了严格约束:
- 只允许增加增强内容,不允许新增、删除或修改原文任何内容;
- 必须遵循全部指令;
- 不得在输出 Markdown 外包裹代码围栏容器(如 ```markdown),只输出博客正文本身。
这条纪律的实际意义是保证幂等性与可追溯性:增强后的文稿与原文一一对应,作者可以方便地用 diff 工具审阅"模型到底改了什么",避免模型越权改写内容导致事实偏差或风格漂移。结合 STEPS 中的完整性复查,模式形成了"增强—校验"的闭环。
五、在 Fabric CLI 中运行 enrich_blog_post
Fabric 的模式通过 --pattern(短参数 -p)指定,因此运行该模式的标准命令为:
fabric -p enrich_blog_post
输入方式
模式从标准输入读取博客原文,典型用法:
# 从文件输入,结果打印到终端
cat my_blog_post.md | fabric -p enrich_blog_post
# 直接粘贴文本输入
fabric -p enrich_blog_post
# (随后粘贴 Markdown 原文,按 Ctrl-D 结束)
# 管道组合:抓取 URL 内容后直接增强
fabric -u "https://example.com/my-post" | fabric -p enrich_blog_post
注意:
-u/--scrape_url依赖 Jina AI 将网页抓取为 Markdown(见 internal/cli/flags.go),抓取结果再交给本模式增强,适合"从已有网页二次加工"的场景。
常用配套参数
参考 internal/cli/flags.go 中的 Flags 定义,以下参数与本模式组合最常用:
| 参数 | 说明 | 使用示例 |
|---|---|---|
-o, --output |
将结果写入文件 | fabric -p enrich_blog_post -o enhanced.md |
--output-session |
把整个会话(含临时会话)写入输出文件 | fabric -p enrich_blog_post --output-session -o session.md |
-s, --stream |
流式输出 | fabric -p enrich_blog_post -s |
-c, --copy |
结果复制到剪贴板 | fabric -p enrich_blog_post -c |
-m, --model |
指定模型 | fabric -p enrich_blog_post -m claude-sonnet-4-5 |
-V, --vendor |
指定提供商 | fabric -p enrich_blog_post -V "OpenAI" -m gpt-4o |
-v, --variable |
传入模式变量(如 -v=#name:value) |
fabric -p enrich_blog_post -v=#style:minimal |
-t, --temperature |
采样温度(默认 0.7) | fabric -p enrich_blog_post -t 0.3 |
--dry-run |
只显示将发送给模型的内容,不真正发送 | fabric -p enrich_blog_post --dry-run |
-S, --setup |
重新运行配置 | fabric -S |
其中 --dry-run 特别适合调试:在正式调用前先确认模式文件、变量与输入是否正确组装。
配置与模式加载机制
模式文件的加载与更新由 Patterns Loader 管理(见 internal/tools/patterns_loader.go):fabric -U/--updatepatterns 可从默认仓库(DefaultPatternsGitRepoUrl,模式目录 data/patterns)拉取最新模式集合;fabric -l/--listpatterns 可列出全部可用模式;fabric --readpattern enrich_blog_post 可在终端打印该模式的完整内容,便于你在调用前审阅指令细节。
六、为 enrich_blog_post 绑定专属模型与命令别名
按模式指定模型(环境变量)
从 internal/cli/chat.go 的源码可以看到,Fabric 支持"按模式映射模型":当指定了 --pattern 且未显式传入 --model 时,CLI 会构造环境变量名 FABRIC_MODEL_ + 模式名(大写、连字符转下划线)并读取其值;若值为 厂商|模型 格式则同时设定 vendor 与 model,否则仅设定 model。
因此,你可以在 shell 启动文件(如 ~/.bashrc)中为该模式固定一个高质量写作模型:
# 固定模型(只指定模型名)
export FABRIC_MODEL_ENRICH_BLOG_POST="gpt-4o"
# 同时指定厂商与模型
export FABRIC_MODEL_ENRICH_BLOG_POST="OpenAI|gpt-4o"
这样每次运行 fabric -p enrich_blog_post 都会自动使用该模型,无需重复 -m 参数。
为模式创建命令别名
README.md 中提供了为所有模式批量生成别名(alias)的脚本思路:遍历 ~/.config/fabric/patterns 目录下的每个模式目录,生成 alias pattern_name='fabric --pattern pattern_name' 形式的命令。套用到本模式即为:
alias enrich_blog_post='fabric --pattern enrich_blog_post'
之后即可直接用 enrich_blog_post < my_post.md 或 cat my_post.md | enrich_blog_post 调用。
七、输出后处理:thinking 块剥离与直接落盘
如果你开启了思考块(thinking)相关功能,模型输出中可能包含 <think>...</think> 之类的推理片段。Fabric 在 internal/domain/think.go 中提供了 StripThinkBlocks 函数,按起始/结束标签用正则((?s)startTag.*?endTag\s*,带正则缓存)剥离思考内容;CLI 侧的 --suppress-think 标志也会抑制思考文本的输出。因此在将增强结果写入博客文件前,建议:
cat my_post.md | fabric -p enrich_blog_post --suppress-think -o enhanced_post.md
八、实际工作流建议与注意事项
- 保留原文备份:虽然模式承诺"不改内容",但任何 LLM 输出都有不确定性,建议在增强前保留原文,增强后用 diff 工具核对差异是否符合预期。
- 为
<MarginNote>准备样式:若站点尚未定义该标签样式,增强结果中的标签会原样出现;可参照md_callout模式(data/patterns/md_callout/system.md)的 Callout 思路,为<MarginNote>设计对应的 CSS。 - 注意输入中的
❝与NOTE:标记:这两类标记是触发增强的关键信号;如果你希望原文中的某些内容保留原样,请确保它们不以NOTE:开头。 - 结合
--dry-run调试:先跑一遍--dry-run确认发送给模型的完整提示词内容,避免变量替换或输入拼接错误。 - 别让它替你"写内容":该模式适合排版增强,若需要改写文风或压缩篇幅,应改用
improve_writing、summarize等模式;各模式的定位差异可在 data/patterns/suggest_pattern/user.md 与 data/patterns/pattern_explanations.md 中查阅。
总结
enrich_blog_post 是一个小而精的"发布前置"模式:它以严格的内容保真为底线,通过 ❝/NOTE: → <MarginNote> 的标记转换、结构优化与可读性增强,让 Markdown 博文在静态站点上获得接近成品页面的呈现效果。配合 Fabric 的管道输入、输出落盘、按模式模型映射与命令别名机制,你可以把它无缝接入自己的写作发布流水线,实现"草稿进、可发布文稿出"的一键增强。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0634
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
jforgamejforgame是一个一站式游戏服务器开发框架。包含游戏服务器开发所需要的各种组件,比如网关,socket服务端与客户端,自定义高效消息编解码,游戏热更新,游戏通用工具等等。包含游戏服,跨服,匹配服,后台管理系统等实现,同时提供大量业务案例以供学习。亦可用于其他socket应用,例如及时聊天等。Java01
fizz-gateway-nodeAn Aggregation API Gateway in Java . FizzGate 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。Java00
certd开源SSL证书管理工具;全自动证书申请、更新、续期;通配符证书,泛域名证书申请;证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔;https证书,pfx证书,der证书,TLS证书,nginx证书自动续签自动部署JavaScript00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00