基于Dify搭建AI事故复盘助手:工作流编排与提示词实战全解

发布时间:2026/9/29 5:43:28
基于Dify搭建AI事故复盘助手:工作流编排与提示词实战全解 我先把话说在前头这个项目不是那种“看起来很美、落地就废”的AI玩具。我基于Dify做了一款叫“hindsight”的事后复盘助手专门用来处理线上事故、迭代复盘和客服工单分析这类“回头看”的场景。这篇文章是把整个项目的设计思路、搭建过程、踩坑经历全部摊开来讲内容偏工程向但我会尽量把每一步都讲透让你照着也能搭出一个能用的版本。先说清楚hindsight到底解决什么问题。日常研发里最消耗人的不是写代码而是“回忆”。线上出事故了要拉人、翻聊天记录、找变更单、对时间线一整套复盘搞下来两三个小时起步最后写出来的报告还经常漏掉关键细节。hindsight的核心思路就是把这些散落在各个平台的碎片信息统一丢给AI让它帮你完成时间线梳理、根因推断、影响面评估和行动项提取把复盘的产出效率提升一个量级。项目本身是用Dify搭建的。Dify这个开源平台最大的好处是不用写太多胶水代码就能把大模型、知识库、工作流编排、API发布串起来。hindsight这个名字取的是“后见之明”的意思——复盘本来就是事后视角AI正好擅长在信息洪流里找规律这个名字算是贴切。我下面会从需求拆解、技术选型、工作流搭建、提示词调优、真实案例复盘、常见问题六个维度把这个项目完整还原一遍。1. hindsight想解决什么问题1.1 复盘场景里的三个真痛点我在做这个项目之前先统计了一下团队过去半年的复盘记录发现三个非常突出的问题。第一个是信息分散。一次典型的线上事故相关线索分散在监控告警平台、IM群聊、变更管理系统、日志平台四个地方。人工复盘的时候需要不停切换系统而且很多关键信息其实只在某个人的聊天记录里。信息找不全复盘质量就无从谈起。第二个是时间衰减。事故发生后48小时是复盘的黄金期但现实是处理完事故大家往往先去忙别的复盘会排到一周以后。这时候很多细节已经模糊了谁先发现的、当时怎么判断的、中间走过什么弯路全都记不清楚。写出来的复盘报告经常变成“当时我们做了A、B、C三项操作成功恢复了服务”完全没有参考价值。第三个是记忆断层。团队人员是会流动的。新人接手一个系统遇到类似问题翻历史复盘报告往往翻不到因为报告存得乱七八糟也没有一个沉淀和检索的机制。结果就是同类事故反复发生每次都在重新发明轮子。hindsight的设计目标就是针对这三个痛点它负责把分散的信息汇聚到一个入口把过去的历史复盘报告变成可检索的知识库把复盘的产出结构化成标准报告让每次事故都变成团队的长期资产。1.2 为什么通用ChatBot做不了这件事可能有人会说这玩意儿不就是把资料扔给ChatGPT让它总结一下吗我自己做过对比测试通用聊天机器人做不了这件事原因有三点。一是上下文管理困难。一次普通事故的聊天记录、日志片段、变更单文本加起来轻松超过几万字。通用ChatBot的上下文窗口即使再大塞满之后就无法继续接收信息而且早期信息很容易被后面的内容稀释掉。hindsight需要的是“分步处理”而非“一股脑塞进去”。二是没有领域知识支撑。通用ChatBot不了解你的系统架构、不了解历史故障模式、不了解团队的习惯用语。比如你丢给它一段日志说“redis cluster down”它能告诉你Redis是什么但不知道这个故障在你的具体架构里意味着什么——是缓存雪崩的前兆还是仅仅一个从节点掉线。这个判断需要依赖团队积累的历史资料也就是RAG检索增强生成能力。三是输出不可控。你跟通用ChatBot说“帮我分析一下”它可能给你写一篇小作文你让它“列出根因”它可能答非所问。复盘报告需要的是固定的结构时间线、影响面、根因、行动项。没有工作流编排输出格式完全看模型心情这对团队复盘来说是致命的——大家都按模板写报告才能对比和追溯。1.3 为什么选Dify来做载体选Dify而不是直接调大模型API或者用LangChain自己搭我主要是从维护成本考虑的。Dify对我来说最实用的三个能力是可视化工作流编排、内置知识库/RAG能力、一键发布为API。可视化编排的价值在于后续调整分析路径不用改代码。比如我想在“配置变更类故障”的分析分支里加一个步骤直接在画布上拖节点就行不需要重新部署服务。内置知识库省去了自己搭向量数据库的麻烦Dify把文档上传、切片、向量化、检索这一套流程封装好了。发布为API意味着hindsight可以很容易地接入飞书机器人、钉钉机器人或者内部运维平台使用门槛大幅降低。当然Dify也有它的复杂性后面我会单独讲工作流编排里容易踩的坑。2. hindsight的整体设计与技术选型2.1 核心功能拆解先列一下hindsight的功能清单这是我在动手搭建之前画好的边界输入层接收事故描述、日志片段、变更记录、相关聊天记录支持多种格式纯文本、Markdown、JSON导出。处理层对输入信息做清洗和分段识别事故类型从知识库检索同类历史事故按时间线组织信息。分析层基于分类结果走不同的分析路径配置变更类、代码缺陷类、容量类、外部依赖类每一步都用专门的提示词约束输出。输出层生成标准复盘报告包含事故概述、时间线、直接原因、根本原因、影响范围、行动项、遗留问题。这个拆解的目的是让每个环节职责单一方便单独调优。比如分析层觉得某个分支效果不好只需要改那一个分支的提示词不影响其他环节。2.2 技术选型为什么这样组整个hindsight的技术栈其实很克制没有引入太多新东西Dify社区版作为应用编排平台承担工作流、知识库、API发布。模型方面我用了两类分类和实体抽取用速度快的模型比如Qwen系列或GLM系列的小参数版本报告生成和分析用能力更强的模型比如GPT-4o或DeepSeek-R1级别的。在Dify里不同的节点可以配置不同的模型这是它很灵活的地方。知识库的文档来源主要是团队历史复盘报告、系统架构说明、常见故障手册、监控告警规则说明。外部对接通过Dify发布的API接入飞书机器人群里直接机器人发事故信息就能触发复盘。这个组合的现实考量是分类节点如果每次都用最强模型成本和延迟都扛不住而生成报告如果用小模型逻辑性和详细程度又不够。所以“小模型分诊、大模型深挖”是我最后定下来的方案。2.3 工作流里没有废话的节点设计hindsight的Dify工作流核心节点最初设计的时候画了十几个节点实际跑起来发现很多是多余的后来精简到五个核心节点。第一个是“输入预处理”节点。这个节点负责把用户输入的原始文本清洗成结构化的信息片段。比如去掉无意义的刷屏消息、把时间戳统一格式、识别每条记录的类型告警/变更/讨论。这里我用了一个模型节点做实体和时间戳抽取。第二个是“事故分类”节点。给模型设定一个分类任务代码缺陷、配置变更、容量瓶颈、外部依赖故障、未知类型。这个分类结果决定后续走哪条分析路径。第三个是“知识检索”节点。用Dify内置的知识库检索把当前事故的特征描述转成语义检索的查询找回最相似的三到五条历史复盘记录。第四个是“分支分析”节点。这是一个条件分支根据分类结果进入不同的分析提示词。比如配置变更类会让模型重点对比变更前后的差异容量类会让模型去检查资源水位趋势。第五个是“报告生成”节点。把前面所有步骤的产出物汇总统一交给大模型生成符合团队模板的最终复盘报告。这个节点的提示词最关键后面单独讲。3. 从0到1搭建hindsight的实操记录3.1 第一步创建Dify应用和知识库我在Dify里创建了一个“聊天助手”类型的应用然后在“知识库”模块里新建了两个知识库一个是“历史复盘报告库”把过去半年团队写的复盘报告全部整理成Markdown格式传进去另一个是“系统架构与故障手册库”上传了系统拓扑说明、依赖关系文档、历史故障处理手册。这里有两个实操注意点。第一文档不要整个传建议按事故类型拆分成一个个独立文件比如“事故-2025-03-12-缓存雪崩.md”。这样检索的时候命中的粒度高很多不会出现一个文件几十页、检索结果非常模糊的情况。第二Dify的检索模式我选的是“向量检索”因为复盘报告的相似度更多体现在语义层面而不是关键词层面。你需要提前去Dify的文档里把Embedding模型配好我用的是本地部署的bge-m3模型效果稳定。知识库建好之后在“召回测试”里做了几个验证。我拿一个线上真实事故描述去检索命中的前三条历史报告有两篇确实是非常相似的故障类型这说明向量检索的语义匹配是有效的。3.2 第二步搭建工作流骨架在Dify的“工作流”画布里我搭了一条这样的路径开始节点 - 输入预处理(LLM节点) - 事故分类(LLM节点) - 知识检索(知识检索节点) - 条件分支(IF/ELSE节点) - 分支分析(LLM节点多个) - 报告生成(LLM节点) - 结束节点第一次搭的时候我把“知识检索”放在“事故分类”之前结果不太好。原因是未分类的原始描述检索出来的结果很杂可能是因为描述里包含太多噪声信息。后来调整为先分类再检索按照分类结果和提取出的关键实体去做检索命中率明显上升。输入变量定义上我设置了一个变量叫“incident_raw”就是用户传进来的原始文本一个变量叫“incident_type”由分类节点输出还有一个变量叫“key_entities”由预处理节点输出关键系统名、时间点等。这些变量会在后面的提示词里用花括号引用Dify的工作流节点支持这种变量传递。3.3 第三步写能让模型干活的提示词这是hindsight项目里最花时间、也最出效果的部分。我先贴第一版提示词也就是效果很一般的版本你是事故复盘助手请根据用户提供的信息分析事故原因输出复盘报告。这版提示词跑出来的结果基本都是空话套话比如“可能是由于系统配置不当导致服务异常建议加强监控”完全没法用。后来我换了一种写法用“角色设定约束条件输出结构”的三层结构效果好了一个量级。以“事故分类”节点为例最终定稿的提示词是这样的你是SRE事故分诊专家。你的任务是根据输入的原始事故信息判断事故类型。 可选的类型 1. code_defect代码缺陷 2. config_change配置变更 3. capacity_issue容量瓶颈 4. external_dependency外部依赖故障 5. unknown无法确认 判断依据 - code_defect有代码变更记录、报错堆栈涉及业务逻辑、发布后出现异常 - config_change有配置变更时间点、变更内容与故障现象有逻辑关联 - capacity_issue资源水位指标达到阈值、流量异常突增 - external_dependency依赖的下游服务、中间件、云服务商出现异常 输出要求只输出一个类型标识不要输出任何解释。这里面的关键是“判断依据”那段。这不仅是在约束输出格式也是在给模型提供行业领域知识。没有这段依据模型只会字面理解有了这段模型会去核对输入里的证据是否匹配某个类型。报告生成节点的提示词更长我贴出核心部分你是事故调查员。你需要根据以下材料撰写复盘报告事故描述、分类结果、检索到的历史相似事故、分析结论。 报告必须包含 - 事故概述一句话说明发生了什么 - 时间线按时间排序的关键事件包含时间点和事件描述 - 直接原因直接导致事故发生的操作或变化 - 根本原因导致直接原因出现的管理或设计缺陷 - 影响范围受影响的服务、用户、功能 - 行动项每项必须包含负责人、动作、截止时间 约束 - 时间线中每一条必须与输入材料对应禁止编造。 - 如果你认为材料不足以得出根因必须写“当前材料无法确认根本原因”并列出需要补充的信息。 - 行动项要具体可执行禁止写“加强监控”这类空话至少包含“监控什么指标、达到什么阈值算异常”。这个提示词最关键的改动是加了“禁止编造”和“无法确认就说明”这两条约束。不加这两个约束的时候模型会非常自信地编造一个看起来合理的根因这在复盘场景里是致命的——所有行动项都建立在一个错误的根因上。3.4 第四步发布API并接入飞书机器人Dify里的应用可以一键发布成API。我创建了一个API Key然后在飞书开放平台建了一个自定义机器人把Webhook地址指向Dify的API网关。这样在群里发送“hindsight 复盘 [事故描述]”就能触发分析报告会以卡片消息的形式推回群里。这一步本身不复杂有一个坑提醒一下Dify的API默认有响应时间限制。如果用户一次塞了特别长的文本工作流可能要跑一两分钟直接同步调用会超时。我的处理方法是在飞书机器人侧设置“异步等待”先返回一个“正在分析中”的占位消息然后轮询Dify的API拿到最终结果再推送。如果你不想改机器人逻辑也可以把Dify的推理超时时间调大但那样体验不好建议还是走异步。4. 复盘报告质量的关键提示词与上下文工程4.1 同样一份材料为什么模型输出天差地别我在调hindsight的过程中做过一组对比实验输入完全一样的事故材料只改提示词结果差异非常大。第一版提示词产出的报告通篇都是模糊推断“可能”“大概”“也许”占了三分之一第四版提示词产出的报告时间线清清楚楚每条都有依据根因给了一个最可能的判断同时列出了支撑证据和反证。这个差异的根源在于大模型本质上是“基于概率的续写器”你不告诉它应该以什么角色、按什么标准、输出什么结构它就会按照训练数据里的最大概率路径去生成。而训练数据里最大概率的“复盘报告”是新闻报道或者学术摘要的样子不是工程事故复盘的样子。所以提示词的本质是给模型划出一条通往目标格式的概率通道。4.2 角色设定和结构约束的具体写法角色设定为什么有效因为角色这个词会激活模型在训练阶段见过的大量同类文本分布。比如“你是SRE事故调查员”模型会倾向于输出SRE语境下的术语、分析方式和报告格式而“你是一个有帮助的助手”它就倾向于输出那种什么都能聊的通用语气。结构约束为什么有效因为它把输出空间从无限压缩成了有限。当你列出“概述、时间线、直接原因、根本原因、影响范围、行动项”六个固定小节模型就不会自由发挥去写一段散文。实操上还有一个小技巧在提示词里加一个“少样本示例”区块。给一小段已经写好的时间线样例模型的质量会进一步提升。比如时间线示例 - 14:02 监控告警订单服务P99延迟超过500ms - 14:05 值班人员确认告警开始排查 - 14:10 定位到配置中心有变更记录变更内容为连接池大小 - 14:15 回滚配置P99延迟回落有了这个示例模型生成的时间线格式基本不会跑偏。4.3 上下文超限时的分段策略事故材料特别长的时候不能把全部内容塞进一个节点。我设计的方案是“时间窗口分段-摘要-汇总”的三层结构。第一层把原始材料按时间窗口切段比如每5分钟一段每段单独调用一次模型提取关键事件和状态变化产出一份“片段摘要”。第二层把所有的片段摘要拼接起来再调用一次模型做时间线合并和去重。第三层把合并后的时间线连同原始的分类结果、知识检索结果一起放进报告生成节点。这样每一步的上下文都在可控范围内而且因为分段摘要已经过滤了噪声最终报告的信息密度反而更高。这个“先分后总”的思路本质上和人在处理大量信息时是一样的——先快速扫一遍划重点再在重点的基础上做深度思考。模型也是给它一屏内容它处理得好给它一百屏内容它就开始犯糊涂。5. 真实事故复盘的完整演示5.1 输入材料我拿团队近期一次真实的P99延迟飙升事故做测试。输入给hindsight的材料包括监控告警信息订单服务P99延迟从50ms涨到3s持续10分钟等级为P1。变更记录同一时间段配置中心有一条变更将订单服务的数据库连接池最大连接数从40调到了10。聊天记录片段值班同事讨论“是不是数据库扛不住了”“连接池被人调了”“先把配置回滚试试”。日志片段服务日志里大量“connection pool exhausted”错误。5.2 hindsight输出的报告精简版这是hindsight生成报告的关键部分事故概述订单服务因数据库连接池配置被调低在高并发下连接耗尽导致P99延迟飙升至3秒。 时间线 - 13:57 配置变更[订单服务] 数据库连接池max_total 40 - 10 - 14:02 监控告警P99延迟超过500ms触发P1告警 - 14:03 服务日志出现大量connection pool exhausted - 14:05 值班人员确认告警开始排查 - 14:10 聊天记录中出现“连接池被人调了”的初步判断 - 14:15 执行配置回滚连接池恢复至40 - 14:25 P99延迟回落至80ms服务恢复正常 直接原因数据库连接池最大连接数被从40调低至10导致服务在正常流量下无法获取足够连接。 根本原因配置变更未经过评审流程变更人未评估低连接数在峰值流量下的影响且配置中心没有针对关键参数变更的二次确认机制。 影响范围订单服务所有实例受影响请求占比约15%用户侧表现为下单超时。 行动项 1. 配置中心增加关键参数变更保护名单将数据库连接池参数列入变更时自动通知SRE负责人。 2. 为订单服务增加连接池使用率监控指标超过60%触发预警。 3. 本周内完成配置变更流程规范修订明确变更前必须进行影响评估。这份报告的含金量在于时间线里的每一条都能对得上输入材料根因不是泛泛而谈的“配置不当”而是具体到了“没有评审流程”和“缺少二次确认机制”行动项也不再是空话。对比以前人工写的复盘报告效果超出预期。5.3 与人工复盘的对比当然hindsight不是万能的。我把这份AI报告拿给当时值班的工程师看他指出一个问题报告里把“聊天记录中出现初步判断”时间点放在了14:10但实际群里大家更早就在讨论材料里没有提供所以这个时间点是“引用材料范围里最早的”。这就涉及到AI复盘的边界它能处理喂给它的信息但覆盖不到系统之外的信息。所以我在设计上一直强调hindsight产出的是“基于材料的最优推断”不是“绝对真相”。人工复盘的价值在于补充材料之外的判断AI的价值在于把材料内的信息榨干。6. 常见问题与排查技巧6.1 高频问题排查表我在部署和使用hindsight的过程中整理了这份高频问题排查表绝大多数问题都遇到过对照处理就行问题现象可能原因处理方式知识库检索结果不相关文档切片粒度过大或过小按“一次事故一个文件”的粒度整理调整Dify的切片长度我一般设500字重叠50字模型分类错误判断依据写得太抽象在提示词里加入团队内部的具体案例把“判断依据”细化到可匹配关键词级别报告里有编造内容缺少“禁止编造”约束在提示词中增加“必须与输入材料对应”和“无法确认就说明”两条硬规则输入超长导致超时工作流同步调用材料过长改异步调用或启动分段摘要策略避免一次性传给最终生成节点多轮对话分析效果差复盘本质上是一次性分析不适合聊天流式处理限制hindsight为单轮分析工具每次输入独立触发需要补充信息时用“补充材料”方式重新触发报告格式不统一不同节点使用了不同模型的风格差异固定报告生成节点绑定的模型版本提示词中的模板段落不要频繁改动6.2 三个独家避坑经验第一个经验输入材料里必须强制带时间戳。AI对带时间的信息处理能力比对纯描述强得多。所以我在飞书机器人接入的入口处加了一条规则用户输入必须以“【时间】”开头标识每条信息的时间点。不用这个规则的时候报告里的时间线经常是乱的。第二个经验给模型留一条“说不知道”的退路。在很多场景里模型编造内容不是因为它想骗人而是因为它的训练目标就是给出一个连贯的回答哪怕没有依据。给了“无法确认就写无法确认”这个出口之后模型反而更诚实。而且实际跑下来这个出口被触发的时候并不多不代表报告质量下降只代表材料信息不足这时需要人工补材料。第三个经验对反复出现的高频事故做去重。hindsight上线后同一类缓存故障一周被触发了三次复盘知识库里出现了三篇高度相似但有细微差异的报告。我的处理方式是在工作流里加了一个检查节点检索历史报告时如果发现相似度超过85%的就会在报告开头附加提示“与历史事故2025-03-12相似建议优先回顾历史报告”避免重复劳动。6.3 让hindsight真正在团队里跑起来最后说点团队落地层面的经验。工具再好不用就是零。hindsight上线的前两周使用率并不高大家都觉得“有那个时间把材料粘进去我自己都写完了”。后来我做了一个调整把飞书机器人的触发方式改成一个斜杠命令“/hindsight”让用户直接转发告警消息、变更单消息到群里不需要自己整理格式。这一个小改动使用率翻了不止一番。这说明一个道理做内部工具降低“第一步的操作成本”比任何技术优化都重要。技术再强入口太麻烦就没人用。写在最后的一些体会hindsight做了大概三周从第一版只能输出空洞套话到现在的版本能直接产出接近人工水平的复盘报告中途迭代了十几次大部分时间都花在提示词和工作流结构的打磨上。我自己最大的体会是这类AI工具的价值不在于“替代专家”而在于把复盘的启动成本降到足够低让任何人面对一坨乱糟糟的事故信息时都能快速获得一个结构化的起点。后续我打算给hindsight加两个方向的能力一是把多个复盘报告自动汇总成月度稳定性报告二是把复盘里验证有效的行动项自动同步到任务管理平台。如果你也打算基于Dify搭一个类似的复盘助手建议先从你自己的团队最痛的一个场景切入把知识库建扎实把提示词调到你满意的程度再逐步放开给团队用。只要入口够简单、输出够稳定这类工具在团队里的生命力会比想象中强很多。