ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Dify+RAG+Agent实战:构建个人AI复盘助手hindsight

Dify+RAG+Agent实战:构建个人AI复盘助手hindsight 1. 项目概览把hindsight从想法做成 AI 复盘助手hindsight这个词本身就有意思——后见之明、事后复盘、回头看。我拿它做项目名就是想做一个私人 AI 回顾助手把散落在各个笔记软件、文档、聊天记录里的碎片内容收集起来定期让大模型帮我回头看一遍总结出当时的我没意识到的规律、遗漏的信息、以及该吸取的教训。说白了这项目想解决的问题非常实际我记了很多笔记——会议纪要、读书摘录、灵感碎片、周报草稿——但记完就再也不翻。知识都在但检索不出来、关联不清晰、洞察不够是三个老大难。hindsight 这个项目就是把这些沉睡的笔记变成 AI 的记忆库再通过定时任务和精心设计的提示词让 AI 定期给我生成回顾报告告诉我这段时间我做了什么、关注什么、哪些决定做得好、哪些坑其实能提前避开。这个项目很适合几类人参考知识管理党——收藏夹和笔记常年爆炸团队管理者——想从周报和会议记录里提炼团队动向正在学 Dify 和 RAG 的开发者——想用一个真实可跑通的项目来理解 Agent、知识库、工作流编排这几个概念是怎么落地的。懂的可以直接抄作业不懂的也能在一步步搭建里把 AI 应用开发的底层逻辑串起来。我最终选择在 Dify 上实现而不是直接用 Jupyter Notebook 调 API原因后面会细说。先看整体想法这个项目的本质是时间维度上的信息压缩与模式提取。不是简单做个问答机器人而是让 AI 按时间切片去审视过去——这决定了它需要 RAG、需要 Agent、需要定时触发这三条腿缺一不可。2. 整体架构设计为什么选择 Dify RAG Agent 的组合2.1 核心链路从碎片记录到洞察报告的完整数据流hindsight 的第一版架构我画了很久最后定下来的是一个很简单的单向流笔记输入 → 知识库入库 → 定时任务触发 → Agent 调取知识库检索 → 大模型理解与结构化输出 → 报告推送这条链路看着不复杂但每一步都有值得深挖的设计点。以笔记输入为例我面对的数据源非常杂——有纯 Markdown 文件、有从微信收藏导出的 HTML、有 Notion 导出的 CSV。如果直接一股脑塞给知识库召回质量和拆分效果会非常差。所以我在入库前做了一个统一的预处理把不同来源的文档转成标准的 Markdown 格式统一保留日期标题再按来源和主题打好标签。这个预处理不是 Dify 自带的功能是我在数据导入前用脚本处理的但处理完之后 Dify 的知识库才能稳定发挥。为什么一定要先统一格式因为后续 Agent 要按时间回顾如果文档里没有清晰的日期信息AI 根本不知道哪条记录是当时的产物也没有办法判断时间线上的因果。这是很多做 RAG 项目的人容易忽略的一点知识库的关键不是能搜到而是能按什么维度去搜。hindsight 的核心维度就是时间 主题所以我的一切预处理都围绕这两个维度展开。2.2 RAG 设计的几个关键决策分块、检索与重排在 Dify 里创建知识库很简单难的是几个参数怎么调。我先说结论再说为什么。第一版我用的是 Dify 默认的分段标识符分割方式分段长度设了 500 个字符。实测下来针对我这种每条笔记长短不一、主题跳跃的内容固定长度分段会把完全无关的内容切在同一个 chunk 里检索时经常出现驴唇不对马嘴的召回结果。后来我把分段方式换成了 Markdown 标题分割每条笔记作为一个独立 chunk再把最大分段长度设为 1024、分段重叠设为 50。这个调整背后的逻辑hindsight 的检索单元应该是一条完整笔记而不是笔记的一个片段。Markdown 标题天然就是笔记的边界按标题切能最大程度保证每个 chunk 的语义完整。分段重叠的意义在于有时笔记标题和正文之间的上下文链接很重要50 字符的重叠足够让上下文连贯又不会让 chunk 之间出现大量冗余。检索参数上我建议把TopK从默认的 3 调整到 6-8。为什么如果你是做相似问题问答TopK3 够用答案通常就在两三个段落里。但 hindsight 做的是全景式回顾需要同时拿到过去一周不同主题的笔记TopK 太低会导致复盘内容只停留在某一个主题上看不到全局。Score阈值我建议不要设太高0.3 左右即可因为笔记这种碎片化内容本身和需要回顾的主题之间的语义距离就比问题-答案要远阈值太高会滤掉太多可能相关的信息。还有一点很关键启用重排Rerank。Dify 知识库支持配置 Rerank 模型我接的是 Cohere 的 Rerank 模型。重排的作用是把检索出来的十几个候选段落按相关性重新排序把最相关的排在最前面。模型生成时有上下文窗口长度和最大 Token 数的限制如果 TopK 设多了全塞给大模型会超出上下文限制重排后只取前 4-5 个最高分的段落既保证信息覆盖又不爆上下文。这一步是提升复盘质量性价比最高的操作。2.3 为什么用 Agent 而不是固定工作流一开始我打算用 Dify 的工作流Chatflow来搭——把调用知识库和调用模型两个节点串起来逻辑非常简单。后来体验下来发现一个问题固定流程不知道该回顾哪个时间段。如果我固定检索最近 7 天的笔记那周报场景还行但遇到用户突然想问上个月我对产品方向的思考变化固定流程就愣住了。Agent 则不同——它自己有规划能力我只需要给它工具知识库检索再告诉它你可以按时间检索、也可以按主题检索、如果你觉得某个话题值得深挖可以连续多次检索它就会自己决定怎么拆解用户的请求。所以我最终做的是 Dify 的 Agent 应用类型并把知识库作为 Agent 的一个工具传入。系统指令里特别强调了三条先判断用户请求的时间范围和主题范围如果检索结果覆盖不足允许进行第二轮检索输出时必须标注每条洞察对应的时间节点和笔记来源防止幻觉说实话这一点是 Dify 设计得比较聪明的地方Agent 应用天然支持多轮工具调用而且有观察-思考-行动的循环比起 Chatflow 的死板编排更适合开放式回顾这种场景。3. 从零搭建hindsight 的四个核心环节实操3.1 第一步知识库的搭建与文档预处理在 Dify 控制台左侧选知识库新建一个知识库我给它命名叫hindsight-memory。数据源是本地文件上传支持 PDF、DOCX、Markdown、TXT 等格式。上传之前我做了统一预处理所有笔记都转成 Markdown文件名采用YYYY-MM-DD-主题.md的命名规则。这个命名规则极其重要我强烈建议照做。Dify 知识库每个文档都有元数据但没有默认的时间字段如果不把日期写进文件名或文档开头后续做时间范围的检索基本无从谈起。哪怕你没有写预处理脚本至少在上传文档时手动在文档第一行加上 日期2024-06-01记得保持格式统一。否则 Agent 在判断这个笔记是什么时候的时完全是瞎猜输出结果会严重失真。分段设置这里再强调一遍分段标识符选 Markdown 标题最大分段长度设 1024分段重叠设 50。如果你用的文档不是 Markdown 而是 PDF那分段标识符可以选 二级标题 或自定义正则匹配。Dify 还支持自定义正则表达式来切分这个适合文档格式很统一的情况我暂时没用到但值得了解一下。嵌入模型选了 OpenAI 的text-embedding-3-small。这里有个考虑如果是中文笔记为主可以考虑用text-embedding-3-large或者国产的 embedding 模型比如 text2vec 等来提升中文语义匹配的效果。我的笔记中英混杂OpenAI embedding 对两者支持都不错就先这么定了。embedding 模型的维度会影响后续检索的精度和速度太小的模型对长文本不友好但 small 级别的在大部分场景足够。提示Dify 知识库的召回模式一定要选向量检索或混合检索。混合检索会同时做关键词和向量匹配对主题回顾这种模糊需求效果更好。和我一起测这个项目的朋友只用了向量检索经常出现某些专有名词明明在笔记里有却搜不到的情况改成混合检索后好了很多。3.2 第二步Agent 编排与工作流配置知识库就绪后我开始创建 Agent 应用。在 Dify 顶部选Agent类型然后在编排界面里做了几件事模型选择我用了gpt-4o。如果追求成本控制用gpt-4o-mini也可以但 hindsight 的输出都是长文本复盘报告gpt-4o-mini在跨多篇笔记找规律这类的推理任务上明显吃力经常会漏掉深层关联。Agent 类型的应用和普通聊天不同它要自己规划调用工具的路径对模型推理能力的要求比单轮问答高不止一个档次这里不建议省。工具配置把刚建的 hindsight-memory 知识库添加为工具。Dify 允许设置工具的参数包括query检索关键词Agent 自己生成top_k我在 Agent 工具这里也设了 6score_threshold0.3这里有个小技巧Dify 的 Agent 应用里每个工具都可以写工具描述这个描述会被模型看到影响它何时调用以及如何调用这个工具。我的工具描述写的是回顾用户笔记库的工具。当需要查询用户过去记录的想法、笔记、会议总结时使用。支持按时间关键词和主题关键词检索。这段描述的信息量很大。我一开始只写查询知识库结果 Agent 经常把这个工具当成备选优先自己乱答。后来把何时使用和支持什么检索方式写清楚Agent 的调用频率和准确度都提升了。这一步是社区里很少提到的隐藏优化点非常值得一试。指令系统提示词Agent 的系统提示词决定了它怎么理解任务。我写了很多版本最后稳定下来的核心逻辑是你是 hindsight一个个人记忆回顾助手。你的使命是帮助用户回看过去的笔记和记录 发现其中的模式、趋势、遗漏点和可改进之处。 工作原则 1. 当你需要回顾内容时优先调用知识库工具而不是依靠你自己的知识。 2. 如果你认为第一轮检索结果不足以支撑结论可以进行第二轮检索 第二轮检索可以尝试不同的关键词组合。 3. 如果用户没有指定时间范围默认回顾最近 14 天的记录。 4. 区分事实和推测报告中必须明确标注哪些是笔记中的原始内容哪些是推断。 5. 输出时注意时间线的因果关系不要脱离上下文做评价。这五条原则每一条都是踩过坑才加上的。第 2 条解决的是一次检索不够用的问题第 4 条防幻觉第 5 条是复盘类 AI 最容易翻车的地方——它看到一条负面笔记就着急输出建议完全不管前后发生过什么。3.3 第三步提示词模板设计——复盘的灵魂很多人以为 Agent 配好了就能出好结果实际上真正决定复盘质量的是提示词。我给 hindsight 设计了三种场景模板全部放在系统指令里让 Agent 根据用户的请求自动套用日复盘模板输入是今天帮我做一次日复盘请回顾用户最近一天内的笔记记录输出一份简短的日复盘报告包含 - 今日聚焦列出当天记录中最常出现的 3 个主题 - 关键时刻标注当天时间线上最重要的 2-3 个事件或决定 - 遗漏检查根据当天 TODO 类记录指出可能被忽略的事项 - 明日提示基于今天的记录生成 1 条对明天的行动建议 要求每个部分不超过 3 句话使用中性、客观的语气。周复盘模板请回顾用户最近一周的笔记记录输出一份周复盘报告包含 - 主题进展归纳本周关注的核心主题及其进展 - 关联发现找出 2-3 个跨笔记的模式或关联 - 问题信号指出重复出现的问题或情绪信号 - 决策反思标注本周做过的关键决策并分析当时的信息充分度 - 下周建议给出 2 条可执行建议 要求引用具体笔记内容作为依据区分笔记事实和AI 推断。专题回顾模板比如回顾一下我关于产品方向的思考请检索用户笔记中与产品方向相关的内容跨时间梳理用户思考的演变过程。 输出要求 - 时间线按时间顺序列出关键观点和变化节点 - 转折点指出观点发生显著变化的时间点和可能诱因 - 当前状态基于最新笔记判断用户当前在该主题上的立场 - 盲区提示基于用户过往记录和用户关注领域的常见框架指出可能未被考虑的盲区 注意如果检索结果不足请明确说明检索覆盖有限而不是强行生成。这三套模板的共性是什么先列结构再给约束。不要指望大模型自己决定复盘报告长什么样它自由发挥的结果通常是一堆正确但没有信息的废话。给了模板之后输出结构极其稳定而且每个部分都很克制不会动不动写八百字鸡汤。我还做了一个细节优化在模板最后加了一句如果不确定用户笔记中的某个事实请不要猜测或用通用知识填充。复盘类 AI 最常见的问题就是模型用自己的知识脑补比如用户根本没记录过融资相关的内容模型却因为互联网公开信息而写进了复盘报告这完全违背了 hindsight 的定位——它只审视用户的个人记录不是通用知识问答。3.4 第四步定时触发与自动化交付Dify 的 Agent 应用发布后会生成一个 Web App 访问链接和一个 API 访问端点。如果只是手动打开网页问一句帮我做周复盘那是半自动不够香。hindsight 的完整闭环应该是定时自动触发。Dify 本身提供了定时任务功能可以在应用的定时任务标签页里配置。我配置了两个任务每天早上 8:00发送 API 请求触发日复盘每周日晚 20:00触发周复盘定时任务的本质是调用这个应用发布后生成的 API 端点请求体中指定对话 ID 或用户 ID并传入初始输入。一个值得注意的点每次定时触发时要传一个唯一但稳定的conversation_id比如daily-review。如果传了同一个 conversation_idAgent 会复用之前的对话上下文导致新旧复盘信息混淆。我踩过这个坑还是在看日志时发现的——日报里突然多了上周的内容就是因为所有定时任务都用了同一个 conversation_id。改成每天一个 ID 之后就好了。定时任务的推送结果我接的是企业微信机器人。Dify 的自定义工具模块支持发送请求到企业微信机器人的 Webhook 地址把 Agent 的回复文本 POST 过去即可。如果你不用企业微信也可以接钉钉、飞书或者 Telegram Bot逻辑一模一样拿到回复文本用工具发出去。这一步让 hindsight 从我得记得去查变成了它主动给我送到眼前。4. 常见问题与排查技巧实录4.1 知识库检索不到或结果太零散这是所有 RAG 项目的头号问题hindsight 自然也逃不掉。我遇到过三种典型情况第一种专有名词检索困难。笔记里写的是LTV 模型我用用户生命周期价值去搜向量检索能匹配上但关键词检索完全失效。这种情况开启混合检索就解决了。第二种笔记内容过短。有些灵感类笔记就一句话embedding 出来的向量在整个高维空间里很难被精准召回。我的办法是调整分段设置把同一主题的短笔记合并成一个 chunk如果不行则考虑引入关键词标题机制——每条短笔记加一个信息量更大的标题。第三种发布时间顺序混乱。知识库里的文档默认按创建时间排但笔记真正记录的事件时间可能在正文里。后来我统一在所有文档的首行加入了日期字段并且在预处理时确保文件名就是日期格式事实上解决了这个问题。如果以上三种都不符合你的情况去 Dify 的日志页面看召回结果是一个好习惯。日志里会展示 Agent 每一步调用了什么工具、传了什么参数、拿到了什么结果。不用瞎猜看日志定位问题效率最高。4.2 复盘内容太泛、缺乏洞察模型输出的复盘经常是你本周关注了多个主题建议继续保持。这种废话毫无信息量。我排查后发现了两个原因一是检索范围太窄。TopK 少、score 阈值高Agent 只拿到了一两条最相似的笔记自然总结不出跨笔记的模式。调整检索参数后可用的信息量变大输出质量有明显提升。二是系统指令里没强调对比和找关系。大模型的默认行为是概括你已经知道的东西而不是发现你不知道的东西。所以我在提示词里加了关联发现和问题信号这些带分析性的栏目强迫模型去做推理而不是复述。4.3 定时任务触发失败或回答串台定时任务不触发先检查 API 密钥状态、Webhook 地址是否有效再去看 Dify 的日志面板。大多数情况不是 Dify 本身的问题而是工单里填的conversation_id重复导致 Agent 的各种信息混合。我养成了一个习惯每个定时任务都单独设定唯一的 conversation_id并且按日期做后缀比如daily-2024-06-01。既避免串台也方便后期按会话溯源。还有一个小问题定时任务触发的消息是通过 API 的inputs传入的inputs里传的是一个 JSON 对象。如果传字符串而不是字典结构Agent 可能收到错误格式。正确写法是这样的{ inputs: { query: 请帮我做一次日复盘 }, user: hindsight-bot, conversation_id: daily-2024-06-01 }把这段配置到定时任务的请求体里基本就不会出问题。4.4 模型幻觉与编造笔记内容这是复盘类 AI 最隐蔽也最危险的坑。模型在生成报告时为了让内容看起来完整会凭空补充用户根本没有记录过的细节。比如笔记里只写了今天讨论了定价策略模型却在周报里脑补出讨论了竞品定价、并表示要提高 10%。我在系统指令里加了两重防线。第一重是在第 4 条工作原则里明确区分原始内容和推断。第二重是在输出格式上做强制约束任何涉及具体数据的描述都必须以引用的形式给出来源笔记的片段。如果模型写报告时必须引用就是逼它不能瞎编。实测下来幻觉率从最初的约 40% 降到不足 10%。代价是报告篇幅会变长一些但换来的是可信度这笔买卖非常划算。5. 项目扩展与我的实操体会hindsight 跑到现在我已经把它当成一个新的基础设施来看待了。它不只是一次性的工具我可以继续给它加新的数据源——比如把 RSS 阅读器的收藏文章定时同步进知识库这样周报里就能包含我这周关注了什么外部信息的维度也可以做一个专门的决策记录器每次做完重大决定就把当时的备选方案和理由录入这样 hindsight 在周复盘时就能自动做当初的选择是否合理的验证。从架构上讲目前知识库是整个系统唯一的记忆来源这也是后见之明的哲学根基——人的记忆不可靠AI 的记忆靠检索。你不需要一次把所有笔记全部打包喂给模型只需要在需要回顾的那个时间切片里精确取回相关内容这样无论笔记库增长到多大规模单次回顾的复杂度和成本都是可控的这个架构天然具备可扩展性。我在实际跑这套系统的过程中最大的体会是做一个 AI 应用难点从来不在调用大模型这一步而在于如何把真实世界的杂乱信息变成模型能可靠利用的数据结构。hindsight 这个项目表面上做的是笔记回顾实际上做的是让模型在正确的时间、用正确的上下文、输出正确的结构。如果你也想动手做一个同类型的项目我建议先别急着写提示词先把知识库的数据质量打磨好——那是整个系统的地基。地基不牢大模型给出的复盘报告哪怕措辞再漂亮也只会让你对自己产生更深的误解。再分享一个小技巧Agent 应用的迭代不是一次性的你可以把用户反馈好的报告回填到知识库里。比如周复盘报告里指出了一条很有价值的洞察就把这条洞察作为一条新笔记加进知识库。日积月累hindsight 的记忆库里不仅有原始笔记还有它自己的历史洞察后续的复盘就能基于更丰富的上下文做分析形成一个正反馈循环。这是超越工具的一步也是我认为这类项目最有想象力的延伸方向。
返回列表