# 第 26 章 自动化工作流的可靠性 以"每日 AI 热点选题聚合"为贯穿案例,说明自动化工作流在从手动运行到定时可靠执行的过程中,需要处理哪些问题。 ## 案例背景:内容博主的每日选题任务 AI 内容领域更新速度快,每天需要从多个信息源中筛选当日值得写的选题。手动逐一翻阅各个平台耗时且容易遗漏。一个典型的 AI 博主选题需求如下: ```text 我是一名 AI 领域的博主,主要内容方向是 AI 教程、AI 工具、AI Coding、AI 测评等。 帮我找今日的 AI 领域热点,方便筛选当天的选题内容。 来源: - 微信公众号近期爆款文章(@wechat-article-search) - GitHub 今日热门 AI 项目(@GitHub热门项目) - 多引擎 AI 新闻聚合(@多引擎搜索) - AI 热点追踪(@AIHOT) ``` 手动运行一次这个任务,WorkBuddy 会同时调用四个数据源,整合输出一份当日 AI 热点清单,供博主快速判断和筛选。 ![](assets/001_image_FGBhb1udco.png) ![](assets/002_image_Yuucbmf9So.png) 跑通一次后,下一步是把它设置为定时自动化任务:每天早上 9:00 自动运行,结果推送到指定位置,无需每天手动触发。 本章围绕这个场景,说明从"能用"到"可靠自动化"需要处理哪些问题。 ## 自动化前的三个门槛 不是所有任务都适合立即自动化。判断标准: 1. **同一 Prompt 已手动运行至少三次**,输出质量和格式基本稳定; 2. **触发条件、输入来源和验收标准清楚**:什么时候运行、依赖哪些数据源、输出什么格式; 3. **有 owner、有告警、有停用方法**:任务失败时谁处理,如何临时停用不影响其他流程。 选题任务满足以上三点:Prompt 结构固定、每天早上 9:00 触发、输出内容为当日热点清单。 频繁改 Prompt 或数据源还不稳定的任务,先手动运行,不急于自动化。 ## 在 WorkBuddy 中设置自动化任务 手动运行确认效果后,在同一对话框中直接告诉 WorkBuddy: ```text 把这个任务设置为自动化,每天早上 9:00 运行, 结果发送到 [指定飞书群 / 邮件 / 企微通知]。 ``` WorkBuddy 会将当前 Prompt 和数据源配置保存为定时任务,按设定时间自动执行。 ![](assets/003_image_RNrFb50Tqo.png) ![](assets/004_image_IPtlb5D3Zo.png) 设置完成后,每天早上 9:00,WorkBuddy 自动调用四个数据源,整合结果并推送。博主打开通知,直接开始筛选选题,不需要手动触发。 ![](assets/005_image_A6Jmbe0tao.png) ## 把自动化任务设计成状态机 自动化不是让任务"跑起来就行"。真实环境中,每次运行都可能遇到:某个数据源返回超时、当日无 AI 相关条目、GitHub API 限流、推送目标不可达。 将任务设计成状态机,每个状态都有明确的成功条件和失败出口: ```mermaid stateDiagram-v2 [*] --> WaitingTrigger WaitingTrigger --> Fetching: 9:00 触发 Fetching --> Aggregating: 数据源全部响应 Fetching --> PartialAggregating: 部分数据源超时 Aggregating --> Filtering: 聚合完成 PartialAggregating --> Filtering: 超时来源标记缺失 Filtering --> Delivering: 筛选完成,有有效条目 Filtering --> Blocked: 所有来源均无有效 AI 内容 Delivering --> Completed: 推送成功 Delivering --> Blocked: 推送失败 Blocked --> WaitingTrigger: 次日重新触发 ``` 关键原则:部分数据源失败不应阻断整体任务,而是标记缺失后继续聚合;推送失败应保留结果并告警,不丢失已生成的内容。 ## 数据源就绪检查 定时触发不等于数据源已就绪。每次运行开始时,先检查各数据源的可用性: | 数据源 | 检查项 | 不可用时的处理 | |-|-|-| | @wechat-article-search | 搜索 API 可达,返回非空结果 | 标记缺失,继续其他来源 | | @GitHub热门项目 | GitHub API 未限流,热门列表正常 | 退避重试一次,失败则标记缺失 | | @多引擎搜索 | 搜索引擎可达 | 标记缺失,继续其他来源 | | @AIHOT | 热点追踪服务正常 | 标记缺失,继续其他来源 | 四个来源中至少有三个正常,才输出完整热点清单。全部失败时,进入 Blocked 状态并推送告警,次日重新触发。 ## 内容质量门禁 数据源可达不代表内容有效。聚合后需要过滤: - **相关性**:条目是否真正属于 AI 领域(排除泛科技话题的噪音); - **时效性**:内容日期是否为当日(排除过期热点被重新推送的情况); - **重复性**:同一事件是否已在多个来源出现,合并展示; - **最低数量**:有效条目少于 5 条时,视为当日 AI 热点不足,在输出中标注。 质量状态:**pass**(正常输出)、**warning**(部分来源缺失,在输出顶部说明)、**blocked**(有效条目不足,不推送正文,只推送说明)。 ## 输出结构 聚合完成后,输出一份结构固定的热点清单,方便博主快速扫描和判断: ```text 📋 AI 热点选题日报 — 2026-07-10 【今日概况】 有效条目:18 条 | 来源:4/4 | 运行时间:09:02 ━━━━━━━━━━━━━━━━ 🔥 高热度(适合快速蹭热点) 1. [模型名称] 发布,[核心能力] — 来源:AIHOT + GitHub 热度指数:★★★★★ | 建议角度:功能测评 / 使用教程 2. [工具名称] 开源,[功能描述] — 来源:GitHub热门项目 热度指数:★★★★ | 建议角度:上手教程 / 对比测评 ━━━━━━━━━━━━━━━━ 📈 潜力方向(适合深度分析) 3. [话题] 引发讨论 — 来源:微信公众号 热度指数:★★★ | 建议角度:观点分析 / 案例拆解 ━━━━━━━━━━━━━━━━ ⚠️ 数据来源说明 GitHub:正常 | 微信:正常 | 多引擎搜索:正常 | AIHOT:正常 ``` 输出格式固定后,博主可以在 5 分钟内完成选题判断,而不是每次重新整理格式。 ## 推送目标与幂等 每次运行的输出需要推送到固定位置。常见推送目标: | 推送目标 | 适用场景 | 注意事项 | |-|-|-| | 飞书群消息 | 团队共享选题 | 记录 message ID,避免重复推送 | | 个人飞书通知 | 个人使用 | 同上 | | 飞书文档(追加) | 保留历史记录,便于回溯 | 每日一条,按日期追加,不覆盖历史 | | 邮件 | 跨平台通知 | 记录发件 ID | **幂等原则**:如果某次任务因推送失败而重试,不应重复发送已成功推送的内容。每次运行生成唯一批次 ID(如 `ai-hotspot-2026-07-10`),推送成功后记录状态,重试时检查状态跳过已完成步骤。 ## 超时和重试策略 | 失败类型 | 是否重试 | 策略 | |-|-|-| | 数据源 API 超时 | 是 | 等待 10 秒后重试一次,仍失败则标记缺失 | | GitHub API 限流(429) | 是 | 按响应头中的 Retry-After 等待,最多等待 2 次 | | 认证失效(401/403) | 否 | 转人工处理,不自动重试 | | 推送目标不可达 | 是 | 指数退避重试 2 次,失败则告警并保留结果 | | 聚合结果为空 | 否 | 进入 blocked 状态,推送说明,次日重新触发 | 重试只针对临时性故障,不对输入问题或配置问题重试。 ## 断点续跑 每次运行生成状态文件,记录已完成的步骤和产物: ```json { "batch_id": "ai-hotspot-2026-07-10", "trigger_time": "2026-07-10T09:00:00+08:00", "state": "delivering", "completed": ["fetching", "aggregating", "filtering"], "source_status": { "wechat": "ok", "github": "ok", "multi_search": "ok", "aihot": "ok" }, "item_count": 18, "last_error": null, "updated_at": "2026-07-10T09:02:14+08:00" } ``` 推送失败后重试,从 `delivering` 步骤继续,不重新抓取和聚合。 ## 告警要可行动 自动化任务失败时,告警内容必须包含足够信息,让收到告警的人能够立即判断如何处理: ```text ⚠️ AI 热点选题任务告警 批次:ai-hotspot-2026-07-10 状态:Blocked 触发时间:09:00 失败原因:所有数据源均返回空结果或超时 已完成步骤:fetching(部分失败) 影响:今日热点清单未生成,未推送 建议处理: 1. 检查各数据源 API 状态 2. 如为临时故障,可手动触发一次任务重跑 3. 如需跳过今日,确认后标记为已处理 恢复入口:WorkBuddy → 自动化任务 → 手动运行 ``` "任务失败,请查看"不足以让人处理。 ## 降级交付 当部分数据源失败,不应等待全部就绪再输出: - 3 个及以上来源正常 → 输出清单,顶部标注哪些来源缺失; - 2 个来源正常 → 输出简化清单,标注数据不完整; - 1 个或 0 个来源正常 → 不输出正文,只推送说明和告警。 降级结果必须显式标记来源覆盖情况,不伪装成完整运行。 ## 日志 每次运行记录: - 批次 ID 和触发方式(定时 / 手动); - 各数据源响应状态和耗时; - 聚合条目数量和过滤后数量; - 推送目标和结果(成功 / 失败 / message ID); - 总耗时和错误信息; - 运行成本(Token 消耗、API 调用次数)。 日志不记录热点内容正文(避免日志过大)。 ## 成本预算 选题任务的主要成本来源: | 成本项 | 说明 | |-|-| | WorkBuddy 调用次数 | 每次运行调用四个 Command,按平台计费规则计算 | | 外部 API 调用 | GitHub、搜索等数据源的 API 调用费用 | | 模型推理 | 聚合和过滤阶段的 LLM 推理 | | 推送服务 | 飞书等推送 API 的调用 | 设置预算上限:单次运行超过设定成本时,记录告警并继续运行,但下一次运行前需确认。 ## 自动化任务定义模板 以选题任务为示例,记录完整的自动化任务定义: ```text 任务名称:AI 热点选题日报 触发方式:每天 09:00(工作日) 触发条件:无前置检查,定时直接运行 Prompt:[完整 Prompt 文本] 数据源:@wechat-article-search / @GitHub热门项目 / @多引擎搜索 / @AIHOT 质量门禁:有效 AI 相关条目 ≥ 5 条;数据源可用数量 ≥ 3 个 输出格式:结构化热点清单(含来源、热度、建议角度) 推送目标:[飞书群 / 个人通知 / 飞书文档追加] 幂等控制:批次 ID = ai-hotspot-{date},推送成功后标记,不重复推送 重试策略:数据源超时重试 1 次;推送失败退避重试 2 次;其他失败转人工 告警接收:[个人飞书通知] owner:[博主本人] 停用方式:WorkBuddy 自动化任务管理页 → 暂停 ``` ## 上线前演练 正式开启定时任务前,手动模拟以下场景,确认任务行为符合预期: | 场景 | 预期行为 | |-|-| | 所有数据源正常 | 输出完整清单,推送成功 | | GitHub API 限流 | 退避重试,仍失败则标记缺失,继续聚合其他来源 | | 当日无 AI 相关热点 | 有效条目不足,输出说明,不推送空清单 | | 推送目标不可达 | 重试 2 次,失败则告警并保留结果 | | 重复触发(手动触发与定时同时) | 检测批次 ID,跳过重复执行 | 演练通过后再开启定时运行。 ## 运行指标 稳定运行后,定期检查以下指标: - **按时触发率**:09:00 定时是否准时触发; - **一次运行成功率**:不需要重试的成功比例; - **数据源可用率**:各来源的单独可用比例; - **有效条目数量趋势**:监测 AI 热点信息量的波动; - **推送成功率**:推送不丢失的比例; - **单次运行成本**:追踪成本变化趋势。 指标出现持续下降时,检查对应数据源或推送配置是否发生变化。 ## 从个人自动化到团队服务 个人选题任务运行稳定后,可以扩展为团队共享: | 维度 | 个人使用 | 团队服务 | |-|-|-| | 推送目标 | 个人通知 | 团队飞书群 | | 选题方向 | 单一方向 | 多方向分类推送 | | 审核流程 | 个人判断 | 主编确认后分发 | | 故障处理 | 自己处理 | 有 owner 和备份处理人 | | 成本归属 | 个人账户 | 团队预算 | 扩展为团队服务时,需要补充:明确 owner、建立运行手册、设置权限(谁能修改 Prompt 和推送配置)、制定变更流程(修改数据源需测试后生效)。 自动化的高级形态,不是完全没有人,而是正常路径少打扰人,异常路径能及时找到正确的人。 ## 选题任务的迭代优化 自动化任务上线后,根据实际使用反馈持续迭代: **Prompt 优化**:根据哪类条目真正被采用、哪类被忽略,调整过滤维度和描述。修改 Prompt 后需手动运行三次确认效果再重新保存自动化配置。 **数据源调整**:某个数据源长期质量差或可用率低,考虑替换或降低其权重。 **输出格式迭代**:根据筛选习惯调整清单格式(如增加"本周已覆盖"标记,避免重复选题)。 **时间调整**:根据实际使用习惯调整触发时间(如改为 8:30 或 10:00)。 每次调整都是一次小型配置变更,遵循"改 → 手动验证 → 重新保存"的流程,不直接在定时任务上实验。