尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

在 Haystack Agent 中接入 Hindsight 长期记忆:hindsight-haystack 集成实战指南

在 Haystack Agent 中接入 Hindsight 长期记忆:hindsight-haystack 集成实战指南 在 Haystack Agent 中接入 Hindsight 长期记忆hindsight-haystack 集成实战指南【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight本文以 Hindsight 官方指南《Guide: Add Haystack Memory with Hindsight》为核心脉络结合仓库内hindsight-haystack集成包的源码与测试系统讲解如何让任何 HaystackAgent获得由 Hindsight retain / recall / reflect API 支撑的持久化长期记忆。读完本文你将掌握hindsight-haystack的安装、后端连接、工具接入与自动记忆两种模式并能独立验证记忆是否真实生效。为什么需要给 Haystack Agent 加记忆标准的 HaystackAgent每次会话都从零开始模型只能看到当前对话上下文无法记住用户在上一次会话甚至上一个回合中透露的偏好与事实。hindsight-haystack包解决了这一问题——它基于 Hindsight 的 retain存储、recall检索、reflect反思综合三组 API为任意 HaystackAgent提供跨回合、跨会话的持久化长期记忆。该包提供两种互补的使用模式create_hindsight_tools(...)返回一组 HaystackTool——retain_memory、recall_memory、reflect_on_memory由模型在回合内自行决定何时调用HindsightMemoryWrapper一个 HaystackToolset打包同样的工具并额外支持auto_recall每回合前自动把相关记忆注入系统提示词与auto_retain每回合后自动存储用户与助手消息。快速上手pip install hindsight-haystack创建指向你后端的Hindsight客户端base_url或 Cloud 的HINDSIGHT_API_KEY用create_hindsight_tools(clientclient, bank_iduser-123)构建工具把工具传给 HaystackAgent或使用HindsightMemoryWrapper实现自动 recall/retain验证后一个回合能召回前一个回合存储的事实前置条件开始之前请确认Python 3.10集成包在 pyproject.toml 中声明requires-python 3.10并支持 3.10 / 3.11 / 3.12一个使用haystack-ai 2.12.0的 Haystack 项目hindsight-client 0.4.0作为hindsight-haystack的依赖自动安装一个可达的 Hindsight 后端Hindsight Cloud 或自托管服务器默认 API 地址为https://api.hindsight.vectorize.io定义在 config.py 的DEFAULT_HINDSIGHT_API_URL。Step 1安装集成包pip install hindsight-haystack安装会同时拉入 Hindsight 客户端因此你可以直接为 HaystackAgent构建记忆工具。仓库中该包的完整元数据MIT 协议、作者、依赖声明等见 hindsight-integrations/haystack/pyproject.toml。Step 2让工具指向你的 Hindsight 后端创建Hindsight客户端。自托管服务器请显式传入base_urlfrom hindsight_client import Hindsight client Hindsight(base_urlhttp://localhost:8888)使用 Hindsight Cloud 时API URL 默认就是https://api.hindsight.vectorize.ioAPI Key 会回退到HINDSIGHT_API_KEY环境变量——也就是说只设置环境变量即可工作无需在代码里写任何连接参数源码见 _client.py 的resolve_client()。你也可以用configure()一次性设置全局默认值之后每次调用都无需再传client/hindsight_api_urlfrom hindsight_haystack import configure configure( hindsight_api_urlhttp://localhost:8888, api_keyyour-api-key, budgetmid, tags[source:haystack], contextmy-app, missionTrack user preferences, )configure()之后只需要一个bank_id就能构建工具。configure()与配置回退机制源码级HindsightHaystackConfig见 config.py是一个 dataclass其字段同时定义了工具的默认行为。工具构造时遵循「显式参数 全局配置 内置默认值」的 None 哨兵回退逻辑见 tools.py 中_HindsightToolBackend.__init__主要字段如下字段默认值说明hindsight_api_urlhttps://api.hindsight.vectorize.ioHindsight API 服务器地址api_keyNoneAPI Key回退到HINDSIGHT_API_KEY环境变量budgetmidrecall/reflect 的预算级别取值low/mid/highmax_tokens4096recall 结果的最大 token 数tagsNoneretain 存储时附加的标签recall_tagsNonerecall 检索时用于过滤的标签recall_tags_matchany标签匹配模式any/all/any_strict/all_strictcontexthaystackretain 操作的来源标签missionNonebank 的使命描述用于事实抽取上下文verboseFalse是否启用详细日志对应的回退行为在 test_tools.py 的TestConfigFallback中有完整覆盖例如configure(budgethigh)后创建的 recall 工具会把budgethigh传给arecall而显式传入的budgetlow会覆盖全局配置。Step 3为 Agent 添加记忆工具创建 Hindsight 工具并传入 HaystackAgentfrom hindsight_haystack import create_hindsight_tools from haystack.components.agents import Agent from haystack.components.generators.chat import OpenAIChatGenerator from haystack.dataclasses import ChatMessage tools create_hindsight_tools( clientclient, bank_iduser-123, missionTrack user preferences, ) agent Agent( chat_generatorOpenAIChatGenerator(modelgpt-4o-mini), toolstools, 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)如果只需要 retain 和 recall可以去掉 reflect 工具# Only retain recall (no reflect) tools create_hindsight_tools( clientclient, bank_iduser-123, include_reflectFalse, )实际上create_hindsight_tools提供了三个独立开关include_retain/include_recall/include_reflect默认均为True你可以自由组合出任意工具子集test_tools.py 的TestCreateHindsightTools验证了只保留单个工具等全部组合。三个记忆工具的语义从 tools.py 的_TOOL_DEFS可以看到每个工具对外暴露的 JSON Schema 描述retain_memory(content)把重要事实、用户偏好、决策等信息存入长期记忆参数为必填的content字符串recall_memory(query)检索长期记忆中与query相关的信息返回编号列表无结果时返回No relevant memories found.reflect_on_memory(query)基于已存记忆综合出有条理的总结或推理式回答而不是返回原始记忆片段当配置了reflect_response_schema时返回符合该 JSON Schema 的结构化输出源码中通过json.dumps(response.structured_output)返回。深入记忆工具在底层是如何工作的create_hindsight_tools(...)的核心是一个名为_HindsightToolBackend的内部后端见 tools.py它封装了客户端解析、配置回退、bank 管理与 retain/recall/reflect 的具体逻辑。理解它的几个关键设计能帮你更好地排查问题1. 同步工具桥接异步客户端。Haystack 的Tool要求同步可调用对象而hindsight_client的aretain/arecall/areflect都是异步方法。_run_sync()助手把协程提交到一个常驻后台线程事件循环并阻塞等待结果——之所以不能每次用asyncio.run()是因为 aiohttp 会把 session 绑定在创建它的事件循环上新建循环会导致后续调用失败。测试见 test_tools.py 的TestRunSync同时覆盖了调用方无事件循环和已在事件循环内两种场景。2. bank 按需创建且幂等。传入mission时首次调用会通过acreate_bank(bank_id..., name..., mission...)创建/更新 bank若返回 already exists 或 409 冲突则视为已初始化不会重复创建瞬时错误则不标记初始化下次调用重试_ensure_bank()。TestBankMission与TestBankCreationRetry覆盖了幂等、重试与无 mission 时不建 bank 等分支。3. 工具可序列化且不泄漏密钥。_HindsightTool重写了to_dict()/from_dict()把bank_id、API URL 等后端配置序列化而不是绑定方法Haystack 无法序列化绑定方法。注意api_key故意不进入序列化结果——Haystack pipeline 会被导出为 YAML 用于检查、checkpoint 和共享序列化密钥会泄漏进每个 dump反序列化时resolve_client()从HINDSIGHT_API_KEY环境变量重新取回密钥。test_tools_round_trip_serialization_with_client明确断言了「URL 进入序列化字典、密钥绝不出现」。4. 工具调用永不抛异常。retain_memory/recall_memory/reflect_on_memory捕获一切异常并返回错误字符串如Failed to store memory: ...让 Agent 可以据此做出反应连接解析始终成功URL 默认指向 Cloud缺失 API Key 只在真正发起调用时才暴露。create_hindsight_tools的完整签名与全部参数的官方文档字符串就写在 tools.py 的create_hindsight_tools函数中是排查参数问题的第一手资料。自动记忆HindsightMemoryWrapper深入解析如果不想依赖模型主动调用工具使用HindsightMemoryWrapper——一个打包了同样三件套工具、并具备自动行为的Toolsetfrom hindsight_haystack import HindsightMemoryWrapper toolset HindsightMemoryWrapper( clientclient, bank_iduser-123, missionTrack user preferences, auto_recallTrue, # Inject memories into the system prompt before each turn auto_retainTrue, # Store user assistant messages after each turn ) agent Agent( chat_generatorOpenAIChatGenerator(modelgpt-4o-mini), toolstoolset, system_promptYou are a helpful assistant with long-term memory., ) # Use toolset.run() for automatic memory behavior result toolset.run(agent, messages[ChatMessage.from_user(I prefer dark mode)])auto_recallTrue每回合开始前用最后一条用户消息作为查询去 recall 相关记忆注入系统提示词max_recall_results默认 10限制注入条数防止提示词无限膨胀模板由memory_prompt_template控制默认模板为Below are relevant memories from previous conversations:\n{memories}\nUse these memories to provide more personalized and contextual responses.必须包含{memories}占位符。auto_retainTrue每回合结束后把用户消息与助手最终回复存入 Hindsight并在 metadata 中写入role与source: haystack使召回的回合可区分来源。要获得自动行为必须调用toolset.run(agent, ...)而非agent.run(...)。run()的执行顺序为auto-recall 注入提示词 → 调用agent.run()携带增强后的 system prompt→ auto-retain 存储消息。同时提供run_async()异步版本内部走同一套持久事件循环桥接行为与同步版一致。相关行为在 test_tools.py 的TestToolsetAutoRecall与TestToolsetAutoRetain中有逐条验证auto-recall 会保留原 system prompt 并追加记忆块、无用户消息时跳过 recall、无记忆时原样透传基础提示词、max_recall_results确实截断结果auto-retain 会分别存储 user 与 assistant 两条消息。若只想要纯工具模式把toolset直接传给Agent(toolstoolset, ...)即可——此时自动行为不生效但模型仍可调用三个记忆工具。验证记忆确实在生效官方推荐一套可靠的验证流程运行 Agent让它记住某件事例如 Remember that I prefer dark mode让该事实真正被存储——无论是通过retain_memory工具调用还是auto_retain开启全新回合或新的一次 run询问之前的事实确认 Agent 能召回。例如回合一存储「用户偏好深色模式」回合二询问「用户的界面偏好是什么」如果 Agent 说出了之前的偏好说明整套链路已经打通。仓库中的端到端测试 test_e2e.py 演示了同样的验证思路它针对真实 Hindsight 服务器执行 retain → 轮询 recall_recall_until_nonempty最多轮询 12 次因为 retain 需要经过事实抽取与索引才可被召回→ 断言召回内容并标记为requires_real_llm依赖后端 LLM 的事实抽取默认跳过设置HINDSIGHT_API_URL指向可达服务器后即可运行。这正是你自建验证脚本的可靠参考模板。常见错误期待agent.run()有自动行为auto-recall 与 auto-retain 只通过HindsightMemoryWrapper.run()触发。如果拿 wrapper 直接调agent.run(...)你只会得到工具而不会得到自动 recall/retain——请使用toolset.run(agent, ...)。所有用户共用一个 bank记忆按bank_id隔离。如果所有用户共享一个 bank他们的记忆会混在一起。请为每个用户或每个 Agent 使用独立的bank_id保持存储隔离。假设模型一定会调用工具仅使用create_hindsight_tools(...)时记忆是模型驱动的。如果系统提示词没有指示模型存储和检索记忆它可能跳过这些调用。请在提示词中明确引导或改用HindsightMemoryWrapper获得自动行为。忘记指向正确的后端API URL 默认指向 Hindsight Cloudhttps://api.hindsight.vectorize.io。使用自托管服务器时必须在客户端传base_url或向configure()传hindsight_api_url否则所有调用都会打到 Cloud。FAQ我必须使用 Hindsight Cloud 吗不需要。自托管的 Hindsight 服务器同样可用——把它的base_url传给Hindsight客户端或向configure()传hindsight_api_url即可。工具和 wrapper 有什么区别create_hindsight_tools(...)给模型一组可以自行调用的记忆工具HindsightMemoryWrapper打包同样的工具并增加了可选的 auto-recall 与 auto-retain让记忆在模型无需调用工具的情况下自动发生。记忆如何隔离通过bank_id。每个 bank 都是独立的记忆存储因此请为每个用户或 Agent 使用独立的 bank。可以只用 retain 和 recall 吗可以。向create_hindsight_tools(...)传include_reflectFalse就只会得到retain_memory和recall_memory。总结与下一步至此你已经掌握了hindsight-haystack的两条接入路径模型驱动的create_hindsight_tools(...)与自动化的HindsightMemoryWrapper以及 bank 隔离、参数回退、序列化安全等底层机制。这套集成的核心价值在于Agent 不再是「每次冷启动」而是能在跨回合、跨会话的尺度上记住用户、积累事实。继续深入可以参考仓库内的以下资源集成包完整使用说明与快速开始示例hindsight-integrations/haystack/README.md工具与 wrapper 的完整实现含全部参数文档字符串hindsight-integrations/haystack/hindsight_haystack/tools.py全局配置与默认值hindsight-integrations/haystack/hindsight_haystack/config.py客户端解析与密钥回退逻辑hindsight-integrations/haystack/hindsight_haystack/_client.py单元测试覆盖工具行为、配置回退、序列化、自动 recall/retainhindsight-integrations/haystack/tests/test_tools.py针对真实后端的端到端验证hindsight-integrations/haystack/tests/test_e2e.py如果你要更深入地理解 recall / retain API 的语义Hindsight 官方文档站与 quickstart 指南是下一步的入口。【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表