尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

为什么 Agent Memory 默认不需要外部向量数据库:Hindsight 的 PostgreSQL 多策略检索架构剖析

发布时间:2026/9/13 15:03:46

资讯中心
01
ARTICLE

为什么 Agent Memory 默认不需要外部向量数据库:Hindsight 的 PostgreSQL 多策略检索架构剖析

为什么 Agent Memory 默认不需要外部向量数据库:Hindsight 的 PostgreSQL 多策略检索架构剖析
为什么 Agent Memory 默认不需要外部向量数据库Hindsight 的 PostgreSQL 多策略检索架构剖析【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight大多数给 Agent 加上记忆的教程都以同一个动作开场安装一个向量数据库。Mem0 的快速开始指向 Qdrant 或 PineconeLangChain 的记忆示例默认使用 ChromaAgent memory 就等于向量数据库几乎成了行业共识。但本篇文章要论证的是大部分时候这一步完全没有必要。本文基于 Hindsight 项目的架构主张深入分析 Agent Memory 与 RAG 在读写形态上的本质差异剖析外部向量数据库隐藏的运维税并展示 Hindsight 如何用一个 PostgreSQL pgvector承载事实抽取、实体解析、矛盾处理、失效与反思reflect构成的完整学习层以及语义、实体、时间、图四种检索策略并行融合的实现路径。读完本文你将能判断自己的 Agent 记忆场景究竟属于该用 Postgres还是确实需要专用向量库。本文核心论点来源于 Hindsight 官方博客 The Case Against External Vector DBs for Agent Memory并结合仓库源码hindsight-api-slim/hindsight_api/engine/下的检索与融合实现进行佐证与扩展。Agent Memory 不是 RAG先看工作负载因为一切结论都从负载形态推导而来。维度RAGAgent memory读写比例读密集语料一次构建写密集每一轮对话都会产生事实单租户体量百万到十亿级向量几十万到几百万条事实检索形态以语义相似度为主语义 实体 时间 图混合延迟预算数百毫秒搜索 UI 可接受亚 200msAgent 循环内RAG 是读密集型的语料一次性构建批量计算 embedding索引建成之后系统余下的一生都在对近乎静态的索引服务相似度查询。更新虽然存在但绝不是热路径热路径是用户输入一个问题返回最语义相似的 chunk。ANN近似最近邻吞吐是它的头号指标。Agent memory 几乎把这张表翻转过来而且不只是因为写得更频繁。每一次写入都要穿过一条学习流水线原始对话被分解为原子事实fact extraction跨事实出现的实体被解析合并——认证服务我们的登录系统OAuth 微服务应当落在同一个规范节点上entity resolution新事实与旧事实冲突时触发矛盾消解contradiction handling被取代的事实要被标记失效invalidation最后定期有一个合成步骤读取累积事实、写回更高阶的观察reflection/synthesis。这些环节在 RAG 摄取里统统不存在也统统不是向量数据库擅长的事。检索形态同样不同。RAG 查询大多是单次语义查找Agent memory 查询是混合的——用户上周二关于定价做了什么决定是时间锚定 实体锚定展示所有与数据库迁移线程相关的内容是图形态的用户是否对新仪表盘提过任何担忧需要语义搜索同时要靠实体解析来捕捉同义词。这些都不是纯粹的 ANN 问题。第三个差异是单租户体量典型的 agent-memory 语料是每个租户几十万到几百万条事实比值得在生产环境运行 Pinecone的 RAG 规模低两到三个数量级。正是那个让专用向量数据库的运维成本物有所值的条件十亿级向量在 agent memory 场景里通常根本不存在。外部向量数据库的隐藏税如果 agent memory 与 RAG 形态相同单独维护一个向量数据库的运维税只是正常的业务成本。但它不是所以这笔税大多买不到任何东西。运维表面积Operational surface area运行一个外部向量数据库意味着要为一个第二个有状态服务做容量规划、扩缩容、安全加固、备份、监控和版本升级。对于本来就在生产环境运营 Pinecone 或 Weaviate 的团队这笔成本可以摊薄对于没有的团队agent-memory 项目直接让数据库数量翻倍。这个模式在主流 agent-memory 框架的自托管方案里看得一清二楚自托管 Mem0 需要额外搭建 Qdrant 或 PineconeZep 的 Community Edition 已弃用自托管 Graphiti 意味着在 Graphiti 自身服务之外再搭 Neo4j、FalkorDB 或 Kuzu。框架本身不是重担数据库依赖才是。网络跳数与延迟Agent 循环的延迟预算比 RAG 管道紧得多。一次 400ms 的记忆检索在搜索 UI 里毫无感觉在每轮要做四次工具调用的 Agent 里就是坏了。路径上每多一个外部服务就多一次往返和一次序列化。对低流量的 agent-memory 负载到托管向量数据库的网络跳数往往比查询本身占掉更大比例的延迟预算。小规模下的成本托管向量数据库有定价下限。Pinecone 的 serverless 与 pod 档位都存在不随小数据集线性缩放的定价地板Weaviate Cloud、Zilliz、Qdrant Cloud 结构类似具体价格请以各家最新报价为准供应商经常调整。对一个几个 GB 的 Postgres 就能轻松装下的负载去支付托管向量库的地板价是用钱买运维简化的税却什么负载真正需要的东西都没买到。向量数据库没有的学习层如果把检索层面的争论剥开更根本的问题其实在检索之前。有用的 agent memory 不是一堆对话 chunk而是一个随着对话累积不断被构建与重建的结构化表示。支撑它的架构原语根本不是向量事实抽取Fact extraction模型把每一轮对话分解为原子化、可检索的声明claim并保留回源到原始消息的 provenance溯源。实体解析Entity resolution新的提及被链接到已有实体。同一个客户、项目或服务无论怎么被称呼都归一到同一个规范节点。矛盾处理Contradiction handling当新事实与旧事实冲突系统必须决定谁胜出、谁被失效、谁作为历史保留。失效Invalidation事实有生命周期。仪表盘还在 beta在仪表盘上线之后就不该再被检索到。反思Reflection系统定期读取累积事实写回合成的观察——模式、摘要、反复出现的主题。它们不存在于任何单次对话却从众多对话中涌现。向量数据库对这一切没有任何意见。它只接受一个id和一个vector。结构、关系、时间有效性、去重逻辑——所有这些都必须住在别处。在实践中别处通常意味着第二个数据库或一大摊应用逻辑与缓存而向量存储退化为你本来就在维护的更大 schema 里的一列。到这一步你不是从技术栈里去掉了一个数据库而是加上了一个。把学习层和检索底座放进同一个事务性数据库架构就被压缩了事实抽取流水线直接写入 pgvector 正在索引的那个 Postgres实体解析是一次 join矛盾消解是一个事务reflect 输出与输入一样是事实紧挨着被索引。Agent 真正需要的混合检索从数据模型里自然涌现而不是跨服务拼装。单策略检索才是真正的天花板向量数据库只把一件事做好对 embedding 做 ANN。即便抛开上面的运维争论纯向量系统对 agent memory 来说仍然是错误的底座——因为大多数 agent-memory 查询根本不能分解为纯语义相似度。Hindsight 对每个查询并行运行四种检索策略语义搜索、基于实体的检索、时间过滤、图遍历。这四种里有三种不是 ANN。基于实体的检索是对实体表的结构化查找时间过滤是对时间戳的范围查询图遍历是对边的递归游走。向量数据库能做第一种其余三种要么委托出去要么重复实现。这一点不是 Hindsight 独有的观察。任何足够完整的 agent-memory 系统最终都会具备这四种检索模式中的至少三种因为查询就是这么要求的。Zep 的 temporal knowledge graph 是认真对待图与时间的最强例子而代价是一旦你真的去遍历 Zep 的图数据库它同样不再是一个向量数据库问题。架构论证是双向切割的。经验结果跟架构一致。在标准的长程对话记忆评测 LongMemEval 上向量主打的系统得分更低Mem0 公布 49.0%多策略系统得分更高Hindsight 公布 91.4%同样运行多检索模式的 SuperMemory 公布 81.6%。准确率差距正是架构差距的可见产物。Hindsight 源码中的四路并行检索Hindsight 把这四种策略落实为 retrieval.py 中的ParallelRetrievalResult语义、BM25关键词全文检索、图通过可插拔的GraphRetriever接口、时间带 spreading 的时间感知检索四路并行后带独立的 timings。模块 docstring 明确写着 Retrieval module for 4-way parallel search。语义与 BM25 甚至被合并进同一个 SQLretrieve_semantic_bm25_combined_sql用UNION ALL把按 fact_type 划分的子查询联合起来让每个 arm 拥有独立的ORDER BY ... LIMIT从而可以利用每个 fact_type 上的部分 HNSW 索引纯向量模式enable_text_searchFalse下则只发语义 UNION把 BM25 的全部开销分词、term 选择查询、/rank 扫描跳过。图检索走 graph_retrieval.py 的GraphRetriever抽象基类——实现遍历 memory graph实体链接、时间链接、因果链接去找到语义与关键词都找不到的相关事实。默认实现是LinkExpansionRetriever链接扩展检索。最后多路结果在 fusion.py 里用**倒数排名融合Reciprocal Rank Fusion, RRF**合并score(d) sum_over_lists(1 / (k rank(d)))默认k60。每个来源先按 cap 截断cap_per_source防止单一过度扩展的 arm 挤占其它来源再进入融合与重排。这就是博客所说在应用层合并、再做 cross-encoder 重排的具体实现。向量数据库为错误的负载做了优化向量索引结构HNSW、IVF、ScaNN是读优化的构建昂贵增量更新也昂贵。有些实现支持 delete-and-rebuild 模式另一些对非平凡变更要求完全重建索引。没有哪一种喜欢 agent memory 这种高频写入、更新、失效的负载。更糟的是向量索引看到的写入甚至不是实质性的写入。有意义的工作——抽取、解析、矛盾、reflect——发生在流水线上游产出大量小型派生记录向量存储只在其最终 embedding 形态下看到它们。大部分学习逻辑根本不碰向量索引而这正是要点向量存储只是一个系统里的一个底座而那个系统的重心在别处。PostgreSQL 用三十年把事务性负载做到极致MVCC、WAL、时间点恢复、在线 schema 变更、成熟的复制。这些都不是为向量而生的但恰恰是为 agent memory 真正拥有的访问模式写入、更新、删除、并发读而生的。通过 pgvector 加上向量搜索所有这些能力全部继承。在十亿向量规模上结论反转专用向量数据库在原始吞吐和索引构建时间上胜出运维开销也值回票价。但大多数 agent-memory 负载不在十亿级。pgvector 对 Agent Memory 来说已经够用对直接用 Postgres的历史性质疑是性能pgvector 早期的 IVFFlat 索引在规模上缺乏竞争力。这已不再是制约条件pgvector 支持 HNSW 索引在 agent-memory 负载关心的召回与延迟曲线上具有竞争力Postgres 16 的并行索引构建与查询并行度补齐了剩余的大部分差距。更重要的是把向量放进 Postgres意味着实体表、时间事实、图边和应用数据住在同一个事务性数据库里。多策略检索变成一次 join 而非分布式查询跨全部四种检索底座的原子写是免费的备份就是一个pg_dump。在实践中它看起来就是一条 SQL-- 三种检索策略在同一个数据库的同一条查询里合并 WITH semantic AS ( SELECT fact_id, 1 - (embedding $query_embedding) AS score FROM facts ORDER BY embedding $query_embedding LIMIT 50 ), temporal AS ( SELECT fact_id, 1.0 AS score FROM facts WHERE created_at BETWEEN $window_start AND $window_end ), entity AS ( SELECT f.fact_id, 1.0 AS score FROM facts f JOIN fact_entities fe USING (fact_id) WHERE fe.entity_id ANY($resolved_entity_ids) ) SELECT f.*, COALESCE(s.score, 0) AS semantic_score, COALESCE(t.score, 0) AS temporal_score, COALESCE(e.score, 0) AS entity_score FROM facts f LEFT JOIN semantic s USING (fact_id) LEFT JOIN temporal t USING (fact_id) LEFT JOIN entity e USING (fact_id) WHERE s.fact_id IS NOT NULL OR t.fact_id IS NOT NULL OR e.fact_id IS NOT NULL;图遍历加上对 edges 表的递归 CTEcross-encoder 重排在应用层对合并后的候选集运行。同一个数据库装下这一切而这一切是同一个事务。选择不是用 Postgres 代替向量数据库而是因为检索模式想要 join所以用 Postgres。Hindsight 的向量后端如何落地在 Postgres 上Hindsight 的向量层不是硬编码 pgvector而是通过 _vector_index.py 做统一分派支持四种可配置扩展pgvectorHNSW、pgvectorscaleDiskANN、vchordvchordrq以及 AlloyDB 上的scann运行时还会解析 Azure 上的pg_diskann。环境变量HINDSIGHT_API_VECTOR_EXTENSION控制选择默认pgvector。各后端的索引子句_INDEX_USING_CLAUSES后端CREATE INDEX USING 子句扩展安装顺序pgvectorUSING hnsw (embedding vector_cosine_ops)vectorpgvectorscaleUSING diskann (embedding vector_cosine_ops) WITH (num_neighbors 50)vector→vectorscale CASCADEvchordUSING vchordrq (embedding vector_cosine_ops)vchord CASCADEscannUSING scann (embedding cosine) WITH (mode AUTO)vector→alloydb_scann CASCADE源码还体现了 ANN 检索时的调优细节pgvector 支持hnsw.ef_search与hnsw.iterative_scan两档配置——低延迟档retain 侧链接探测用ef_search60且关闭 iterative scan高召回档连接池初始化用ef_search200并开启strict_order迭代扫描配合hnsw.max_scan_tuples上限ann_iterative_scan/ann_max_scan_tuples两个配置项控制让查询按自己的 LIMIT 决定扫描深度而不是受一次扫描的候选列表封顶。索引创建策略上ScaNN 有SCANN_MIN_ROWS_FOR_AUTO_INDEX 10_000的最少行数门槛其它后端默认在 bank 创建时即构建每 bank 的部分索引per_bank_index_min_rows0时急切构建也可通过阈值配置改为按需维护。这一切都证明Hindsight 的向量能力是 Postgres 之上的可插拔底座而不是一个独立的第二数据库。AI Agent 需要向量数据库吗默认不需要。大多数 agent-memory 负载足够小可以和应用数据一起放进带 pgvector 的 Postgres。外部向量数据库是为 RAG 规模的语料和读密集的相似度搜索而建的agent memory 是写密集、更新密集的从向量图时间组合检索中得到的收益大于原始 ANN 吞吐。确实存在真正的例外见下节。什么时候外部向量数据库仍然有意义有三种情况会真正反转上面的结论。超大向量数的多租户 SaaS。如果你为几百个租户各存几千万条向量pgvector 的索引构建时间和共享资源争用会成为真问题。Pinecone 的 serverless 索引和 Weaviate 的租户隔离值得那份运维成本。Agent memory 与真实 RAG 语料共享基础设施。如果你的团队已经为百万级文档的产品 RAG 运行向量数据库把 agent memory 叠加到同一套基础设施上可能比另起一套 Postgres 更高效——向量库的边际成本已经付过了。读吞吐主导的负载。有些 agent-memory 部署企业知识库上的长尾召回、多区域读副本形态上更像 RAG 而非 agent memory。专用向量数据库就是为这种形态设计的。这些都不是默认情况。它们是负载已经跨回向量数据库形态领域的边界情形。Agent Memory 的更好默认方案适合大多数 agent-memory 负载的默认架构一条学习流水线把事实、实体、边和合成观察写入同一个 Postgres——pgvector 管 embedding、图表管边、时间索引管事实生命周期多策略检索实现为对同一个数据库的并行查询在应用层合并在应用层对合并结果做 cross-encoder 重排以单个容器部署像任何 Postgres 一样备份。这就是 Hindsight 实际发布的架构而且不是巧合。架构之所以这样选是因为负载要求如此负载之所以这样要求是因为 agent memory 不是 RAG。自托管只需要一条 Docker 命令存储用的是嵌入式 PostgreSQL——没有需要额外搭建的外部向量库也没有需要并行运维的图数据库。结论正确的问题不是该为 agent memory 运行哪个向量数据库而是两个问题检索上游的学习流水线到底做什么我的检索混合形态到底是什么样对大多数团队答案是事实抽取、实体解析、矛盾处理和反思以及一个大多不是语义相似度、大多不在十亿级、大多写密集、大多小到可以和应用数据并存的检索混合形态。一个 Postgres 同时承载这两层比单独的向量数据库更好运维成本还更低。外部向量数据库在它们被建造的用途上依然出色。Agent memory 通常不在其中——而其中最不像 RAG 的部分是学习层不是搜索层。延伸阅读仓库内对应文档本文档原文The Case Against External Vector DBs for Agent MemoryHindsight 项目总览与架构背景见 hindsight-api-slim/README.md四路并行检索实现engine/search/retrieval.py、engine/search/fusion.py、engine/search/graph_retrieval.py向量后端分派与索引策略hindsight_api/_vector_index.py相关测试test_recall_min_score.py、test_interleave_fusion.py、test_combined_scoring.py【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。