面试被问到“agent的记忆机制怎么设计”,该怎么回答?

我头一次听这个问题的时候,寻思,这不简单,现在模型的上下文那么老长,“用向量数据库存历史对话,每次检索相关内容拼进去”,不就得了。

然后过年吃饭和一个做算法的同学聊到这里,他告诉我,这样回答根本拿不到分。

1.先看GPT咋做的

前阵子网上比较火的一个帖子,有开发者通过对话实验,把ChatGPT的记忆机制逆向了出来。结果挺让人意外的,整套系统没有向量数据库,没有RAG,没有 Embedding 召回,甚至连相似度匹配都没做。就是四层纯结构化设计,干干净净。

我当时也疑惑:GPT又不算Agent,这个例子能说明什么?你先罚一杯!

ChatGPT的确是对话产品,不是严格意义上的Agent。但它的Memory设计思路,刚好就是Agent记忆系统的问题:哪些信息该靠检索获取,哪些压根不需要检索?

2.GPT为啥不选向量数据库?

归结下来就两个原因。

原因一:向量检索天然是模糊匹配,而很多记忆需要精确命中。

比如用户上周说过“我的预算是5万”,今天直接问“预算多少来着?”你要是走向量检索,召回的大概率是一堆沾边的内容,聊过的各种数字、各种花钱的场景……真正需要的那条记录不一定能排在前面。换成结构化存储就不一样了,直接读“用户预算”这个字段,一步到位,想出错都难。

原因二:向量数据库对"信息更新"这件事很不友好。

用户会改主意。上周预算5万,今天说改8万了。向量库里新旧两条都躺着,检索可能同时召回,模型根本分不清该信哪条。但结构化存储本来就支持覆盖,新的值写进去,旧的就没了,永远只保留最新状态。

你当然可以给向量库加metadata、打时间戳、写过滤逻辑,折腾一圈也能达到精确召回的效果。但既然数据本身就是结构化的,还为啥非要用模糊匹配的工具去检索它呢?

就好比你明知道钥匙在左边裤兜里,却偏要把浑身上下翻一遍再排个序。能找到,但也太累了吧。

3.正确做法:按类型分层

记忆不是铁板一块,拆开来看至少有4个层次

①当前对话上下文:压根不用额外存储,滑动窗口天然覆盖。

②用户长期画像:姓名、职业、偏好、目标这类稳定事实。应该做成结构化的用户档案,支持随时修改,精确读写。

③近期交互摘要:用户最近在关注什么、讨论过什么方向。一份轻量的摘要清单就够了,不必保留完整对话原文。

④历史经验库:曾经生效的方案、踩过的坑、处理过的案例。只有这一类,才是向量检索好使的地方。

所以你看,向量数据库只覆盖了四类记忆中的一类,远远算不上万能解法。

4.ChatGPT 被逆向出来的四层结构

实际被扒出来的架构,和上面的分类高度吻合:

第一层

会话元信息(设备、时区、交互习惯)

临时变量

实时微调回复风格,用完即弃

第二层

用户画像(姓名、职业、偏好、长期目标)

结构化档案

支持增删改,按字段精确读取

第三层

近期对话摘要(最近十几轮的主题和要点)

轻量清单

不留原文、不做检索,直接拼入Prompt

第四层

当前对话(最近N条消息)

Token滑动窗口

溢出就丢弃最早的部分

全程没向量库,没RAG,靠的就是分层策略。

5.背后的逻辑

该精确查的就结构化存,该模糊找的才上检索。

向量数据库擅长的是那些开放的、模糊的、没法提前穷举的内容。比方说用户问“上次咱们聊过一个XXX相关的话题”,这种场景下语义搜索确实好使。

但在绝大多数Agent场景里,Memory的核心诉求是精确、可控、可更新:用户预算是多少?用户身份是什么?上一轮选定的是哪个方案?这些都是确定性的事实查询,不是语义相似度问题。

6.向量数据库到底什么时候用?

同时满足三个条件的时候:

  1. 内容本身是非结构化
  2. 数据量会持续增长
  3. 查询方式是模糊语义

典型场景:客服Agent,要从几万条历史工单里找类似案例,这时候向量检索是最优解。

但如果只是让Agent记住用户的基本信息和最近的对话脉络,结构化存储配合摘要机制完全够用,而且响应更快、结果更准、维护更简单。

7.最后

Agent的Memory不是一个单点模块,而是一套分层体系,不同性质的记忆,对应不同的存取策略:

当前上下文

滑动窗口

长期事实

结构化存储

近期脉络

轻量摘要

历史案例

向量检索

向量数据库是个工具,但不是万能的,哪有啥万能钥匙。面试时这么回答,展现的不是你背了多少方案,而是你理解每种方案各自在解决什么问题。

下次再被问到这题,别急着蹦出“向量数据库”三个字。先反问一句:你们的Memory需要承载哪几类信息?

他跟我说,能问出这句,且能针对不同情况做回答,就能加分,我说:那你再罚一杯吧!

#AI求职实录#
SAGIMA经验浅谈 文章被收录于专栏

虽然咱也不算啥大佬,但也是踩过坑、中过招的,我要是早点知道这些,不早就……早就……早就知道这些了嘛~

全部评论

相关推荐

昨天 09:55
已编辑
门头沟学院 Java
2.4 一面2.6 二面2.9 三面(hr面)2.13 oc1.15号收到面试电话那会就开始准备,因为一开始没底所以选择推迟一段时间面试,之后开始准备八股,准备实习可能会问的东西,这期间hot100过了有六七遍,真的是做吐了快,八股也是背了忘,忘了背,面经也看了很多,虽然最后用上的只有几道题,可是谁知道会问什么呢自从大二上开始学java以来,一开始做外卖,点评,学微服务,大二下五六月时,开始投简历,哎,投了一千份了无音讯,开始怀疑自己(虽然能力确实很一般),后来去到一家小小厂,但是并不能学到什么东西,而且很多东西都很不规范,没待多久便离开,大二暑假基本上摆烂很怀疑自己,大三上因为某些原因开始继续学,期间也受到一俩个中小厂的offer,不过学校不知道为啥又不允许中小厂实习只允许大厂加上待遇不太好所以也没去,感觉自己后端能力很一般,于是便打算转战测开,学习了一些比较简单的测试理论(没有很深入的学),然后十二月又开始继续投,java和测开都投,不过好像并没有几个面试,有点打击不过并没有放弃心里还是想争一口气,一月初因为学校事比较多加上考试便有几天没有继续投,10号放假后便继续,想着放假应该很多人辞职可能机会大一点,直到接到字节的面试,心里挺激动的,总算有大厂面试了,虽然很开心,但同时压力也很大,心里真的很想很想很想进,一面前几天晚上都睡不好觉,基本上都是二三点睡六七点醒了,一面三十几分钟结束,问的都不太难,而且面试官人挺好但是有些问题问的很刁钻问到了测试的一些思想并不是理论,我不太了解这方面,但是也会给我讲一讲他的理解,但是面完很伤心觉得自己要挂了。但是幸运的是一面过了(感谢面试官),两天后二面,问的同样不算难,手撕也比较简单,但也有一两个没答出来,面试官人很好并没有追问,因为是周五进行的二面,没有立即出结果,等到周一才通知到过了,很煎熬的两天,根本睡不好,好在下周一终于通知二面过了(感谢面试官),然后约第二天三面,听别的字节同学说hr面基本上是谈薪资了,但是我的并不是,hr还问了业务相关的问题,不过问的比较浅,hr还问我好像比较紧张,而且hr明确说了还要比较一下,我说我有几家的面试都拒了就在等字节的面试,三面完后就开始等结果,这几天干啥都没什么劲,等的好煎熬,终于13号下午接到了电话通知oc了,正式邮件也同时发了,接到以后真的不敢信,很激动但更重要的是可以松一口气了,可以安心的休息一下了终于可以带着个好消息过年了,找实习也可以稍微告一段落了,虽然本人很菜,但是感谢字节收留,成为忠诚的节孝子了因为问的比较简单,面经就挑几个记得的写一下一面:1.实习项目的难点说一下2.实习中用到了哪些测试方法3.针对抖音评论设计一下测试用例4.手撕:合并两个有序数组二面:1.为什么转测开2.线程进程区别,什么场景适合用哪个3.发送一个朋友圈,从发出到别人看到,从数据流转的角度说一下会经历哪些过程4.针对抖音刷到广告视频设计测试用例5.手撕:无重复字符的最长字串
牛客85811352...:测开问这么简单?
查看8道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务