首页 / 资讯中心 / 文章详情

检索 0.06 秒,反思 70 秒:Hindsight 把记忆的成本挪到了写入时

检索 0.06 秒,反思 70 秒:Hindsight 把记忆的成本挪到了写入时 ★ FEATURED ARTICLE
Agent 查记忆为什么不该调大模型多数人给 Agent 加记忆的第一反应是把原文存进向量库查的时候捞出来再让大模型读一遍、判断哪句有用。能用但每查一次就付一次模型的钱而且它分不清这句话是谁说的、什么时候说的「上周」存进去半年后查出来还是「上周」。Hindsight 反过来做贵的活全放在写入那一刻查的时候一分模型钱都不花。我们在一台没有 GPU 的机器上把它跑了一遍检索 0.06 秒返回Reflect 要 70 秒。两个数差了一千多倍这个差距不是缺陷正是它的设计。[实测] 主图两个数字分别是本文实测的 recall 接口耗时和一次 Reflect 的耗时Hindsight 是 vectorize-io 开源的 Agent 记忆层MIT 协议Python 写的截至 2026-10-03 07:50北京时间有 44689 个 Star、5869 个 Fork最新版本是 9 月 29 日发布的 v0.10.2。下面一层层拆。贵的活放在写入时先看两种做法的账怎么算。[框架示意] 同样是记住一句话、以后查出来常见做法每次查询都要大模型参与Hindsight 把大模型集中在写入和后台归并检索不调模型Hindsight 的 API 只有三个核心操作retain写入调大模型从文本里抽事实、实体和时间在事实之间建语义、时间、实体链接后台再把多条事实归并成「观察」。recall检索语义向量、BM25 关键词、关系图、时间四路并行融合排序不调大模型。reflect反思一个带工具调用的 Agent 循环基于记忆推理出回答。Agent 记忆是典型的读多写少一句偏好写进去一次后面几百次对话都要查。把成本压在写这一头账就算对了。这是整个项目最值得抄的一个决定。写入一刻发生了什么5 条事实、9 条观察我们写了两条演示用的编辑部纪要一位叫小林的编辑负责开源栏目喜欢先在沙箱里跑通再写稿、不喜欢只翻译 README截图统一用 1440×900团队主要用 Postgres不想额外维护向量库还有一条下周的选题安排。这里交代一句口径下文所有抽出的事实、观察和 Reflect 的回答都是经第三方中转调用的 gpt-6.1-sol 生成的不是项目默认模型Hindsight 本身不绑定模型。retain 用了 19 秒从两段话里抽出 5 条事实并建了 46 条链接语义 25 条、时间 20 条、实体 1 条。紧接着后台归并任务又跑了 30 秒生成 9 条观察。[实测] 记忆库概览14 条记忆5 条事实加 9 条观察、46 条链接左上是记忆星座图抽取与归并由经第三方中转调用的 gpt-6.1-sol 完成写入的纪要是演示文本观察是比事实高一层的认识比如「团队主要使用 Postgres」「团队不希望为了一个记忆服务额外维护向量数据库」每条都挂着实体、标签和来源事实。[实测] 9 条观察后台归并任务从事实中提炼出的高层认识由经第三方中转调用的 gpt-6.1-sol 生成最见功力的是时间处理。纪要里写的是「上周那篇」存进去的事实里已经换算成了「2026 年 9 月 21 日至 9 月 27 日」。抽取模块的文件头说得清楚它要同时抽事实、实体和时间hindsight-api-slim/hindsight_api/engine/retain/fact_extraction.py:1-6。相对时间在写入时落成绝对日期以后按时间检索才靠得住这件事放到查询时再做就晚了那时候已经不知道「上周」是哪周。19 秒加 30 秒听着慢但这是一次性的。用户说完一句话Agent 后台写进去就行没人在等它。不靠大模型检索凭什么够准在控制台的 Recall 页输入「小林写开源稿件有什么要求」接口 0.06 秒返回 5 条结果控制台显示 0.05 秒。第一条正是「先在沙箱里跑通再写稿不喜欢只翻译 README」第二条是截图尺寸。[实测] Recall一句自然语言提问0.06 秒返回 5 条按相关度排序的事实检索本身走本地 ONNX 向量和 RRF 融合不调大模型事实内容由经第三方中转调用的 gpt-6.1-sol 抽取准靠的是两件事。第一存进去的东西已经干净了。检索的对象不是原文碎片而是写入时整理好的一条条事实每条只说一件事、带着人物和日期。查询本身就简单了。第二四路互补再用排名融合。语义向量管「意思相近」BM25 管「关键词命中」关系图管「和谁有关」时间管「什么时候」engine/search/__init__.py:1-8。四路结果不比分数只比排名# hindsight-api-slim/hindsight_api/engine/search/fusion.py:29-56节选defreciprocal_rank_fusion(result_lists:list[list[RetrievalResult]],k:int60)-list[MergedCandidate]: Merge multiple ranked result lists using Reciprocal Rank Fusion.RRF formula:score(d)sum_over_lists(1/(krank(d)))...source_names[semantic,bm25,graph,temporal]倒数排名融合RRF的好处是不用调权重四路的分数尺度完全不同它只看每条结果在各路里排第几在多路都靠前的自然胜出。整个过程是数据库查询加一次本地向量计算所以是毫秒级。向量用的也不是云端接口默认就是本地小模型# hindsight-api-slim/hindsight_api/config.py:1211-1215DEFAULT_EMBEDDINGS_PROVIDERlocalDEFAULT_EMBEDDINGS_LOCAL_MODELBAAI/bge-small-en-v1.5DEFAULT_EMBEDDINGS_LOCAL_FORCE_CPUFalse# Force CPU mode for local embeddingsDEFAULT_EMBEDDINGS_LOCAL_TRUST_REMOTE_CODEFalse# Security: disabled by default, required for some modelsDEFAULT_EMBEDDINGS_ONNX_MODEL_IDintfloat/multilingual-e5-small我们启动时日志显示嵌入跑的是intfloat/multilingual-e5-small384 维在CPUExecutionProvider上重排用 RRF不跑神经网络。全程没用 GPU。[实测] API 启动嵌入走本地 ONNXmultilingual-e5-smallCPUExecutionProvider重排用 RRF连通性校验通过模型为经第三方中转调用的 gpt-6.1-solReflect 慢但用在对的地方检索只负责把相关事实找出来。要综合判断比如「给小林写 Hindsight 稿件时要注意什么」就轮到 Reflect。它跑了 2 轮、1 次工具调用、3 次大模型调用约 70 秒把几条记忆串成了一段建议先实际跑通再写截图用 1440×900命令和退出码以运行日志为准技术选型考虑团队已有的 Postgres。[实测] Reflect基于记忆库回答「给小林写 Hindsight 稿件时要注意什么」2 轮、1 次工具调用、3 次大模型调用约 70 秒回答由经第三方中转调用的 gpt-6.1-sol 生成它的检索是分层的# hindsight-api-slim/hindsight_api/engine/reflect/agent.py:1-8 Reflect agent - agentic loop for reflection with native tool calling. Uses hierarchical retrieval: 1. search_mental_models - User-curated summaries (highest quality) 2. search_observations - Consolidated knowledge with freshness 3. recall - Raw facts as ground truth 先查人工整理的知识页再查归并后的观察最后用原始事实兜底默认最多 10 轮agent.py:149。这和写入时的分层是对上的写入时做好的观察在 Reflect 里成了第二层检索的原料前面花的钱在这里又用了一次。70 秒放在聊天框里不可接受放在后台任务里完全没问题每晚给 Agent 生成一份「这个用户该注意什么」或者写稿前先出一份要点。面向用户的实时路径交给 recall需要想一想的交给 Reflect项目把这两条路分得很清楚。控制台里每次调用的账都记着我们把这次各步的耗时画成一张图[实测] 每个操作的耗时和是否调用大模型retain、归并、reflect 取自控制台 LLM 调用记录recall 为接口实测耗时模型为经第三方中转调用的 gpt-6.1-sol[实测] 控制台的 LLM 调用记录原图这个记忆库共 9 次成功调用每次的 Token 和耗时都列出输入 Token 含中转站每次约 4200 的附加计费直连会更低模型为经第三方中转调用的 gpt-6.1-sol一个 Postgres 加一个 Key 就能跑设计上省钱部署上也省事。存储只要一个 PostgreSQL 加 pgvector 扩展事实、链接、向量、全文索引都在一个库里我们用的是pgvector/pgvector:pg17镜像。服务装的是精简版hindsight-api-slim选local-onnx扩展不装 PyTorch。uv解析出 231 个包12 秒装完。[实测] 源码安装 hindsight-api-slim带 local-onnx 扩展退出码 012 秒大模型只认四个环境变量默认 provider 是openai任何兼容接口都能接# hindsight-api-slim/hindsight_api/config.py:159-162ENV_LLM_PROVIDERHINDSIGHT_API_LLM_PROVIDERENV_LLM_API_KEYHINDSIGHT_API_LLM_API_KEYENV_LLM_MODELHINDSIGHT_API_LLM_MODELENV_LLM_BASE_URLHINDSIGHT_API_LLM_BASE_URL我们把BASE_URL指向中转站、MODEL填gpt-6.1-sol没改一行源码。嵌入和重排都在本地不需要第二个 Key。接入方面hindsight-clients/下有 Python、TypeScript、Go、Rust 四种客户端hindsight-integrations/下列了 56 个框架的接入也能当 MCP 工具用。[源码推导] Hindsight 运行架构retain、recall、reflect 三条路径大模型与本地 CPU 嵌入PostgreSQL pgvector 与控制台节点职责根据 config.py、engine/retain、engine/search、engine/reflect 整理谁该现在用谁再等等适合现在就用在做 Agent 产品、需要跨会话记住用户偏好和团队约定的开发者。retain 加 recall 就够检索不花钱。团队已经在用 Postgres 的。不用另起一套向量库加个 pgvector 扩展就行。想要基于历史做综合建议、能接受后台异步的。Reflect 放进定时任务里跑。再等等或者不适合要求每次回答都实时综合推理的场景。Reflect 是分钟级的单次模型调用默认超时 30 秒config.py:1197这类需求先别用 Reflect用 recall 拼上下文更合适。只想在一次对话里记住前几轮内容。模型的上下文窗口就够了用不上一个记忆层。使用前提一句话需要一个大模型 Key 来抽事实和 Reflect不配也能跑provider 设成none后只存原文块、能检索config.py:4068-4075。MIT 协议可以商用。推荐一个优秀项目RuoyiOffice 是一套面向中小企业的企业管理一体化平台思路是「一个平台管好整个企业」不用再分别采购 OA、人事、客户管理、进销存好几套系统数据在一个平台里打通。它的核心特性有这几块业务全覆盖按需启用OA 协同、流程审批、人力资源、客户管理CRM、进销存ERP、资产管理、仓储管理、企业商城、数据报表、物联网等十余个子系统模块化组合用到哪个开哪个。可视化流程引擎仿钉钉、飞书的流程设计器同时支持 BPMN会签、或签、依次审批抄送、转办、委派、加减签父子流程和超时提醒都有请假、入职、转正、调动、离职这类单据都能走线上审批。PC 端加移动端PC 端基于 Vue 3移动端基于 UniApp审批、打卡、待办、公告、企业云盘在手机上也能处理。微服务架构后端基于 Spring Boot 和 Spring Cloud Alibaba网关、注册配置中心、消息队列齐全各模块可以独立部署、按需扩展。内置 AI 能力可对接 DeepSeek、通义千问等大模型提供 AI 对话、写作、绘图、知识库问答和思维导图。企业级底座多租户、细粒度的角色和数据权限、单点登录还有代码生成器二次开发省事。
阅读完成 · 觉得有帮助?
咨询建站