ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Hindsight OpenClaw 插件实战:用 recallInjectionPosition 控制记忆召回注入位置

Hindsight OpenClaw 插件实战:用 recallInjectionPosition 控制记忆召回注入位置 Hindsight OpenClaw 插件实战用 recallInjectionPosition 控制记忆召回注入位置【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight在 OpenClaw 中接入 Hindsight 记忆后召回的记忆会被自动注入到模型的输入上下文里而注入到哪个位置直接决定了模型对记忆赋予多少权重、系统提示词缓存能否命中、以及最终行为是否容易推理。本篇指南围绕vectorize-io/hindsight-openclaw插件的recallInjectionPosition配置展开讲清prepend/append/user三种注入模式各自的行为差异与适用场景给出可复制的配置脚本并结合仓库源码插件入口、类型定义说明记忆块究竟是怎么拼装、落在哪个字段上的。读完后你能独立完成注入位置的选型、切换与验证。快速结论默认值是user记忆注入在用户消息之前且不会破坏系统提示词前缀缓存如果记忆需要系统级语境同时又要保住大段静态系统提示词的可缓存前缀用append只有当记忆必须出现在系统提示词之前、且可以接受缓存失效代价时才用prepend修改配置后必须重启 OpenClaw gateway用一条真实的重记忆提示词做回归测试并观察日志而不是只看配置文件。前置条件动手改注入位置之前先确认环境满足以下条件OpenClaw 已在运行并安装了vectorize-io/hindsight-openclaw插件自动召回已开启autoRecall默认即为开启见 types.ts 中 Auto-recall memories on every prompt (default: true) 的注释记忆库bank里已经有可用的记忆否则无内容可注入你已经判断出当前要解决的核心问题是提示词布局、延迟还是模型行为这三者对应不同的调优手段。可以用下面的脚本检查当前召回相关配置配置路径为~/.openclaw/openclaw.json插件条目位于plugins.entries[hindsight-openclaw].configpython3 - PY import json, pathlib path pathlib.Path.home() / .openclaw / openclaw.json config json.loads(path.read_text()) plugin config[plugins][entries][hindsight-openclaw][config] print(autoRecall:, plugin.get(autoRecall, True)) print(recallInjectionPosition:, plugin.get(recallInjectionPosition, user)) print(recallBudget:, plugin.get(recallBudget, mid)) print(recallMaxTokens:, plugin.get(recallMaxTokens, 1024)) print(recallContextTurns:, plugin.get(recallContextTurns, 1)) PY如果autoRecall是关的改注入位置不会产生任何效果——这是最常见的混淆来源。改配置前建议同时参考 OpenClaw 集成文档 与插件仓库自带的 README判断记忆没出现到底是检索问题还是放置位置问题。三种注入位置的含义recallInjectionPosition接受三个取值在插件配置归一化阶段会被严格校验只有prepend、append、user会被接受任何其他字符串都会回落到默认值user见 index.ts 配置归一化逻辑recallInjectionPosition: typeof config.recallInjectionPosition string [prepend, append, user].includes(config.recallInjectionPosition) ? (config.recallInjectionPosition as PluginConfig[recallInjectionPosition]) : user,取值行为适用场景prepend记忆注入到系统提示词之前需要最强记忆框架memory-first framing且不关心提示词缓存append记忆注入到系统提示词之后大段静态系统提示词、需要保持前缀缓存友好user记忆注入到用户消息之前默认默认行为保持系统提示词缓存把记忆当作用户侧上下文一个简单的心智模型prepend先给记忆再给系统规则append系统规则保持稳定记忆附在后面user把召回的记忆当成额外的对话输入而不是系统级指令。需要强调的是这个配置改变的不是召回哪些记忆而是这些记忆落在模型输入中的位置。源码视角位置是怎么映射到 hook 字段的OpenClaw 插件框架的 prompt hook 可以返回一个PluginPromptHookResult对象它有三个字段见 types.tsexport interface PluginPromptHookResult { prependContext?: string; // 用户消息之前 prependSystemContext?: string; // 系统提示词之前 appendSystemContext?: string; // 系统提示词之后 }插件在before_prompt_build钩子里完成召回后按位置把拼装好的记忆块塞进对应字段见 index.ts// Keep recalled memories outside the system prompt by default so the // provider can reuse its stable prompt prefix across turns. Users who // need system-level memory context can still opt into prepend or append. const position pluginConfig.recallInjectionPosition ?? user; switch (position) { case append: return { appendSystemContext: contextMessage }; case user: return { prependContext: contextMessage }; case prepend: default: return { prependSystemContext: contextMessage }; }这段注释直接解释了默认选user的动机把记忆放在系统提示词之外让提供商可以跨轮次复用稳定的提示词前缀缓存。集成测试 hooks.integration.test.ts 也逐条断言了各模式下只有对应字段被填充、其余字段为undefined。注入的记忆块长什么样无论哪个位置注入的都不是裸文本而是一个结构化的hindsight_memories块见 index.tshindsight_memories {recallPromptPreamble 或内置引导语} Current time - {YYYY-MM-DD HH:MM UTC} {formatMemories(results) 生成的要点列表} /hindsight_memories其中内置 preamble 为 Relevant memories from past conversations (prioritize recent when conflicting). Only use memories that are directly useful to continue this conversation; ignore the rest:见 DEFAULT_RECALL_PROMPT_PREAMBLE可用recallPromptPreamble覆盖时间戳显式带UTC后缀避免模型把时间误读为本地时间而做出错误的新旧判断每条记忆由formatMemories渲染为要点列表包含正文、类型、日期、发生时间窗口以及[doc:document_id]等仅在字段存在时显示。此外源码里还有两个与注入相关的行为值得知道在途请求去重同一 bank 下对归一化后的查询做 SHA-256 截断哈希命中缓存则复用同一个 in-flight recall 请求index.ts避免同一轮内重复召回超时静默降级自动召回超时recallTimeoutMs默认 10000ms或取消时插件只打 warn 日志并跳过本轮注入不会让对话流程失败index.ts。选择 prepend最强的记忆框架prepend把每轮都在变化的召回内容放到系统提示词开头。这给了记忆最强的语境权重但代价是由于前缀内容每轮都变基于前缀的提示词缓存在大多数轮次都会失效。显式设置方式python3 - PY import json, pathlib path pathlib.Path.home() / .openclaw / openclaw.json config json.loads(path.read_text()) plugin config[plugins][entries][hindsight-openclaw][config] plugin[recallInjectionPosition] prepend path.write_text(json.dumps(config, indent2) \n) print(fUpdated {path}) PY适合prepend的情形记忆必须出现在所有其他系统上下文之前你没有在大段静态系统提示词上做提示词缓存优化。拿不准时保留默认的user即可。切换到 append系统提示词稳定性优先append最典型的用例是你有一份大且基本静态的系统提示词希望它在轮次之间保持不变以维持缓存命中。把召回记忆放到它之后静态部分就继续保持缓存友好。python3 - PY import json, pathlib path pathlib.Path.home() / .openclaw / openclaw.json config json.loads(path.read_text()) plugin config[plugins][entries][hindsight-openclaw][config] plugin[recallInjectionPosition] append path.write_text(json.dumps(config, indent2) \n) print(fUpdated {path}) PY适合append的情形系统提示词大且大部分内容静态你希望该静态部分跨轮次保持稳定你希望记忆影响回答但不希望它是模型上下文里最先出现的内容。这对指令长、成本高、刻意保持稳定的生产级提示词设计尤其有吸引力。保持 user缓存友好的默认user模式把召回记忆完全放在系统提示词之外既保住稳定的系统提示词缓存又把记忆当作上下文输入而非系统级指令。python3 - PY import json, pathlib path pathlib.Path.home() / .openclaw / openclaw.json config json.loads(path.read_text()) plugin config[plugins][entries][hindsight-openclaw][config] plugin[recallInjectionPosition] user path.write_text(json.dumps(config, indent2) \n) print(fUpdated {path}) PY适合user的情形希望保住系统提示词缓存希望系统指令对召回内容保持优先级对贴近用户消息的上下文这种定位你的记忆数据形态是合适的。对于任何没有显式设置recallInjectionPosition的新旧配置这都是默认行为源码在归一化阶段兜底为user。调优与注入位置联动的其他设置改注入位置只解决了一半问题下面这些设置决定注入多少、内容如何组成配置默认值作用autoRecalltrue是否每轮自动召回关闭后注入位置设置完全无效recallBudgetmid召回力度分档low/mid/highrecallMaxTokens1024召回响应的最大 token 数recallTopK不限制注入的最大记忆条数召回后截断见 index.tsrecallContextTurns1组成召回查询时纳入的最近用户轮数recallPromptPreamble内置引导语放在记忆块顶部的提示语可覆盖默认文案recallTypes[observation]参与召回的记忆类型默认只召回整合去重后的 observation 视图recallTimeoutMs10000自动召回超时毫秒超时则跳过注入并打 warn 日志以上默认值均来自 types.ts 的字段注释 与 index.ts 的配置归一化。一个更重但仍受控的完整调优示例python3 - PY import json, pathlib path pathlib.Path.home() / .openclaw / openclaw.json config json.loads(path.read_text()) plugin config[plugins][entries][hindsight-openclaw][config] plugin[autoRecall] True plugin[recallInjectionPosition] append plugin[recallBudget] mid plugin[recallMaxTokens] 1024 plugin[recallContextTurns] 2 path.write_text(json.dumps(config, indent2) \n) print(fUpdated {path}) PY如果召回感觉弱问题往往出在召回量或相关性上而不是注入位置——先核对recallBudget/recallMaxTokens/recallContextTurns再考虑位置。重启 OpenClaw 并做真实验证修改完成后重启 gatewayopenclaw gateway restart然后跑真实测试而不是合成的一行命令。用一段被记住的上下文显然应该起作用的对话。推荐模式给 agent 一条持久事实例如We deploy staging fromdevelopand production frommain.等该轮结束让 retain保留/提取流程有机会执行在下一轮提相关问题例如Which branch should I use for staging?对比调整注入位置前后的回答质量。需要更多信号时打开日志行为不明确时用主 OpenClaw 集成指南里同样的 Hindsight 日志观察方式tail -f /tmp/openclaw/openclaw-*.log | grep Hindsight确认三类证据召回确实触发了info 级日志会输出injecting N memories into context (bank: ...)见 index.ts记忆确实被注入了重启后系统整体健康。需要更细的 debug 级日志时打开插件 debug 开关python3 - PY import json, pathlib path pathlib.Path.home() / .openclaw / openclaw.json config json.loads(path.read_text()) plugin config[plugins][entries][hindsight-openclaw][config] plugin[debug] True path.write_text(json.dumps(config, indent2) \n) print(fUpdated {path}) PY开启后能看到召回的完整查询文本、原始召回结果含每条的 score 与截断预览、topK 截断后的注入条数等细节。若还关心延迟分布可额外开启debugPerfTiming它会在 info 级输出每次 hook 的 recall RPC 耗时与总耗时。验证是否生效检查配置改完后把关键项打印一遍python3 - PY import json, pathlib path pathlib.Path.home() / .openclaw / openclaw.json config json.loads(path.read_text()) plugin config[plugins][entries][hindsight-openclaw][config] for key in [autoRecall, recallInjectionPosition, recallBudget, recallMaxTokens, recallContextTurns]: print(f{key}:, plugin.get(key)) PY检查真实提示词下的响应行为最好的验证是一个真实回答且记忆位置应当影响结果助手是否自然地用上了召回上下文是否仍然遵守系统规则与之前相比感觉更好还是更差检查解决的是不是对的问题如果你的目标是提示词缓存append可能更合适如果目标是更强的记忆影响力prepend可能更好如果目标是贴近用户的上下文user值得保留。正确答案取决于你要修的是什么。常见问题排查改了设置但没有任何变化最可能的原因autoRecall被关掉了库里没有可注入的有用记忆gateway 没有重启配置未生效。append 没有改善行为完全可能。append解决的是位置与提示词稳定性问题不是检索质量问题。如果召回内容本身质量差注入位置救不了它。user 模式感觉别扭或语气太强这是正常现象你告诉了插件把记忆放在离用户轮次更近的位置。想要更克制的表现时切回prepend或append。记忆显得过于强势试append、调低recallMaxTokens或减小recallContextTurns。很多时候问题在召回量不在位置。记忆显得太弱试prepend、提高recallBudget、增大recallMaxTokens。另外值得回头看 retain 侧——如果正确的事实当初就没有被干净地存进库再调位置也没有意义。FAQ大多数人该用哪个注入位置从user开始。它是缓存友好的默认值且让召回内容位于系统指令之下。什么时候切到append当你有一份大而稳定的系统提示词希望召回记忆追加在它之后以维持更好的提示词形状稳定性时。什么时候用user当召回记忆应当表现为用户侧上下文且保住系统提示词缓存对你重要时。这个设置会改变 Hindsight 的召回内容吗不会。它只改变召回记忆的注入位置不改变检索算法本身。除了recallInjectionPosition还有什么重要通常是autoRecall、recallBudget、recallMaxTokens、recallContextTurns。想深入时OpenClaw 集成文档 中的插件配置参考其中对recallInjectionPosition的说明见 openclaw.md以及 集成插件 README 是最贴近源码的参考资料。小结recallInjectionPosition是 Hindsight OpenClaw 插件里少数几个配置很小、影响面很大的选项它不碰检索只决定召回记忆在提示词中的落点——系统提示词之前prepend、之后append还是用户消息之前user默认。选型时抓住两条主线系统提示词是否值得缓存是则避开prepend、记忆需要多强的框架强则考虑prepend。改完后用真实对话回归、用日志确认注入链路再决定是否需要继续调recallBudget、recallMaxTokens、recallContextTurns等量级参数。【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表