Hindsight × Haystack 集成指南:为 Haystack Agent 接入持久化长期记忆
2026/9/15 14:48:25 网站建设 项目流程

Hindsight × Haystack 集成指南:为 Haystack Agent 接入持久化长期记忆

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

导读

hindsight-haystack是 Hindsight 官方提供的 Haystack 集成包,它把 Hindsight 的retain(存储)、recall(检索)、reflect(综合反思)三大记忆能力封装成标准的 HaystackTool,让任何基于haystack-ai >= 2.12构建的 Agent 都能直接获得跨会话的持久化长期记忆。本文以官方集成文档为主体,结合仓库内 hindsight-integrations/haystack 的源码与测试,完整讲解安装步骤、两种接入模式(显式工具调用与HindsightMemoryWrapper自动记忆)、全部核心配置项及其底层实现原理,读完即可在自建应用中落地"会学习、能记住"的 Haystack Agent。

背景:为什么 Haystack Agent 需要 Hindsight

Haystack 是 deepset 出品的开源 LLM 编排框架,其Agent组件通过 Tool Calling 调用外部工具完成任务。但原生 Agent 是无状态的——每一轮对话结束后,之前交互中的用户偏好、关键事实、决策过程都会丢失,下一轮需要用户重新描述。

Hindsight 正是为解决这一问题而设计:它把对话内容沉淀为可检索、可综合的长期记忆("Agent Memory That Learns")。hindsight-haystack的作用是把两者无缝衔接:Agent 通过调用工具写记忆、读记忆、反思记忆,从而在多次会话之间保持上下文连续。

集成包在架构上提供两种互补的使用模式(源码见 hindsight-integrations/haystack/hindsight_haystack/tools.py):

  • create_hindsight_tools(...):返回一组 HaystackToolretain_memoryrecall_memoryreflect_on_memory),由模型在回合内自行决定何时调用——这是显式的、由 Agent 主导的记忆行为;
  • HindsightMemoryWrapper:一个 HaystackToolset,打包同样的三个工具,并额外提供可选的auto-recall(每轮对话前自动把相关记忆注入系统提示词)与auto-retain(每轮对话后自动把用户与助手消息存入记忆)——这是隐式的、由框架主导的记忆行为。

安装与前置条件

安装只需一条命令(要求 Python 3.10+):

pip install hindsight-haystack

包依赖见 hindsight-integrations/haystack/pyproject.toml:

  • haystack-ai >= 2.12.0
  • hindsight-client >= 0.4.0

此外需要一台可访问的 Hindsight 实例:

  • Hindsight Cloud(推荐):无需自托管,注册即可使用;
  • 自托管
pip install hindsight-all export HINDSIGHT_API_LLM_API_KEY=your-api-key hindsight-api # 服务启动于 http://localhost:8888

从源码看(hindsight-integrations/haystack/hindsight_haystack/_client.py),客户端在构造时默认使用https://api.hindsight.vectorize.io作为 API 地址、HINDSIGHT_API_KEY环境变量作为密钥,超时时间为 30 秒,并附带hindsight-haystack/{version}的 User-Agent。

快速开始:用三个工具为 Agent 注入记忆

完整可运行的示例(同时见 hindsight-integrations/haystack/README.md):

from hindsight_client import Hindsight from hindsight_haystack import create_hindsight_tools from haystack.components.agents import Agent from haystack.components.generators.chat import OpenAIChatGenerator from haystack.dataclasses import ChatMessage client = Hindsight(base_url="http://localhost:8888") tools = create_hindsight_tools( client=client, bank_id="user-123", mission="Track user preferences", ) agent = Agent( chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=tools, system_prompt=( "You are a helpful assistant with long-term memory. " "Use retain_memory to store important facts. " "Use recall_memory to search memory before answering." ), ) result = agent.run(messages=[ChatMessage.from_user("Remember that I prefer dark mode")]) print(result["messages"][-1].text)

关键点:

  • bank_id是记忆库标识,不同用户/场景使用不同bank_id即可实现记忆隔离;
  • mission是记忆库的使命描述,用于指导后续事实抽取方向(如"Track user preferences"会让记忆更聚焦于用户偏好);
  • 三个工具通过_TOOL_DEFS注册为带 JSON Schema 参数定义的 HaystackTool,模型可依据工具描述自主决定调用(见 hindsight-integrations/haystack/hindsight_haystack/tools.py)。

三个记忆工具的行为契约

从 tools.py 中的后端实现_HindsightToolBackend可归纳出每个工具的确切行为:

工具名入参行为空结果返回
retain_memorycontent(要记忆的内容)调用aretain写入长期记忆成功返回"Memory stored successfully."
recall_memoryquery(检索词)调用arecall检索,返回编号列表"No relevant memories found."
reflect_on_memoryquery(反思问题)调用areflect基于记忆综合回答回退到"No relevant memories found."

值得注意的工程细节:工具调用本身永不抛异常——出错时返回错误字符串(如Failed to store memory: ...),让 Agent 能够读取并自行应对;同时每次 retain 若不显式指定document_id,会自动生成{session_id}-{uuid_hex12}格式的文档 ID(参见 tools.py 及测试 test_tools.py)。

自动记忆:HindsightMemoryWrapper

显式工具模式依赖模型"自觉"调用工具。如果不希望依赖模型行为,可用HindsightMemoryWrapper开启全自动记忆:

from hindsight_haystack import HindsightMemoryWrapper toolset = HindsightMemoryWrapper( client=client, bank_id="user-123", mission="Track user preferences", auto_recall=True, # 每轮对话前将相关记忆注入系统提示词 auto_retain=True, # 每轮对话后自动存储用户 + 助手消息 ) agent = Agent( chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), tools=toolset, system_prompt="You are a helpful assistant with long-term memory.", ) # 通过 toolset.run() 触发自动记忆行为 result = toolset.run(agent, messages=[ChatMessage.from_user("I prefer dark mode")])

其运行流水线(实现于 tools.py)分为三步:

  1. Auto-recall:提取最后一条用户消息文本作为检索词,调用arecall取回相关记忆,通过模板注入系统提示词;
  2. Agent 执行:用增强后的system_prompt调用agent.run()
  3. Auto-retain:把本轮用户消息与 Agent 最终回复(last_message)写入记忆。

注入模板默认如下(常量DEFAULT_MEMORY_PROMPT):

Below are relevant memories from previous conversations: {memories} Use these memories to provide more personalized and contextual responses.

默认注入前 10 条记忆(max_recall_results=10),防止提示词无限膨胀;用户消息与助手消息在 retain 时会自动附加{"role": "user"/"assistant", "source": "haystack"}元数据,便于后续按角色溯源(见 tools.py)。该工具集同时提供run_async()异步版本,行为与同步版一致。若只想用工具、不想要自动行为,直接Agent(tools=toolset)即可进入显式模式。

按需裁剪:Selective Tools

默认返回三个工具;若不需要某个能力,可通过开关裁剪:

# 仅保留 retain + recall(去掉 reflect) tools = create_hindsight_tools( client=client, bank_id="user-123", include_reflect=False, )

create_hindsight_toolsHindsightMemoryWrapper均支持include_retaininclude_recallinclude_reflect三个布尔开关(全部为False时返回空列表)。测试 test_tools.py 对每个开关组合均有覆盖验证。

全局配置:configure()

若在代码多处创建工具,可先调用configure()设置一次连接默认值,之后即可省略client=/hindsight_api_url=参数:

from hindsight_haystack import configure configure( hindsight_api_url="http://localhost:8888", api_key="your-api-key", budget="mid", tags=["source:haystack"], context="my-app", mission="Track user preferences", ) # 此后无需再传 client / url tools = create_hindsight_tools(bank_id="user-123")

完整的配置项及其默认值(见 hindsight-integrations/haystack/hindsight_haystack/config.py):

参数默认值说明
hindsight_api_urlhttps://api.hindsight.vectorize.ioHindsight API 地址
api_key环境变量HINDSIGHT_API_KEYAPI 密钥
budget"mid"recall/reflect 的预算等级:low/mid/high
max_tokens4096recall 结果的最大 token 数
tagsNoneretain 写入时附加的默认标签
recall_tagsNonerecall 检索时用于过滤的标签
recall_tags_match"any"标签匹配模式:any/all/any_strict/all_strict
context"haystack"retain 操作的来源标签
missionNone记忆库使命(事实抽取上下文)
verboseFalse是否开启详细日志

从 config.py 可以看到configure()内部会先解析显式传入的api_key,缺失时回退到HINDSIGHT_API_KEY环境变量。配套提供get_config()reset_config()用于读取与重置全局配置。

参数解析与配置回退的底层实现

create_hindsight_tools/HindsightMemoryWrapper的每个参数最终都汇聚到_HindsightToolBackend构造器([hindsight-integrations/haystack/hindsight_haystack/tools.py#L103-L170])。其参数解析遵循显式参数优先、全局配置兜底的规则:例如budget未显式传入时取config.budget,仍为空则落到默认值"mid"max_tokens默认4096retain_context默认"haystack"。参数在各操作中的实际去向如下:

  • retaincontent+context+tags+metadata+document_id_retain_kwargs);
  • recallquery+budget+max_tokens+tags/tags_match+types(事实类型:world/experience/observation)+include_entities_recall_kwargs);
  • reflectquery+budget+context+max_tokens(默认回退到max_tokens)+response_schema(结构化 JSON Schema 约束输出)+tags/tags_match(未指定时回退到recall_tags,见_reflect_kwargs)。

值得展开的两个高级能力:

  1. reflect_response_schema结构化输出:为 reflect 指定 JSON Schema 后,后端会返回json.dumps(response.structured_output),便于下游程序直接消费结构化结论而非自由文本;
  2. mission与记忆库自动创建:首次调用任何工具前,若配置了mission,后端会调用acreate_bank创建/更新记忆库(_ensure_bank,见 tools.py);该过程对"already exists"/409/conflict等"已存在"错误幂等处理,对瞬时错误则留待下次重试,同一会话内只创建一次。对应测试见 test_tools.py 的TestBankMissionTestBankCreationRetry

可序列化设计:安全接入 Haystack Pipeline

Haystack 的 Agent 通常会被序列化为 YAML 用于检查、断点或共享。集成包为此做了专门设计(_HindsightTool.to_dict/from_dict,tools.py):

  • 序列化时保存的是后端配置bank_id、URL、各参数)而非绑定方法,保证可重建;
  • api_key刻意不参与序列化——避免密钥泄漏进 YAML dump;反序列化时通过resolve_client()HINDSIGHT_API_KEY环境变量重新取回(测试test_tools_round_trip_serialization_with_client明确断言密钥不会出现在任何序列化字段中)。

另一个工程细节是常驻事件循环桥hindsight_client是异步客户端(aretain/arecall/areflect),而 HaystackTool需要同步可调用对象。模块在后台守护线程中启动一个常驻事件循环,通过run_coroutine_threadsafe桥接同步调用(tools.py),并在进程退出时通过atexit钩子关闭模块自建的客户端会话,避免 "Unclosed client session" 告警。

进阶调优建议

结合源码与测试可给出以下实操建议:

  • 多租户隔离:每个用户使用独立bank_id,配合mission引导记忆聚焦方向;
  • 标签化治理:retain 时用tags打标(如source:haystack),recall/reflect 时用recall_tags/recall_tags_match精确过滤,reflect未指定标签时会自动沿用recall_tags
  • 成本与延迟控制budget三档(low/mid/high)与max_tokens直接决定 recall 返回内容的规模,高并发场景建议mid起步;
  • 结构化输出:需要让记忆"变成数据"时,为 reflect 配置response_schema
  • 自动 vs 显式模式:追求"开箱即记忆"用HindsightMemoryWrapper(auto_recall=True, auto_retain=True);需要模型自主决策、减少无关记忆写入时用create_hindsight_tools

相关资源

  • 集成包源码与示例:hindsight-integrations/haystack
  • 单元测试(覆盖工具行为、配置回退、序列化与自动记忆):hindsight-integrations/haystack/tests/test_tools.py、hindsight-integrations/haystack/tests/test_config.py
  • 集成变更日志:skills/hindsight-docs/references/changelog/integrations/haystack.md
  • 客户端库:hindsight-clientHindsight类,提供aretain/arecall/areflect/acreate_bank等异步接口)
  • 更多官方集成参见 hindsight-integrations 目录下的其余 SDK 适配

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

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

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

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

立即咨询