所谓Memory和Context Engineering
所谓Memory和Context Engineering
最近在工作中学到许多成体系的Agent相关知识,在mentor的教导下也是从Agent练气散修突破到了筑基,狠狠记录一下。
旧时的理解
之前我对memory和context的理解很模糊。我简单的将memory理解为short-term+long-term, context则是模型在一次会话中的上下文.
在我之前的视角中,他们是并列关系,后面也是纠正了这个错误思维。
实际上, LLM本质上只有一个输入: Context
tokens -> model -> tokens
所以memory和context的关系实际上是:
Context
│
├── System Prompt
├── Tool Specification
├── Retrieved Knowledge (RAG)
├── Memory
├── Chat History
└── User Input
memory是context engineering的一部分.
概念明晰
System Prompt = "模型的基础信息,思想钢印, 控制定位,人设等"
Memory = "可复用上下文"
Tools = "模型可用工具"
真实存在的需求
Memory这东西听着还是蛮有用的,但具体是如何体现的呢?
你是不是会发现在ChatGPT和Gemini中,他们会记住你以前的一些重要信息:
user: "我在做开源"
bot: "噢,那你还挺牛的"
-> 此刻bot偷偷记住了你做过开源
-> 若干天后
user: "我去这个git pull咋老有冲突啊,快帮我解决下"
-> 思考的过程中联想到开源
bot: "你做开源的这都不懂?"
user: "?下个月退订了"
前文提到过Memory是可复用上下文, 大体分为short-term + long-term组成。
而这里就是用到了long-term!
那么模型是如何发现哪个记忆应该被存起来,又是如何实施存储的呢?
实施方案
system prompt = """
你是一个聊天机器人,你要做的事情就是把用户哄高兴了。
tools:
如果用户说了什么你认为有价值,需要保存的信息,使用save_memory
"""
是不是非常简单,加一条prompt让LLM自己判断记不记住,再写点配套tools让agent操作存进向量数据库, 美美实现一个最简Memory管理!
虽然基本的实现非常简单,然而这种设计可能出现这种情况:
user: "我最喜欢TypeScript, 现代类型系统,生态繁荣好用"
bot: "行,记住了"
-> db: user最喜欢TypeScript
-> 若干天后
user: "我最喜欢Python, 我勒个英语写代码啊"
-> db: user最喜欢Python
-> 若干天后
user: "想写个链表,你用我最喜欢的语言写吧,"
-> db: 自动召回 最喜欢的语言两个结果?
bot: "呃..我记得你最喜欢的语言有两个, rust和python"
user: "你疯了吗?最喜欢怎么会有两个"
用户总是无理取闹的,所以我们需要一开始就设计好。
我们通常有两个还不错的方案:
- 给每条记忆打上时间戳
[2026-3-17] user最喜欢ts
[2026-3-20] user最喜欢py
agent get 最喜欢语言 -> 两个结果
[bot] 看上去py新一点,拿py吧!
- 加一步检查, 专门用一个agent review
[2026-3-20] user最喜欢py
[2026-3-17] user最喜欢ts
[memory_admin] 这个冲突了吧?结合user之前的记录,看上去他用py多些,存py吧
[bot] 行
[2026-3-17] user最喜欢py
小结
memory相关差不多就这些,等后面我学到新技巧再来更新!