Hindsight × OpenClaw:为编码 Agent 构建跨会话代码库记忆的完整实战指南
【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight
导读
本文基于 Hindsight 官方博客与仓库内 OpenClaw 集成源码,完整讲解如何为 OpenClaw 接入 Hindsight 记忆插件,让编码 Agent 跨会话记住你的技术栈、编码约定、历史架构决策与反复出现的疑难 Bug。读完本文,你将掌握两分钟完成安装配置、三种部署模式的选择、recall/retain 核心配置项的含义,以及团队共享记忆库、历史会话回填与结构化心智模型(Mental Model)预置等进阶用法。
OpenClaw 到底记住了代码库的什么
每一个 AI 编码会话都从零开始:打开 OpenClaw,粘贴上下文——技术栈、约定、上周做的架构决策、三月花了整整两天排查的 Bug——然后下一个会话再重复一遍。问题的根源不是 OpenClaw 不擅长编码,而是它对你的代码库没有任何记忆。
接入 Hindsight 后情况完全不同:每个会话都会不断累积对项目的认知。到第 20 个会话时,OpenClaw 已经知道你的模块边界、命名约定、已知脆弱区域,以及那个反复出现的认证问题的根因。你不再需要反复解释,它开始"知道"。
记忆的是事实,而不是转录稿
OpenClaw 本身不会存储对话转录稿。Hindsight 提取并保留的是事实(facts)——从对话中抽出的原子化、可检索的知识片段。一次典型的编码会话结束后,类似这样的事实会自动进入记忆:
"Project uses ESM modules, not CommonJS — always use .js extensions in imports""The auth middleware fails silently on expired refresh tokens, known issue as of March 14""SQLAlchemy was removed in favor of raw asyncpg after performance testing in February""Team convention: all async handlers wrapped in handle_errors() decorator"
以上这些都不需要你显式告诉 OpenClaw 去记住。Hindsight 的写入管线会从会话的自然流程中提取它们——从你提出的问题、你描述的错误、你顺带解释的决策中。
而不会成为记忆的包括:原始文件内容、逐行代码、冗长的终端输出。提取步骤本身就是一个过滤器。对话填充词、重复的上下文铺垫、过程性噪声——都不会幸存下来。最终留下的是一个不断增长的代码库事实索引,OpenClaw 会在未来的每个会话中携带它。
每个回合两端的记忆生命周期
记忆的运转横跨每一轮对话的两端:
- 每回合之前(recall):Hindsight 从历史中预取最相关的记忆,注入到系统提示中。OpenClaw 在看到你的消息之前,就已经看到这些上下文。
- 每回合之后(retain):对话被异步留存。Hindsight 在后台提取事实。这一轮讨论的内容,从下一轮开始即可被检索。
从插件源码看,这两条路径分别挂在 OpenClaw 的before_prompt_build(recall 路径)和agent_end(retain 路径)钩子上,核心实现位于 hindsight-integrations/openclaw/src/index.ts。recall 的默认超时是 10 秒(DEFAULT_RECALL_TIMEOUT_MS = 10_000),retain 还内置了一个 JSONL 重试队列(默认路径~/.openclaw/data/hindsight-retain-queue.jsonl),每 60 秒尝试冲刷一次,避免临时网络故障导致记忆丢失。
两分钟完成安装
安装插件并运行配置向导:
openclaw plugins install @vectorize-io/hindsight-openclaw npx --package @vectorize-io/hindsight-openclaw hindsight-openclaw-setup三种安装模式
向导会引导你选择三种安装模式之一:
- Cloud(云托管)——使用托管的 Hindsight 服务。粘贴你的云 API Token 即可完成。
- External API(外部 API)——连接你自己部署的 Hindsight 实例。需要提供 URL 和可选的 Token。
- Embedded daemon(嵌入式守护进程)——在本机运行 Hindsight。会提示你选择 LLM 提供方(OpenAI、Anthropic、Gemini、Groq、Ollama、Claude Code、Codex)及其 API Key。
这三种模式在插件源码 hindsight-integrations/openclaw/src/setup-lib.ts 中对应applyCloudMode/applyApiMode/applyEmbeddedMode三个函数:云模式和外部 API 模式会写入hindsightApiUrl(云模式默认指向托管端点)与hindsightApiToken,并清除残留的本地 LLM 配置;嵌入式模式则写入llmProvider/llmApiKey/llmModel,并清除外部 API 相关字段,三种模式互不串扰。
验证记忆已生效
openclaw gateway # 查看日志: tail -f /tmp/openclaw/openclaw-*.log | grep Hindsight # 应当看到: # [Hindsight] ✓ Using provider: openai, model: gpt-4o-mini核心配置项
配置位于~/.openclaw/openclaw.json的plugins.entries.hindsight-openclaw.config下。对大多数编码工作流,默认值即可直接使用:
| Key | 默认值 | 说明 |
|---|---|---|
autoRecall | true | 每回合前自动注入记忆 |
autoRetain | true | 每回合后自动捕获对话 |
recallBudget | mid | 检索力度:low/mid/high |
recallMaxTokens | 1024 | 每回合注入多少记忆上下文(token) |
autoRecall与autoRetain默认均为true,意味着无需改动 Agent 侧任何东西,记忆开箱即用。OpenClaw 不需要"知道"记忆系统的存在——它只是多了一份上下文。记忆在每回合前被注入系统提示,对话在每回合后于后台被留存。
手工配置(不使用向导)
向导只是便利封装——所有字段都可以直接用openclaw config set设置:
# 嵌入式守护进程 + OpenAI openclaw config set plugins.entries.hindsight-openclaw.config.llmProvider openai openclaw config set plugins.entries.hindsight-openclaw.config.llmApiKey \ --ref-source env --ref-provider default --ref-id OPENAI_API_KEY # 或者:Claude Code(无需 API Key) openclaw config set plugins.entries.hindsight-openclaw.config.llmProvider claude-code # 或者:指向外部 Hindsight API openclaw config set plugins.entries.hindsight-openclaw.config.hindsightApiUrl https://mcp.hindsight.example.com openclaw config set plugins.entries.hindsight-openclaw.config.hindsightApiToken \ --ref-source env --ref-id HINDSIGHT_API_TOKEN注意敏感凭据的存放方式:向导交互模式为简单起见将凭据内联明文存进openclaw.json(粘贴时会被打码);CI/生产环境应通过--ref-source env(或file/exec)以 SecretRef 方式引用,避免密钥落盘。插件清单文件 hindsight-integrations/openclaw/openclaw.plugin.json 明确声明了llmApiKey与hindsightApiToken两个敏感输入路径。
从 0.5.x 迁移(0.6.0 起)
0.6.0 版本移除了插件对进程环境变量的所有直接读取。原先来自 shell 环境变量(OPENAI_API_KEY、HINDSIGHT_API_LLM_PROVIDER等)的配置,现在必须通过openclaw config set配置,且凭据使用 SecretRef。迁移后请运行openclaw config validate确认配置形状可正常解析。
关键映射(完整映射表见 hindsight-integrations/openclaw/README.md):
| 旧(0.5.x) | 新(0.6.0) |
|---|---|
OPENAI_API_KEY=…(自动探测) | openclaw config set plugins.entries.hindsight-openclaw.config.llmProvider openai且llmApiKey以--ref-source env --ref-id OPENAI_API_KEY引用 |
HINDSIGHT_API_LLM_PROVIDER=… | openclaw config set plugins.entries.hindsight-openclaw.config.llmProvider … |
HINDSIGHT_API_LLM_MODEL=… | openclaw config set plugins.entries.hindsight-openclaw.config.llmModel … |
HINDSIGHT_EMBED_API_URL=… | openclaw config set plugins.entries.hindsight-openclaw.config.hindsightApiUrl … |
HINDSIGHT_BANK_ID=… | openclaw config set plugins.entries.hindsight-openclaw.config.bankId … |
如果你的 shell 已经导出了OPENAI_API_KEY,上面的 SecretRef 配置在启动时会解析到同样的值——无需改动 shell 设置,只需显式把插件指向该变量。
部署形态如何选
- 如果跨机器工作或与团队共享记忆,用 Cloud。
- 如果想要完全本地、无外部依赖,嵌入式守护进程会在后台运行一个本地 PostgreSQL 实例。首次启动约需一分钟,之后启动很快。启动日志位于
~/.hindsight/profiles/openclaw.log。
代码库记忆最有价值的三个工作流
一、在既有工作上开启新会话
没有记忆时,恢复既有项目的会话意味着在实际工作开始前要先做一轮上下文铺垫:粘贴 README、解释技术栈、重新说明上次进行到哪、提醒 OpenClaw 本该早已知道的约定。在复杂项目上,这种开销每次会话要吃掉 10–15 分钟。
有了记忆,OpenClaw 会在每次会话开始时,把来自之前会话的累积事实直接注入上下文。它知道技术栈、知道约定、知道上周你在调试什么。会话的第一条消息就直接进入实际工作。
注入什么由recallBudget控制。在mid(默认值)下,Hindsight 获取 10–15 条最相关的记忆——足以覆盖项目核心事实,又不会淹没上下文窗口。在high下,检索会更深:更多上下文、更多 token。对大多数编码工作流,mid是恰当的平衡点;如果你要跳回一个跨多模块的复杂调查,high值得多付出的成本。
二、调试反复出现的问题
代码库记忆最高杠杆的价值在于跨会话的模式识别。有些 Bug 不是一次性的——它们是更深层架构问题的症状,会在数月内以不同形态反复浮现。
没有记忆时,每次实例都要独立排查,你可能会三次追踪同一个根因却从未把它们联系起来。有了记忆,OpenClaw 会回忆起之前的实例。描述一个新的失败模式,它就会带出相关上下文:两个月前识别出的根因、撑到下一次重构的临时方案、反复出现在这些故障中的组件。
这类高价值事实包括:
"The rate limiter bypasses auth checks for requests with X-Internal: true header, source of two privilege escalation near-misses""Async task queue silently drops jobs when Redis connection resets, needs explicit ACK handling, not fire-and-forget""GraphQL resolver N+1 pattern reappears after every new schema addition, needs DataLoader enforcement flagged in code review"
这些不是你会想到在调试会话开始时粘贴的事实,它们是区分"盲调"与"带着完整上下文调试"的制度性知识。对这个工作流,recallBudget: high值得额外成本——不再局限于默认的 10–15 条记忆,高预算检索会跑得更深,覆盖更多检索策略。
三、上手别人的代码
如果你加入一个同事已经用 OpenClaw + Hindsight 在共享记忆库(shared bank)上工作过的项目,记忆库中已经包含了他们会话产生的上下文。可以直接向 OpenClaw 提问某个模块的情况:
What do you know about the payments module?What quirks or known issues have come up in the auth service?What were the reasons we moved off SQLAlchemy?OpenClaw 会带出之前会话累积的事实:架构上下文、已知边界情况、过去的决策及其背后的理由——无需任何人在 README、Wiki 或没人找得到的 Slack 线程里写下来。这不是文档,而是永远进不了文档的制度性知识。
好的代码库记忆长什么样
在项目上经过 30+ 会话后,一个构建良好的记忆库通常覆盖:
- 项目约定:模块结构与导入模式、错误处理要求、从代码中看不出来的命名约定、与默认值不同的 lint 规则。
- 已知脆弱区域:在特定负载或输入条件下会挂的组件、引发过生产事故的集成点、测试套件没覆盖的边界情况。
- 架构历史:被替换的依赖及其原因、考虑过又被否决的模式、通过测试而非文档发现的性能特征。
- 团队偏好:代码评审优先级、部署坑、与官方文档说法不一致的实际情况。
其中大部分会从普通会话中自动累积。唯一的例外是:重大架构决策和团队偏好值得显式说明。当你做出重大决定时,把理由讲给 OpenClaw:
We're switching to asyncpg from SQLAlchemy because connection pooling under our load profile caused intermittent timeouts above ~200 concurrent requests. The fix wasn't tuning, it was the ORM abstraction. Remember this.后台提取会捕获大部分重要内容,无需你显式操作。
有记忆与无记忆的会话对比
没有记忆时,会话开头可能是:
"I'm working on a Python service that uses asyncpg for database access. We removed SQLAlchemy in February due to connection pool issues under load. All async handlers should be wrapped in
handle_errors(). Help me debug this intermittent 500..."
有了记忆,这些事实已经被注入,你只需要开场:
"Help me debug this intermittent 500 in the payment handler."
技术栈、约定、架构上下文——都已经在那里了。
团队代码库:共享记忆库
默认情况下,OpenClaw 会按 agent + channel + user 各自创建独立的记忆库。如果团队共享同一个编码 Agent 做同一项目,可设置dynamicBankGranularity共享一个库:
{ "dynamicBankGranularity": ["agent"] }当多位开发者对同一代码库使用共享记忆库时,记忆会从他们所有人的会话中累积复合。某位开发者积累的知识——某个棘手模块未文档化的行为、来之不易的调试洞察、某个部署坑——会自动对其他团队成员可用。
从源码看,银行 ID 的推导实现在 hindsight-integrations/openclaw/src/index.ts 的deriveBankId中:默认按["agent", "channel", "user"]拼接(如agent-123::channel-456::user-789),字段缺失时回退到unknown/anonymous,会话键可用于补全缺失的 channel/provider 信息;每个段会做编码以防止分隔符冲突。相关的边界情况由测试 hindsight-integrations/openclaw/src/derive-bank-id.test.ts 覆盖。
几个注意事项:
- 适合共享的:代码库事实、架构决策、已知问题、约定。这些描述的是代码库而非个人——可以安全共享。
- 应保持隔离的:个人工作流偏好、无关的个人上下文。这些应使用单独的库。
- 命名规范:用
bankIdPrefix按项目做命名空间。支付团队共用一个带payments-service前缀的共享库,会沉淀为制度性记忆;而三个人各用默认库、彼此不协调,只会变成噪声。
dynamicBankGranularity的完整可选项为agent/channel/user/provider;关闭动态库(dynamicBankId: false)则可固定使用单一openclaw库或bankId指定的静态库,此时bankIdPrefix会拼出类似prod-shared-bank的 ID。
进阶:预置结构化心智模型(Mental Model)
从会话中自然提取是 Hindsight 构建代码库知识的主要方式。但你也可以显式前置加载上下文——在开始接手既有代码库、或某些关键约定必须在首个会话前就位时,这很有用。
Hindsight 通过 SDK 与 API 暴露了两种独立于 OpenClaw 之外的操作,它们写入的正是 OpenClaw 读取的同一个记忆库:
摄入既有文档(Ingest)。上传架构笔记、ADR 或约定文件。Hindsight 会对内容运行事实提取,将结果以记忆形式存入记忆库。摄入后,这些事实在下一个会话就对 OpenClaw 可用——无需等待自然提取慢慢追上。
创建心智模型(Mental Model)。定义从源查询(如"What are the coding conventions for this project?")构建的精炼摘要。Hindsight 运行 reflect 操作,从所有已摄入与会话提取的知识中综合出答案并保存结果。设置refresh_after_consolidation: true后,模型会在新事实到达时自行重新推导。reflect 调用期间会先检查心智模型,其次才检查单条观察与原始事实——因此预计算答案会被直接返回,无需现场重新推导。这一点在 API 层有对应实现与字段定义,见 hindsight-api-slim/hindsight_api/api/http.py 中的 mental model 相关模型与refresh_after_consolidation/refresh_cron互斥校验。
回填既有历史(Backfill)。如果你已经有数月的 OpenClaw 会话,插件附带一个回填 CLI 可将其导入 Hindsight:
npx --package @vectorize-io/hindsight-openclaw hindsight-openclaw-backfill \ --openclaw-root ~/.openclaw \ --dry-run移除--dry-run即执行。用--agent proj-run限定只导入特定 Agent,用--resume从上次回填中断处继续。回填默认镜像当前插件的银行路由配置(dynamicBankId/dynamicBankGranularity/bankIdPrefix/ 本地守护进程还是外部hindsightApiUrl),也支持--bank-strategy agent|fixed这类迁移导向的显式覆盖;导入进度以检查点文件记录在~/.openclaw/data/hindsight-backfill-checkpoint.json。回填的解析与计划构建逻辑见 hindsight-integrations/openclaw/src/backfill-lib.ts。
已摄入的项目文档、会话提取的事实与回填的历史三者组合,让 OpenClaw 从三个角度获得完整图景:有意记录了什么、使用中发现了什么、插件安装前发生过什么。
用得越久,你需要解释的越少
OpenClaw + Hindsight 是少数上下文能够跨会话累积的编码工作流之一。每个会话都会增加它对你代码库的认知。其他工具会重置,这个不会。
价值随使用而复合:第一个会话,OpenClaw 对你的项目一无所知;第五个会话,它知道技术栈与约定;第 30 个会话,它知道项目的历史、脆弱区域、塑造其当前形态的决策。到那时你已不再需要解释那些东西——不是因为跳过了上下文,而是因为再也不需要提供它。当心智模型足够丰富时,你面对的不再只是一个编码助手,而是一个和你一样了解代码库的 Agent。
如果希望深入了解,本仓库还提供了原始集成公告 adding-memory-to-openclaw-with-hindsight、完整的配置参考 openclaw 集成 README 以及插件配置模式定义 openclaw.plugin.json,可以对照本文继续深入。
【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考