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

资讯详情

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

用 Hindsight 为 SmolAgents 赋予跨运行持久记忆:retain / recall / reflect 实战指南

用 Hindsight 为 SmolAgents 赋予跨运行持久记忆:retain / recall / reflect 实战指南 用 Hindsight 为 SmolAgents 赋予跨运行持久记忆retain / recall / reflect 实战指南【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight导读SmolAgents 的每一次agent.run(...)都是独立生命周期推理、执行、返回之后运行内学到的一切随之蒸发。本文基于 Hindsight 仓库中的 SmolAgents 集成讲解如何用稳定的 bank ID 原生 Tool 子类 系统提示词预注入构建一个跨运行累积事实、记住有效方案、规避已知失败路径的代码执行 Agent。读完你将掌握hindsight_retain/hindsight_recall/hindsight_reflect三个记忆工具的完整用法、memory_instructions()的热启动注入模式以及一套可复现的跨运行记忆验证方法。快速答案五步打通跨运行记忆pip install hindsight-smolagents并连接 HindsightCloud 或本地自托管服务。为同一个 Agent / 用户 / 项目在每一次运行中都使用同一个稳定的 bank ID。用create_hindsight_tools(bank_id...)给 Agent 挂上 retain / recall 工具让它在运行中可以存储与检索记忆。每次新运行开始时用memory_instructions()把历史运行发现的记忆预注入到系统提示词中。验证让后一次运行能回答出前一次运行存储的事实。这套方案对应的集成包位于仓库的 hindsight-integrations/smolagents核心实现集中在 hindsight_smolagents/tools.py。为什么每次运行都从零开始很昂贵SmolAgents 的 Agent在单次运行内部是有记忆的——推理步骤、工具观察结果、中间代码状态都存在于 agent loop 之中。但这些状态的作用域仅限于这一次运行下一次agent.run(...)启动时一切归零。对代码执行型 Agent 来说这种冷启动代价尤为明显第一次运行可能发现某个库需要特定版本 pin可能发现某个 API 返回分页结果可能试出某个方案会抛异常、换一个方案才能跑通。到第二次运行时这些知识全部不存在。Agent 重新探索、重新踩坑、重新推导同一批事实——把 token 和墙钟时间烧在它早已掌握的知识上。跨运行记忆打破了这个循环运行边界不再抹除 Agent 学到的东西而由一个持久化存储把有用的残余事实、可行方案、值得避开的死胡同带到下一次运行。从实现层面看HindsightRetainTool在forward()中调用 Hindsight 客户端的retain()HindsightRecallTool调用recall()二者通过同一个bank_id落盘到同一个记忆库见 tools.py 中的三个 Tool 子类。一次运行中什么才值得 retain并非运行中的一切内容都值得保留。完整 transcript 噪声太大价值在于可长期复用的教训。适合交给hindsight_retain的候选任务相关事实Agent 需要自行发现的 schema 形态、必需的版本 pin、接口的怪癖、凭据存放位置永远不要存密钥本身。验证可行的方案例如用pandas.read_csv(..., sep;)解析这个 CSV 成功了而默认分隔符失败了。验证失败的方案例如不传分页参数调用该端点结果会被截断为 100 行——这样下次运行就不会重蹈覆辙。运行期间达成的决策与约定Agent 或用户拍板定下的规范。最佳做法是让 Agent 在抵达这些时刻时主动调用hindsight_retain或者在运行结束时由你自己 retain 一段浓缩总结。要点是存储教训本身而不是逐步骤的原始 trace。Hindsight 在写入时会做事实抽取与合并ingest 阶段自动 consolidation因此短小、具体、陈述明确的句子检索效果最好——这也正是 HindsightRetainTool 的输入设计单个content字符串参数所鼓励的用法。新运行开始时的记忆注入两条互补路径一次新运行应当开局即已知历史运行学到的东西。有两种方式把上下文带进来二者互为补充路径一用memory_instructions()前置加载在运行开始前预先召回最相关的记忆注入到 system prompt。Agent 从第一步起就把历史教训放在上下文中据此规划行动from hindsight_smolagents import create_hindsight_tools, memory_instructions from smolagents import CodeAgent, HfApiModel BANK code-agent-project-x memories memory_instructions( bank_idBANK, queryprior approaches, failures, and task facts for this project, ) agent CodeAgent( toolscreate_hindsight_tools(bank_idBANK), modelHfApiModel(), system_promptfYou are a coding agent.\n\n{memories}, )从源码看memory_instructions()是一个构造期同步召回函数它调用resolved_client.recall(...)把返回结果格式化为编号列表字符串前缀默认为Relevant memories:\n再交给你拼进system_prompt。注意两个细节见 tools.py 的 memory_instructions 实现默认budgetlow、max_results5保证注入内容量小且受控若召回失败或没有结果函数静默返回空字符串不会因为记忆层故障阻塞 Agent 启动。路径二用hindsight_recall按需检索因为召回本身也是一个工具Agent 可以在运行中途遇到前置上下文没覆盖的问题时随时搜索完整记忆库。这让开局的上下文保持精简同时仍给 Agent 访问全部存储的通道。在每一次运行中使用同一个bank_id是这一切成立的前提——bank 就是串联各次运行的线。memory_instructions与工具必须指向同一个 bank否则注入与检索会各说各话这也是原文档与集成 README 反复强调的要点。连接 SmolAgents 与 Hindsight一次配置处处复用安装pip install hindsight-smolagents集成包要求 Python 3.10依赖smolagents与hindsight-client0.4.0见 pyproject.toml。连接Cloud 或自托管指向 Hindsight Cloud 或本地服务器均可。推荐的全局配置方式from hindsight_smolagents import configure configure( hindsight_api_urlhttps://api.hindsight.vectorize.io, # 默认即 Cloud api_keyhsk_..., # 或设置 HINDSIGHT_API_KEY 环境变量 budgetmid, # 召回预算low / mid / high max_tokens4096, # 召回结果的最大 token 数 )自托管时把hindsight_api_url换成你的本地 API 地址如http://localhost:8888并省略api_key即可。也可以跳过全局配置直接在create_hindsight_tools()里传hindsight_api_url与api_key。从 config.py 的实现可以看到configure()把连接信息与默认参数写入全局HindsightSmolAgentsConfig此后创建工具时无需重复传参api_key会优先取显式参数其次回退到HINDSIGHT_API_KEY环境变量test_config.py中通过patch.dict(os.environ, ...)验证了这一回退逻辑。_resolve_client()则按显式 client 显式 url/key 全局配置的优先级解析客户端并在没有任何 URL 可解析时抛出HindsightError见 tools.py 的 _resolve_client。即插即用的记忆工具三个原生 Tool 子类集成包提供三个继承 SmolAgentsTool基类的原生工具子类Agent 使用记忆的方式与使用其他任何工具完全一致。用工厂函数一键创建from hindsight_smolagents import create_hindsight_tools tools create_hindsight_tools(bank_idcode-agent-project-x)这样 Agent 将获得工具作用输入hindsight_retain把事实、教训或决策写入长期记忆content要存储的信息hindsight_recall在长期记忆中搜索相关历史事实query检索查询hindsight_reflect基于存储的记忆综合出有推理的回答query要反思的问题三个工具的name、description、inputs均在类属性中声明见 tools.py 中三个 Tool 类的定义因此 SmolAgents 能自动把它们暴露给模型。test_tools.py中的TestToolConstruction与TestCreateHindsightTools用例覆盖了工具属性、开关组合、客户端共享等行为。你可以只保留需要的工具。对跨运行累积循环而言retain 与 recall 是必需品当你想要综合后的答案而非原始事实列表时才需要 reflecttools create_hindsight_tools( bank_idcode-agent-project-x, enable_retainTrue, enable_recallTrue, enable_reflectFalse, )如果倾向于单独实例化HindsightRetainTool与HindsightRecallTool接受同样的bank_id参数也可传入hindsight_api_url/api_key/client。工厂函数与独立类支持的完整参数如下与 集成 README 的配置参考一致create_hindsight_tools()参数参数默认值说明bank_id必填Hindsight 记忆库 IDclientNone预配置的 Hindsight 客户端优先hindsight_api_urlNoneAPI 地址未提供 client 时使用api_keyNoneAPI 密钥budgetmid召回/反思预算等级low/mid/highmax_tokens4096召回结果最大 token 数tagsNoneretain 写入时附加的标签recall_tagsNone检索时用于过滤的标签recall_tags_matchany标签匹配模式any/all/any_strict/all_strictenable_retainTrue是否包含 retain 工具enable_recallTrue是否包含 recall 工具enable_reflectTrue是否包含 reflect 工具memory_instructions()参数参数默认值说明bank_id必填召回的 Hindsight 记忆库 IDqueryrelevant context about the user注入用召回查询budgetlow召回预算等级max_results5最多注入的记忆条数max_tokens4096召回结果最大 token 数prefixRelevant memories:\n记忆列表前的引导文本tags/tags_matchNone/any召回结果过滤标签及匹配模式三个工具的低层行为细节retain 会自动建库HindsightRetainTool首次写入前会调用client.create_bank(bank_id..., namebank_id)且同一会话内只建一次_created_banks集合去重即使 bank 已存在也不报错见 tools.py#L84-L92。recall 返回编号列表无结果时返回No relevant memories found.有结果时按1. {text}\n2. {text}...格式返回见 tools.py#L157-L179。错误统一包装底层网络等异常会被包装为HindsightError并记录日志HindsightError本身则原样透传便于上层捕获处理test_tools.py的失败路径用例覆盖了这两类行为。验证记忆确实跨运行持久化验证方法很简单证明第二次运行知道只有第一次运行才可能学到的东西。在第一次运行中让 Agent 解决一个任务并调用hindsight_retain存储一条具体教训——例如导出端点按 100 行分页所以必须传page参数。让这次运行完整结束retain 的数据已落盘到该 bank。用同一个bank_id启动第二次运行要么用memory_instructions()前置注入要么问一个应当触发hindsight_recall的问题。询问 Agent 关于分页行为的问题或观察它是否直接围绕该行为规划、而无需重新探索。如果第二次运行使用了第一次运行存储的事实跨运行记忆即已生效。如果它依然冷启动请检查两点两次运行是否用了同一个 bank ID、第一次运行的 retain 调用是否真的完成。常见错误每次运行用不同的 bank IDbank 是把各次运行串起来的纽带。如果每次运行都生成一个新的 bank ID什么都不会持久化。为 Agent、用户或项目固定一个稳定的 ID——这是本方案最重要的一个约定。retain 原始 transcript把完整的逐步 trace 存进去会让教训淹没在噪声里。只保留短小、具体的事实与决策这样的内容在后续 recall 时才能被精准浮现。只挂工具、从不注入上下文给 Agent 挂上hindsight_recall只代表它可以按需检索但它不会自动在每次运行开始时带上历史上下文——除非你同时用memory_instructions()注入。两者配合使用才能获得可靠的热启动。retain 未完成就测试 recall如果在第一次运行的 retain 落盘之前就检查第二次运行记忆可能还没存进去。先让第一次运行完整结束再断言第二次运行记得住。常见问题必须使用 Hindsight Cloud 吗不是。自托管的 Hindsight 服务器同样可用——把工具的hindsight_api_url指向本地 API 地址即可。全局configure()或逐工具传参都支持自托管场景。Agent 如何决定何时 retainhindsight_retain与普通工具无异你可以通过提示词让 Agent 在自然时机存储教训也可以在运行结束时自己 retain 一段浓缩总结。核心原则始终是——存教训不存原始 trace。这会拖慢每一次运行吗memory_instructions()前置注入只在运行前增加一次召回且注入内容受max_results与max_tokens约束默认最多 5 条、4096 token。按需的hindsight_recall只在 Agent 选择调用时才执行。测试test_tools.py::TestMemoryInstructions也验证了max_results对注入条数的截断行为。只能用于 CodeAgent 吗不是。工具遵循 SmolAgents 的 Tool 模型任何接受工具的 Agent 都能套用同一套跨运行记忆模式集成 README 与__init__.py的导出 API 均未绑定 CodeAgent。下一步完整安装与连接步骤可参考同仓库的姊妹篇 Guide: Add SmolAgents Persistent Memory with Hindsight涵盖configure()与自托管细节阅读集成包完整说明与参数表hindsight-integrations/smolagents/README.md深入阅读工具与配置源码hindsight_smolagents/tools.py、hindsight_smolagents/config.py参考单元测试了解各工具行为的边界条件tests/test_tools.py、tests/test_config.py了解 Hindsight 记忆库、召回与 retain 的低层 API可进一步阅读 hindsight-api 下对应模块的实现与测试。要点回顾跨运行记忆的全部奥秘浓缩为三句话——用create_hindsight_tools(bank_id...)给 Agent 原生记忆工具用固定的bank_id串联所有运行用memory_instructions()让每次新运行开局即携带历史教训。三者齐备代码执行 Agent 便从每次都重新踩坑进化为踩着前次的脚印稳步前进。【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表