今天在 GitHub Trending 上看到一个有意思的项目:Hindsight,一个由 Vectorize.io 构建的 Agent 记忆系统。它想解决的不是「把对话存下来再检索」,而是让智能体像人一样随着时间不断学习——把经历沉淀为可复用的认知,而不是一堆堆砌的向量。
一、项目概述
大多数记忆系统的思路停留在「召回对话历史」:把聊天记录塞进向量库,需要用的时候再搜出来。Hindsight 认为这远远不够——真正的智能体应该从经验中学习,并据以改变未来的行为。
它宣称在长时记忆任务上达到了当前最准的效果,并在学术界常用的 LongMemEval 基准上取得 SOTA。官方还强调,其基准数据已被弗吉尼亚理工 Sanghani 人工智能与数据分析中心以及《华盛顿邮报》的协作研究者独立复现,而非厂商自报。
核心卖点可以概括为:
- 会学习而非仅记忆:用仿生数据结构组织记忆,把零散事实逐步凝练为观察(Observations)与心智模型(Mental Models)。
- 超越 RAG 与知识图谱:通过四种检索策略并行 + 重排序,号称在长时记忆准确性上优于传统方案。
- 接入成本极低:LLM Wrapper 两行代码即可给现有 Agent 加上记忆;自带 60+ 集成与 MCP Server。
- 多平台、多语言:支持 25+ LLM 厂商,原生多语言(中文事实保持中文原文),并提供 Docker / 裸机 / K8s / 嵌入式多种部署形态。
二、技术原理
仿生记忆类型
Hindsight 没有采用普通向量检索或知识图谱,而是用更接近人类记忆的仿生数据结构管理记忆,分为四类:
- World facts(世界事实):关于世界的事实,例如「炉子会烫手」。
- Experiences(经历):智能体自身的经历,例如「我摸了炉子,真的很疼」。
- Observations(观察):由大量记忆归纳出的、有证据支撑的信念。
- Mental models(心智模型):从观察与事实中综合出的、对世界的理解。
记忆写入时会被推入「世界事实」或「经历」通道之一,再以实体 + 关系 + 时间序列的组合表示,配合稀疏 / 稠密向量,为后续召回做准备。
三段式操作:retain / recall / reflect
整个系统围绕三个核心操作展开,这也是理解 Hindsight 的关键。
Retain(保留) —— 把新信息送入系统:
client.retain(
bank_id="my-bank",
content="Alice got promoted to senior engineer",
context="career update",
timestamp="2025-06-15T10:00:00Z",
)
背后会用 LLM 抽取关键事实、时间、实体与关系,再经过归一化处理,把数据转成规范化实体、时间序列与检索索引。
Recall(召回) —— 检索记忆,并行执行四种策略:
- 语义(Semantic):向量相似度
- 关键词(Keyword):BM25 精确匹配
- 图(Graph):实体 / 时间 / 因果关联
- 时间(Temporal):时间范围过滤
client.recall(bank_id="my-bank", query="What does Alice do?")
client.recall(bank_id="my-bank", query="What happened in June?") # 时序查询
各路结果用**倒数排名融合(reciprocal rank fusion)与交叉编码器重排序(cross-encoder reranking)**合并、排序,再按需裁剪以适配 token 上限。
Reflect(反思) —— 对已有记忆做更深入分析,建立记忆间的新连接,适合需要「深度思考」而非「查表」的问题:
client.reflect(bank_id="my-bank", query="What should I know about Alice?")
典型场景包括:AI 项目经理反思项目风险、销售 Agent 反思为何某些触达有回应、客服 Agent 反思文档未覆盖的用户疑问。
Observations 与 Mental Models
保留进来的事实不会一直堆成扁平的一堆。后台会把相关事实整合成观察(Observations)——去重后的信念,每条都保留支持证据(精确引用 + 证明计数),且新证据到来时是「精炼」而非「覆盖」,从而让信念被增强、削弱或扩展,而不是被悄悄替换。
心智模型则是对某个问题的固定答案(如「这位用户的偏好是什么?」)。你定义一次问题,Hindsight 在后台写好答案并随学习持续重写;读取它只是一次数据库读,无需检索也不消耗 LLM 调用。由此,Agent 每次启动都能带上一页「已定论的知识」,而不是每次重新发现。
隔离、多语言与记忆防御
- Bank(记忆库):一个隔离的记忆存储——一个用户 / Agent / 项目一个「大脑」,严格隔离、互不串味;还可携带 disposition 特质(怀疑、刻板、共情)影响 reflect 的推理风格。
- 默认多语言:输入语言端到端保留,实体保持原生文字(如「张伟」不会被转成 “Zhang Wei”)。
- Memory Defense:可选的逐库策略,对照 45 种模式扫描每次 retain 中的密钥与 PII,要么脱敏(如
[REDACTED:github_token]),要么在入库前直接拦截。
三、安装与快速开始
启动服务(Docker,推荐)
export OPENAI_API_KEY=sk-xxx
docker run -it --pull always --name hindsight --restart unless-stopped -p 8888:8888 -p 9999:9999 \
-e HINDSIGHT_API_LLM_API_KEY=$OPENAI_API_KEY \
-v hindsight-data:/home/hindsight/.pg0 \
ghcr.io/vectorize-io/hindsight:latest
API:http://localhost:8888 | UI:http://localhost:9999
它支持 25+ LLM 厂商(HINDSIGHT_API_LLM_PROVIDER):托管型(openai、anthropic、gemini、groq、bedrock、vertexai、deepseek 等)、本地型(ollama、lmstudio、llamacpp)、任何 OpenAI 兼容端点,以及 litellm 等网关;ChatGPT Plus/Pro、Claude Pro/Max、GitHub Copilot 这些既有订阅也无需额外 API Key。
连接客户端
pip install hindsight-client -U # Python
npm install @vectorize-io/hindsight-client # Node.js / TypeScript
go get github.com/vectorize-io/hindsight/hindsight-clients/go # Go
curl -fsSL https://hindsight.vectorize.io/get-cli | bash # CLI
最简运行示例(Python):
from hindsight_client import Hindsight
client = Hindsight(base_url="http://localhost:8888")
client.retain(bank_id="my-bank", content="Alice works at Google as a software engineer")
client.recall(bank_id="my-bank", query="What does Alice do?")
client.reflect(bank_id="my-bank", query="Tell me about Alice")
嵌入式(无需服务)
pip install hindsight-all -U
import os
from hindsight import HindsightServer, HindsightClient
with HindsightServer(
llm_provider="openai",
llm_model="gpt-5-mini",
llm_api_key=os.environ["OPENAI_API_KEY"]
) as server:
client = HindsightClient(base_url=server.url)
client.retain(bank_id="my-bank", content="Alice works at Google")
results = client.recall(bank_id="my-bank", query="Where does Alice work?")
四、使用方法与实战
给现有 Agent 加记忆:两行代码
最简单的方式是 LLM Wrapper——把现有 LLM 客户端换成包装版本,每次调用自动存 / 取记忆,无需改动其余代码:
from openai import OpenAI
from hindsight_litellm import wrap_openai
client = wrap_openai(
OpenAI(),
bank_id="user-123",
hindsight_api_url="http://localhost:8888",
)
# Hindsight 在调用前召回相关记忆,调用后保留对话
response = client.chat.completions.create(
model="gpt-5-mini",
messages=[{"role": "user", "content": "What do you know about me?"}],
)
wrap_anthropic() 同理作用于 Anthropic SDK;底层是 LiteLLM,因此同一套集成覆盖 100+ 模型,且每次调用都能用 hindsight_* 关键字参数覆盖 bank、召回预算、事实类型等设置。
60+ 集成与编码 Agent
几乎无需改代码的集成覆盖:Claude Code、Codex、Cursor、GitHub Copilot、OpenHands 等编码 Agent;LangGraph、LlamaIndex、CrewAI、Pydantic AI、OpenAI Agents SDK 等框架;n8n、Zapier、Dify、Flowise 等低代码工具;以及 ChatGPT、Perplexity、Obsidian 等应用。
对 CLI 编码 Agent,一条命令即可获得基于 git 历史与历史会话自动构建的「每仓库记忆库」,随 Agent 启动注入:
npx @vectorize-io/hindsight-coding-agents install all # 全部检测到的 Agent
npx @vectorize-io/hindsight-coding-agents install claude-code # 或仅指定一个
MCP Server
每个服务自带内置 MCP 端点(默认启用,每个 bank 一个):
http://localhost:8888/mcp/{bank_id}/
把任意 MCP 客户端指向它,即可把 retain / recall / reflect 暴露为工具。
生产部署
存储支持 PostgreSQL + pgvector,或 Oracle AI Database 23ai(功能对等);提供分层配置、Prometheus 监控、Admin CLI、Webhook 事件与多扩展点,亦可选用 Hindsight Cloud(托管、按量计费、99.9% SLA)。
五、常见问题与解决方案
Q:拉起 Docker 后 API 访问不通?
确认映射了 8888(API)与 9999(UI)两个端口,且设置了 HINDSIGHT_API_LLM_API_KEY。若用外部 PostgreSQL,需先 export HINDSIGHT_DB_PASSWORD 再在 docker/docker-compose 下 docker compose up。
Q:想换非 OpenAI 的模型?
通过 HINDSIGHT_API_LLM_PROVIDER 指定:anthropic / gemini / deepseek / ollama 等均可,或指向任意 OpenAI 兼容端点、litellm 网关。既有 ChatGPT Plus、Claude Pro、GitHub Copilot 订阅无需 Key。
Q:Intel 版 Mac 安装报错?
README 明确标注 Intel (x86_64) Mac 需改用 hindsight-all-slim,裸机方式在 Intel Mac 上兼容性受限(⚠️)。
Q:担心记忆里混入密钥 / 个人隐私?
开启逐库的 Memory Defense:系统对照 45 种模式扫描每次 retain,命中后自动脱敏([REDACTED:...])或在入库前拦截。
Q:多语言场景事实被转写? Hindsight 默认端到端保留输入语言与实体原生文字,中文事实会保持中文,不会被动转成拼音 / 英文。
六、总结
Hindsight 把「智能体记忆」从「检索对话」升级为「随经验学习」:仿生记忆类型、retain/recall/reflect 三段式操作、观察与心智模型的后台沉淀,加上 4 路并行召回 + 重排序的检索 pipeline,让长时记忆的准确性有了明显提升。配合两行代码的 LLM Wrapper、60+ 集成、内置 MCP 与多部署形态,它对想把「会学习」能力塞进产品 / Agent 的团队来说,是一个值得一试的开源方案(MIT 协议)。
- 项目地址:https://github.com/vectorize-io/hindsight
- 论文:https://arxiv.org/abs/2512.12818
- 基准(持续更新):https://benchmarks.hindsight.vectorize.io/