☰
基于Dify搭建AI复盘助手:工作流、RAG与Prompt实战拆解
2026/9/28 13:54:18 网站建设 项目流程

1. 项目概述:hindsight 到底是个什么项目

1.1 从“后见之明”到“AI 复盘师”

hindsight 这个项目,名字本身就很有意思。英文直译叫“后见之明”,就是我们常说的马后炮、事后诸葛亮。但在我把它做成一个跑在 dify 上的 AI 应用之后,这个词的含义就彻底变了——它现在是一个专门的复盘助手,做的事情不是让你事后感叹“我早该想到”,而是把一段你经历过的、或者错过的过程,重新拆解给你看,把当时没注意到的细节、没说清的话、没抓住的机会,一条条捞出来摊在你面前。

我最初想做一个 AI 辅助复盘的项目,是因为一次真实的工作困境:团队每个月都要做项目回顾,但每次大家坐到一起,七嘴八舌讲两个小时,最后形成的纪要基本就是流水账。真正的问题——比如决策依据不充分、信息传递断层、某个被忽略的异常信号——都没被挖出来。后来我开始琢磨,能不能让大模型直接读我们的对话记录和文档,自动完成这种“回溯式分析”,这才有了 hindsight 最早的雏形。

做这个项目之前我也纠结过技术路线。直接写代码调用 GPT API 组合各种工具链,当然可行,但要处理的东西太多了。后来我决定把整个 app 建立在 dify 这个开源 LLM 应用开发平台上,原因是它把工作流编排、知识库检索、Agent 工具调用、Prompt 版本管理全部可视化,我可以在一个界面里完成从搭建到发布的全过程,不用自己在前后端之间来回折腾。

这个项目适合谁来参考?如果你正在做一个大模型应用,而且应用的核心逻辑是“对已有数据进行回溯、分析、总结和决策推导”——注意不是那种一问一答的简单对话——那 hindsight 的拆解对你就有直接参考价值。当然,如果你刚接触 dify 或者 RAG,想看看一个完整应用是怎么一层层搭出来的,这篇内容同样能帮你打通整个链路。

1.2 它能解决什么问题,适合谁参考

我们先说清楚 hindsight 到底解决什么问题。

日常工作中最不缺的是什么?是“发生过的事”。会议纪要、聊天记录、周报、工单、客户反馈、接口日志,都是发生过的事。但这些数据躺在那里,99% 都没有第二次被认真阅读。人脑的记忆容量有限,信息量一大,我们就会选择性遗忘,而且遗忘的方向往往偏向那些“模糊的、不舒服的、需要额外消化”的部分。hindsight 的价值,就是把这些沉默的历史数据重新激活,用一个可复现的方式对它们做系统性复盘。

具体来说,hindsight 能接受三类输入:

  • 对话记录:包括会议纪要、客服聊天记录、IM 群聊导出;
  • 项目文档:需求文档、复盘报告的旧版本、周报日志;
  • 结构化数据描述:用户主动粘贴的关键事件列表、决策节点描述。

输入之后,它输出一份结构化的复盘报告,内容包括关键事件时间线、决策节点与依据、被忽略的信号、分歧与遗留问题、下一步行动建议。这套输出结构不是我从网上抄来的,而是在跑过几十轮实际材料之后一点点调出来的。后面我会详细讲怎么调。

适合谁来参考这个项目?我认为有三类人。第一类是正在用 dify 或其他 LLM 平台做应用的人,你可以直接把我的工作流搭法和 Prompt 策略抄走;第二类是做产品、运营、项目管理的人,你不需要写代码,但通过这篇拆解能理解为什么“靠人脑复盘”在数据量上来之后必然失效;第三类是研究 RAG 和 Agent 工程化的人,hindsight 里对知识库参数调优、上下文窗口压缩、工具调用设计的取舍,都来自真实运行环境的反馈,不是教科书上的标准答案。

2. 技术方案选型:为什么用 dify 来搭 hindsight

2.1 先说说需求边界再选型

不管是自己从零写,还是用平台搭,选型之前第一件事是划清楚需求边界。

hindsight 当时的核心需求有五条:

  1. 能读多轮对话和长文档,避免上下文溢出导致信息丢失;
  2. 能对历史数据做多阶段分析,不是一次 Prompt 一把梭;
  3. 能接入团队已有的知识库(历史复盘模板、项目背景文档);
  4. 输出必须是结构化的复盘报告,而不是一段泛泛的总结;
  5. 应用要能对外开放成 API,方便接到内部协作工具里。

这五条每一条都指向一个技术决策。第一条指向上下文管理策略;第二条指向多节点工作流而不是单轮聊天;第三条指向 RAG 检索;第四条指向输出约束和模板化设计;第五条指向应用发布和 API 封装能力。

我当时评估过几条路线。

第一条路是直接用 LangChain + OpenAI SDK 写 Python 脚本。优点是可控性强,缺点是工程化成本高,而且后面团队其他人想改 Prompt、加节点,都得找我来改代码,这对工具的可持续性来说是个灾难。

第二条路是用开源框架比如 FastGPT、Dify,或者商业产品比如 Coze。我最终选了 dify,理由比较实际:

  • dify 的工作流编辑器是可视化的,可以让我把一个复杂的复盘逻辑拆成节点,每个节点单独测试,这个体验比写代码调试省太多时间;
  • dify 自带完整的 RAG 链路——知识库管理、文档分块、向量检索、TopK 参数调节,不用我自己去拼一套向量数据库;
  • 它的“应用发布”直接把一个工作流暴露成 API 和 WebApp,前后端联调的成本几乎为零;
  • 最重要的是,dify 的社区版本是开源的,数据在自己手里,很多企业场景下这是硬性要求。

不过我也得说句公道话,dify 不是没有代价。它抽象掉了很多底层细节,如果你习惯直接操作 embedding 模型或向量库的原始参数,会在某些环节觉得“隔了一层”。但对于 hindsight 这种应用形态来说,dify 的抽象是恰到好处的。

2.2 dify 给我的三个核心能力

我在搭建 hindsight 的过程里,实实在在用到了 dify 的三个能力,缺一个这个项目都得换方案。

能力一:可视化工作流编排。

hindsight 的核心逻辑不是一个 Prompt 能搞定的。它需要先抽取事件,再分析决策,再检索相关知识,最后生成建议。每一步的输出是下一步的输入,中间还有条件分支来处理不同内容类型的材料。在 dify 里,我可以把这段逻辑画成一张流程图:开始节点接上 LLM 节点,LLM 节点接上知识检索节点,再接上判断节点,判断节点再分流。每个节点单独跑,我看得见中间结果是啥。这在纯代码里也能做到,但要反复试错,可视化让试错成本低了不止一个量级。

能力二:内置 RAG 链路。

hindsight 要调用的知识库至少有两类:一类是团队沉淀的复盘方法论、写作模板,另一类是项目历史文档。如果自己搞,我得部署 embedding 服务、向量数据库,还要写分块和检索逻辑。dify 把这块变成了管理员后台的“知识库”管理界面,上传文档、选择分块策略、配置检索参数,全部界面化操作。而且它支持多个知识库同时挂到一个应用上,还能在检索节点里单独指定用哪个知识库,这个灵活性对 hindsight 的多知识源需求帮助很大。

能力三:Prompt 变量与输出格式约束。

复盘的最终产物是报告,报告必须稳定输出 Markdown 结构,不能一次一个样。dify 的 LLM 节点里支持我直接定义输入变量、设置温度、选择模型,并且通过在 Prompt 里用 few-shot example 和强制输出格式描述,基本能把输出约束在期望框架内。后面我会专门讲我在 Prompt 设计上踩过的坑,这里先记住一个结论:模型输出的稳定性,一半靠 Prompt 约束,一半靠工作流结构兜底。

2.3 整体技术架构拆解

hindsight 在 dify 里的整体架构可以拆成四层:

数据接入层。这一层负责接收用户的复盘素材。我用 dify 的开始节点定义了多个输入字段,包括“复盘素材”“对话背景”“希望聚焦的问题”。素材统一接收长文本,背景信息接收短文本,聚焦问题是可选项。

分析处理层。这是整个工作流最重的一层,由串联的 LLM 节点组成。按先后顺序分别是:时间线抽取节点、决策点识别节点、分歧与异常发现节点、知识检索与融合节点。每个节点都尽量只干一件事,保证单一职责。这层做的事情不是一次生成最终答案,而是先把材料拆解成中间结构,为最后一步组装报告做准备。

知识增强层。这层由知识检索节点和相关度判断组成。在分析处理层跑完之后,工作流会把中间结论带到知识检索节点,从 dify 知识库里检索与本次复盘相关的历史模板、参考资料,融合到最终生成阶段。我们要让模型“有据可依”,而不是凭感觉编写。

输出生成层。最后一个 LLM 节点接收分析层产出的结构化中间结果和知识层检索到的参考资料,组装成最终复盘报告。报告格式我固定为 Markdown,包含四到五个固定章节。

这几层之间的数据流,完全靠 dify 工作流节点之间的变量引用串联。我后面会展示每一层的关键配置,包括具体的 Prompt 片段和参数数值。

3. 核心细节解析:复盘类 AI 应用的要点拆解

3.1 复盘逻辑要显性化,不能靠模型自发发挥

这是我做 hindsight 过程中最重要的一个认知。

最初我以为只要把资料丢给一个强模型,让它“写一份复盘报告”就行。结果我试了几轮,输出确实看着挺专业,但经不起细看——模型会把重要的事件一笔带过,反而花大量篇幅描写无关紧要的背景;它倾向于给出非常安全、非常正确的套话,像“后续应加强沟通”“建议提升效率”——这些永远是废话。

问题出在哪?出在“复盘”这个抽象任务没有被拆解。大模型在没有明确步骤引导的情况下,会走一条“平均路径”,输出一个最中庸的结果。

后来我调整思路,把复盘的逻辑拆成三个阶段,写进工作流里强制执行:

阶段一:还原。先把素材里的事件按时间线拉出来,标注“谁”“什么时间”“做了什么”“结果是什么”。这个阶段不做任何价值判断,只做事实抽取。

阶段二:回溯。找到关键决策点,回答:当时做了什么选择?依据是什么?有没有备选方案被忽略?这个阶段要求模型对每个决策点列出“已考虑因素”和“未考虑因素”。

阶段三:提炼。基于前两个阶段的中间结果,生成三个部分:被忽略的信号、可复用的经验、下一步行动建议。

拆完之后,输出的质量和之前完全不在一个水平。原因很简单,你在一个一个节点上约束模型,相当于给模型铺了一条轨道,它不会跑偏,而且每个节点都容易检查、容易修正。

3.2 设计的核心要点:上下文与知识双通道

复盘类应用的第二个核心要点是双通道信息融合。

什么意思?一条复盘链路要吃两类信息:一类是本次输入的素材,属于“单次任务上下文”;另一类是预置在知识库里的历史资料和复盘方法论,属于“长期知识”。两者必须分开管理,再在最后的生成阶段合并。

很多同类应用做不好复盘,是因为把长期知识直接堆进了系统 Prompt 里。比如你给模型设了一长串角色设定:“你是一个精通 GRAI 复盘法、KPT 复盘法的专家……”——但这只是角色声明,模型并没有真正“读过”那些方法论,它在生成时只是凭印象编。真正的长期知识应该通过 RAG 检索来拿,达到的目的不是“让模型觉得自己是专家”,而是“把相关方法论的具体章节省出来,塞进上下文”。

hindsight 的知识库我建了两个:

  • 一个是“复盘方法论库”,里面放了我写好的 GRAI、KPT、STAR 等复盘框架的具体说明、适用场景、示例报告;
  • 另一个是“历史复盘库”,放团队历史项目的复盘报告,供模型参考之前的表达风格和深度。

在生成最终报告前,工作流会拿当前分析出的关键决策点去这两个知识库检索,然后把命中的内容并入生成节点的上下文。这样输出的报告既是定制化的,又有历史一致性,不会每次风格飘忽。

3.3 参数与模型选择:温度、TopK、分块大小怎么定

复盘类任务和闲聊类任务对模型参数的要求很不一样。

hindsight 的所有分析节点,温度我统一设为0.2。原因不用多说——复盘要的是准确性和一致性的对齐,生成花哨内容反而有害,这里温度参数越低,模型越不容易发挥无关的创造力。最终报告生成节点我也没有调高,维持在0.3左右。因为报告虽然需要一点行文流畅性,但核心仍然是事实,不是文采。

知识检索节点的TopK参数我调了很多轮,最后稳定在6。为什么不设成 10?复盘任务检索的是方法论文档和类似历史报告,这些文档彼此之间有大量内容重叠,如果取太多片段,大段的重复内容会占据上下文窗口,挤压真正有用的信息,反而拉低报告质量。设成 6,既能覆盖主要方法,又不会淹没重点。

文档分块大小默认我用的600 字符,重叠 100 字符。这个值对复盘文档来说偏小,但我是有意为之。原因是复盘材料往往事件密集,分块太大会导致一个块里混杂多个事件,检索时命中一个块就牵出一堆无关内容。600 字符的块配合 TopK=6,基本能保证检索到的都是高纯度的事件片段。

模型选型上,我整套流程都用了一个中高级别的通用模型,重点不在于选多强的模型,而在于工作流的结构是否把任务拆到位。实践中我发现,哪怕模型水平一般,只要节点拆得足够小、Prompt 给的信息足够明确,输出质量仍然可接受。反过来,模型再强,不拆节点,也会照样给你吐套话。

3.4 结构化输出:用约束清单代替自由发挥

复盘报告的结构化问题,我是用“输出格式约束清单”的方式解决的。

我研究过 JSON Schema 输出和纯文本格式化输出,最后选择了后者。原因是最终报告要给人读,不是给程序读,JSON 结构反而增加阅读负担,而且多轮生成之后嵌套格式容易出错。所以我在最终节点的 Prompt 里写了一个固定结构模板,并用一个强约束的“风格禁用清单”来控制。

模板不是死的框架,而是让模型有“写成什么样算合格”的预期。比如“被忽略的信号”这一章,我明确要求每条信号必须对应原始素材中的一个具体细节,禁止使用“氛围”“企业文化”这类不可验证的归因。这就是在逼模型回到材料本身。

避坑提示:别指望模型在长报告生成过程中一直保持结构稳定。报告太长,尾部内容一定会跑偏或压缩。我的补救办法是把最终报告拆成两段生成——先产生报告主体,再在另一个节点专门对全文做一次“结构化校检”,把遗漏的章节补全。虽然多了一次模型调用,但稳定性提升明显,值得。

4. 实操拆解:在 dify 上一步步搭出 hindsight

4.1 工作流搭建:把六个核心节点串起来

hindsight 在 dify 上的工作流,我最终定稿为六个核心节点。我按顺序拆给你看,每个节点的关键配置都值得单独说。

节点一:开始节点,定义输入变量。变量我设了三个:material(复盘素材,必填),background(事件背景,可选),focus(聚焦问题,可选)。为什么要把背景和聚焦点独立出来?因为复盘的质量高度依赖“是否有明确的问题意识”。如果用户提供了 focus,比如“我主要想搞清楚为什么这次上线延期了”,后续所有分析节点的 Prompt 里都会强调这一点,引导模型在提炼阶段围绕这个问题输出。

节点二:时间线还原节点(LLM)。输入是material,要求输出严格的时间线列表,格式为“时间/事件/参与者/结果”。我在 Prompt 里专门规定:如果素材里没有明确时间,只能写“推断时间”,不能用编造的时间。这一步是后面所有分析的地基,地基不稳,后面全垮。

节点三:决策点识别节点(LLM)。输入是节点二输出的时间线加上原始素材,要求识别 2 到 5 个关键决策点,每个决策点输出四个字段:决策内容、决策依据、已考虑因素、未考虑因素。这个节点的 Prompt 我迭代了最多版本,后面详细讲。

节点四:分歧与异常发现节点(LLM)。输入是节点二和三的产出,要求找出素材中的分歧点、未解决疑问、异常数据,每个发现要引用原文依据。这个节点有效抓住了人工复盘容易漏掉的内容。

节点五:知识检索节点。这个节点用 dify 的知识检索功能,输入是节点三产出的决策点摘要,去检索我之前建好的复盘方法论库和历史复盘库,TopK 设为 6。检索结果会拼接成一段“参考资料”传给下一个节点。

节点六:报告生成节点(LLM)。这是最后一个节点,输入全合并:时间线、决策点、异常发现、知识库参考资料、background 和 focus。输出一份包含“一、事件还原 / 二、决策回溯 / 三、关键发现 / 四、改进建议”四个章节的 Markdown 报告。如果 focus 存在,生成时会自动把“针对 focus 的专项结论”作为附加章节。

4.2 数据准备与知识库构建

搭工作流之前,我先把知识库搞定了。这里必须提前说一句:不要任务没定义清楚就传一堆文档进知识库,那样只会让后面检索时捡回一堆噪声。

我建知识库有两个步骤。

第一步是整理方法论库。我把复盘常用的方法整理成标准化文档,每篇文档包括“方法名称、适用场景、操作步骤、一周目参考话术”。比如 GRAI 复盘法那一篇,我就写了四个步骤:Goal 回顾目标、Result 评估结果、Analysis 分析原因、Insight 总结规律。每篇文档控制在 1500 字以内,清晰、短小、可命中。

第二步是清洗历史复盘报告。团队过往的复盘报告普遍有大量空话,我做了去噪处理,只保留“结论明确”的段落。因为如果知识库里全是“我们要加强沟通”这种话,模型检索回来也只能给你生成这种话。清洗原则就三条:有具体事件、有具体归因、有可执行动作。不满足的段落直接删。

知识库在 dify 里的配置我用了以下参数:分块模式选“父子分块”(一个块包含段落小结 + 详细内容),TopK 6,相似度阈值0.35。这个阈值我试过来回几轮,低于 0.3 会捡回很多无关片段,高于 0.4 又会漏掉相关片段。

4.3 两个关键 Prompt 的设计思路(附对照)

hindsight 里最有代表性的 Prompt 是“决策点识别”和“报告生成”这两个。我把它们的设计思路讲透。

决策点识别 Prompt 的核心写法

第一版 Prompt 我是这么写的:

你是一位资深复盘顾问,请阅读下列素材,找出其中所有的关键决策点。

这种写法的问题你肯定猜到了——输出太散,没有结构。模型会把它认为重要的内容全列出来,和素材里的关键节点对不上。

我改到第四版,变成这样:

你是复盘分析引擎。阅读素材后,找出 2 到 5 个真正改变了事件走向的决策点。判断标准:如果这个节点当时做了不同选择,后续结果会发生明显变化。对每个决策点用以下格式输出: 决策点名称:一句话概括 决策内容:当时选择了什么 决策依据:素材里能支持的证据原文引用 已考虑因素:决策时被纳入讨论的选项或信息 未考虑因素:事后回看应该考虑但没有考虑的信息 未考虑因素的依据:为什么你认为这些因素本该被考虑,必须引用素材原文 注意:如果你没有足够依据,未考虑因素可以写“未找到明确依据”,严禁编造。

改动最关键的地方是加了“判断标准”和“依据引用”。有了判断标准,模型就不会把无关紧要的小事当决策;有了依据要求,模型不敢编造,输出可信度立刻提升。

报告生成 Prompt 的结构化写法

报告生成节点我不让模型自由发挥,而是给了明确的结构约束:

请基于以下分析结果生成复盘报告,结构严格遵循四个章节: 一、事件还原:用时间线方式概述全过程,突出关键节点 二、决策回溯:针对已识别的决策点,复盘决策过程,指出关键盲区 三、关键发现:包括被忽略的信号、分歧点、可复用的经验 四、改进建议:每条建议必须包括【动作/负责人/时限/验证标准】 写作红线: 1. 禁止出现“加强沟通”“提高意识”“团队协作”等无法验证的表述 2. 所有结论必须能在上述分析结果中找到依据 3. 建议必须具体到可以被执行 【分析结果】 {决策点分析} {异常发现} {知识库参考}

这版 Prompt 加上前面的分析结果,生成的报告基本能达到“拿得出手、可以直接发给团队”的水准。

4.4 从调试到发布:在 dify 上的完整闭环

工作流全部搭好后,进入调试阶段。我用自己的真实复盘材料跑了十几轮,每一轮都在 dify 的“运行日志”里查看每个节点的中间输出。

调试时最容易发现的问题是两个:一是前面节点输出的格式不符合后面节点的预期;二是知识检索节点没检索到内容。第一个问题,解决方法是让节点 Prompt 里的输出格式尽量使用简单文本标记而不是 JSON,因为 LLM 在执行多级嵌套时稳定性下降。第二个问题,我调 TopK 和相似度阈值,偶尔也检查是不是知识库里文档分块策略有问题。

调通之后,我在 dify 里把应用发布成“Agent 应用”类型。发布平台支持 WebApp 界面直接对话,也支持 API 调用。我实际接的是内部的一个知识管理系统,上传会议记录后自动触发分析,再把生成的复盘报告回调到对应项目的看板。dify 发布接口提供的 API 密钥管理、请求日志和 token 统计,让我在联调阶段省了大量排查时间。

一个额外的提示:dify 工作流里记得把每个 LLM 节点的“模型”配置成可复用的环境变量,而不是固定在应用里。这样后续如果发现某个模型效果不好,替换只需要改一个地方,不用每个节点都动。

5. 项目经验沉淀:复盘应用的三条基线

5.1 复盘质量的三条基线

hindsight 跑了小半年,我总结了复盘类项目必须守住的三个底线:

底线一:不编造事实。这是复盘应用的命门。模型一旦为了满足输出格式而编造细节,整个报告就失去了信任基础。我靠三件事守住:所有分析节点都强制“引用原文依据”、生成报告阶段加入“无依据禁止输出”、知识库降低 TopK 减少噪声干扰。

底线二:结论要可执行。判断一个复盘报告好不好,不是看它写得准不准,而是看读它的人能不能照着做。hindsight 的每条建议,我都强约束为“动作 + 责任人 + 时限 + 验证标准”。刚开始跑的时候,模型经常输出“建议定期review”——这不行,我改成要求输出“每周五下午由项目负责人 review 一次,通过率低于 90% 时触发根本原因分析”。约束条件给到位,它就能给出像样的结论。

底线三:过程要可检查。复盘的中间过程比最终结论重要。hindsight 的每个分析节点都保留中间产出,如果一个结论异常,我可以回溯到具体是哪个节点给出的,并且调出它依据的原文片段。没有这个过程追踪能力,应用就只能当玩具用,不能真正服务决策。

5.2 hindsight 还能怎么扩展

项目做到这个程度,其实只是第一步。我心里还有一份扩展清单,现在分享给你。

第一个扩展方向是事件回放可视化。把时间线节点导出的结构化数据接前端,用图表和时间轴动画渲染,让用户像看回放一样浏览项目的关键节点。这个方向对产品演示很有价值。

第二个方向是周期自动复盘。现在 hindsight 是“传入素材才分析”的被动模式。扩展之后,可以让它定时从项目管理工具里拉取一周内的评论、工单和合并请求,自动生成周复盘。dify 的 API 触发方式完全支持这种定时任务,关键是给素材打标签、按项目维度做聚类。

第三个方向是多轮追问式复盘。现在输出的是一份静态报告,下一步想让它变成对话式——生成报告后,用户可以对某个结论继续追问“当时有没有其他备选方案”“这个决策现在是否仍然有效”。这其实就是从工作流应用转成 Chatflow,把 final 节点的结果接到对话上下文里,难度不大,但对交互体验的提升很明显。

我个人在实际操作中的一个建议是:做复盘类应用,不要太迷信模型本身的推理能力,要把重心放在“信息还原——决策回溯——洞察提炼”这条链路的结构设计上。我在 hindsight 上花的绝大部分时间,都不是在调模型,而是在调节点的拆法、Prompt 的边界、知识库的清洗。模型本身是过关的,但只有你把流程设计到位,它才能真正发挥复盘的价值。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询