AI Agent 面试全攻略:分层记忆系统代码实战,短期Redis滑窗+长期向量库如何落地
【免费下载链接】ai-agent-interview-guideAI Agent 面试全攻略:从零到Offer,包含200+面试题、企业级项目(Python/Java/Go)、简历模板、STAR面试稿、哆啦A梦漫画图解项目地址: https://gitcode.com/gh_mirrors/ai/ai-agent-interview-guide
AI Agent 记忆系统是面试中的高频考点:短期记忆解决「会话内记住刚才聊了什么」,长期记忆解决「跨会话召回用户偏好与历史事实」。本文以开源项目中的真实代码为蓝本,带你用 Redis 滑动窗口 + LLM 摘要压缩实现短期记忆,用向量库(Milvus)实现长期记忆,并给出 MemoryManager 统一调度方案,最后附上面试官最爱追问的 5 个问答与应答要点。
为什么记忆系统是 AI Agent 面试必考题
大模型本身是「无状态函数」——每次请求都像第一次见面。没有记忆,Agent 无法:
- 多轮一致性:避免重复追问、前后矛盾
- 长任务延续:工具调用链、子目标状态跨轮保留
- 个性化服务:记住用户偏好、术语、禁忌
💡 面试金句:「短期记忆服务当下推理,长期记忆服务跨会话个性化与知识」——这句话基本可以作为开场答案。
分层记忆的整体架构:一层管快,一层管久
项目中把记忆拆成两层,各用最适合的存储介质:
| 层级 | 存储介质 | 数据特征 | 典型场景 |
|---|---|---|---|
| 短期记忆 | Redis 列表 | 有序、强时效、Token 受限 | 当前会话的对话历史 |
| 长期记忆 | 向量数据库 | 无序、跨会话、语义检索 | 用户偏好、历史关键事实 |
核心设计思想:热数据放 Redis(快),冷数据进向量库(久),由一个统一管理器负责读写调度。
短期记忆实战:Redis 滑窗 + Token 预算
短期记忆的实现见 short_term.py,关键设计只有 4 点:
- Redis List 存消息:每轮对话
RPUSH到stm:session:{session_id},读取用LRANGE拿全量历史,顺序天然正确 - 滑动窗口:默认
window_size=20,只保留最近 20 条消息 - Token 预算:用
tiktoken精确计数(不可用时退化为len(text) // 4估算),超过max_tokens=4000即触发压缩 - 双条件触发:
消息条数 > 窗口 OR 总 Token > 预算,任一命中就压缩
Go 版本的实现思路完全一致,用LPUSH + LTRIM实现滑窗并挂 2 小时 TTL 自动过期,可对照阅读 short_term.go。
关键一步:超窗时不是丢弃,而是 LLM 摘要压缩
这是面试中最容易拉开差距的点。很多实现直接把窗口外的消息丢掉,导致「用户 20 轮前说『不要用 Python』」这类硬约束消失。
项目中的做法(_compress_if_needed方法):
- 保留尾部
window_size // 2条最新消息 - 对其余历史调用 LLM 生成摘要,以
[历史摘要]系统消息形式插回列表头部 - LLM 不可用时降级为截断(2000 字符兜底),保证主流程不被阻塞
一句话答法:「滑窗管长度,摘要管信息密度——压缩后既控制了 Token 成本,又保住了早期关键事实。」
长期记忆实战:向量库写入与按会话召回
长期记忆实现见 long_term.py,数据流是:
写入:content → embedding 向量化 → 连同 pk / session_id / metadata 插入 Milvus
召回:query → embed → 带 session_id 过滤条件的 Top-K 相似度检索 → 返回 MemoryItem 列表
三个工程细节值得在面试中主动提及:
- 会话隔离:检索时表达式强制带
session_id == "xxx",且对单引号做了转义防止注入——多租户隔离是生产事故高发区 - 同步 SDK 异步化:Milvus SDK 是同步的,代码用
asyncio.to_thread包一层,避免阻塞事件循环(见 milvus_client.py) - 可遗忘:提供
forget(memory_id)按主键硬删除,满足「用户要求忘记」这类合规需求
MemoryManager:统一调度短长期记忆
manager.py 中的MemoryManager是对外唯一入口,两个方法覆盖所有场景:
get_context(session_id, query):并发拉取短期历史 + 长期 Top-5 召回,组装成MemoryContext注入 Promptsave(session_id, message):新消息写入短期记忆,滑窗与压缩逻辑下沉到ShortTermMemory内部自动执行
💡 面试加分点:两层读取都包了try/except,任一层故障时降级为空记忆继续对话——记忆挂了不能把聊天主链路拖死,这是工程化思维的体现。
高频追问:面试官最可能问的 5 个问题
| 追问 | 应答要点 |
|---|---|
| 滑窗丢掉的早期约束怎么办? | 硬约束应走「关键句提取」进长期记忆,不能只依赖窗口 |
| 长期记忆为什么用向量库? | 语义检索能处理「换说法」匹配;局限是相似≠正确,精确值(订单号)应走关系库 |
| 记忆更新怎么防脏数据? | 主键化 memory_id + 显式版本 + 冲突策略(最新覆盖/多版本) |
| 检索怎么排? | 相关性 + 近期性(指数衰减)+ 重要性 三因子加权,即 Generative Agents 的思路 |
| 摘要会误差累积吗? | 会,用「增量在线摘要 + 定期全量重摘要校准」缓解 |
完整的 20 道记忆系统面试题与标准答,可直接复习文档 05-记忆系统.md。
备战建议:三步吃透记忆系统专题
- 先讲机制:画出「Redis 滑窗 + 摘要压缩 + 向量召回」的架构图,能白板默写
- 再讲权衡:窗口大小怎么选、Token 预算怎么分配、衰减会不会误删重要记忆
- 最后讲事故面:租户串数据、敏感信息进向量库、embedding 模型升级后旧向量需重嵌入
建议动手把 project-python/app/core/memory/ 下三个文件通读一遍——代码量不大,但滑窗、压缩、隔离、降级这些生产细节全部到位,面试时能给出「我实现过」的具体细节,远比背八股有说服力 🎯
【免费下载链接】ai-agent-interview-guideAI Agent 面试全攻略:从零到Offer,包含200+面试题、企业级项目(Python/Java/Go)、简历模板、STAR面试稿、哆啦A梦漫画图解项目地址: https://gitcode.com/gh_mirrors/ai/ai-agent-interview-guide
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考