1. 项目起源:为什么我需要一个"事后复盘"AI
先说清楚这个项目是干嘛的。hindsight 这个词本身就是"事后聪明"的意思,指回头看时对已经发生的事情有了更清晰的理解。我做这个项目的起因特别朴素:身边不少人包括我自己,每天都在记日志、写周报、做会议纪要,但记完就完了——很少有人真正回看这些内容,更别说从中提炼出有价值的规律和决策依据。信息被记录下来却没有被再次利用,这是个人知识管理里最典型的浪费。
所以当我在 Dify 平台上看到可视化工作流编排能力时,第一个想法就是做一个"hindsight 复盘助手":把散落的日志、周报、项目记录丢进去,让大模型按结构化的复盘框架(目标、结果、差异、原因、下一步)整理输出,并且能基于历史内容回答"上周为什么延期""这个决策当时基于什么假设"这类回顾性问题。简单说,它就是给个人或小团队用的 AI 复盘引擎。
这个项目解决的核心痛点是:复盘本身需要纪律和方法论,但大多数人坚持不下来。让 AI 帮你按模板提问、按框架归纳、按时间线比对,等于雇了一个不知疲倦的复盘教练。适合谁?适合有记录习惯但不会做深度回顾的个人,适合需要周期性做项目复盘的团队,也适合正在学习 Dify 工作流编排、想找一个贴近真实业务场景来练手的开发者。无论你是哪种角色,下面这套从零搭建的方案应该都能给你一些启发。
2. 整体设计与方案选型
2.1 为什么用 Dify 而不是直接调 API
如果只是写个脚本调大模型接口,也能实现类似功能,但会卡在三个问题上:第一,复盘流程是有状态的,需要先拆解输入内容、再分步追问、最后汇总输出,纯代码里要自己维护多轮对话的状态机,很繁琐;第二,个人复盘往往需要长期记忆,也就是要能把"一个月前的目标"和"今天的进度"关联起来,这需要向量检索和知识库管理,自己从零搭一套成本不低;第三,我想让非技术背景的队友也能调整提示词和流程,而不需要改代码。
Dify 恰好把这三点都覆盖了。它的工作流编排界面可以可视化地搭建多步骤 LLM 应用,内置知识库和向量检索,提示词和流程参数都能在界面上直接改。我在本地用 Docker 部署了一版社区版,数据完全在自己手里,不用担心第三方平台的数据留存问题,这一点对于记录个人日志这种隐私性较强的场景来说很重要。
2.2 复盘方法论的选择:从 GRAI 到定制框架
工具定了之后,更重要的是"复盘逻辑"。市面上常见的复盘框架有好几种:GRAI(Goal 目标、Result 结果、Analysis 分析、Insight 洞察)、KPT(Keep 保持、Problem 问题、Try 尝试)、PDCA(Plan 计划、Do 执行、Check 检查、Act 处理)等。
我最终选了 GRAI 作为基础框架,原因是它最贴合"事后回顾"的语义:先明确目标,再看实际结果,分析差异原因,最后提炼可复用的洞察。KPT 偏向快速迭代场景,PDCA 偏向流程管理,而 GRAI 的"目标—结果—归因—洞察"四步结构正好对应 hindsight 的核心价值——不是简单地记录发生了什么,而是搞清楚为什么发生、下次怎么办。
基于 GRAI,我定制了一个五段的输出模板:
- 目标回顾:提取输入内容中提到的原始目标,标注明确的和隐含的
- 结果对照:列出实际完成情况,与目标逐条对比,标出达成、部分达成、未达成
- 差异归因:对每个差异项分析主客观原因,区分内因外因、可控因素与不可控因素
- 规律提炼:从本次复盘中提取可迁移的经验,用一句话概括
- 下一步行动:输出 1-3 条具体的、可执行的改进行动
这个模板看着简单,但实际调起来牵扯很多细节,后面第三节我详细说。
2.3 整体架构与数据流
整个应用的数据流是这样的:用户提交一段或多段原始记录(可以是日志、周报、会议纪要的纯文本)→ Dify 工作流先做数据清洗和分段 → 关键信息通过知识库检索与历史记录关联 → 大模型按 GRAI 框架进行多步分析 → 最后格式化输出复盘报告,同时把本次复盘的关键结论回写进知识库,作为下一次复盘的上下文。
架构上分了三层:
- 接入层:支持网页对话、API 调用两种方式。日常用网页版直接粘贴文本,批量场景通过 API 接入自动化流程
- 处理层:包括文本预处理节点、知识库检索节点、LLM 分析节点和结果格式化节点
- 记忆层:用 Dify 的知识库存储历史复盘结论和用户长期目标,实现跨会话的"记忆"
知识库设计的细节我在 3.2 节展开讲,这里先提个重点:不要把原始日志一股脑全部塞进知识库,要只存结构化的复盘结论。原因是原始日志噪声太大,检索质量会明显下降,而结构化的结论本身就足够支撑后续回顾。
3. 核心细节解析与实操要点
3.1 文本预处理:为什么复盘效果差常常是输入的锅
这条经验是我踩过坑之后总结的:复盘效果差,十有八九不是模型不行,是喂进去的内容太乱。原始日志往往是时间线混杂、情绪化表达多、关键信息淹没在流水账里。如果把这种文本直接丢给模型做 GRAI 复盘,模型容易把"我今天很焦虑"当成重要事实,反而忽略了"项目延期三天"这个关键信息。
所以我在工作流最前面加了一个文本预处理节点,用提示词要求模型完成三件事:
- 清洗:去掉情绪化的修饰词和无关琐事,保留事实性描述
- 结构化:按"时间、事件、涉及对象、结果、影响"五个维度重新组织内容
- 提取关键指标:识别数字类信息(如延期天数、完成率、成本金额),统一格式
注意:预处理节点不要设定得太死,否则会丢失原始信息中的上下文。我的做法是只要求"重写"而不要求"删减",让后续的分析节点自己判断哪些信息重要。
实测下来,加了预处理节点之后,复盘的归因准确率提升非常明显。从个人体会来说,这个节点是整套工作流里性价比最高的一环。
3.2 知识库与长期记忆设计
复盘和普通问答不一样的地方在于:复盘的结论必须建立在"过去的信息"之上。你今天的复盘,要能关联到上个月设定的目标;这周的总结,要能看到三周前的预警。这就要求应用具备长期记忆能力。
我的做法是在 Dify 里建了两个知识库:
- 目标库(goal_memory):存储用户设定的长期目标、阶段性目标、关键假设
- 复盘库(review_memory):存储每一轮复盘产出的规律和行动项
为什么拆成两个?因为两者的检索场景不同。目标库用于"对齐",即在复盘时把当前输入和既定目标做匹配;复盘库用于"追溯",即查看历史上有过哪些洞察、哪些行动项是否落实。拆开后,检索时可以分别指定召回范围,准确度比混在一起好得多。
知识库的更新策略也很关键。每轮复盘完成后,我设置了一个"写入记忆"的节点:把目标回顾和下一步行动写入目标库,把规律提炼写入复盘库。这样每做一次复盘,记忆就增加一层,下一次复盘的上下文就更丰富。有一个细节要注意:写入前要检查是否与已有内容重复,避免知识库里堆积大量语义相近的条目,否则检索时会分散召回权重。我用的方法是写入前先做一次相似度比对,相似度超过 0.85 就合并到旧条目里。
3.3 提示词设计:复盘不是让 AI 自由发挥
复盘提示词是整套系统的灵魂。直接让模型"帮我复盘一下上周工作"得到的结果大概率是泛泛而谈的正确的废话。我一开始就是这么干的,输出全是"要加强沟通""要合理安排时间"这种空话,完全没有价值。
问题的根源在于:复盘需要"对照"和"归因",这会消耗模型的推理能力,而泛化的指令没有给模型足够的约束和引导。后来我把提示词改成了结构化的评分卡式引导,效果立刻不一样了。核心是两段指令:
第一段指令限定分析视角,要求模型从"目标完成度、时间投入、协同效率、风险控制"四个维度强制打分,每个维度必须给出分数和依据。打分机制的作用是强迫模型做具体化思考,因为一旦要打分,它就必须从输入中找证据来支持分数,而不是空泛描述。第二段指令限定归因逻辑,要求模型对每个未达标项明确区分"外部客观原因"和"内部可控原因",并且规定如果存在内部可控原因,必须输出至少一条对应的改进动作,格式必须是"动作 + 预期效果 + 验收标准"。
提示:评分维度要按使用场景定制。我同时维护了个人复盘(维度偏情绪、精力、成长)和项目复盘(维度偏进度、质量、资源)两套提示词模板,在 Dify 里用变量切换。
另外,我在提示词里加了一条反幻觉约束:"所有判断必须引用输入文本中的具体事实,不得推测未提及的信息;若信息不足,明确标注'信息不足'。"这一条很关键,它让输出内容始终可溯源,方便用户再做二次判断。
3.4 模型选择和参数调整
模型选型上我做过几组对比。复盘任务对中文理解、长文本归纳、多步推理都有要求。我先后试过几款主流模型,结论是:侧重归纳类的中型模型性价比最高,而追求深入归因时需要更强的推理能力。实际部署中我做了"双模型路由":预处理和格式化用较快的轻量模型,核心的归因分析用更强的重量级模型。在 Dify 的工作流里,不同节点可以分别指定模型,这个配置成本几乎为零,但效果差距明显。
温度参数也需要单独调。默认的 0.7 在复盘场景偏高,会让归因输出显得"发散",有时候甚至会编造一些听起来合理但没有依据的原因。我最终把核心分析节点的温度调到了 0.2 左右,输出明显更稳定。而标题生成等创意性任务可以保留 0.6-0.8 的温度,这个区分是很有必要的。
4. 实操过程与核心环节实现
4.1 在 Dify 中创建工作流:从空白到可用
搭建过程我逐步拆解一遍。首先是创建工作流应用,这里我选了"工作流"类型而不是"聊天助手",原因是复盘是一个确定的处理流程,不需要多轮自由对话,工作流类型更能保证每次处理都走完同样的步骤。
工作流的节点结构如下:
- 开始节点:接收两个输入参数,一个是
content(本次要复盘的原始文本),一个是context_type(复盘场景,可选值:daily、weekly、project) - 文本预处理节点:调用 LLM 对
content做清洗重构,输出结构化文本 - 知识检索节点:根据
context_type中的场景参数检索目标库,召回相关的历史目标和过往复盘 - 归因分析节点:把预处理后的文本和知识库召回内容合并,按 GRAI 框架做核心分析
- 格式化节点:将分析结果按标准模板输出为最终复盘报告
- 记忆写入节点:将本次复盘的关键信息回写知识库
配置这一步需要注意的是开始节点的参数设计。一开始我只做了一个content参数,后来发现不同场景的复盘侧重点差异很大,单靠提示词去判断场景容易出错,才加了context_type参数。现在回头看,场景参数是必要的——复用一套流程跑多种场景时,显式的场景标注会让知识检索和提示词切换都更精确。
4.2 核心节点的提示词模板参考
这里给出归因分析节点中用的核心提示词模板思路,你可以根据需求调整维度:
你是一名经验丰富的复盘教练。请基于以下信息,对用户提供的记录进行结构化复盘。 ## 本次记录内容 {cleaned_content} ## 历史目标与过往复盘(供参考) {retrieved_memory} ## 复盘要求 请严格按以下结构输出: 1. 目标回顾:列出原始记录中可识别的目标,区分明确目标与隐含目标。 2. 结果对照:将实际结果与目标逐条对照,标记状态:达成 / 部分达成 / 未达成。 3. 差异归因:对每个未完全达成的目标,分析原因。必须区分外部客观原因与内部可控原因。内部可控原因不得少于 1 条。 4. 规律提炼:用 1-2 句话概括本次复盘中最重要的可迁移经验。 5. 下一步行动:输出不超过 3 条行动,每条包含:具体动作、预期效果、验收标准。 ## 硬性约束 - 所有判断必须引用记录中的具体事实,禁止推测。 - 信息不足时,在对应位置标注"信息不足",不要强行填充。 - 归因分析要具体到事件,不要出现"沟通不足"这类无主语的空泛结论。这份提示词的关键在于最后两条硬性约束。没有这两条,模型输出的内容会迅速滑向"正确的废话"。尤其是"具体到事件"这条,它迫使模型在输出前先定位到记录里的具体事例,再基于事例做归因,可操作性一下就上来了。
格式化节点用的是输出模板,把五段内容规范成下面这种结构:
## 复盘报告({date}) ### 目标完成度 ... ### 差异分析 | 目标 | 状态 | 关键原因 | 可控性 | |------|------|----------|--------| | ... | ... | ... | ... | ### 核心洞察 ... ### 行动清单 - [ ] 行动1(验收标准:...) - [ ] 行动2(验收标准:...)Markdown 格式的表格输出非常直观,方便用户复制到笔记软件里继续维护。
4.3 知识库如何建:分块方式和索引策略
知识库的建立有一个容易忽视的细节:分块方式。日志类内容分块不要用固定字符数,因为日志天然按天分隔。我把分块分隔符设为了日期标记(例如 "2025-06-01"),确保一天的内容不会被切开。这样检索时,召回的是完整的一天记录,而不是语义被切断的半截文本。
索引策略上,我关闭了"全文索引"而只开启"向量索引"。原因很直接:日志文本往往包含大量重复性词语(比如"开会""跟进"),全文索引会导致关键词检索时召回大量无关片段。向量索引根据语义匹配来召回,和复盘场景的匹配度更高。同时,每条知识入库时我要求必须带上日期元数据,这让后续的"按时间范围过滤"成为可能——比如你想只看最近两周的历史复盘,可以直接按元数据过滤。
4.4 测试与迭代:一个真实的复盘案例
搭建完成后,我用自己某周的工作日志做了测试。输入内容是一段流水账:"周一定方案,周二开发遇到接口问题,周三解决接口问题但进度滞后,周四联调,周五发布。期间和第三方沟通多次,对方响应慢。"
第一版输出的归因是"第三方沟通效率低导致进度滞后"。这个结论不算错,但很浅。我追问格式要求后,模型给出的改进动作笼统到"加强沟通",根本没法落地。
问题出在哪里?我后来发现是知识库召回了不相干的历史目标,干扰了判断。改进办法是在知识检索节点加上了一个相关性阈值过滤,相关性低于 0.7 的结果直接丢弃。同时,我在归因提示词里加了"如果原因涉及外部依赖,必须同时给出一个针对自身可控动作的改进项"。加了这条之后,输出变成了"第三方响应慢是外部原因,但自身可控的改进是:在项目启动前与第三方确认接口文档的交付时限,并设置 48 小时的超时告警"。这个结论就完全可执行了。
这一轮迭代让我意识到,搭建工作流只是开始,真正让复盘有价值的,是持续围绕输出质量打磨提示词和检索策略。我建议你把用过的真实测试输入保留下来,每调整一次提示词就重新跑一遍,对比输出差异,而不是凭感觉改参数。
5. 常见问题与排查技巧实录
5.1 输出内容空洞,全是正确的废话
这是最常见的问题,几乎所有复盘类应用都会遇到。特征很统一:归因部分全是"要加强沟通""要提高效率"这类没有动作对象的结论。
排查路径按优先级从高到低:
- 先检查提示词里有没有"必须引用具体事实"这条约束,没有就补上
- 再检查归因部分有没有要求"区分内因外因",这能强制模型做结构化思考
- 最后检查温度参数是否过高,高于 0.5 时归因容易发散
改完之后如果还是空洞,大概率是输入文本质量太差,信息密度不够。这种情况建议从预处理节点下手,让模型在清洗环节把事实性信息单独列出来,再喂给分析节点。
5.2 检索结果不相关,复盘被带偏
知识库检索召回的内容如果和当前复盘话题无关,模型会被历史信息干扰,甚至把过去问题的归因套到当前事件上。我的解决方案有三个:
- 设置相关性阈值,低于阈值的召回结果直接丢弃
- 在检索前根据
context_type给检索加上场景过滤条件 - 定期清理知识库中过时或重复的条目,保持知识库的"瘦身"状态
第三个方案常被忽略。知识库不是越大越好,冗余信息会稀释检索精度。我给自己定的维护频率是每两周检查一次复盘库,合并语义重复的结论,删除失去时效性的行动项。
5.3 多轮复盘中"记忆混乱":旧的结论污染新的复盘
系统用了几个月后,我发现知识库里的历史复盘有时候反而成为负担。比如某次模型在归因时引用了三个季度前的"团队协作问题",而当前事件根本与此无关。这种"联想过度"是检索增强应用的通病。
排查方法是回看检索召回的内容,看是哪些历史条目干扰了模型判断。如果历史条目中确实包含可相关的信息,需要在提示词里注明"历史信息仅供参考,仅当与当前输入明显相关时才可使用",给模型划清边界。更省事的做法,是配置检索时按时间窗口做过滤,只召回最近 30 天或 90 天的历史复盘,减少"陈年旧账"的影响。
5.4 长文本处理超时或截断
项目日志攒久了,可能会有大段文本输入。Dify 调用 LLM 时有上下文窗口限制,超长文本会出现截断或处理超时。我的处理策略是前置分段:在预处理节点之前加一个文本切分节点,按日期或段落边界把长文本拆成多段,逐段做轻量摘要,再把摘要合并送入归因分析节点。这种方式牺牲了一点上下文连贯性,但保证了超长场景下也能稳定输出。日常使用时,我还会在开始节点对输入长度做校验,超过 10000 字时提示用户分批提交,也是一种有效的兜底。
6. 项目延展与进阶思路
hindsight 这个项目做到稳定之后,我陆续加了一些有意思的扩展功能。最实用的是"定期自动复盘"的定时触发:配合 API,每周日晚自动读取本周的日志记录,跑一遍工作流,生成复盘报告推送到通知渠道。这个功能让复盘的纪律性彻底不再依赖个人自觉,也是我认为整个项目价值最大的一次升级。
另外一个方向是"目标偏差预警"。把目标库里的关键目标和截止时间抽取出来,在每次复盘时除了输出复盘报告,额外计算目标进度偏差率,当偏差超过设定阈值时在工作流里追加一个预警节点,输出醒目的提示。这个功能对项目管理场景特别有用,等于从"事后复盘"往前走了一步,变成了"事中预警"。
更进一步的话,可以把复盘报告用 Dify 的 API 接入其他工具,比如自动生成周报草稿、更新任务管理工具的状态、把行动项转成待办事项。这些都是很自然的连接场景。我个人的体会是,hindsight 的核心价值不在于单次复盘的输出有多惊艳,而在于它把"回顾"变成了一个可持续运转的机制——每多跑一次,知识库里的规律就多一层,下一次的输出就更精准。
最后说一个用了很久才明白的体会:复盘工具做得再好,也只是个放大器,前提是你得有记录可复。现在每次日志写完之后,我都会顺手想想"这条记录里有没有值得写进知识库的东西",这个习惯比任何工具都重要。如果你也想搭一个类似的东西,建议从小场景切入,先跑通一条最简单的日常复盘流程,再去加知识库、加自动触发这些复杂能力。方向对了,后面的路走起来都会很顺。