主题
02 让 AI 主导工作,让证据和权限决定能否执行
这个系统的基本单位是一项可以追溯的页面改进:它为什么值得做,用了哪些资料,改了哪个版本,谁批准了什么,结果是否支持继续。关键词、文章和报表围绕这项改进连接起来。这样,即使某个模型换了,数据迟到了,或者一次实验没有效果,工作也能从可靠的状态继续。
本章先给出完整的目标设计。交付原型只实现其中的本地闭环;生产身份认证、多机调度和远程发布并未因为画进架构图就自动具备。阅读时按以下三个等级判断能力。
| 等级 | 本书中的含义 | 不能据此声称什么 |
|---|---|---|
| 原型已实现 | 源码中存在,可用本地合成数据执行并接受测试 | 真实流量、排名、收入已经验证 |
| 配置后可接入 | 有适配代码或清楚的接口合同,还需账户、授权、配额和真实验收 | 填入凭据就一定稳定可用 |
| 生产扩展未实现 | 给出工程设计与验收条件,需另行开发 | 交付包已经包含企业级平台 |
原型到底实现了哪一段
当前 CLI 只有 demo、status、recover,均要求专用 --workdir。entities 用不可变 JSON 记录关键词、分类、页面计划、来源、事实、提案、决策与机会反馈;pages 指向当前版本,versions 保留旧版本,另有 metrics、approvals、actions、experiments、audit、meta 表。精确 DDL 在 store.py。
可执行的页面改动目前仅为 update_title。动作状态从 applied 到 kept 或 rolled_back;实验从 observing 到对应终态。数据不足的 wait 仍保持观察,并记录原因。没有自动研究任意真实市场、长文自主生产、真实发布或模型自改代码。预设资料和固定模型回复演示数据流,不能称为完成了真实调研。
本地批准绑定提案 hash、页面、动作、旧版本、到期时间和 synthetic-local-preview 范围,并记录消费。默认策略的 4 次动作预算、7 天冷却和指标最低量属于合成演示初始规则,不能直接当作真实统计门槛。STOP 文件会拦截新的受控动作;它不是跨机器、跨进程的远程紧急停机平台。
2.1 一条闭环,同时保留三个事实层
先区分三层事实。第一层是输入证据,例如需求原句、资料版本、搜索报告响应。第二层是系统动作,例如生成草稿、批准差异、构建预览、恢复旧版本。第三层是外部结果,例如 Google 是否索引、真实访客是否完成任务、广告收入是否结算。原型可以证明第二层按规则运行,不能用它的合成报表证明第三层成功。
建议采用下面的工作图。图中的状态描述业务阶段,不等于数据库枚举;代码的精确字段和状态以第 9 章及 prototype/seo_loop 为准。失败可以进入“待补证据”或“待人工决定”,没有必要把任何阻塞都当作整个项目失败。
正在绘制图示…
查看图源代码
flowchart TD
A[种子与任务边界] --> B[机会与来源证据]
B --> C[主题和页面任务]
C --> D[事实包与草稿]
D --> E[规则检查和独立审稿]
E --> F{证据与质量足够吗}
F -- 否 --> B
F -- 是 --> G[人工批准具体版本]
G --> H[本地预览与验收]
H --> I[另行授权的生产发布]
I --> J[版本与指标快照]
J --> K[提出可反驳的改进假设]
K --> L[小范围实验与观察]
L --> M{证据支持什么}
M --> N[保留或继续观察]
M --> O[恢复旧版本]
N --> B
O --> B
实际工作还需要一条不依赖搜索结果的快速反馈:草稿能不能让人完成任务,工具算得对不对,读者会不会误解输入条件。这些问题可以在发布前验证。只有涉及真实搜索处理、访问组成和收入的假设,才必须等待相应外部证据。不要让“SEO 需要时间”成为不修功能错误的理由。
2.2 四个角色,各自少拿一点权限
规划者负责提出下一步:哪个需求值得调查,哪个证据缺口阻碍判断,怎样用小改动验证假设。它收到的是结构化资料与预算,不拥有生产写权限。写作者根据事实包生成候选正文和变更单,可以标记未知,不能把未知填成看似确定的数据。
审稿者独立检查来源与结论之间的关系,提出最强的反对意见。它与写作者分开运行,有助于暴露遗漏,但两次模型判断并不构成独立事实证明。同一个错误来源可能使两个模型一起出错。程序只检查可机械验证的事项,例如必填字段、证据 ID 存在、URL 范围、成本上限和版本散列。语义真实性、原创价值及法律适用问题,仍需相应人工复核。
最后,确定性执行器只接收白名单动作及通过校验的参数。它不接收“照模型说的运行以下 shell”。规划者即使输出合法 JSON,也可能提出危险动作,所以格式验证之后还要检查业务范围、当前版本、审批和预算。这种分层控制与 OWASP 对提示注入的工具侧校验、最小权限建议一致。[A02]
| 角色 | 可以交付 | 不应拥有的能力 |
|---|---|---|
| 规划者 | 候选任务、证据需求、实验假设 | 发广告、改权限、发布生产 |
| 写作者 | 基于证据的草稿和差异 | 执行任意代码、创造来源 |
| 审稿者 | 问题列表、严重级别、拒绝理由 | 自己批准自己生成的高风险修改 |
| 执行器 | 校验后的本地版本、预览、审计记录 | 越过动作白名单解释自然语言 |
| 人工负责人 | 事实确认、具体审批、预算和方向决定 | 用一次笼统许可替代后续重大变更审批 |
小站可以由同一个人承担全部人工职责,但系统中仍应分开“建议”“审核”“批准”“执行”的记录。外部网页、SERP 摘要、API 返回和文档里的文字都是资料,不能成为指令来源。
2.3 用稳定的实体 ID 把证据串起来
下面是生产目标数据合同,表示每类对象至少应能回答什么。原型可以把其中一部分存为 JSON;这不意味着全部列都已经实现。新增字段前先做迁移和兼容测试,不能只改文档。
| 对象 | 必须回答的问题 | 建议保留的关键属性 |
|---|---|---|
| 需求/关键词 | 谁在什么条件下要完成什么 | 稳定 ID、原句、语言地区、来源、时间、状态 |
| 来源/证据 | 谁说的,何时取得,是否可再用 | 来源 ID、URL、标题、取得时间、内容 hash、权利说明 |
| 实体/事实 | 说的是哪个对象,结论适用于哪版 | 实体 ID、断言、适用版本、证据 ID、失效条件 |
| 页面 | 这个地址长期承担什么任务 | page ID、任务、语言、主题、规范身份、负责人 |
| 页面版本 | 这一版到底写了什么 | version ID、内容 hash、父版本、证据集合、生成配置 |
| 指标快照 | 何时发生、何时看到、后来是否修正 | 指标、维度、时区、事件区间、观测时间、revision |
| 决策/实验 | 为什么改变,怎样判断是否值得 | 假设、主要指标、护栏、比较方法、状态、结论 |
| 动作/批准 | 允许谁对什么做哪一步 | 动作 ID、目标、操作、差异 hash、有效期、使用记录 |
不要拿标题当页面主键。标题会改,slug 也会迁移;页面 ID 应在这些变化中保持稳定。也不要把“主题”“关键词”“页面”当同一种对象。多个表达可能指向同一个任务,一个主题可能需要工具、教程和排错页分别承载。
建议生产中另设 URL 映射:原始 URL、清洗 URL、声明的 canonical、搜索系统选择的 canonical、内部 page ID、映射生效时间。它们不能互相覆盖。开发者声明的 canonical 是一种信号,并不等同于 Google 最终选定的规范页。[A03] 参数是否删除、路径大小写是否合并,要按站点路由测试决定;不能用全站字符串替换把不同语言或产品版本合成一页。
来源记录要能复核,但不能无限复制
证据包优先保存来源地址、取得时间、必要短摘录、解析后的事实、响应元数据和 hash。只有确有权利且确有必要,才留原始全文或完整 API 响应;设置保留期和访问范围。完整响应可能包含查询文本、个人信息或商业数据,不能因为叫“审计”就永久公开保存。
公开可读不等于允许重新发布。美国版权局区分事实与其受保护的表达,并明确网站原作可能受版权保护;具体项目还需核对适用地区、许可与合同。[A04] 内容 hash 用来判断保存的字节是否变化,不能证明来源真实、观点正确或素材有授权。
2.4 指标有两种时间,还会被修订
指标记录至少要区分“被统计的日期”和“我们拿到它的时间”。例如 10 月 1 日的点击数据,10 月 4 日导出一次,10 月 8 日再导出一次,数值可能变化。不要覆盖第一次观察;新增 revision,说明当前报表采用哪一版。正式状态与仍在补全的状态也应分别保存。Search Analytics 提供 dataState 等字段,报告还存在行数与数据覆盖限制;适配器必须把这些限制传到决策层。[A05]
一条生产指标身份建议由以下内容共同确定:数据源、资源 ID、查询规格 hash、维度集合、统计窗口、指标名、单位。observed_at 与 revision 区分同一身份的多次观测。币种和时区属于口径,不能只写进备注。缺失写 unknown 或 blocked;只有确认测得零才写 0。
版本与指标也要明确连接。一个页面在窗口中间更新,整窗收入不能毫无说明地全归给新版本。可拆窗口、记录暴露时间,或把该次观察降级为混合版本观察。流量不足时结论就是“无法判断”,而非要求模型填一个增长原因。
2.5 批准是一张窄通行证
“可以继续优化”不足以授权一次生产改动。更安全的批准单绑定操作、目标、版本和有效期。下面是生产设计示意,字段名不冒充原型 API:
json
{
"operation": "publish_version",
"target_page_ids": ["page-time-converter"],
"base_version_hash": "sha256:旧版本散列",
"candidate_hash": "sha256:待发布内容散列",
"environment": "production",
"expires_at": "2026-11-01T10:00:00Z",
"max_uses": 1,
"approved_by": "已认证的负责人身份"
}执行前重新取得当前版本。若它与 base_version_hash 不同,停止并重新出差异;旧批准不能覆盖别人刚做的修正。批准范围只包含列出的页面,不会顺便覆盖全站模板、robots、canonical、广告代码或追踪脚本。执行器将“验证批准、扣减可用次数、登记动作”放入受控事务,并在外部副作用后进行状态核对。
本地演示的批准记录用于检验程序拒绝越权和版本漂移;它不是可用于互联网服务的身份认证。生产扩展还需可信登录、角色权限、不可由模型写入的批准通道、重放防护和撤销。即使有审批表,能直接改 SQLite 文件的人仍可能改记录;本地原型不能抵抗宿主机管理员篡改。
2.6 SQLite 先解决连续运行,不急着建平台
原型选择 SQLite,目的是把重跑、版本、动作和证据放到同一份本地状态中。SQLite 适合嵌入式本地应用,但同一时刻只允许一个写者;需要跨机器并发写或高写入负载时,应重新评估架构,而非直接把数据库文件放到共享网络盘。[A01]
第一阶段让一个受控进程负责写入,模型调用与网络等待尽量不占数据库事务。每个工作项有幂等键:同一证据、同一输入版本、同一规则版本和同一动作重复到达,不应重复创建页面或记两笔收入。幂等并不意味着“运行第二次完全没有新记录”;可追加一次运行日志,但业务副作用只发生一次。
生产扩展可逐步拆成 PostgreSQL 管理事务与权限、对象存储保存获准的响应和构建产物、任务队列管理延迟与重试。迁移理由应来自实测的锁等待、运行时间、数据量、恢复要求及多人操作需求。增加这些服务会带来账户、备份、密钥、升级与故障恢复成本,不是站点页面达到某个固定数字就必须升级。
任务队列的目标应采用“允许重复投递、执行幂等”的设计,不宣传端到端恰好一次。工作者取得有期限的租约,崩溃后允许重新领取;重试前查询动作结果。数据库写完而外部发布结果未知时,先对照发布清单和目标状态,不能直接再发一次。原型没有远程发布,所以还未验证这种分布式故障。
2.7 停止规则比更多自动化更重要
每次任务先预留预算,再发起调用,最后记录实际费用和差额。调用费、请求次数、运行时间、页面数量、并发数分别设上限。价格未知时不能用“0 元”通过预算门;付费 live 模式应拒绝执行,等待负责人补齐报价与限额。预算数值是运营策略,不是模型可靠性的保证。
| 故障或风险 | 原则 | 生产需要补齐的机制 |
|---|---|---|
| 临时超时、可重试服务错误 | 有界退避,尊重服务限流指示 | 指数退避加抖动、总截止时间、费用累加 |
| 权限失效、结构不符、证据冲突 | 不用重试掩盖问题 | 隔离记录、负责人处理、明确解封条件 |
| 连续失败 | 暂停该来源,别拖垮全系统 | 熔断器及有限探测恢复 |
| 多轮模型修稿仍失败 | 停在问题上,不无限循环 | 最大轮数、失败样本、死信队列 |
| 刚改完又想改 | 等观察窗口或处理明确故障 | 页面级冷却期,紧急修复独立批准 |
| 全局异常或重大投诉 | 停止新副作用,保留诊断 | kill-switch、权限撤销、已在途动作核查 |
这张表是完整运营设计;哪些已落实为代码,以第 9 章测试清单逐项确认。死信队列的作用是保存不能自动完成的工作及原因,不是悄悄丢弃。恢复后重新提交也要沿用原业务身份,避免重复动作。
备份要把数据库、必要证据、构建产物和配置版本一起考虑。SQLite 提供在线备份 API;Python 的 sqlite3 封装可用于生成一致备份。[A06] 不能把“成功复制一个文件”当作恢复成功。第 10 章要求在另一路径恢复、校验完整性、复建页面并核对版本。生产 PostgreSQL 还需根据恢复目标选择备份和恢复方案,不能照搬 SQLite 文件复制。[A07]
本章依据
- [A01] SQLite:适用场景与并发边界,访问 2026-10-14。
- [A02] OWASP:LLM 提示注入防护,工具侧参数与权限控制。
- [A03] Google:规范 URL,声明与选择的区别。
- [A04] 美国版权局:保护范围,访问 2026-10-14;不替代当地法律意见。
- [A05] Search Analytics query,时间、状态及覆盖边界。
- [A06] SQLite 备份 API、Python 3.12 sqlite3。
- [A07] PostgreSQL:备份与恢复,访问 2026-10-14。
- 实现依据:本包
prototype/seo_loop/、prototype/tests/及第 9 章的实际执行记录。未标为“原型已实现”的结构均是本文设计合同。