我给 AI 定的 4 条「不许编」红线,每一条背后都有一次翻车
这是「一个人的 AI 营销部门」系列第 6 篇。前五篇讲了这套系统 长什么样、 一条流水线怎么跑、 看板规则怎么定、 发布权怎么交出去、 出过哪三次事故。
这一篇讲一个更麻烦的问题:AI 会一本正经地编东西,而且编得比真话还顺。
我最开始以为这事靠"选个更强的模型"就能解决。跑了几个月发现不是——模型越强,编出来的 东西越像真的,越难被抓住。真正管用的是把红线写死进规则文件,让它每次干活之前都必须过一遍。
下面四条红线,每一条都是先翻车、后补规则。翻车记录全是我自己这套系统的真事。
红线一:引用任何线上事实,必须先把真东西取回来
翻车过程:2026-09-13,AI 在例行巡检里开了一张 P0 卡片,标题大意是 「aiwith.chat 博客全站空白,41 篇文章全部 404」。证据给得很像回事:三个 slug, 三个都是 404。
我当场就去排查了。结果博客好好的。
问题出在那三个 slug 是 AI 凭印象拼出来的:
- 它写
is-chatgpt-plus-worth-it-2026,真实的是is-chatgpt-plus-still-worth-it-2026(少了个still) - 它写
two-models-one-subscription,这篇站上压根不存在
不存在的地址当然返回 404。拿这个反推"全站挂了",是一次纯粹的假警报,代价是我一次紧急排查。
更值得注意的是第二个站。当时 CN 博客确实是空的,但原因是它本来就还没发过文章。 AI 把"空表"和"故障"看成了一回事——这两者在接口返回上长得一模一样。
补进去的红线:
报线上故障(尤其是 404 / 空页)之前,必须先从列表页、
sitemap.xml或数据源里 取出真实存在的 URL 再去测。不许凭印象构造 slug。 多个站点同时"异常"时,先问一句「这个站本来有数据吗」。
落到动作上就是一行命令,取回来再测:
curl -s https://aiwith.chat/blog | grep -o 'href="/blog/[a-z0-9-]*"' | sort -u
这条红线的适用面比它看起来宽得多。凡是 AI 要在产出里写一个它没亲眼取回来过的 外部事实——链接、价格、版本号、竞品的功能列表——都该走同一道闸:先取回来,再引用。
红线二:用来证明产品能力的图,一张都不许生成
我的内容里要配图。小红书这类平台纯文字笔记基本没有流量,配图是发布的前置条件, 所以生图这一步也交给了 AI(走火山引擎 Ark)。
问题是:AI 画图不挑题材。你让它画一张"产品界面截图",它真能画出一张看起来非常 像真的产品截图——按钮、侧边栏、对话气泡一应俱全,只是那个产品不长这样。
这已经不是"内容质量"问题了,是伪造产品证据。一旦发出去,读者按图来试, 对不上,信任一次性归零。
补进去的红线:
AI 生图只能做封面图、概念示意图、氛围图。凡是「产品界面截图」「真实生成结果」 这类用来证明产品能力的图,一律不能用 AI 画——必须标注为人工截图项,留给人去截。
顺手还有两条踩出来的实操经验,一并写进了规则:
- 生成后必须把图下载到本地再入库。Ark 返回的是签名 URL,
X-Tos-Expires通常是 86400 秒(24 小时),只在 md 里贴链接的话第二天就是一片死链。 - 图里的中文字容易出错字,交付时提醒人核对一遍再发。
红线三:数字要连口径一起给,口径不对的数字比没有更糟
翻车过程:我想看一个导流效果——freeai.help 往 aiwith.chat 引流,转化如何。
AI 去自建的 Plausible 查了,回来说数据正常。
但它查错了地方:它去 freeai.help 自己的站点里查 utm_source=freeai-blog。
这个维度在那边根本不会有值——utm_source 是访客落地时被记录的,
要查自我导流的标记,得去落地站点 aiwith.chat 查。
换对站点之后,真实数字出来了:90 天 18 个访客、0 转化,点击率约 0.02%。 判定为白嫖流量,相关卡片直接关掉,不再投入。
如果当时信了第一次那个"数据正常",我会继续往一条已经死掉的渠道里投时间。 一个取错口径的数字,比根本没有数字更贵——没有数字你至少知道自己不知道。
补进去的红线:报数字必须同时报取数口径(哪个站点、哪个时间窗、哪个维度、 哪个过滤条件)。口径写不清楚的数字不许出现在结论里。现在这套查询长这样, 口径全在请求体里摆着:
curl -sS "https://analytics.bumo.cc/api/v2/query" \
-H "Authorization: Bearer $ANALYTICS_KEY" -H "Content-Type: application/json" \
-d '{"site_id":"aiwith.chat","metrics":["visitors","events"],"date_range":"30d",
"dimensions":["event:goal"],
"filters":[["is","visit:utm_source",["freeai-blog"]]]}'
红线四:取不到的指标就写「未配置」,不许估算
这条是前三条的兜底,也是我认为最重要的一条。
我每周日 9:05 有一份自动跑的指标周报(scripts/weekly-metrics.py),要报注册数、
订阅数、MRR、CN 付费收入、GSC 展现和点击。这些数据分散在四五个来源,
每个来源都有可能因为凭证过期、接口改版而拿不到。
拿不到的时候怎么办?一个"聪明"的 AI 的默认倾向是按上周的数推一个, 或者干脆略过不提。两种都是灾难:前者往你的决策依据里掺假数据,后者让你以为这周没数据可看。
所以脚本第 5 行就把设计原则写死了:
能自动取的字段直接取;取不到的字段明确标「未配置」而不是瞎猜或报错退出。
代码里就是一个常量,所有取数失败的分支全部返回它:
TODO = "未配置"
# ...
def fetch_gsc(...):
if not (creds and site):
return {"impressions": TODO, "clicks": TODO}, "GSC_* 未配置"
有一个字段到今天还是「未配置」,我也没让它变成数字:周报里的"注册用户中非中国占比"。
原因写在脚本注释里——用户表(chat-pro/chat-server/src/models/user.ts)根本没有存
国家/地区字段,Plausible 上也没有对应的目标事件(已经用 v2 query API 核对过 30 天内
的 event:goal 维度)。两条路都拿不到,那就是拿不到。要么人工加打点,要么这一格
永远空着,不能猜。
每周看到那个「未配置」我都有点不舒服——这正是它该有的效果。一个刺眼的空格会催我去补打点, 一个编出来的数字只会让我心安理得地做错决定。
这四条最后是怎么生效的
关键不在于我知道这四条,而在于AI 每次干活前都会读到它们。
我的做法是:红线不写在对话里,写进项目根目录的规则文件(我这边是 CLAUDE.md)。
每次任务启动时它被自动加载,优先级高于模型自己的默认行为。写在对话里的规则,
下一个会话就没了;写进规则文件的规则,一年后新开的会话照样生效。
规则文件最底下还有一条总纲,管的是所有没被上面四条覆盖到的情况:
宁可少做也不要做错。没把握就标记人工,不要猜。
这句话同时出现在两条定时线的 prompt 里(comment-watch.sh 和 daily-agent.sh)。
它给了 AI 一个体面的退出选项——发现自己没把握时,"标记人工"是一个被明确认可的、
不算失败的结果。如果不给这个出口,一个被要求"完成任务"的 agent 在信息不足时,
最自然的行为就是编一个看起来合理的答案填上去。
很多"AI 幻觉"其实是这么来的:不是它想骗你,是你没给它说"我不知道"的余地。
如果你也打算把内容或者运营的活交给 AI 去跑,我的建议是:别等出事再补规则。 上面四条直接抄过去,改成你自己业务的名词,今天就能用。踩一次假警报的成本, 比读这篇文章高得多。
想给自己的团队搭一套?
这套系统是我给自己 12 个产品用的。现在我把同一套东西搭进别人的公司:
- 一块属于你自己的看板:AI 在里面领任务、写稿、配图、发布、汇报,进度你随时能看
- 一套它不会闯祸的规则:谁能发、发之前过几道闸、出问题多久告警,全部写死在规则文件里
- 每周 30 分钟的你:审方向、点发布。剩下的活它自己干
- 按月交付内容和数据:不是「给你一个会写字的 AI」,是内容条数、搜索展现、转化数据一起交
价格:启动包 ¥3,000 起(搭板 + 规则 + 跑通第一轮),月度方案 ¥5,000 起(持续产出 + 数据复盘)。 首批 3 个创始客户 8 折,我会按你的行业把规则调到能用为止。
下一步:到 bumo.cc/issue 找我——微信客服、在线客服、 商务邮箱都在那一页,挑你顺手的那个,说一句「想聊 AI 自动化交付」就行。 20 分钟聊完你至少能带走一张「你的内容流水线该长什么样」的一页纸,不合适也不亏。
想先自己动手也完全可以。这套流水线调用的模型能力全部来自 不墨 AI——一个订阅同时用 GPT / Claude / Gemini / DeepSeek / Kimi, 写稿、起标题、做摘要这些活它都能接。