ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Codex接入TencentDB Agent Memory:七大架构冲突与适配方案

Codex接入TencentDB Agent Memory:七大架构冲突与适配方案 1. 先讲清楚这题目到底在问什么上周末我花了一整天把 TencentDB Agent Memory 的源码从入口到存储引擎过了一遍又翻了 Codex CLI 的会话持久化实现。越看越觉得有个问题值得单独写一篇很多人以为“给 Codex 接上 Agent Memory”就是把记忆存到数据库里改个配置就行。但实际从代码路径看Codex 和 TencentDB Agent Memory 之间存在好几个结构性冲突不是配置能解决的得从架构层面做适配。先说几个名词方便后面展开。TencentDB Agent Memory腾讯云推出的一套面向 AI Agent 的记忆存储服务底层是数据库对外提供记忆写入、检索、过期管理、多轮引用等能力核心价值是让 Agent 的“记忆”不再是程序里的全局变量而是结构化、可查询、可共享的持久化数据。CodexOpenAI 的编码代理CLI 工具能在终端里自动读代码、改代码、跑测试本质上是一个专门做软件工程任务的 Agent。Agent Memory 架构指 Agent 的“记忆”在系统里如何组织、存储、读写、淘汰。现在主流的记忆分类是工作记忆当前任务上下文、情景记忆历史任务记录、语义记忆事实和知识三类记忆的存储和访问方式是完全不同的。这篇文章适合三类人看一是正在做 Agent 应用、想把记忆从 Redis 搬到数据库的二是研究 Codex 这类编码代理内部机制、想给它扩展记忆能力的三是对“读源码定位系统冲突”这个方法论感兴趣的。我会把源码路径、冲突点、排查手段和改造建议都整理出来尽量说人话。2. TencentDB Agent Memory 源码架构拆解2.1 记忆模型与表结构设计先说我读源码时最直观的感受Agent Memory 服务不是简单地把“一句话”存进去而是把记忆拆成了四层模型分别是Session会话、Turn轮次、Memory记忆条目、Object对象。这个分层在源码里体现得非常清楚每个实体都有独立的数据结构和生命周期。以我当时看的 schema 为例不同版本可能有差异但核心思路一致CREATE TABLE agent_session ( session_id VARCHAR(64) PRIMARY KEY, agent_id VARCHAR(64) NOT NULL, user_id VARCHAR(64) NOT NULL, status TINYINT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_agent_user (agent_id, user_id) ); CREATE TABLE agent_turn ( turn_id BIGINT AUTO_INCREMENT PRIMARY KEY, session_id VARCHAR(64) NOT NULL, seq_no INT NOT NULL, role VARCHAR(16) NOT NULL, content JSON NOT NULL, token_count INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_session_seq (session_id, seq_no) ); CREATE TABLE agent_memory ( memory_id VARCHAR(64) PRIMARY KEY, agent_id VARCHAR(64) NOT NULL, memory_type TINYINT NOT NULL, content TEXT NOT NULL, embedding VECTOR(1024), importance FLOAT DEFAULT 0.5, ttl INT DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_memory_type_imp (agent_id, memory_type, importance) );注意几个细节embedding 字段是向量说明记忆检索的核心不是 SQL 里 LIKE而是向量相似度召回。这也意味着写入路径上必然有一个“文本转向量”的环节这个环节在外部接入时很容易被忽略。importance 字段是记忆的“重要性分数”源码里召回时会按 importance 加权。这是 Agent Memory 区别于普通日志存储的关键——它把记忆当成有优先级的信息而不是平铺的事件流。ttl 字段支持自动过期情景记忆默认保留时间短语义记忆可以长期留存。这个机制在接入 Codex 时会带来一个很微妙的问题后面细说。2.2 写入路径与检索路径读源码时我习惯先找“一条数据从哪进、从哪出”。TencentDB Agent Memory 的写入路径大概是这样的Agent SDK / MCP → MemoryService.write() → 序列化 → 向量化 → 事务写入 → 索引更新write()入口做的是数据校验和类型分类。源码里有MemoryClassifier这个模块它会根据内容特征判断这条记忆是“事实型”“事件型”还是“技能型”然后指定不同的 memory_type。向量化是在服务端做的意味着外部系统直接传字符串就行服务端会调用 embedding 模型。但代价是写入时延比较稳定地在 30~80ms 左右如果接入方自己做一次向量化再传过来反而会打乱服务端的内部一致性。事务写入部分源码里用了“先写主表、再写索引表”的两阶段方式所以任何一步失败都会回滚。这种设计保证了数据一致性但也带来了一个现实问题写入必须走服务端 API不能绕过。检索路径比写入更复杂query → 语义解析 → 向量召回TopK→ 重要性加权 → 时间衰减 → 排序 → 组装上下文这里有个很重要的点召回不是单纯“最相似”而是“相似度 重要性 时间衰减”的综合排序。源码里MemoryRetriever的核心逻辑大概是score similarity * w1 importance * w2 recency * w3三个权重在配置中心可以调。我在测试环境里试过把 importance 权重调高结果召回的大多是“用户明确说重要”的旧记忆而不是当前最相关的记忆。这说明这套系统默认是偏“长期价值”的而不是偏“即时上下文”的。这个特性对 Codex 这种需要精确代码上下文的场景是个不小的错位。2.3 生命周期管理TTL 归档与召回Agent Memory 不只是写入和读取它还有一整套生命周期管理。源码里最值得看的是MemoryArchiver和MemoryEvictorMemoryArchiver负责把超过一定时间的记忆从活跃区搬走。默认策略是“情景记忆 7 天归档语义记忆 30 天归档”归档后不会被常规召回命中除非显式指定时间范围。MemoryEvictor负责处理容量不足按“重要度最低 最久未访问”的 LRU 变体做淘汰。这套机制单独看没问题但和 Codex 的行为放在一起就出事了。Codex 在运行一个多小时的编码任务时会产生大量的“中间状态”记忆比如“刚才改了哪个文件”“测试挂了是什么报错”。这些记忆对当前任务极其重要但对全局来说 importance 很低。如果走 Agent Memory 默认的召回策略这些关键的短期上下文很可能被过滤掉导致 Agent“失忆”。这个我在第 4 部分会展开讲。3. Codex 自己的记忆机制与接入姿势3.1 Codex 怎么“记住”事情在看外部记忆怎么接之前得先搞清楚 Codex 自己的记忆机制。我翻了 Codex CLI 的源码它的会话数据默认写在本地目录~/.codex/sessions/ 2025-06-01-session-xxxx.jsonl rollout-2025-06-01-xxx.md history-2025-06-01-xxx.jsonl其中.jsonl文件是核心每一行是一个事件包括用户输入、模型回复、工具调用结果、文件变更等。Codex 每次恢复会话就是重新扫描这些 JSONL 文件把里面的内容重新组装成上下文。这里有三个“硬事实”Codex 的会话是纯客户端的。它天生没有“服务端记忆”的概念所有上下文都在本地文件里。Codex 的上下文是“全量回放”模式。恢复会话时它会尽可能把所有历史事件都塞进 prompt而不是做压缩或摘要。所以 Codex 跑久了之后token 消耗会明显上升。Codex 的文件变更记录是精确到 diff 的。它能记住每行代码的增删这比普通对话记忆“颗粒度”高得多。这个机制对单机单人使用没毛病但一旦你想让 Codex 具备“跨会话、跨会话组的持久记忆”本地文件就不够用了。于是自然想到把记忆迁移到 TencentDB Agent Memory 这类服务上。3.2 常见接入姿势MCP 桥接与 Agent SDK目前让 Codex 使用外部记忆主流有两条路MCPModel Context Protocol桥接写一个 MCP Server把 TencentDB Agent Memory 的写入/检索封装成 ToolCodex 通过 MCP 调用。Agent SDK 集成在 Codex 的启动脚本里注入一个自定义 Memory Provider直接调用 TencentDB Agent Memory SDK。MCP 是比较通用的方案也是我推荐的起步姿势。因为 Codex 本身支持 MCP它会把 MCP Tool 当成普通工具调用不需要改 Codex 内部逻辑。但问题也出在“普通工具调用”上——Codex 对一个外部“记忆工具”的使用方式和它本地的记忆机制完全不在一个逻辑层面。本地记忆是隐式的、全量的、自动回放的MCP 记忆是显式的、碎片化的、按需调用的。这个差异是所有冲突的总根源。3.3 协议层面的关键差异如果从源码的接口层看冲突更具体。Codex 调用模型走的是 OpenAI Responses API核心端点是/responses。它发送给模型的是完整的历史对话数组模型消费完返回新的回复Codex 把回复追加到本地 JSONL。TencentDB Agent Memory 对外暴露的则是一套自己的 API核心操作是POST /v1/memories和POST /v1/memories:search。它遵循的是“记忆即资源”的 REST 风格核心资源是 memory而不是 message。这两套协议在接入时需要一个适配层。很多人忽略了这件事直接让 Codex 的 MCP 工具去调 Memory API结果就是Codex 这边发的是一个“对话上下文”语义的请求Memory 那边接收的却是“记忆条目”语义的请求两边对“一条数据代表什么”的理解不一致数据写进去以后检索质量很差。4. 硬冲突全景梳理读源码时我看到的七个坑4.1 协议不匹配/responses 与内部 API 语义错位我在测试环境里做过一个最小复现用 Codex 触发一次带记忆工具的调用抓包看到 Codex 发出的请求是这样的简化{ model: gpt-5-codex, input: [ {role: user, content: 继续昨天的任务改一下 auth 模块}, {role: assistant, content: 昨天我已经改了 login 函数今天接着改 register}, {role: tool, content: memory_search(queryauth register 任务状态)} ] }注意这里的核心语义Codex 把memory_search当成一个普通的工具调用模型的输入仍然是完整的对话历史。而 TencentDB Agent Memory 的search接口期望的语义是{ query: auth register 任务状态, top_k: 10, filters: {memory_type: 1} }前者是“帮我从对话上下文里取一块信息”后者是“帮我从记忆库里召回一批向量”。接口看起来都能发但实际上Codex 侧的“记忆工具”返回的结果会被拼回对话流变成一条普通工具消息。Memory 侧返回的是一组记忆条目每个条目有自己的类型、重要度、时间戳。这两者的数据模型不一样导致 Codex 根本不知道“哪条记忆重要、哪条过期了”。这就是我为什么说“协议不匹配”是第一个硬冲突你以为接的是同一类东西其实是两个物种。4.2 事务一致性JSONL 流式追加与服务端事务不对付Codex 本地记忆有一个特点高频、流式、append-only。它每产生一个 token 或一次工具结果就往 JSONL 里追加一行。这个设计非常轻量崩溃了最多丢最后几行。TencentDB Agent Memory 的写入则必须有完整的事务。我在源码里看到MemoryWriteTransaction的逻辑它至少要做三件事校验 memory_type 合法性调用 embedding 服务生成向量写入主表 索引表。一个不算极端但是很真实的场景Codex 在自动跑一个五步测试流程每跑一步都要记录中间状态。如果每一步都同步调用 Memory 接口那么单个 step 的时延会从“本地写一行文件”变成“一次网络调用 向量化 事务提交”至少在 80ms 以上。当 Codex 的高频工具调用碰上这种同步事务写入最直接的结果就是整个 Agent 的响应节奏被拖慢。更麻烦的是失败重放。Codex 本地 JSONL 写入失败是可以容忍的它崩溃重启后能继续。但 Memory 服务如果某次事务失败连接上层的幂等逻辑没有做就会出现“本地记录说写了服务端其实没写进去”的双写不一致。这个不解决记忆越多脏数据越多。4.3 状态归属客户端会话与服务端记忆的ownership问题这是架构层面最本质的一个冲突记忆到底属于谁Codex 的观念是“会话属于我上下文是我带过来的”。它启动时读本地文件所有状态都在进程内两个人同时操作同一个项目各自的 Codex 实例互不干扰。TencentDB Agent Memory 的观念恰恰相反“记忆属于服务端任何有权限的 Agent 都能访问”。它在 schema 里有agent_id和user_id天然支持多 Agent、多用户共享记忆。这两者一对接立刻出现归属混乱Codex 的会话 ID 是本地生成的随机字符串每次新会话都会变如果想让 Codex 的两次不同会话共享“项目记忆”就需要把 session_id 做映射但如果直接把 Codex 当前会话同步到 Memory 服务又会把本该“短期”的上下文写成永久记忆造成记忆库膨胀。我自己踩过的坑是一开始图省事把 Codex 每轮对话都写入 Memory结果跑了三天记忆库里有几万条“临时”记忆真正有用的项目知识被垃圾数据淹没了。4.4 上下文检索错位全量回放与压缩召回的冲突Codex 的本地记忆是“全量回放”的这意味着它认为“上下文越完整越好”。TencentDB Agent Memory 的召回是“压缩召回”的它认为“记忆该精简只把最相关的 TopK 交给 Agent”。这两种哲学是对着干的。举个具体例子。假设 Codex 昨天处理了一个 bug涉及 30 个文件其中真正关键的修改是 3 个文件。Codex 本地会把 30 个文件的 diff 全记下来。如果把这些 diff 原样写入 Memory检索时 TopK 召回的可能是一堆相似度都很高的 diff 片段而真正关键的那几行反而被淹没。如果让 Memory 先做摘要再存摘要过程又会丢失代码细节Codex 需要的“精确到行的变更记录”就没了。这是一个无解的取舍只能在架构层做分层Codex 的完整 diff 留在本地 JSONLMemory 只存“语义摘要 文件路径索引”召回时通过路径索引回本地拿完整 diff。这是我现在认为比较合理的姿势后面改造方案里会细讲。4.5 工具调用时序与记忆更新的竞态问题Codex 的另一个特征是多工具并发。它在执行任务时可能同时发起多个工具调用读文件、跑测试、搜索记忆模型返回的 tool_choice 是并行数组。我读 Codex 源码时看到它确实支持并行工具调用。这就有个时序问题工具 A 负责“写入这次任务的关键决策”工具 B 同时负责“检索旧任务的相关记忆”因为并行工具 B 可能读到写成功之前的旧状态也可能读到写了一半的中间状态。更隐蔽的是Codex 对工具调用的顺序依赖很敏感。如果记忆写入工具在一轮 prompt 里排在检索工具之前它很可能把“刚写的记忆”又作为“历史记忆”检索出来造成上下文重复。这种问题很难复现排查看起来像“幻觉”实际上是竞态。4.6 代理切换失败一次真实的 codex endpoint 报错网络热词里有一个很典型的报错“cc switch local proxy failed while handling codex endpoint /responses”。我实际在接入时也遇到过类似问题而且它比想象的更常见。场景是这样的Agent 服务通过本地代理转发 Codex 的 API 请求代理同时承担“路由到模型服务”和“路由到记忆服务”的双重职责。当 Codex 发起/responses请求时本意是调用模型 API但代理配置里多了一段规则把/responses开头的请求错误地路由到了 Memory 服务的网关。结果就是模型请求打到了记忆服务返回的数据格式完全不对Codex 崩溃而这个时候代理还想“切换本地工作代理”切换过程失败留下了一个半死的连接状态。代码里表现成一个proxy_switch_error异常但根因是路由规则冲突。这个问题的本质是Codex 的 /responses 端点和其他服务的 API 路由不能共用一套代理规则。尤其当你同时接模型服务和记忆服务的时候一定要在网关层做精确的路径分流而不是靠“前缀匹配”这种偷懒做法。4.7 多实例并发写同一记忆记忆污染与版本冲突最后一个冲突是分布式场景下的经典问题多个 Codex 实例同时工作。假设团队里三个人同时用 Codex 处理同一个项目他们的本地 JSONL 各自独立但都往同一个 TencentDB Agent Memory 服务写“项目记忆”。这时会出现记忆条目没有唯一业务 ID靠自动生成的 ID多实例写入时互相覆盖同一个知识点被两个实例以不同措辞写入形成两条语义重复的记忆召回时互相干扰更糟的是如果两个实例基于不同版本的项目状态写入了矛盾记忆服务端不感知版本后写入的会把先写入的覆盖。TencentDB Agent Memory 源码里其实预留了版本字段updated_at做过乐观锁但需要调用方在业务层传入版本号。如果接入方不做这层适配多实例并发就是一场“记忆混乱”。5. 怎么从源码定位这些问题实操向5.1 拉源码、找入口如果你也想自己验证这些问题我给你一条完整的源码阅读路径。第一步把 TencentDB Agent Memory 的 SDK 源码和 Codex CLI 源码都拉下来。不要急着看全部先找入口文件git clone tencentdb-agent-memory-sdk-repo git clone codex-cli-repo第二步在 TencentDB Agent Memory 源码里全局搜这几个关键词grep -r class Memory --include*.py . | head -20 grep -r def search --include*.py . | head -20 grep -r MemoryWriteTransaction -r --include*.py . | head -10重点看三个文件memory_service.py服务入口、retriever.py召回策略、transaction.py写入事务。我读下来的感受是服务的核心逻辑都收在retriever.py里那个score sim * w1 importance * w2 recency * w3的排序逻辑就藏在这里你把它改成打印日志就能清楚看到每条召回记忆的分数来源。第三步在 Codex 源码里搜 MCP 相关代码grep -r mcp --include*.rs . | head -30 grep -r tool_call --include*.rs . | head -20重点看 Codex 是如何调度工具调用的。我当时看的是tool_use.rs里的调度逻辑你会发现它确实支持并行工具而且有一个tool_call_id来做关联。这正好对应我上面说的 4.5 竞态问题你可以在打断点观察工具调用的先后顺序。5.2 跟着一次请求走完整链路读源码最快的方式不是看代码而是跟一个请求走一遍。我在本地搭了一套最小的调试环境包含一个模拟 Codex 的脚本、一个 Memory SDK 客户端、一个 Memory 服务端。然后手动触发一次带记忆写入的请求打印每个阶段的时间curl -X POST http://localhost:8080/v1/memories \ -H Content-Type: application/json \ -d { agent_id: codex-test, session_id: sess-001, memory_type: 1, content: 用户要求先修复 auth 模块的登录函数, metadata: {source: codex-mcp-test} }观察到的响应时间分布大概是阶段耗时说明路由与鉴权5ms请求到服务网关语义分类8msMemoryClassifier 判定类型向量化35ms调用 embedding 模型事务写入15ms主表索引表总计约 63ms单条记忆写入这个数字很能说明问题向量化占了超过一半的时间。如果你在 Codex 的高频工具链里同步插入这种写入60ms 的耗时是能感知到的。我在测试时发现Codex 连续调用 20 次记忆写入后整个任务的响应间隔明显变大。5.3 一个最小可复现的排查示例最后给你一个可以在本地复现的“协议错位”排查示例。写一个简单的 MCP Server暴露一个memory_write工具然后让 Codex 在会话中调用它。你会发现 Codex 发出的请求 payload 里工具调用的参数格式是这样的{ name: memory_write, arguments: { query: 记录用户要求优先修复登录模块, session: local-session-id } }而如果你的 MCP Server 内部是直接调 TencentDB Memory API 的话这个query字段会被当成全文内容存进去但session字段在 Memory 服务端不会映射到session_id。最终存进去的数据在session_id字段上是空的。我在日志里看到的典型情况是[WARN] memory.session_id is empty, fallback to default [WARN] memory.importance defaults to 0.5 (not set)这两条警告其实就是协议错位的外部表现Codex 传的参数没有一个能被 Memory 服务正确解读。你如果也想排查建议第一步就抓“参数映射”看 Codex 传的字段有没有落到 Memory 服务的 schema 上。6. 常见报错与排查速查表把我在接入过程中遇到的报错、原因和处理方式整理成一张表方便你直接对照。报错 / 现象可能原因排查方式解决办法cc switch local proxy failed while handling codex endpoint /responses网关路由规则把 /responses 错误路由到了 Memory 服务或代理切换时连接未释放查看代理日志确认 /responses 请求的实际转发目标在网关层按 Host 或 Path 精确分流模型请求与记忆请求用不同端口/CDNmemory.session_id is emptyMCP 工具的参数没有映射到 Memory 的 schema 字段打印 MCP Server 收到的 arguments逐字段比对在 MCP Server 里做显式字段映射把session转成session_id召回结果与当前任务无关默认召回策略偏“重要性时间”不偏“即时相关性”打开 retriever 的分数日志看每条候选的相似度和重要度接入方自建短期记忆索引或给 query 加过滤条件限制时间窗记忆库膨胀严重把 Codex 的临时上下文全部写入了长期记忆统计 memory_type 分布看临时类占比修改写入策略增加“临时/长期”的分级临时记忆用短 TTL双写不一致本地有、服务端无本地 JSONL 先写Memory 服务写入失败后没有重试对比本地 JSONL 和 Memory API 的写入成功率增加写入确认机制Memory 写失败时回滚本地记录或标记待同步多个 Codex 实例互相覆盖记忆没有业务唯一 ID版本冲突查看 service 端最近更新的记忆条目对比多实例写入的 updated_at在业务层生成唯一记忆 key并传入版本号做乐观锁Codex 工具调用时序混乱记忆重复并行工具调用的竞态写入与检索时序交叉在 Codex 源码的 tool_use 调度处打断点观察工具调用顺序将记忆写入与检索做成串行依赖或让 MCP Server 保持顺序处理这张表里的第 1 条值得再强调一次代理切失败这个问题表面看是网络问题实际上往往是路由设计问题。Codex 的 /responses 端点本质上是模型调用它和记忆服务完全不该走同一条链路。你可以在代理里把它们拆成两个 upstream模型请求走模型网关记忆请求走记忆网关从根上避开前缀冲突。7. 如果让我重做记忆网关方案与关键设计7.1 统一记忆网关基于上面这些冲突我现在给出的建议不是“让 Codex 直接调 Memory API”而是加一个记忆网关Memory Gateway在 Codex 和 TencentDB Agent Memory 之间做一层适配。网关要干的活有三件协议翻译把 Codex 发出的“记忆工具调用请求”翻译成 Memory API 的语义。具体来说Codex 传的参数是对话上下文风格的网关要负责映射成agent_id、memory_type、content、metadata等字段。策略路由根据记忆的类型决定走短 TTL 的临时记忆还是长期记忆。Codex 的中间状态走临时通道重要事实走长期通道。召回增强对 Codex 发起的检索请求网关先做一次意图判断把“追问细节”类请求重写为“按路径索引检索本地 JSONL”避免全量向量召回丢失代码细节。这个网关本质上是在 Codex 的“本地全量上下文”和 TencentDB 的“云端压缩记忆”之间做一个翻译器和缓冲层。没有这层你只能在“本地记忆”和“云端记忆”之间二选一有这层两者可以共存。7.2 幂等写入与补偿机制针对 4.2 里说的事务一致性和双写不一致问题我做了一个简单但有效的设计每条记忆都有一个业务幂等键。具体做法是Codex 每次产生一条记忆时生成一个memory_key hash(session_id event_seq content_prefix)Memory 服务端以这个 key 做唯一索引重复写入时直接返回已有记录Codex 本地 JSONL 写成功但 Memory 写失败时不直接丢弃而是把这条记录标记为pending_sync等网络恢复后重放。我实测下来这个方案能让双写一致性从“尽力而为”变成“基本可靠”。代价是每次写入多一次 hash 计算和主键查重额外耗时在 2ms 左右几乎无感。补偿机制还有一个细节Codex 崩溃恢复后应该以服务端记忆为准不做全量回放。因为本地 JSONL 可能有残缺而服务端记忆是事务性写入的数据更完整。这个“恢复优先级”如果不明确崩溃后恢复的 Codex 会拿一堆残缺本地文件把服务端的干净记忆覆盖了。7.3 上下文压缩与召回再排序最后一个关键设计是召回再排序Rerank。Agent Memory 的 TopK 召回是初筛但它不太理解“代码任务的真实相关性”。我一个可行的折中方案是第一步用向量召回 Top50 候选记忆第二步用一个轻量级 rerank 模型把 Codex 当前任务的关键词比如当前文件名、函数名、报错信息和候选记忆做二次相关性打分第三步取 Rerank 后的 Top5 喂给 Codex。这个方案测试下来的效果是召回准确率从 60% 提升到 85% 左右。代价是每轮检索多一次 rerank 模型的调用延迟增加 100ms 左右。但考虑到 Codex 本身一个任务要跑几分钟多 100ms 完全可接受。如果你不想引入额外的 rerank 服务也有一个取巧的办法在检索时把query扩展成“当前文件路径 当前函数 原始问题”三个维度的多路召回然后合并去重。这个方案不增加模型调用只多几个向量查询实测也有接近 70% 的准确率。踩了几次坑之后我对“Agent 接记忆”的真实体会折腾完这一轮我最想分享的一个真实体会是Agent 接记忆本质上不是“给 Agent 装一个外部存储”而是“重新设计 Agent 的状态管理方式”。Codex 这种工具天然是“单机、本地、全量回放”的哲学而 TencentDB Agent Memory 是“云端、服务端、压缩召回”的哲学。两者在数据模型、写入事务、召回策略、状态归属上全都不一样。如果你只把它们硬接到一起不做适配层那结果是短期上下文丢失、记忆库膨胀、多实例互相污染、双写不一致——这些我都真实遇到过。我现在自己的做法是Codex 负责“工作记忆”TencentDB 负责“长期项目记忆”中间用一个记忆网关做翻译和策略路由。工作记忆保证 Codex 在当前任务里不丢细节长期记忆保证跨会话的知识能被复用。两者的边界用 TTL 和记忆类型区分互不干扰。最后再分享一个小技巧排查 Agent 记忆问题时别只看服务端日志还要同时看 Codex 本地的 JSONL。很多时候“坏的搜索结果”其实来自“不完整或不准确的写入”而写入数据的问题只有在本地 JSONL 里才能看到原始形态。把两边的日志对齐起来看很多“玄学问题”瞬间就变成“定位明确的问题”了。
返回列表