说实话,我第一次看到"hindsight"这个词蹦到我工作台旁边的时候,第一反应是:这不就是"事后诸葛亮"的英文版吗?后来真把它当个项目名来用,才发现这名字起得特别妙。hindsight 的意思是"后见之明",就是事情过后回头看,才发现当时哪些判断是错的、哪些信号被漏掉了。而我要说的这个项目,恰恰是把这个"回头看的视角"变成一套可复用的 AI 工作流:基于 Dify 平台搭一个复盘助手,让大模型帮你把杂乱的日志、周报、聊天记录整理成结构化的复盘结论。
这个内容适合谁?产品经理、软件工程师、运营、自媒体作者,甚至只是每天写日记但坚持不下来的人。只要你手头有大量零散的"过程记录",又懒得自己一张张翻、一条条分析,这个方案就能帮你把"复盘"这件事从玄学变成流水线。我自己从踩坑到跑通,前后折腾了大概三个版本,这篇文章直接把最终版的工作流、提示词、参数配置和排查方法完整拆开来讲,你可以照着搭一套自己的。
1. 项目概述:hindsight 到底解决什么问题
1.1 复盘这件事为什么总是做不下去
复盘这个词,职场里已经快被说烂了。什么"每日复盘""项目复盘""OKR 复盘",参加过不少,但真正坚持下来的人没几个。我自己的体感是,复盘最大的门槛不是方法,而是时间和耐心。一天结束,你想回忆今天到底做了什么、哪些决策值得反思,脑子基本是一团浆糊。强行写复盘,写出来的都是"今天开会讨论了需求""下午写代码遇到了 bug"这类流水账,完全没有"见"的成分。
另一个问题是,人的记忆是会被自己骗的。心理学上有个说法叫"事后偏差",事情发生之后再回头看,你会不自觉地把结果写得比实际更合理、更连贯。自己手动复盘,很容易变成给自己找理由的仪式。hindsight 这个项目想做的事情,就是用 AI 当一面"不带感情色彩的镜子",把你丢进去的材料重新切一遍,按事实、情绪、决策、得失几个维度展开,逼你面对那些你下意识忽略掉的细节。
所以这个项目的核心需求,不是做一个"AI 写日记工具",而是做一个"AI 复盘教练"。它要有三个能力:第一,能接住各种乱七八糟的原始记录,包括日记、周报、聊天记录、会议纪要;第二,能按照固定的复盘框架输出结构化结果,而不是自由发挥的抒情散文;第三,能保持中立,只依据事实说话,不自作主张地给你灌鸡汤。
1.2 为什么选 Dify 而不是自己写代码
最开始我其实是想直接调大模型 API 写个脚本的,用 Python 写一个命令行工具,读文件,调 API,输出 Markdown。但写到一半就放弃了,原因很简单:日常的复盘输入不是规整的文件,今天可能是一段语音转文字,明天是飞书文档里的周报,后天是微信群聊导出记录。这些来源需要不同的接入方式,脚本写起来没完没了。
然后我试了 LangChain 做编排,发现它更适合开发者做复杂链路,但对"快速搭一个带界面、带知识库、能分享给同事用"的工具来说,工作量还是太大。那时候正好 Dify 已经比较成熟了,可视化编排工作流、内置知识库、一键发布成 WebApp,全都在同一个平台里解决。我把 Dify 当成一个"流水线车间",不需要自己造传送带,只需要把各种处理节点拖进去接好,再调几组参数就行。
选 Dify 还有个很现实的原因:模型可以随时换。复盘这种任务对推理质量要求不低,但不同场景对延迟和成本的敏感度差很多。我自己平时会用两类模型:一类是 DeepSeek 这种性价比高的,处理日常日记;另一类是 GPT-4o 或 Claude,处理需要深度归纳的项目复盘。在 Dify 里换模型只是下拉框里改一下的事,可维护性比改代码好太多了。
2. 核心细节解析与实操要点
2.1 工作流整体设计:输入到输出的管线
hindsight 的工作流,本质上是一条"材料处理管线"。我不建议一上来就用一个巨大的提示词包办所有事,那样输出质量很不稳定。我最后跑通的版本,把流程拆成了四个阶段:
- 输入阶段:接收文本或文件内容,同时接收用户的复盘类型(日复盘、周复盘、项目阶段复盘)
- 事实抽取阶段:让模型先把材料里的客观事实单独拎出来,区分"发生了什么"和"当时我怎么想"
- 深度分析阶段:基于抽取出来的事实,按得失、决策质量、情绪状态、下一步行动四个维度展开分析
- 结构化输出阶段:把分析结果按固定模板组装成 Markdown 文档,便于归档和后续整理
每个阶段在 Dify 里就是一个节点,节点和节点之间通过变量传递内容。我用的应用类型是 Chatflow,而不是简单的 Workflow,原因是复盘往往不是一次性任务——输出完第一轮结果后,你很可能想追问一句"第三个问题再说清楚一点"或者"当时那条决策如果不做会怎样"。Chatflow 支持多轮对话,复盘这个场景天然就是对话式的。
2.2 提示词工程:复盘 Prompt 这样写才有效
提示词是整个项目里最值得花时间的部分。我前面几个版本输出差,基本都是因为提示词写得太笼统,模型不知道该用哪个视角来看待材料。
我给 hindsight 设计的主提示词经过了三轮迭代,最终版长这样:
你是我的复盘教练。我会给你一段原始记录,请你严格按以下结构输出复盘结果,不要省略任何小节: 【事实回顾】按时间顺序列出关键事件,只写客观事实,不加入你的推断。 【情绪与状态】从记录中识别情绪波动点和精力峰值,指出可能的原因,标注证据。 【关键决策】找出我在记录中做过的3-5个重要选择,分析当时做选择的依据是否充分。 【得失分析】分别列出做得好的2-3点和需要改进的2-3点,每一点都给出下一步的具体动作。 【下一步行动】基于SMART原则写出3条可执行行动,包含时间点和衡量标准。 硬性要求: 1. 每条结论必须给出依据,依据来自原文,必要时引用原文短句。 2. 如果原文信息不足,直接说明缺失了哪些信息,不要编造。 3. 语气直接,不要出现“很棒”“值得点赞”这类客套话。 4. 只基于这段记录分析,不引入与记录无关的外部假设。这个 Prompt 的核心技巧,就是给模型立了一个"复盘教练"的人设,同时把输出强制拆成五个固定板块。板块化输出的好处是稳定,模型知道每段该干什么,不会跑偏。另外"信息不足就直说"这句话很关键,它能让模型在材料单薄时不硬编结论,这是复盘场景里最怕的事。
如果你的复盘周期是按周或按月来,还可以在此基础上加一个"时间范围识别"的变量。例如在开始节点设置一个date_range变量,用户填2025-04-01 至 2025-04-07,提示词里就加一句"只分析时间范围内的内容,超出范围的忽略"。
2.3 数据接入:日记、周报、聊天记录怎么喂进去
输入数据这个环节,看起来简单,实际坑最多。我一开始天真地以为,直接把一整年的日记全粘贴进去就行,结果模型输出直接崩溃,原因后面会讲。正确的做法是先做一次"粗筛选"。
我的输入方式分成三类:
第一类是纯文本粘贴。适合那种每天用笔记软件写日记的人。直接复制粘贴当天的记录,几十行字,模型处理完全没压力。这类输入最简单,也是我最推荐的起步方式。
第二类是文件上传。Dify 的 Chatflow 支持上传文件,我把每周的周报存成 Markdown 或 txt 格式,丢进去让它统一分析。注意,文件不要太大。如果一份周报有几千字,一次性分析反而会抓不住重点,可以用 Dify 的知识库配合分段检索来解决,这个下面单独说。
第三类是聊天记录/会议纪要。这类材料最乱,充满了碎片化信息、口语表达、无关的寒暄。我的做法是先让模型做一个"信息压缩":把聊天记录里涉及任务进展、决策点、阻塞问题的句子抽出来,忽略寒暄和表情包描述。压缩完之后再进入复盘主流程。这个步骤我单独用了一个 LLM 节点,前置在正式分析之前。
3. 实操过程与核心环节实现
3.1 环境准备:部署 Dify 的两种路径
Dify 的部署方式有两种,我两种都试过,可以给你一个非常直接的建议:如果只是自己用,直接用 Dify Cloud 的免费额度就行,省去服务器维护的麻烦。如果涉及隐私数据——复盘这玩意儿其实挺私密的——建议还是自部署,用 Docker Compose 拉一套 Dify 起来,数据都在自己服务器上。
自部署的硬件门槛不高,一台 2C4G 的云服务器就能跑起来。官方的 docker-compose.yml 里包含 API 服务、Worker、PostgreSQL、Redis、Weaviate 等组件,第一次启动大概需要几台容器一起拉起。我第一次部署时卡在端口占用上,后来把 80 端口改成 8080 就通了。Dify 的.env文件里可以改EXPOSE_NGINX_PORT和EXPOSE_NGINX_SSL_PORT,这个值决定你最终访问的端口,改完重启docker-compose里的nginx服务就行。
部署完成检查三个东西:页面能否打开、能否登录管理后台、模型供应商里能否看到你配置的模型。这三个都通过了,环境就算就绪。
3.2 创建应用并配置模型参数
进入 Dify 控制台之后,选择创建应用,类型选 Chatflow,名字就叫 "hindsight 复盘助手"。创建好之后第一件事不是写提示词,而是先配置模型。
模型选型我的建议是:日常复盘用 DeepSeek-V3 或者 GPT-4o-mini,这个量级的模型速度快、成本低,处理一般的日记文本完全够。项目级深度复盘用 GPT-4o 或 Claude 3.5 Sonnet,它们的归纳能力明显更强,能从大段材料里找到有价值的因果链。
参数方面,temperature我给的是 0.2。复盘任务需要的是稳定和克制,温度太高会让模型自己发挥,输出一些花哨但不可信的推论。如果你发现输出太机械、像复读机,可以调到 0.4 试一下,但超过 0.5 我是不建议的——那已经不是复盘了,是 AI 陪你脑补。
还有一个容易忽略的参数是max_tokens,也就是单次输出的最大长度。复盘模板有五段,内容不少,如果设得太短会被截断。我设的是 2000,基本够用。如果你是给模型喂一个月的大记录复盘,那可以再往上加到 4000。
3.3 编排工作流:节点逐一配置
整个 Chatflow 我用了六个节点,按照顺序分别是:
开始节点、输入预处理节点(代码节点,做文本清洗)、事实抽取节点(LLM)、深度分析节点(LLM)、输出整理节点(LLM)、结束节点。
这里有个设计心得:为什么用三个 LLM 节点而不是一个?因为复盘这个任务如果一步到位,模型很容易在"深度分析"时把"事实回顾"的错误也一起带进来——前面的抽取错一点,后面全跟着错。分成三个节点,每一步都有明确的输入输出,任一步出错,你都可以在节点日志里定位到具体是哪一环。这种方式在 Dify 里叫"多阶段文本处理",代价是调用次数多了两倍,但换来的是可调试性和输出质量的显著提升,我认为完全值。
第一个预处理节点用的是代码节点,我写了一段简单的 Python,作用是把输入文本里的多余空行、特殊符号、时间戳前缀清理掉。这段代码不长,但非常实用:
import re def main(input_text: str) -> str: # 清理多余空行 text = re.sub(r'\n{3,}', '\n\n', input_text) # 去除行首尾空格 lines = [line.strip() for line in text.splitlines()] text = '\n'.join(lines) # 删除常见聊天表情占位符,例如 [捂脸] [呲牙] text = re.sub(r'\[[^\]]{1,8}\]', '', text) return text这个节点的主要作用是降低后续 LLM 节点的"噪声负担"。如果你喂的是聊天记录,里面可能有大量"[捂脸]""[旺柴]"这类表情占位符,不清理的话模型会被带偏,把注意力放在这些无关内容上。
事实抽取节点和深度分析节点的配置,核心就是各自填好我上面提到的主提示词的变体。事实抽取节点用"事实抽取版提示词",把输出约束成一条条并列的事实短句;深度分析节点用"分析版提示词",只负责看事实列表,不看原始材料。这样信息一步比一步纯粹,模型更容易聚焦。
3.4 测试与发布:把复盘助手变成随叫随到的服务
工作流编排完成之后,先别急着发布。Dify 提供了页面里的调试功能,在对话输入框里粘贴一段测试文本,就能看到完整的节点执行过程,包括每个 LLM 节点的输入输出和 token 消耗。这个过程一定要做,我每次改提示词都要在调试里跑一遍,观察中间输出是否符合预期。
调试通过后,点击左上角的"发布"按钮,Dify 会生成两个东西:一个是可直接访问的 WebApp 链接,手机和电脑都能打开,适合自己日常用;另一个是 API 服务地址和 API Key,如果你想把复盘能力接到飞书机器人、企业微信或者自己的脚本里,直接调这个 API 就行。
我现在的使用方式是把 WebApp 链接加到浏览器书签栏,每天晚上睡觉前花五分钟,把当天的工作日志粘贴进去,然后拿着生成的复盘结果对照一下第二天计划。周末再把这五天的复盘结果放到一个新对话里,让它生成周度趋势总结。
4. 常见问题与排查技巧实录
4.1 输出太泛泛,像正确的废话
这是第一个版本最常见的问题。现象是模型输出的得失分析全是"提高沟通效率""加强时间管理"这种话,听着没错,但对你没有任何指导意义。我排查了日志,发现模型确实看了原文,但它在分析环节偷懒了,用通用话术填充。
解决办法有两个层面。第一个层面是提示词约束,要求"每条结论必须引用原文短句作为依据",比如"你说下午四点之前完成了三次无效沟通,这里提到的无效沟通具体指什么?"。引用依据有三个好处:逼着模型从具体事实出发,防止泛泛而谈;让你复查时有迹可循;还能让输出看起来更像一个真实教练的追问。
第二个层面是前置事实抽取环节加一个动作:在抽取事实时,要求模型把每个事实按照"时间+地点+人物+事件+结果"的格式展开。结构化的细节会让后边的分析有抓手,模型分析时也更容易从事实里推导出有价值的东西。
4.2 长文本输入被截断,模型遗漏关键信息
这个问题我踩得最狠。有一次我把一个季度的工作记录全塞进去,大概两万多字,模型输出直接泛化成了鸡汤,跟原文相关的部分寥寥无几。原因很简单:上下文窗口超限,或者即便没超限,模型在处理超长文本时的注意力也会失焦。
我的方案是"先砍后喂"。在 Dify 里,用知识库组件把长文按章节切块,切块大小设置为 1000 字符左右,重叠度为 200 字符。然后把用户输入作为检索请求,通过知识库召回最相关的那几块,进入后续分析。这样模型永远只看到和问题相关的一两段,精度高了不少。
如果你不想用知识库组件,还有一个土办法:把长文本按天或按周拆成多段,多轮对话里每次只喂一段。缺点是比较费对话轮数,但效果也很直接。反正记住一条原则:长文本能拆就别整段丢给模型。
4.3 输出格式不稳定,张三李四各说各话
我测试阶段发现,同一个输入,有时候模型输出五个板块齐全,有时候只输出三个板块,甚至会把"下一步行动"的内容并进"得失分析"里去。这其实是 LLM 的通病:格式约束在复杂任务里容易丢失。我试过在提示词里加"如果不按格式输出会被扣分"这种威胁式语句,效果一般。
真正稳定下来的方案是把格式约束拆到代码里做后处理。我加了一个输出整理节点,用 Dify 里的模板节点来组装最终 Markdown 文本。模板节点有点像 JSP 里的模板引擎,你可以预先定义好整个输出框架,然后把前面 LLM 节点输出的数据填进对应的占位符里。这样至少在"组织排版"这一层,永远不会因为模型发挥失常而乱掉。如果你的复盘结果要进 Notion 或者飞书文档,这个稳定格式能力很重要。
4.4 知识库召回不到想用的内容
如果你用了知识库方案,大概率遇到过这种问题:明明往知识库里传了一个月的日志,问"上个月有哪些拖延的迹象"却召回不到相关内容。
问题多半出在"查询改写"上。Dify 知识库的召回逻辑是向量相似度匹配,而用户对话里的问法往往和文档原文的表达方式差别很大。我的解决思路是加一步"检索查询改写"节点:在主流程进入知识库之前,先用一个轻量 LLM 节点把用户的复盘需求改写成几个有效的检索关键词。例如"上个月有哪些拖延的迹象",改写成"拖延、计划延迟、未完成、加班赶工、临时变更"。
这个技巧在信息检索领域叫 Query Rewriting,放在 Dify 里就是一个节点的事,但对召回归类的效果提升非常明显。如果你发现知识库总是"弱智",80% 是查询方式的问题,不是知识库本身的问题。
4.5 复盘助手变成了"情绪垃圾桶"怎么办
还有一个有意思的问题,而且是我用了两周之后才注意到的。很多时候,日记里会有大量情绪倾诉,比如"我今天被气死了""这个项目要完蛋了"。AI 作为复盘教练,如果跟着你一起抱怨,那复盘就变成哭诉了。
处理方式是在提示词里加一条非常明确的分工指令:"情绪表达部分只作为分析依据,不作为回应重点。不要安慰我,不要共情,只做理性拆解。" 我发现一个有趣的现象:模型其实很擅长做情绪识别,只要你引导它把情绪当成数据来分析,它就能很好地完成从"情绪陪伴"到"状态诊断"的切换。这个设定让 hindsight 的输出有了独特的价值——它不是你的朋友,它是你的教练。朋友会顺着你说,教练只会指着你的盲区说。这也是"hindsight"这个词想表达的态度:站在事后的位置,看到的不是情绪,是因果。
5. 一些值得单独拿出来说的体会
5.1 复盘频率和内容颗粒度
我实测下来,日复盘适合用很短的文本输入,三五行就够,重点记"决策点"和"情绪波动"。周复盘适合做汇总分析,把一周的日复盘内容拼起来,让模型输出趋势性和规律性判断。月复盘则可以对比四周的周复盘结果,让模型尝试建立因果链。
很多人问过我用什么频率最合适,我的回答是:宁可每天花两分钟记三行,也不要每周憋一小时写长篇。hindsight 的基础是原始记录的质量,AI 再强也没办法从一个空洞的"今天还行"里榨出真正的信息。这个项目给我的一个额外收获,其实是养成了随手记录的习惯,AI 跑出来的复盘结果只是副产品。
5.2 关于模型迭代和平台更新的建议
Dify 这个平台更新得挺快,我写这篇文章的时候,市面上已经有了很多新功能,包括更完善的 Agent 节点、更细粒度的权限管理,以及更丰富的工具插件。如果你照着本文的流程搭建,发现某些界面和截图不太一样,不用慌,大概率是版本更新的正常迭代。你只需要抓住三个核心不变的东西:工作流拆阶段的思路、提示词里设置复盘教练人设的方法、以及知识库做长文本切块的策略。功能按钮会变,但这三件事不会变。
5.3 这个项目后续还能怎么扩展
hindsight 目前是我自己用的私密工具,但它其实很容易扩展成团队用品。把 Dify 应用接入飞书机器人,团队成员每天下班后在群里丢一段当日总结,机器人自动跑完复盘,然后把结果汇总到一张共享表格里。一个季度下来,每个人的成长轨迹都看得清清楚楚。这对团队负责人来说,价值比市面上大多数绩效工具都大,因为它不评价,只呈现事实和改进方向,这对团队的信任基础有好处。
我个人的下一步计划,是想把语音输入也接进来,毕竟每天打复盘文字还是有点麻烦。Dify 本身支持语音转文字插件,后面我会把"录音文件转文本 -> 文本进复盘流程"做成一条完整的链路。这个扩展如果做成了,可能就真能做到"一分钟完成一次高质量复盘"了。
最后再分享一条我自己的实操感受:复盘的输出结果,一定要隔几天再重新看一遍。hindsight 这个名字本来就是在提醒这件事——你当时没有的视角,事后都会有。AI 帮你生成第一遍的复盘,你隔一周再看一遍,往往能发现第二遍的思考比第一遍更深。工具能做的,是帮你把复盘的门槛降下来,但真正让复盘产生价值的,还是你这个"回头看"的动作本身。