返回文章
数据与知识·约 10 分钟·Kain

我本来只想找回一段会话,后来给自己做了套可观测系统

从 Dex 的会话检索到 EchoVault,找回决策过程,再让后续 Agent 少猜一点。

我本来只想找回一段会话,后来给自己做了套可观测系统的封面
文章目录

上周工作里,我被一件挺窝火的小事卡住了。

有个技术实现,我很确定以前跟 Agent 掰扯清楚过,方案也真的落了地。可等我想把它找回来,脑子里只剩一句“肯定做过”。至于当时用的是 Codex 还是 Claude Code,在哪个项目,哪场会话,全没印象。

最难受的地方就在这儿:东西没丢,我却找不到。

现在手边的 Agent 越来越多。Codex 用,Claude Code 用,WorkBuddy 和 QwenWork 也用。平时切来切去挺顺手,到了翻旧账的时候,代价一下子冒出来了。每个工具都攥着一部分历史,我只能先猜入口。猜错一个,再换下一个。项目一多,时间一长,这跟翻几个没有目录的旧抽屉差不多。

我原以为自己缺的是一层 Agent memory。真往下想,发现不是。我连原始会话在哪都不知道,谈什么让 Agent 记住。

数据还在,入口没了

我想找回的也不只是一段代码。代码仓库里可能还有结果,可当初为什么这么选、中间否掉过什么、改完有没有验证,这些都埋在会话里。少了它们,最后只剩一个已经看不出取舍的实现。

这些东西其实都还在本地。Claude Code 有自己的 JSONL,Codex 有自己的 session,Cursor、OpenCode 也各有存储。问题只是它们互相不认识,我也没有一张统一索引。

那一刻我才把问题想明白:这跟“Agent 忘了我”不太一样。

如果是 memory,中心通常在下一次运行。系统从历史里挑一些内容,再塞回当前上下文,让 Agent 延续之前的判断。我的问题更笨,也更基础:过去那件事到底发生在哪里?

一个面向未来,一个面向过去。

感受上很接近,都是从历史记录里找东西;控制中心却不一样。memory 决定 Agent 下次带回什么,检索应该把选择权留给查询的人。先搜到原会话,再决定哪些内容值得继续使用。

我先不想什么长期记忆了。谁能让我把那场会话搜出来,谁就有用。顺着这个需求,我找到了开源项目 Dex。

我需要的不是另一个聊天客户端

Dex 的定位很直接:把 Cursor、Claude Code、Codex、OpenCode 等编码 Agent 的会话同步到本地 LanceDB,统一做全文和语义检索。

它没有试图替代这些 Agent,也不要求我以后只能用一个入口。各聊各的,Dex 在后面收数据、做标准化、建索引。

Cursor ───────┐
Claude Code ──┤
Codex ────────┼→ 统一会话结构 → 本地索引 → 检索
OpenCode ─────┘

这个方向正好对胃口。我当时没想造一套新系统,只想先把搜索框跑起来。结果项目拉下来没多久,Windows 先给了我一记闷棍:原版跑不了。

没办法,只能开始拆。

8 月 8 日,先把 Windows 路径和 embedding 支持补上。随后又加了 WorkBuddy、QwenWork 两个数据源。它们的会话目录和数据格式都不一样,只能各写一套 adapter,把发现、读取、解析和标准化分开处理。再往后,原来的 CLI 被挪进独立 workspace 模块,为后面的扩展留位置。

最初这些改动都围绕一件事:别谈愿景,先让我机器上的会话真的能被搜到。

但很多需求就是这么长歪的。等不同来源的数据第一次规规矩矩摆到一起,我盯着那些会话,突然觉得不太对。这里面躺着的,好像不只是以前问过的问题。

这些会话,也在记录我

一场 Agent 会话里,除了代码和命令,还会留下一个人做事时的很多痕迹。

我什么时候让 Agent 先查清楚再改,什么时候直接授权它继续;哪些操作我要求停下来确认;方案跑偏以后,我是怎么纠正的;任务结束时,我在意代码、测试,还是文档和交付物一起落盘。

单看一场,这些只是当时随口说的话。放到几十场、上百场里,有些选择却会一遍遍冒出来。原来我每次纠正 Agent、催它验证、拦住一次越界,都在不知不觉地留下数据。

这个念头让我有点兴奋。既然会话已经可以统一查询,能不能顺手把镜子也立起来,看看自己到底是怎么工作的?

这里的“观察”并不是每天用了多少 Token,或者做一张活跃度热力图。那些统计 Dex 本身就能做。我更想知道的是:

  • 我通常怎样推进一个任务;
  • 哪些判断会反复出现;
  • 我如何划分 Agent 的自主执行和人工确认;
  • 最近主要在做什么;
  • 一个新的 Agent 接手工作时,哪些默认可以少磨合几轮。

到这里,需求已经悄悄换了一副样子。Dex 负责回答“做过什么、在哪里”,我还想知道“这些记录究竟能支持什么判断”。

后面这部分,我把它叫作 EchoVault。

做过,不等于擅长

兴奋没持续多久,我就意识到画像这件事特别容易做歪。

最省事的方案,是把一批会话丢给模型,让它总结“这是一个怎样的用户”。Prompt 不难写,报告几分钟就能出来,而且多半写得挺像。问题也出在这个“像”上:人很容易被一段顺耳的描述说服,然后忘了追问它凭什么这么判断。

某段时间一直在修部署问题,能不能说明我擅长部署?不能。也可能只是项目最近老出问题。

我在一个仓库里反复要求先写测试,能不能说明这是我的长期偏好?也不能。那可能只是仓库的 AGENTS.md 在要求,换个项目未必成立。

一场会话里我让 Agent 自主执行,能不能推导出以后都不用确认?更不能。那次任务也许风险很低,甚至只是一次临时授权。

“发生过什么”和“我是什么样的人”之间,隔着一层很容易被忽略的推断。模型特别擅长把这层缝得严严实实,读起来甚至比我自己总结得还像那么回事。

像,不代表证据够。

我不想最后做出一本 AI 算命书。所以 EchoVault 先给自己加了几条限制:单场会话只能产生事件,不能产生长期原则;任务频率不能证明能力、绩效、偏好或正式职责;仓库指令和第三方引用不能冒充用户本人的表达;项目里的规则也不能自动升级成全局习惯。

这些限制不讨巧。报告少了很多斩钉截铁的结论,代码反而多出一大截。但我心里踏实了一点:画像终于不只是一段模型印象,而成了一个可以逐条检查的工程问题。

先保留证据,再允许归纳

现在这条链路大致分成五层:

原始会话
  ↓
可回溯证据
  ↓
候选假设
  ↓
规则评估
  ↓
工作模型
  ↓
报告与 Agent 上下文

真正跑起来时,链路还要再细一层。Dex 只读提供会话,程序先做锚点过滤,再交给分析模型提取单会话事实;证据校验、向量化和候选聚合都由程序控制,最后才调用归纳模型。分析缓存和 embedding 缓存留在各自阶段,某次模型调用失败,不用把前面的工作全部重来。

EchoVault 从 Dex 会话到评估报告的数据流
EchoVault 从 Dex 会话到评估报告的数据流

这张图里有两个 LLM 节点,但决定证据能不能进入画像的并不只有模型。原话校验、来源标注、秘密过滤、作用域、独立会话数和冲突检查都在程序侧完成。分析模型负责发现事实,归纳模型负责把通过门槛的材料写成可读报告,中间不能直接跳过去。

第一层只从单场会话里提取发生过的事情,包括行为事件、任务事件、环境事实和企业资源事实。每条证据都要能回到用户原话,Assistant 的总结只能帮助理解任务,不能拿来证明个人习惯。

第二层把语义接近的事件聚在一起,形成候选假设。向量在这里负责找相似项,仅此而已。它不能因为两句话靠得近,就宣布一条工作原则成立。

门槛在第三层。程序会检查证据来自几场独立会话、是否跨项目、是不是用户明确表达过普遍规则、支持方向有没有冲突。单个项目里重复十次,仍然可能只是项目规则;一场会话里重复几遍,也不会增加独立性。

通过评估的假设,才交给终态模型整理成工作习惯、技术原则和协作边界。模型可以负责表达,不能绕过前面的门槛,也不能从几个候选组里随手拼一条听起来更完整的新结论。

最后再做一次确定性审计:引用是不是真的存在,个人与技术证据有没有串卷,报告里有没有把秘密带出来,归纳失败时是不是老实保留空结果。

流程图说明的是“怎么评估”,还缺一个更直接的问题:报告到底评估了什么?我把当前实现里的对象、门槛和产物重新整理成了下面这张图。

EchoVault 评估对象、证据门槛与三卷报告图谱
EchoVault 评估对象、证据门槛与三卷报告图谱

它先观察四类事实,再用来源、独立性、作用域、一致性和跨情境覆盖检查长期假设。通过后也不混成一份笼统的“个人画像”,而是分别进入个人、技术和企业工作环境三卷。最下面那一栏同样重要:人格、心理、能力、绩效和职级不在评估范围内,任务频率也不能拿来证明擅长或偏好。

这套流程并不保证画像一定正确。它至少能告诉我,一条结论是从哪里来的,为什么暂时成立,又会在什么情况下失效。

可观测,不等于给自己打分

我一开始确实用了“评估自己”这个说法,甚至觉得挺酷。做着做着,我开始对这个词发怵。评估一旦没有边界,离给人贴标签只有一步。

会话数据没有资格回答一个人聪不聪明、能力强不强,更碰不了职级和绩效。一个人做某类任务多,可能因为擅长,也可能因为团队里没人接,甚至可能只是系统总在同一个地方出故障。硬把频率翻译成能力,看着像分析,其实挺不负责任。

当前能做的,是观察工作协作中真实留下的信号:任务类型、参与角色、选择方式、纠正记录、交付习惯、环境限制和最近的项目重心。然后再检查其中哪些信号足够稳定,可以变成未来 Agent 的暂定默认。

这更接近软件里的 observability。

系统运行时,我们不会只看一句“服务健康”。我们会保留日志、指标和 trace,需要时回到现场。个人工作画像也该这样。最终报告可以短,但后面必须留着证据和评估过程;结论发生冲突时,直接把冲突暴露出来。

对我来说,这比一个漂亮的性格雷达图有用得多。雷达图看完容易自我感觉良好,证据链至少会提醒我:别急,这条还只是猜测。

让下一个 Agent 少猜一点

画像做出来以后,我又碰到一个很现实的问题:难道以后每开一场会话,都要先让 Agent 读一遍“我的使用说明书”?光想就觉得累。

最粗暴的做法,是把整份报告塞进每次会话。这个方案很快被否掉了。完整画像里有跨项目规则、近期上下文和企业资源,全部注入既浪费上下文,也容易让旧信息污染当前任务。

现在的做法是先激活一份本地运行时投影,再按任务取最小上下文。

普通协作只加载个人默认;软件工程任务再加载技术原则;进入具体项目,只拿与当前路径匹配的项目规则;企业资源单独查询,不跟着普通画像到处跑。

优先级也写死了:当前用户要求和当前仓库规范,高于历史画像。我尤其在意这一条。我不希望几个月前留下的一句话,被系统加工成一条永久规则,再回来管现在的我。人会变,项目也会变。画像要是不会过期,迟早会从帮手变成包袱。

回头看,这件事的起点小得有点好笑。我只是想找回一个上周做过的技术实现,最后却顺着一堆散落的会话,给自己搭了套观测和评估系统。

Dex 解决了入口问题。EchoVault 则是在入口之上多问了一句:这些散落的协作记录,除了帮我找答案,还能不能让下一个 Agent 少猜一点?

目前检索这段已经跑起来了,画像、评估和运行时上下文也搭出了完整链路。可我还不敢说它真的“懂我”。这话太大。它现在做得更像一个认真做笔记的人:结论从哪来、证据够不够、哪里还在打架,都先记着,等后面的真实使用慢慢校准。

至少下一次再有人说“让 Agent 更懂你”,我大概不会先被这句话打动了。我会先问:它到底记住了哪条证据?如果拿不出来,那可能只是写了一段很像我的话。

继续阅读同主题文章数据与知识