news 2026/9/13 11:48:55

在 Dify 中接入 Hindsight 长期记忆:Retain / Recall / Reflect 插件完整实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 Dify 中接入 Hindsight 长期记忆:Retain / Recall / Reflect 插件完整实战指南

在 Dify 中接入 Hindsight 长期记忆:Retain / Recall / Reflect 插件完整实战指南

【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight

本文以 Hindsight 官方 Dify 集成插件为主线,讲解如何在 Dify 工作流、Chatflow 与 Agent 应用中为每个流程注入跨运行的长期记忆。读完本文,你将掌握插件的安装方式、凭据配置、三个记忆工具(Retain、Recall、Reflect)的参数语义,以及一套可复现的验证流程,并了解插件背后的源码实现与 API 行为。

快速答案(Quick Answer)

  1. 在 Dify 中进入Plugins → Install Plugin,安装Hindsight插件。
  2. 打开 Hindsight 插件,填入API URLAPI Key凭据。
  3. 在 LLM 节点前放置一个Recall节点,拉取相关历史上下文。
  4. 放置一个Retain节点,把新内容写入记忆库(Bank)。
  5. 运行验证:确认后续运行能召回此前运行存储的内容。

为什么 Dify 需要 Hindsight

Dify 是一个可视化的工作流构建器,拥有日益丰富的工具与插件生态。但默认情况下,Dify 的每次工作流执行都是**无状态(stateless)**的——上一次运行产生的信息不会自动带进下一次运行。这意味着基于 Dify 构建的客服机器人、销售助手或知识库 Agent,每轮对话都要重新开始。

Hindsight 插件解决的就是这个问题:它为 Dify 提供跨运行的持久化长期记忆。插件以普通 Dify 节点(Node)的形式出现,与工作流中已有的 LLM 节点、搜索节点、工具节点完全同构——放置一个Retain节点存储内容,放置一个Recall节点在 LLM 步骤之前拉取相关上下文,或放置一个Reflect节点对记忆库提出一个综合性的问题。整个接入过程不离开可视化画布。

插件本身位于仓库的 hindsight-integrations/dify 目录,manifest.yaml中定义:插件名hindsight、版本0.1.0、类型plugin、作者vectorize,采用 Python 3.12 运行环境(runner.language: pythonrunner.version: "3.12"),并为插件分配了 256MB 内存资源、开启了工具权限(resource.permission.tool.enabled: true)。

前置条件(Prerequisites)

开始前,请确认以下三项就绪:

  • 一个可安装插件、可构建工作流的Dify 实例
  • 一个可访问的Hindsight 后端:可以是 Hindsight Cloud,也可以是自托管(self-hosted)的 Hindsight 服务器;
  • 一份来自 Hindsight 控制台的API Key(对于无需鉴权的自托管实例,该项可选)。

对应仓库中的插件目录,入口文件 main.py 通过DifyPluginEnv(MAX_REQUEST_TIMEOUT=120)初始化插件,即插件侧请求超时上限为 120 秒;而底层 HTTP 客户端(见下文源码分析)默认超时为 30 秒。

Step 1:安装插件

在 Dify 控制台进入Plugins → Install Plugin,三种安装渠道任选其一:

安装方式操作说明
Marketplace(应用市场)搜索Hindsight(发布后可用)
GitHubvectorize-io/hindsight仓库安装,路径为hindsight-integrations/dify
Local(本地)上传.difypkg压缩包

.difypkg本质上就是插件根目录的 zip 打包。仓库中的 build_package.sh 展示了打包过程:脚本从manifest.yaml读取插件名与版本号,生成hindsight-0.1.0.difypkg,打包内容包含manifest.yamlmain.pyrequirements.txtPRIVACY.mdREADME.mdLICENSE_assetsprovidertools目录,并剔除__pycache__*.pyc.DS_Store等缓存文件。

安装完成后,Hindsight插件会出现在工作流编辑器的Tools(工具)列表中。

Step 2:添加 Hindsight 凭据

打开 Hindsight 插件,添加以下两项凭据:

  • API URL—— 默认值为https://api.hindsight.vectorize.io(对应 Hindsight Cloud);自托管时改为你的服务器地址。
  • API Key—— 你的hsk_...密钥(对于无需鉴权的自托管实例可选)。

这两项凭据在 provider/hindsight.yaml 中有精确定义:api_url为必填文本框,默认值https://api.hindsight.vectorize.io,帮助文案中明确给出了自托管示例(如http://localhost:8888);api_key为密文输入框(secret-input),非必填,占位符为hsk_...,帮助文案注明"以hsk_开头,Hindsight Cloud 必填,未鉴权的自托管实例可选"。

凭据如何生效?看 tools/_client.py 的build_client实现:它从凭据字典中读取api_url并去掉末尾斜杠,读取api_key(空值视为未设置),然后构造Hindsight(base_url=..., timeout=30.0, api_key=...)客户端——只有当 API Key 存在时才传入api_key参数。配套的 tests/test_helpers.py 覆盖了"空 key 视为缺失""去除末尾斜杠"等边界行为。

如果你还没有密钥,可以注册 Hindsight Cloud 免费套餐并从控制台获取,或者自行部署一个 Hindsight 服务器。

Step 3:把工具接入工作流

插件提供三个工具,放置方式与任何 Dify 节点相同。

Retain —— 存储内容

把自由文本内容写入记忆库。字段如下:

字段必填说明
Bank ID要写入的记忆库;首次使用时自动创建
Content要保留的自由文本
Tags逗号分隔的标签(如support,vip

Retain 调用返回后,Hindsight异步抽取其中的事实(facts)。其工具定义见 tools/retain.yaml,实现见 tools/retain.py:参数校验(bank_idcontent缺失时直接返回错误消息)、通过parse_tags把逗号分隔的标签解析为列表、调用客户端client.retain(...),最后产出两条消息——JSON 消息包含successbank_id,文本消息形如Retained 1 memory in bank 'xxx'.。测试 tests/test_tools.py 验证了"缺少 bank_id / content 返回错误""tags 解析为['a', 'b']并正确传给客户端"等行为。

Recall —— 按查询检索记忆

在记忆库中搜索与查询相关的记忆,返回results数组。字段如下:

字段必填默认值说明
Bank ID要搜索的记忆库
Query自然语言查询
Budgetmid检索预算:low/mid/high,越高越彻底、越慢、越贵
Max Tokens4096返回结果的 token 上限
Tags逗号分隔的标签过滤

实现层面(tools/recall.py):budget缺省取"mid"max_tokens缺省取4096,返回的 JSON 消息包含results数组与count计数,results中的每条记忆经_memory_to_dict序列化(优先使用 Pydantic 的model_dump(exclude_none=True),否则回退到id/text/type三个字段);有结果时输出编号列表文本,无结果时输出No memories found.。参数定义同样可以在 tools/recall.yaml 中查看——注意budgetselect类型(low/mid/high),max_tokensnumber类型。

关于 Recall 的底层机制,仓库文档 recall.mdx 说明:Hindsight 召回时会并行运行四种检索策略——语义相似度、关键词(BM25)、图遍历(graph traversal)、时间(temporal)——再将结果融合、重排成单一排序列表,返回的是结构化事实而非原始文档;query 超过 500 token 会被拒绝。

Reflect —— 对记忆库提出综合问题

基于记忆库返回 LLM 综合生成的答案,返回text字段。字段如下:

字段必填默认值说明
Bank ID要查询的记忆库
Query要回答的问题
Budgetlow预算:low/mid/high

实现见 tools/reflect.py:与 Recall 不同,Reflect 的budget缺省取"low"(源码注释说明:Reflect 涉及 LLM 综合生成、成本更高,因此默认用低预算),返回的 JSON 消息包含text字段,无答案时输出(no answer)。参数定义见 tools/reflect.yaml。

典型工作流形态

一个典型结构是:在LLM 步骤之前放置Recall节点,把此前历史浮现出来作为上下文;在运行结束后放置Retain节点,把本轮新内容写回同一个记忆库。

三个工具的参数校验、错误处理与消息产出在 tests/test_tools.py 中有完整覆盖;provider 层(provider/hindsight.py 与 tests/test_provider.py)则验证了"缺少 API URL 报错""带 key / 不带 key 的健康检查""401 与 500 的错误消息""连接错误包含 URL"等场景。若需了解更底层的 API 行为,可阅读 recall API 文档 与 retain API 文档。

接入后能得到什么(What you get)

因为这三个工具就是普通的 Dify 节点,你可以完全不离开可视化构建器,把记忆塞进 Chatflow、工作流与 Agent 应用:

  • 客服支持助手—— 每张关闭的工单触发一次 Retain,记录解决方案;每张新工单先用 Recall 检索记忆库、浮现相似历史问题,再把上下文传给 LLM 节点起草第一封回复。
  • 销售通话教练—— 每次通话后 Retain 一份通话摘要;下一次准备会议前,用客户姓名做一次 Recall,把所有历史触点拉进每日准备文档。
  • 知识库 Agent—— 上传的文档被 Retain 存储,Chatflow 用 Recall 替代"仅向量库检索",获得经过事实抽取、去重、具备时间感知的结果。

验证记忆确实在工作(Verify)

推荐如下验证序列:

  1. 运行一个以Retain节点结尾、向某记忆库写入内容的工作流;
  2. 存储一条独特的事实——例如一个决策或一个客户细节;
  3. 运行第二个工作流,其中Recall节点读取同一个 Bank ID
  4. 用查询语句检索第一步存储的事实;
  5. 确认该事实出现在results数组中。

如果 Recall 节点浮现了此前运行存储的内容,说明整套配置已经生效。

常见错误(Common mistakes)

Bank ID 不匹配

Recall 与 Retain 只有在使用相同 Bank ID时才共享记忆。如果后续的 Recall 返回空结果,请先检查它指向的 Bank 是否是之前 Retain 写入的那个。

在 Retain 之后立刻 Recall

Retain 在调用返回后异步抽取事实。如果 Retain 刚结束就立刻 Recall,事实可能尚未进入可检索状态,需要稍候片刻再查询。

凭据缺失或错误

工具报错时,确认API URL指向你的后端,API Key已正确填写(Hindsight Cloud 必填)。

把 Reflect 当成 Recall 用

Recall 返回results记忆数组,供 LLM 步骤消费;Reflect 直接返回综合生成的text答案。需要把记忆喂给 LLM 时用 Recall,需要直接拿到综合答案时用 Reflect。

常见问题(FAQ)

我需要 Hindsight Cloud 吗?不需要。自托管的 Hindsight 服务器同样可用——把插件的API URL指向它即可;对于未鉴权的自托管实例,API Key 可选。

插件在 Dify 中显示在哪里?安装完成后,Hindsight 插件出现在工作流编辑器的Tools下。

记忆的作用域如何划分?Bank ID划分。每个 Bank 都是独立的记忆存储,由你决定每个工具节点从哪个 Bank 读、往哪个 Bank 写。

应该用哪个工具?Retain负责存储内容,Recall负责在 LLM 步骤前拉取相关记忆,Reflect负责对记忆库提出 LLM 综合问题。

进一步探索

  • 想深入了解插件在仓库中的完整实现,可通读 hindsight-integrations/dify 目录(manifest.yamlmain.pyprovider/tools/tests/);
  • 想理解 Recall 的四路检索与融合重排机制,阅读 Recall 架构文档;
  • 想直接调用底层 API,可参考 quickstart、recall 与 retain 三份接口文档,仓库的examples/目录还提供了 Python / Node.js / Shell / Go 多种语言的调用示例。

【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 11:48:45

车载组合导航算法:SINS/GNSS紧耦合与车规级实时实现

简介:本资源是一套面向导航算法研究者与车载系统开发工程师的捷联惯导与组合导航MATLAB仿真代码集,聚焦于SINS/GPS车载组合导航系统的建模、误差补偿与滤波融合实践。资源包含32个文件,主体为30个.m函数脚本(如sins.m、kalman.m、…

作者头像 李华
网站建设 2026/9/13 11:47:50

晶振相位噪声:近端与远端噪声的物理机制与协同优化

1. 为什么晶振的“近端”和“远端”噪声不能混为一谈? 你手头那颗标称10ppm、老化率0.5ppm/year的石英晶振,放在频谱仪上一测,相位噪声曲线却在1kHz偏移处突然“翘尾巴”,在100kHz处又莫名抬高——这根本不是数据手册里写的那条平…

作者头像 李华
网站建设 2026/9/13 11:46:53

Simulink光伏MPPT建模:基于单二极管物理模型与S-Function工程实现

简介:本资源是一套基于MATLAB/Simulink构建的独立光伏发电系统建模仿真资料,面向新能源方向本科生、研究生及电力电子初/中级工程师,聚焦光伏系统建模与MPPT控制策略实践。压缩包含10个文件(5个Simulink模型.mdl文件用于系统搭建与…

作者头像 李华
网站建设 2026/9/13 11:43:26

SAX解析Excel:startRow、cell、endRow回调机制与内存优化实战

做Excel解析的同行,十有八九都被大文件卡死过内存。上次我处理一个50MB出头的xlsx,用DOM方式直接OOM,换成SAX事件解析后,全程内存占用稳在120MB以内,速度还快了一个量级。今天就把这块的核心逻辑彻底聊透:S…

作者头像 李华