写技术博客和写代码最大的区别在于,代码可以通过编译器和测试用例判断对错,而一篇文章要判断好坏,往往要等读者读到一半才见分晓。LLM 技术写作之所以在开发者群体中流行,不是因为模型能代替人总结思想,而是因为它能把写作过程从“面对空白页面”改成“面对一份可以修改的初稿”。这篇报告会拆解开发者为什么愿意用 LLM 写博客、应该怎样准备运行环境、如何把写作流程工程化,以及发布前必须做哪些验证和排错。
文章面向正在尝试用 LLM 整理技术笔记、输出博客、沉淀团队文档的开发者。看完之后,你会得到一条从选题到大纲、从初稿到验证、从排错到发布的完整链路,而不是停留在“用 AI 生成一段文字再复制粘贴”的层面。
1. 先回答核心问题:开发者为什么愿意用 LLM 写技术博客
1.1 技术写作的低效环节,恰好是 LLM 能补齐的环节
写一篇技术博客真正耗时的地方,往往不是打字,而是组织内容。打开编辑器之后不知道先写概念还是先写操作步骤;同一个主题在不同平台要重新调整结构;代码块和配置片段粘贴进来之后还要整理格式;中英文术语混在一起,读起来不顺畅。这些环节本身不需要太多“创作灵感”,却会消耗大量时间。
LLM 解决的是“从零开始”的成本问题。给它一个主题、一份踩坑记录、一段报错日志,它可以在几秒钟内生成结构完整的初稿。开发者要做的不再是凭空搭建文章框架,而是在初稿上做增删、验证代码、补充真实细节。从实际使用体验来看,写作时间可以减少一半以上,而且这部分节省下来的时间几乎都来自格式整理、大纲调整和措辞打磨,而不是来自内容质量的注水。
需要强调的是,这里说的“效率提升”有一个前提:写作素材要来自真实项目。如果让模型在没有任何输入的情况下凭空生成一篇“缓存优化实战”,得到的内容往往正确但无重点,最后改稿的时间可能比直接写还长。LLM 在下游整理环节效率高,在上游事实生产环节并不具备可靠性。
1.2 从“代笔”到“辅助”:LLM 在写作链路中的真实定位
把 LLM 当成“代笔”是最常见的误区。模型可以生成一段逻辑通顺的文字,但它不知道这段文字描述的功能是否真的存在,不知道命令在你所在的环境里是否能跑通,也不知道某个版本号是否已经过时。
技术博客的信任基础是可复现。读者收藏一篇文章,通常是因为它解决了某个具体问题,并且照做之后能成功。如果代码不能运行、日志是编造的、路径是虚构的,那么文章发布后只会带来更多提问和差评。因此,LLM 的合理定位是“协作者”而不是“作者”。
| 写作环节 | LLM 可以承担的程度 | 开发者必须负责的部分 |
|---|---|---|
| 选题拓展 | 高,可以快速列出相关子话题 | 判断这个主题是否真的有真实需求 |
| 大纲组织 | 中高,能生成完整目录树 | 判断结构是否符合读者认知习惯 |
| 初稿生成 | 高,能快速铺开内容 | 事实核查、删改、补充细节 |
| 代码块生成 | 中,能给出常见写法 | 在真实环境运行验证 |
| 排错段落 | 低,容易编造错误原因 | 提供真实日志和真实的排查过程 |
1.3 收益与成本要分开核算
把 LLM 接入写作流程,不会只带来收益。它的成本集中在三个地方:调试提示词、核查模型输出、把生成的代码跑通。这三个环节的工作量取决于文章的主题离项目和真实数据有多远。
| 项目 | 收益 | 成本 | 适合场景 |
|---|---|---|---|
| 效率 | 初稿速度快,格式更规整 | 第一次调试提示词需要时间 | 素材充足的实战类文章 |
| 覆盖度 | 容易扩展开头、对比、扩展方向 | 容易产生与主题无关的内容 | 需要发散找角度的科普型文章 |
| 一致性 | 多篇文章结构能保持统一 | 提示词模板需要维护 | 系列博客、团队文档 |
| 准确性 | 无直接收益 | 需要逐条核对事实和运行代码 | 排错和教程类文章尤其明显 |
结论很直接:当写作素材来自真实项目时,LLM 的投入产出比最高;当内容完全依赖模型想象时,返工成本最高。这也是为什么优秀的 AI 辅助写作流程,第一步通常是收集素材,而不是打开对话框。
2. 写作不是孤立任务:LLM 工具链和运行环境怎么准备
2.1 两条路线:云端 API 还是本地模型
接入 LLM 之前要先选运行路线。云端 API 适合大多数个人博客场景,注册之后就能调用,不需要关心 GPU 和显存。本地模型适合两种情况:一是文章涉及未公开的项目细节,不希望把内容发送到外部服务;二是离线写作,或者对数据流向比较敏感。
| 对比维度 | 云端 API | 本地模型 |
|---|---|---|
| 部署难度 | 低,获取密钥即可调用 | 较高,需要下载模型并配置运行环境 |
| 硬件要求 | 无特殊要求 | 需要 GPU、内存和磁盘空间 |
| 数据隐私 | 取决于服务商的条款 | 数据不出本机 |
| 单次使用成本 | 按 token 计费 | 主要是电费和硬件成本 |
| 离线可用 | 否 | 是 |
| 输出稳定性 | 通常较高 | 取决于模型尺寸和量化方式 |
对普通技术博客来说,云端 API 已经足够。如果平时会写一些关于内部系统、商业项目、安全漏洞的文章,就优先考虑本地部署,避免把敏感信息拼进提示词。
2.2 本地部署 LLM 时的硬件、依赖和目录规划
本地部署 LLM 不一定需要高端显卡,但要提前规划好资源。模型文件动辄几个 GB,量化后的模型能降低显存占用,但也会影响输出质量。上下文越长,显存压力越大。建议先跑通一个小模型,验证流程,再根据实际效果决定是否升级。
# 示例:启动本地模型服务 # 具体工具和模型名称以官方文档为准 python -m venv .venv source .venv/bin/activate # 安装调用接口所需的 Python 依赖 pip install requests环境准备好之后,建议把写作项目按目录拆分。这样提示词、草稿、脚本和素材不会混在一起,也方便后续做批量生成。
blog-writer/ ├─ prompts/ │ ├─ system.txt │ └─ outline.txt ├─ drafts/ │ ├─ cache-penetration.md │ └─ redis-miss.md ├─ scripts/ │ └─ generate.py └─ notes/ └─ project-notes.md目录分层不需要很复杂,但“素材、提示词、脚本、产出”四类文件一定要分开。很多人直接把所有内容堆在一个对话框里,等一个月后想复用提示词时,发现什么都找不到。
2.3 一个容易混淆的问题:ComfyUI 和 LLM 必须在同一台电脑上吗
很多开发者会在同一台机器上同时使用 ComfyUI 做图像生成、使用 LLM 做文本处理,因此经常有人问这两者是不是必须部署在同一台电脑上。答案是:没有必要。
ComfyUI 负责图像生成任务,LLM 负责文本理解和生成,它们在功能上没有依赖关系。所谓“必须同机”通常来自两种场景:一是当前只有一台带 GPU 的机器,二是在 ComfyUI 里通过节点调用 LLM 来增强提示词。如果只是分别完成图像和文本任务,完全可以通过 HTTP API 把两个服务部署在不同的机器上,甚至把 LLM 换成云端接口。
真正需要注意的是资源竞争。ComfyUI 和本地 LLM 都是显存大户,同时运行很容易触发 OOM。减少冲突的做法包括:
- 分开部署,文本生成走云端 API,ComfyUI 留在本机。
- 错峰使用,避免两个大任务同时执行。
- LLM 使用量化和小上下文配置,给图像生成留出显存。
- 用独立进程启动服务,方便单独重启和观察日志。
2.4 环境检查清单
在开始搭建写作流水线之前,先按下面的清单确认环境。
| 检查项 | 确认方式 | 正常状态 |
|---|---|---|
| Python 版本 | python --version | 能正常运行脚本 |
| API 密钥 | 检查环境变量是否设置 | 目标环境能读取到密钥 |
| 网络连通性 | 用 curl 请求接口地址 | 能返回 JSON |
| GPU 显存 | nvidia-smi | 剩余显存足够加载模型 |
| 磁盘空间 | df -h | 模型文件所在分区有足够空间 |
| 依赖版本 | pip freeze与需求文件对比 | 版本不冲突 |
这份清单不是一次性的。模型版本升级、显卡更换、接口服务调整时,都应该重新走一遍。
3. 把写作流程工程化:一个可复用的技术博客生产链路
3.1 先定选题和大纲,再让 LLM 生成初稿
直接让 LLM 写一篇“关于缓存穿透的博客”,得到的结果往往大而全,但读完找不到重点。正确顺序是先定大纲,再逐段生成。大纲的作用类似代码里的接口定义,先把结构定清楚,后面的实现才不会跑偏。
你是资深技术编辑。下面是我的主题和素材: 主题:Redis 缓存穿透的排查和应对 素材:项目日志、代码片段、踩坑记录 请输出 Markdown 格式的大纲,包含: 1. 目标读者和前置知识 2. H2 章节和 H3 小节 3. 每节需要的代码、配置、表格 4. 需要开发者手动验证的事实点 不要输出正文,只输出大纲。大纲生成之后要做一次人工检查:确认是否覆盖“是什么、为什么、怎么做、怎么查”,确认每个 H2 下是否有足够细节支持。如果大纲里全是“概述、原理、实践、总结”,说明结构还不够具体,需要继续细化。
3.2 用系统提示词约束角色和输出
生成正文之前,先定义系统提示词。系统提示词的作用是让模型进入特定的写作模式,避免输出过于空泛。
你是一名有十年经验的后端开发者和技术博主。 写作规则: 1. 全文使用中文,技术术语保留英文并给出中文解释。 2. 结构顺序必须是:概念解释、环境准备、代码实现、运行验证、常见问题。 3. 所有命令和配置必须说明运行环境。 4. 段落必须有信息量,禁止使用缺少实义的套话。 5. 生成代码后,用一个自然段解释关键参数。系统提示词不需要一次写得完美,可以在使用过程中迭代。但要注意,规则越具体,输出越接近可发布状态。如果你希望文章里保留个人经验,可以在系统提示词里加入“必须加入真实踩坑记录,不得编造错误日志”。
3.3 用 Python 脚本批量调用 LLM,把写作变成流水线
一篇完整博客往往超过两千字,单次生成容易截断,也容易丢失前面章节的细节。更稳妥的做法是把文章拆成章节,逐段生成,然后再合并。这样任何一个章节质量不达标,只需要重新生成该章节,不需要整篇重来。
import os import requests from pathlib import Path API_KEY = os.environ["LLM_API_KEY"] BASE_URL = os.environ.get("LLM_BASE_URL", "https://api.example.com/v1") MODEL = os.environ.get("LLM_MODEL", "example-chat-model") def generate(system_prompt: str, user_prompt: str) -> str: resp = requests.post( f"{BASE_URL}/chat/completions", headers={"Authorization": f"Bearer {API_KEY}"}, json={ "model": MODEL, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}, ], "temperature": 0.3, "timeout": 120, }, ) resp.raise_for_status() return resp.json()["choices"][0]["message"]["content"] def gen_sections(sections, system_prompt: str, out_dir: Path): out_dir.mkdir(parents=True, exist_ok=True) for sec in sections: text = generate(system_prompt, sec["prompt"]) (out_dir / f"{sec['name']}.md").write_text(text, encoding="utf-8")这段脚本把“调用模型”和“保存文件”拆开,好处是失败时能看清楚是网络问题、接口问题还是内容质量问题。temperature设低一些,输出会更稳定,适合技术文档类内容。实际项目中,接口地址、模型名和鉴权方式要以你的服务商文档为准。
3.4 代码、日志和配置片段要回到真实工程环境验证
模型生成的代码只能证明“它看起来像代码”,不能证明“它能运行”。技术博客一旦被读者收藏,往往说明读者把它当作操作手册。如果代码在干净环境里跑不通,文章的可信度会直接归零。
建议在发布前把每个代码块放进一个干净的临时环境运行。干净环境的意思是:不要使用本机已经装好一堆依赖的解释器,而是新建虚拟环境,再安装需求文件。
python -m venv /tmp/verify-env source /tmp/verify-env/bin/activate pip install -r requirements.txt python 示例脚本.py如果代码需要数据库、Redis、消息队列等外部依赖,至少要在文章里写明启动方式和版本要求。这一步看起来繁琐,但它是把“AI 生成的草稿”变成“可以发布的技术文章”的核心环节。
4. 让文章具备技术颗粒度:提示词、RAG 和输出格式控制
4.1 提示词要约束角色、背景、范围和禁止项
写好提示词是使用 LLM 写作的核心技能。一个可复用的提示词通常包含四个部分:角色、背景、范围和禁止项。角色决定语感,背景决定内容方向,范围决定边界,禁止项决定哪些输出必须避免。
你是服务端开发工程师。 写作主题:Redis 缓存穿透、击穿、雪崩。 目标读者:1 到 3 年经验的 Java 后端开发者。 交付内容:概念解释、最小示例、代码、常见问题排查表。 禁止:不要写与主题无关的性能营销内容,不要编造日志。对比一下,如果只写“帮我写一篇 Redis 缓存的博客”,模型会按自己的理解自由发挥。结果往往是结构完整,但没有针对性,也没有颗粒度。提示词越具体,返工越少。
4.2 把项目资料交给模型:RAG 与轻量知识库
模型不知道你的项目里有什么代码、遇到过什么报错、最终怎么解决的。要让文章贴合项目,就必须把素材带进提示词。最简单的方式是直接拼接,把笔记、日志、配置文件贴进用户消息。更强的做法是把个人 wiki 和踩坑记录整理成可检索的知识库。
维护个人技术 wiki 是一个成本很低、收益很高的习惯。把常见问题、代码片段、命令记录按主题整理成条目,写作时直接检索相关条目,拼进提示词。这样每次写博客实际上是在复用过往经验,而不是让模型凭空生成。
# 伪代码:把与主题相关的笔记检索出来,拼进提示词 related_notes = search_notes(topic="缓存穿透", top_k=3) user_prompt = f"下面是项目笔记:\n{related_notes}\n\n请基于笔记生成正文"对个人博客来说,刚开始不需要引入向量数据库和完整 RAG 架构。先维护好碎片笔记,写作时手动选择相关内容,效果已经足够。只有当笔记量很大、手工挑选明显耗时之后,再考虑自动化检索。
4.3 输出格式控制:为什么 JSON 比自由文本更可靠
如果生成结果需要程序化处理,可以要求模型输出 JSON,而不是自由格式的 Markdown 文本。JSON 可以被 JSON 解析器校验,字段缺失能及时发现,后续转成 Markdown 或 HTML 也更方便。
{ "title": "Redis 缓存穿透的三种应对方式", "summary": "面向初中级后端的缓存穿透排查笔记", "sections": [ { "heading": "什么是缓存穿透", "content": "第一次请求一个不存在的数据时,缓存没有命中,请求打到数据库。" } ], "code_blocks": [ { "lang": "java", "code": "// 示例代码" } ], "risks": [ "调用远程缓存时未设置超时时间" ] }使用 JSON 输出时,注意两点:第一,模型可能偶尔输出不合法 JSON,脚本里要做异常处理;第二,JSON 结构里不要放太多自由文本,每个字段尽量短,避免模型在中途截断。转成 Markdown 时,可以用一个小脚本渲染 sections 和 code_blocks,把最终结果写回文件。
4.4 版本、路径和参数信息必须保守处理
LLM 的训练语料有时效性。模型的回答可能停留在某个较旧的版本,也可能把不同版本的功能混在一起。写技术博客时,涉及版本号、命令参数、API 名称、路径和平台规则的内容,必须做保守处理。
| 模型容易生成的确定表述 | 发布前应该改成 |
|---|---|
| 官方已支持某个功能 | 我验证的版本支持该功能 |
| 在所有环境都能运行 | 以下步骤在特定环境验证通过 |
| 修改某个配置文件即可 | 修改项目中的对应配置,路径以实际项目为准 |
| 这是目前最优方案 | 在我的场景下更合适的方案 |
保守不是含糊,而是把结论限定在自己验证过的范围内。读者想要的是可以判断是否适用于自己环境的文章,而不是一句没有边界的断言。
5. 运行验证:从“生成了”到“能发布”要过哪些检查
5.1 代码可执行性检查
发布前把所有代码块提取出来,逐段运行。这个过程可以部分自动化,但核心步骤仍然需要人工盯住结果。
# 提取 Markdown 中的脚本并做语法检查 python -m py_compile 示例脚本.py如果代码块里包含命令,要确认命令在当前系统 shell 下能执行;如果包含配置片段,要确认文件名、路径和占位符没有遗漏。最容易被忽略的是图片路径和示例文件路径,模型喜欢生成your-project/src/main/java/...这类示意路径,发布前要改成读者真正能对应的结构。
5.2 技术事实与版本时效审查
逐条审查文章中的确定性表述。把所有“官方支持”“最新版本”“默认开启”这类说法找出来,与自己的验证记录对照。凡是没有验证过的事实,要么删除,要么改成“需要在你的环境确认”。
重点核对以下内容:
- API 名称和参数是否与当前文档一致
- 命令参数是否存在,是否区分大小写
- 版本号是否写错或过时
- 平台和工具的规则是否变化
- 引用的依赖是否存在兼容性问题
5.3 风格一致性与平台规范检查
一篇博客发布到技术平台之前,还要做格式和风格检查。人工逐行看太慢,可以用脚本扫描常见的模板表达。
from pathlib import Path BANNED = ["众所周知", "毋庸置疑", "废话不多说", "你学会了吗"] for md in Path(".").glob("*.md"): text = md.read_text(encoding="utf-8") for word in BANNED: if word in text: print(f"{md.name}: 发现模板表达 {word}")除了禁用词,还要检查 Markdown 格式是否规范:H2 标题是否编号、代码块是否带语言标识、表格是否有对齐线、段落是否有超长行。CSDN 这类平台对代码块语言标识尤其敏感,缺少语言标识的代码块会失去高亮效果。
6. 常见问题与最佳实践
6.1 高频问题排查表
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 文章结构空洞 | 只给了主题,没有给大纲和读者定位 | 查看用户提示词是否包含读者和交付物 | 先让模型生成大纲,确认后再写正文 |
| 生成的代码不能运行 | 模型没有获得真实环境信息 | 在干净虚拟环境运行代码 | 以运行结果为准,补齐版本和日志 |
| API 名称和版本写错 | 训练语料过期 | 与官方文档逐条核对 | 发布前把所有确定性表述过一遍 |
| 多篇文章风格雷同 | 提示词缺少个人经验约束 | 对比不同 prompt 的输出 | 在提示词中加入自己的踩坑和结论 |
| 本地显存溢出 | ComfyUI 与 LLM 同时运行 | 用nvidia-smi查看显存占用 | 分开部署、错峰运行、使用量化模型 |
| 长文后半部分被截断 | 上下文太长或单次生成内容过多 | 查看输出末尾是否完整 | 拆分章节,逐段生成再合并 |
6.2 从现象倒推原因:质量下降排查路径
当使用 LLM 写作的质量突然下降时,按顺序检查以下环节。
- 输入是否正确:主题、素材、日志路径是否有误。
- 提示词是否完整:有没有丢失角色、范围或禁止项。
- 上下文是否合适:素材太少导致信息不足,素材太长导致重点丢失。
- 模型参数是否异常:
temperature过高会导致输出发散。 - 接口是否变化:服务商是否切换了模型版本。
- 输出是否被后续脚本改写:合并、格式化逻辑是否引入了错误。
这条排查路径适用于大多数情况。不要一遇到质量问题就急着换模型,先检查输入和提示词,大部分问题出在这里。
6.3 可执行的最佳实践
把真实日志、真实错误信息作为素材,不给模型编造排错的机会。模型最擅长整理,最不擅长发明事实。
发布前在干净环境运行所有代码块。这一步能避免大多数“文章看起来很好但照做失败”的风险。
对版本敏感信息使用占位符或验证记录。建议在文章开头或末尾标注“本文验证环境”,让读者知道适用范围。
建立自己的提示词模板库,像管理代码一样管理模板。提示词是解决写作问题的代码,值得用版本控制工具管理。
每周固定用个人 wiki 记录踩坑,写作时直接引用。知识库和工作流是长期复利。
用脚本检查禁用词和格式,减少人工 Review 负担。但脚本只能检查文本,不能代替对技术事实的核对。
发布前检查清单:
| 检查项 | 检查方式 | 通过标准 |
|---|---|---|
| 代码可运行 | 干净环境执行 | 所有代码块按预期输出 |
| 事实核对 | 与官方文档对照 | 版本、参数、行为一致 |
| 格式规范 | Markdown lint 脚本 | 标题编号、代码块语言、表格正常 |
| 术语统一 | 全文检索 | 同一术语没有多种译法 |
| 素材完整 | 对照大纲逐节检查 | 每节都有示例、代码或表格 |
| 禁用表达 | 脚本扫描 | 无模板套话,无空泛形容词 |
6.4 下一步扩展方向
把写作流水线接入 CI,提交草稿后自动执行代码块验证和格式检查,适合有固定发布节奏的团队或系列博客。
用 RAG 接入团队文档,可以生成内部技术方案和复盘报告。相比个人博客,团队场景对数据隐私要求更高,更适合本地部署加私有知识库。
用同一组提示词对比不同模型的输出,能帮助你找到最适合自己写作风格的工具,也能在模型升级时快速评估效果变化。
如果要长期做技术输出,下一步最有价值的事情不是接入更多自动化工具,而是把个人 wiki 沉淀成可复用的知识库。素材积累得越早,LLM 辅助写作的收益越大。
回到最初的问题:开发者为什么愿意用 LLM 写技术博客?核心原因是它把写作从“从零表达”改成了“从初稿修订”。模型负责把散乱的素材整理成结构完整的文本,开发者把节省下来的时间用来验证代码、核对事实、补充真实踩坑过程,最终形成自己的技术判断。这个分工能成立的前提是,你始终清楚哪些环节可以交给模型,哪些环节必须自己完成。写技术博客的护城河从来不是打字速度,而是对问题真正深入的理解。