最近在写技术文章的时候,经常会在开头反复删掉两句话。一句是“随着技术的不断发展”,另一句是“在现代软件开发中”。并不是这些话本身有错,而是它们出现得太频繁了,频繁到读者一眼就能认出“这是 AI 写的第一版”。网上现在把这些低质量的 AI 生成内容叫 “AI slop”,大意是“AI 批量制造、缺少信息增量、读起来像那么回事但实际没什么内容”的文字垃圾。
但这里有个很容易被带偏的结论:是不是用 AI 写东西就一定会写成 slop?显然不是。真正的问题是很多人把 AI 辅助写作(AI-assisted writing)和 AI slop 混为一谈了,结果要么过度依赖 AI,要么干脆把所有 AI 生成内容都一棒子打死。这篇文章就把这两者的边界讲清楚,同时给出一套从文本识别、自动化检测到人工重写的完整流程。写技术博客、写需求文档、写接口说明、写周报,甚至写代码注释,都可以参考这套方法。
1. 背景与核心概念:先看清楚两者之间的那条线
1.1 什么是 AI 辅助写作
AI 辅助写作指的是,在写作流程中把 AI 当作一个协作工具来看待,而不是替代者。它可以帮助你完成搜集资料、整理大纲、起草段落、润色语句、生成示例代码等具体环节,但最终的内容结构、信息取舍、事实核查和表达风格,仍然由人来控制。
举个最朴素的例子。你在写一篇 Spring Boot 接入 Redis 的教程,决定先让 AI 帮你列一个目录,这是辅助写作。AI 根据你的目录生成“缓存穿透、缓存击穿、缓存雪崩”三个小节的内容,你逐段核验并替换掉错误描述,这也是辅助写作。你让 AI 编写一段全局限流拦截器,然后你把它放入项目里运行,确认限流生效后再写进文章,这还是辅助写作。
辅助写作的关键特征是“人在回路里”。每一个 AI 生成的句子,你至少应该问三个问题:它说得对吗?它有必要吗?它比我自己写好在哪?如果三个问题都答不上来,那么这段文字大概率不需要保留。
1.2 什么是 AI slop
AI slop 这个词最早是围绕 AI 生成垃圾内容形成的贬义说法,类似于早期互联网里的 content farm。它最典型的特征是:内容在语法层面是通顺的,但在信息层面是空洞的。你看完一整篇文章,好像它讲了各种大道理,却记不住任何一个具体的操作步骤、真实案例或验证过的数据。
这类内容通常长这样:
- 开头是“随着 XXX 技术的迅猛发展”;
- 中间是“首先,我们要理解 XXX 的基本概念”;
- 结尾是“综上所述,XXX 在现代开发中具有重要的应用价值”。
如果一篇文章里大量出现“首先”“然后”“最后”“值得注意的是”“极大提升了开发效率”这类过渡和空泛评价,而很少有可以照做的命令、可以运行的项目、可以复现的报错信息,那么这篇内容就是 AI slop 的典型形态。
还需要注意一点:AI slop 不一定是 AI 生成的。思路混乱、信息量低、全是套话的人工文章一样可以被归入这个范畴。只不过在当下,因为 AI 批量产出文本的成本极低,slop 数量被迅速放大了。
1.3 为什么边界如此重要
之所以要把辅助写作和 slop 区分开,是因为它们对应完全不同的工程习惯。
辅助写作对应的是可控流程:你给 AI 明确任务,AI 输出初稿,你做事实核查和结构调整,最后发布。这个流程可以显著提升产出效率,尤其是在内容量大、信息结构重复的文档场景里。
AI slop 对应的则是失控流程:你给 AI 一个简短主题,AI 自动生成一篇完整文章,你几乎不做修改就发布到博客、知识库或企业文档平台。结果就是你开始在搜索引擎里看到大量标题类似、结构类似、结论空洞的“AI 污染内容”。
对于开发者来说,还需要关心一个实际风险:如果你的团队正在用 AI 批量生成接口文档、代码注释或架构设计说明,而这些内容没有经过审查,那么团队的知识库会被噪音填满。后续接手的人不仅要花时间理解代码,还要花时间辨别文档里哪些是事实、哪些是 AI 的编造。这种隐性成本,比“多花十分钟人工写”高得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 识别 AI slop:五个可操作的信号
我们不需要靠玄学判断一篇文章是不是 AI slop,可以从文本特征入手。下面五个信号,逻辑上相互独立,但实际中经常同时出现。
2.1 结构雷同与三段式模板
大多数 AI slop 文章都遵循同一个模板:引入背景,中间罗列几条,最后做个总结。每一条与每一条之间的逻辑关系非常弱,经常是“并列”关系。比如聊缓存,就写“什么是缓存、缓存的作用、缓存的类型”;聊微服务,就写“什么是微服务、微服务的好处、微服务的挑战”。
这种结构本身没有错,甚至可以用于快速列大纲。但 slop 的问题在于,它把大纲当成了最终文章。每个小节都只有一两句正确的废话,缺少展开、缺少案例、缺少数据、缺少报错和排错过程。
一个有效的检查方法是:把文章里的小标题遮住,看看正文是否能独立成立。如果能成立,说明每个小节里有自己的逻辑线索;如果读起来像是标题换了一种说法,那么这就是典型的模板堆砌。
2.2 信息密度低,形容词占比高
信息密度是一个很主观的东西,但可以做粗略估算。一篇文章如果每句话都包含新的专有名词、路径、参数、命令、版本号、数据对比,那么信息密度就高。反之,如果一句话去掉若干形容词和修饰语后,剩下的主干仍然是空的,那么信息密度就低。
举一个典型例子:
在当今数字化转型的大背景下,企业级应用对系统的稳定性提出了更高的要求,而微服务架构凭借其灵活性和可扩展性,成为了越来越多团队的首选技术方案。
这句话看起来挺厉害,但你可以尝试删掉“当今、大背景、更高的、灵活性、可扩展性、越来越多”这些词,剩下的信息几乎是零。真正的技术文章哪怕只写配置一行:
properties复制spring.redis.host=127.0.0.1
读者也能从中学到东西。因为他们知道“原来 Redis 地址是在这个配置项里改的,默认指向本机”。相比之下,“凭借其灵活性和可扩展性”没有让读者获得任何可复用能力。
2.3 代码或示例与正文脱节
AI slop 的另一个常见问题是代码和文本脱节。正文里说“下面给出完整的实现代码”,但代码只是片段;正文里说“运行结果如下”,但结果和代码逻辑对不上;正文里说“支持高并发场景”,但代码本身没有缓存、没有异步、没有熔断,连线程安全都没考虑。
这种情况在 AI 生成内容中尤其严重,因为语言模型擅长生成看起来合理的符号序列,但它并没有真正运行过这些代码。判断方法很简单:把所有代码复制到一个空项目里跑一遍。跑不通,就说明文章里的代码与结论不一致。更进一步,还要检查示例代码是否会带来安全风险。比如让 AI 生成一个 SQL 查询,它可能会拼字符串,这在生产环境里就是注入点。
2.4 编造细节与幻觉
“幻觉”是 AI 生成内容最危险的问题,因为它不是单纯的措辞空洞,而是生成了伪造的事实。AI 可能会把 JPA 的 save 方法描述成“立即刷新到数据库”,也可能会给你一个并不存在的 spring.redis.cluster.nodes 配置格式,甚至会在引用统计数字时给出一个合理但查不到出处的百分比。
这类问题只能靠人来兜底。技术文章必须经过事实核查,尤其是涉及以下信息时:
- 版本号:Spring Boot 2.7 和 Spring Boot 3.x 的配置方式有差异;
- 函数返回值:
redisTemplate.opsForValue().get(key)返回的是Object,需要类型转换; - 网络协议状态码:201 代表创建成功,204 代表无内容,301 和 302 代表重定向;
- SQL 行为:
DELETE FROM table如果没有 WHERE 条件,会清空整张表。
对于无法核实的信息,最诚实的做法是在文章中明确写“这个参数在不同版本中的行为可能不一致,请以官方文档为准”,而不是为了让内容显得确定,强行补一个编造出来的答案。
2.5 缺少来源与版本边界
技术写作与普通的观点表达不同,它是在传播知识。知识是需要边界条件的。比如“使用索引能提升查询性能”这句话单独看没有错,但实际中却需要补充:索引适合在选择性高的列上建立,不适合在频繁写入的表上建立太多索引,也不适合在几乎只有两种值的列上建立普通 B 树索引。
AI slop 的问题在于非常喜欢给出“放之四海而皆准”的结论,却不说清楚结论的适用范围。为了修正这一点,你需要要求 AI 在输出时标注上下文。比如“在某些场景下”“以 MySQL 8.0 为例”“这里只讨论单机部署”。如果 AI 不会标,那就由人来补。没有边界条件的技术结论,本质上就是在误导读者。
3. 写一个“空洞指数”检测工具:从人工识别到自动化检查
识别 AI slop 不应该只是一次性的直觉判断。如果你经常写技术文章、维护团队知识库,或者要审查一批 AI 生成的上线内容,可以用一个简单脚本把空洞文本标记出来,作为第一道过滤器。
下面这个示例基于 Python 3 实现,属于启发式规则检查,不依赖任何第三方大模型,也不接入在线 API,便于在任何环境里直接运行。
3.1 脚本功能设计
这个脚本做三件事:
- 读取一个 Markdown 文件;
- 按段落检查是否包含高频空洞短语;
- 对每段累计空洞指数,最后输出一条推荐处理建议。
高频空洞短语可以按你团队的情况自行维护。例如我常用的是这些明显带有“套话感”的表达式:首先、其次、再次、综上所述、总而言之、随着技术的不断发展、作为一门新兴技术、众所周知、显然、极大提升、显著改善、更好地满足用户需求等。
需要说明的是,这些短语并不是绝对禁止的。有时人写文章也会用“总之”来做小节收束。所以这个脚本给出的只是一个提醒,最终是否删除,仍然需要人来判断。它更适合作为 CI 流水线或 pre-commit hook 的一环,而不是自动改稿工具。
3.2 完整代码
python复制#!/usr/bin/env python3
"""
check_slop.py
简单的 Markdown 内容空洞检测工具。
用法:
python check_slop.py README.md
原则:
1. 只读文件,不会修改原文;
2. 输出提醒,不代替人的编辑判断。
"""
import re
import sys
from pathlib import Path
SLOP_PHRASES = [
"首先", "其次", "然后", "总之", "综上所述", "显而易见",
"众所周知", "随着技术的不断发展", "随着科技的进步",
"在当今", "在现代", "极大提升", "极大改善", "显著提升",
"显著改善", "更好地满足", "更好地服务", "不言而喻",
"无疑", "作为一项新兴技术", "作为一门新兴技术",
]
FLUFF_ADVERBS = [
"非常", "相当", "十分", "高度", "深入", "全面地", "进一步地",
]
def load_text(path: str) -> str:
return Path(path).read_text(encoding="utf-8")
def score_paragraph(paragraph: str) -> int:
score = 0
for phrase in SLOP_PHRASES:
count = paragraph.count(phrase)
if count > 0:
score += count
print(f" [空洞短语] 「{phrase}」出现 {count} 次")
for adverb in FLUFF_ADVERBS:
count = len(re.findall(adverb, paragraph))
if count > 0:
score += count * 0.5
print(f" [弱修饰] 「{adverb}」出现 {count} 次")
return score
def main() -> None:
if len(sys.argv) != 2:
print("用法: python check_slop.py <markdown_file>")
sys.exit(1)
target = sys.argv[1]
if not Path(target).exists():
print(f"文件不存在: {target}")
sys.exit(1)
try:
text = load_text(target)
except UnicodeDecodeError:
print("文件编码不是 UTF-8,请先转换为 UTF-8 再检测。")
sys.exit(1)
paragraphs = [p.strip() for p in text.splitlines() if p.strip()]
total_score = 0
for index, paragraph in enumerate(paragraphs, start=1):
plain_text = re.sub(r"[#*_`>\-]", "", paragraph)
if len(plain_text) < 20:
continue
score = score_paragraph(paragraph)
if score > 0:
total_score += score
print(f"第 {index} 段空洞指数: {score} | 内容预览: {plain_text[:50]}")
print("-" * 60)
print(f"全文累计空洞指数: {total_score}")
if total_score >= 10:
print("处理建议: 空洞指数较高,建议大幅重写后再发布。")
elif total_score >= 5:
print("处理建议: 内容存在明显套话,需要逐段删减。")
else:
print("处理建议: 空洞指数较低,可进入人工质量审查。")
print("注意: 本脚本只提示潜在问题,不能取代人工判断。")
sys.exit(0)
if __name__ == "__main__":
main()
把上面的代码保存为 check_slop.py,然后在命令行里执行:
bash复制python check_slop.py docs/2025-ai-assisted-writing.md
如果文档里有“综上所述”这类短语,脚本会输出类似下面这样的结果:
code复制 [空洞短语] 「综上所述」出现 1 次
第 24 段空洞指数: 1 | 内容预览: 综上所述,本文介绍了 AI 辅助写作的基本概念
------------------------------------------------------------
全文累计空洞指数: 8
处理建议: 内容存在明显套话,需要逐段删减。
这个脚本的价值不在于算法有多精妙,而在于把“空洞感”变成了一个可观测的指标。只要团队统一维护这份套话清单,就能在内容合入文档仓库之前先做一次自动提醒。
3.3 接入 Git pre-commit 实现发布前拦截
如果你和团队共用 Git 仓库,可以把这个脚本挂到 pre-commit 钩子上。当有人准备提交一份修改过的 Markdown 文档时,先自动跑一遍检查;如果提示空洞指数过高,提交者就知道需要再改一改。
下面是一段最小示例,放在 .git/hooks/pre-commit 中即可生效:
bash复制#!/bin/sh
# pre-commit 示例:提交 Markdown 文档前进行空洞检查
# 注意:这个钩子只输出提醒,不做强制拦截;如需强制拦截,可在分数
# 达到阈值时直接 exit 1。
staged_docs=$(git diff --cached --name-only --diff-filter=ACM -- '*.md')
if [ -n "$staged_docs" ]; then
for doc in $staged_docs; do
echo "检查文档: $doc"
python /path/to/check_slop.py "$doc"
echo ""
done
fi
exit 0
把这个脚本保存后,需要执行 chmod +x .git/hooks/pre-commit 给它加可执行权限。再次提交 Markdown 文件时,就能在消息里看到检测结果。
这样做的好处是,你不需要信任每个人的自觉,而是把质量检查前置到了工作流中。坏处是,如果团队有很多人不喜欢被脚本“指手画脚”,可能会引发抵触情绪。比较温和的做法是先作为 CI 任务只提醒不拦截,运行一段时间后再决定是否升级为强制检查。
另外要强调一点:这种脚本以及类似的自动化检查只是辅助手段,它无法判断事实是否准确。AI slop 的核心问题不是用了“综上所缩”这几个字,而是整段话没有信息量。所以脚本只能挡住一部分低质量文本,深层次的问题仍然需要人工判断。
4. 从“AI 初稿”到“可用文稿”的完整流程
如果把写技术文章当成一次代码重构,那么 AI 生成的内容相当于一个未经测试的初始 commit。它可能有一点骨架,但绝不可以直接合入主干。接下来用一个具体例子演示如何从 AI 初稿逐步收敛成能发布的文章。整个过程包含四个阶段:任务设计、初稿生成、人工重写、结果验证。
4.1 设计你的写作任务模板
多数 AI slop 的产生,根源在于提问太宽。只写一句“帮我写一篇关于 Redis 缓存雪崩的文章”,模型自然会依据训练数据里的常见模板生成一篇看起来无所不包、实际上什么都没讲透的内容。要避免这种情况,需要给 AI 提供一个带约束的写作任务模板。
下面是一个适合技术文章初稿的示例模板:
markdown复制角色:技术文档编辑
任务:根据下面的技术笔记生成文章初稿
输入信息:
- 主题:Spring Boot 项目接入 Redis 缓存
- 目标读者:已经会写简单 CRUD 的后端开发者
- 核心要讲清楚 3 个知识点:缓存穿透、缓存击穿、缓存雪崩
- 必须包含一个可运行的 Spring Boot 配置示例
- 必须包含一个缓存失效的模拟场景
硬性约束:
1. 禁止使用“首先、其次、最后、综上所述”这类过渡词
2. 每一段都必须包含具体的配置项、代码片段或运行结果
3. 如果某个知识点你不太确定,直接写“待人工确认”,不要编造
4. 正文不要超过 2000 字
5. 不要使用空洞的形容词和过度概括性评价
把这段模板复制给你的 AI 工具,要求它按约束输出。你会发现输出的质量明显比一个开放式问题要更接近草稿标准。当然,它仍然是草稿,仍然需要你逐段把关。
4.2 人工重写与信息注入
假设 AI 初稿里有一句话是:
当大量请求同时访问一个不存在的 key 时,会导致请求直接打到数据库,从而造成数据库压力过大,严重影响系统的稳定性。
这句话对不对?对,但太空了。没有说明“大量”是多少,没有说明“不存在的 key”是哪来的,也没有说明“压力过大”如何量化。人工重写时要做的,就是把这些缺失的具体信息补回来。
重写后的版本可以是这样:
假如你的商品详情接口先从 Redis 里查
product:10086,但这个 key 不存在,那么每次请求都会绕过缓存去查询 MySQL。假如瞬时 1000 个请求同时过来,MySQL 就要承受 1000 次相同的重复查询。更危险的是,下次用户换个商品继续刷,MySQL 又要承受另一批查询。这类击中数据库的无效流量多了,连接池会被占满,正常的业务读写都会被拖慢。常见的解决办法是缓存空值,并设置一个较短的过期时间,比如 60 秒。
通过对比可以发现,重写版把抽象场景变成了具体场景,补充了 key 名、请求量和解决办法。读者不需要猜测“缓存穿透到底发生了什么”,而是能直接在脑海里模拟出一次请求链路。
4.3 代码示例:给出可验证的配置
技术文章的第二个关键是提供可验证的代码。不要在正文里用“配置一个 Redis 连接”一句话带过,给出完整配置。以下面这段 application.yml 为例:
yaml复制spring:
data:
redis:
host: 127.0.0.1
port: 6379
password:
timeout: 2s
如果读者本机 Redis 没有密码,这段配置就可以直接启动。如果 Redis 设置了密码,需要把 password 补上。你还可以在正文旁边加一句说明:“这是最基础的连接配置,集群模式下还需要追加 spring.data.redis.cluster.nodes 等参数,但那个属于进阶场景,本文先不展开。”这样既给出了可用示例,又界定了适用范围,避免误导读者把单机配置当成集群配置。
更进一步,可以给出一小段 Java 代码:
java复制// 文件路径:src/main/java/com/example/cache/ProductController.java
@RestController
public class ProductController {
private final StringRedisTemplate redisTemplate;
private final ProductService productService;
public ProductController(StringRedisTemplate redisTemplate, ProductService productService) {
this.redisTemplate = redisTemplate;
this.productService = productService;
}
@GetMapping("/product/{id}")
public Product getProduct(@PathVariable String id) {
String cacheKey = "product:" + id;
String cached = redisTemplate.opsForValue().get(cacheKey);
if (cached != null) {
return jsonToProduct(cached);
}
Product product = productService.findById(id);
if (product != null) {
redisTemplate.opsForValue().set(cacheKey, productToJson(product), 30, TimeUnit.MINUTES);
}
return product;
}
}
这段代码并不能代表完整的生产实现,但配合正文讲解“查缓存、没命中、查数据库、回写缓存”的过程,读者能清楚地看到每一步对应的代码位置。
4.4 用自动化检查和人工清单做最终验证
写完初稿和示例代码后,把 AI 生成的句子替换成你自己整理过的版本,然后在命令行里再次运行检查脚本:
bash复制python check_slop.py docs/redis-cache-article.md
只有当空洞指数降到 5 以下时,才进入最终人工审查。人工审查时可以对照下面的清单:
- 每个小节是否回答了“操作是什么”和“为什么这样做”;
- 文中出现的版本号是否在你本机验证过;
- 每一个代码块是否可以在一个空项目中原样运行;
- 是否有至少一个“错误示例 → 正确示例”的对比;
- 是否有至少一个具体的运行结果或预期输出;
- 结论是否写清楚了适用边界。
如果上述清单都通过,这篇文章就可以从“AI 初稿”升级为“可用文稿”。整个流程不会比直接让 AI 生成然后发布慢太多,但内容质量和读者信任度会完全不一样。
5. 常见问题与排查思路
在实践 AI 辅助写作时,常见的并不是某一个固定报错,而是一类质量偏差。下面把出现频率较高的问题整理成表格,并给出对应的排查思路。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 文章结构完整但读完记不住任何内容 | 所有段落都是概括性描述,缺少具体案例和代码 | 逐段补充配置、命令、截图或运行结果,把每一条抽象结论改成可操作步骤 |
| 代码示例看着正确但运行报错 | AI 没有实际执行代码,接口名或依赖版本对不上 | 本地新建项目验证一遍,尽量把示例简化到最小可运行状态,标注已验证的环境版本 |
| 版本号或配置项疑似过时 | 模型训练数据包含旧版本信息 | 以官方文档为准,文章中写明“以 XX 版本验证”,不要用 AI 记忆中的版本号充当新版本 |
| 每段都出现“首先、然后、最后” | 提问缺少硬性约束 | 在写作任务模板里直接写明“禁止使用这些过渡词”,如果 AI 仍然生成,靠人工删除 |
| 逻辑上依赖的依赖和代码不一致 | 初稿没有全局自检 | 把所有依赖、配置、代码通读一遍,按顺序模拟一次项目构建流程 |
| 解释了概念但没有解决业务问题 | 目标读者被定义得太宽 | 把写作目标改成“教会读者解决一个具体问题”,比如“排查 Redis 连接超时”而不是“了解 Redis” |
| 文字过于正式、无人味 | 模型默认使用“专业书面语” | 加入示例数据、报错现象、个人判断,或者直接人工重写开头和结尾 |
| 内容存在无法查证的数据 | 幻觉导致 | 删除数据,或者只保留有可靠来源的数据,不确定时不写 |
常见问题的核心其实是同一个:人没有完成最终的信息质量控制。AI 负责生产文本,但人类必须对所有事实和操作步骤负最终责任。这不只是编辑概念,在团队协作中更是责任边界问题。如果团队里有人用 AI 写接口文档后没有验证就直接上传,后续被外部团队调用时出现问题,追责就会非常麻烦。
另外还要特别提醒一句:如果 AI 生成的是一段部署命令或数据库变更 SQL,直接在生产环境执行是绝对不能接受的行为。任何生产环境变更都必须经过测试环境验证、备份和审批流程。AI 输出只能作为建议文本,不能作为执行依据。如果你拿不准,哪怕多花一天时间人工核对,也比把线上数据搞出问题要好。
6. 最佳实践与工程建议
当你能熟练区分 AI 辅助写作和 AI slop 之后,下一步就是把这套能力沉淀到日常工作流程中。这里整理几条比较实用的工程建议。
6.1 把内容分成三类,分别采用不同 AI 策略
我建议把写作任务分成三类。
第一类是“草稿型内容”,比如周报、会议纪要、初版技术方案。AI 可以直接参与,因为它可以帮助把零散信息组织成结构,人和读者也不会把草稿当最终结论。重点是标清楚“这是草稿”,发布前还是要过一遍。
第二类是“参考型内容”,比如内部知识库、接口文档、代码注释、配置说明。AI 可以承担一部分初稿,但必须有至少一个人实际验证过其中的操作步骤和代码。参考型内容的错误会产生连锁反应,所以速度可以慢,质量不能低。
第三类是“决策型内容”,比如生产环境变更方案、安全审计报告、数据库迁移方案、故障复盘。这类内容不建议把 AI 生成的段落直接作为决策依据。AI 可以提供分析框架作为辅助参考,但决策理由必须来自人的理解和核实。
6.2 在团队里建立“事实核查”约定
如果你的团队已经有 AI 辅助写作的习惯,建议约定一些硬性规则:
- 生成内容中出现的所有版本号、官方 API、配置项,必须由作者本人至少验证一项;
- 所有 SQL 示例必须能在一个临时数据库里运行,并且要展示运行结果;
- 所有涉及删除、更新、批量操作的语句,必须写明执行前的备份方式和回滚方式;
- 所有引用数据必须写明来源,无法写明来源就删掉;
- 所有“最佳实践”结论,必须有一个具体的适用场景说明。
这些规则不是限制 AI 发挥作用,而是在保护 AI 发挥作用之后的产出质量。毕竟知识库里的错误内容,比没有内容更可怕,因为读者会把错误当作正确参考。
6.3 让 AI 从“第一稿写作者”变成“校对者”
另一个非常有用的思路是让 AI 角色反转。你不让它写初稿,而是让它检查你已经写好的内容。
可以把你的草稿交给 AI,让它完成以下动作:
- 找出每段中可以被删除的空话;
- 指出概念使用是否一致;
- 找出与上下文逻辑不连贯的句子;
- 帮你把一长段拆成更短、更容易理解的小段落;
- 对示例代码提出一个问题清单,供你检查。
这个流程把 AI 放在了一个更好的位置上。它不是一个“无中生有”的创作者,而是一个需要基于现有内容工作的校对者。它提供的建议仍然可能出错,但至少不会像“从零生成一篇完整文章”那样容易产生幻觉和空洞。
6.4 为团队维护一份自定义 slop 词库
我在前面写过 check_slop.py,它的核心价值来自那份可以不断扩充的词库。团队可以维护一份 slop_phrases.txt,把平时在代码审核中常看到的套话加进去。比如“赋能”“抓手”“闭环”“颗粒度”“作为一项有前景的技术”“在实际项目中具有重要意义”等。词库越贴近自身业务,检测脚本就越有针对性。
每过一段时间,可以复盘一次哪些词仍然出现,哪些词只是误报。这样积累半年,团队的文档风格会越来越收敛,读者也会越来越习惯你们知识库的“信息密度风格”。
6.5 注意安全与合规边界
最后一点是关于合法和合规的边界。AI 写作工具可能会被用于自动生成钓鱼邮件、虚假宣传、伪造案例或绕过内容安全机制的内容。这是必须警惕的使用边界。你在自己的工作中使用 AI 写作时,也要遵守内容平台的规则:涉及用户数据、企业内部信息、未公开业务数据时,不要随意粘贴进不受管控的 AI 工具。部分 AI 服务会把输入内容用于模型训练,如果你的团队处理的是敏感数据,最好选择经过合规许可的私有部署方案,或者明确约定哪些内容禁止上传到外部 AI 服务。
在写技术文章时,如果引用了开源代码或者他人文章,要保留引用来源;如果是 AI 生成的内容,很多平台要求标注“AI 生成”或“AI 辅助创作”,这类要求在不同平台也不一样。不要为了显得自己全手写而隐瞒 AI 参与度,信任和透明在长期内容创作中比一次性阅读量重要得多。
7. 写在最后:真正的上限仍然是人
老实说,我到现在也没有找到一个能够准确区分“AI 辅助写作”和“AI slop”的绝对公式。这个词定义的边缘太模糊,同一个句子放到不同文章里,给人感觉完全不同。但我找到了一套实用判断标准,你可以把它当成默认工作流:AI 写初稿时,把它当实习生,重点看它有没有逻辑漏洞;脚本跑检测时,把空洞指数当成“机器提示”,而不是最终审判;人工重写时,把注意力放在事实核查和具体信息上;发布之前,再问自己一个问题——如果读者只记得一句话,你希望那句是什么。
如果这个问题你回答不上来,那这篇文章还是很危险。
AI 辅助写作最大的价值不是替代思考,而是帮助我们更快地把脑中的零散想法组织成可讨论的文本。AI slop 则是思考被跳过的产物。两者之间并没有一道清晰的分界线,但我们可以通过不断完善流程,让自己越来越靠近前者,而不是后者。写技术文章这么多年,我的真实感受是:能够长期获得读者信任的博主,靠的从来不是生成速度,而是每一句话背后都站着一个“我说过、我做过、我验证过”的人。这一点,AI 不会改变,也不会消失。
