9. Agent 的长短期记忆系统怎么做的?记忆是怎么存的?粒度是多少?怎么用的?
👔面试官:你们项目里 Agent 的记忆系统是怎么做的,短期记忆和长期记忆分别存在哪?
🙋♂️我:短期记忆就是把对话历史存在内存里,长期记忆存数据库,需要的时候查出来用。
👔面试官:长期记忆「存数据库」?那你用的什么数据库,怎么查的,按关键词全文搜索吗?
🙋♂️我:也可以用关键词搜索,就是普通的字符串匹配,比如用 SQL 的 LIKE 查询......
👔面试官:你这样搜根本搜不到语义相关的内容。比如用户问的是「代码习惯」,历史里存的是「Python 风格偏好」,关键词不重叠,你怎么匹配?
🙋♂️我:那......我把粒度搞细一点,把每句话都拆开存,这样关键词覆盖更全。
👔面试官:拆得越细,检索噪音越大,一个完整的用户偏好被拆成四五条,检索时只命中其中两条,拿到的是碎片化信息,这才是问题所在。你知道长期记忆的正确存法是什么吗?
好,被追问到这里说明这道题的坑不少,咱来系统说一下 Agent 记忆系统的正确做法。
💡-简要回答
我理解记忆系统分两层。
短期记忆就是 context window 里的对话历史,存当前任务的中间状态,任务结束就清掉;长期记忆用向量数据库存,把信息 embedding 后写入,用的时候做语义检索拿回来注入 prompt。
粒度上我通常按「一次完整交互」或「一个关键事件」为单位存,太细碎检索噪音大,太粗糙又丢失细节,这个需要根据业务实际调整。
📝-详细解析
先假设一个没有记忆系统的 Agent,感受一下它会有多不堪用。
class ShortTermMemory:
def __init__(self):
# messages 列表就是 LLM 的工作台
# 每条消息有 role(谁说的)和 content(说了什么)
self.messages = []
def add(self, role: str, content: str):
# role 有三种:user(用户输入)、assistant(LLM 输出)、tool(工具返回结果)
# 每一步的内容都要追加进来,保持完整的任务状态
self.messages.append({"role": role, "content": content})
def get_context(self):
# 调 LLM 时把完整的 messages 传进去
# LLM 会读取这份完整历史来理解当前状态
return self.messages
def clear(self):
# 任务结束后清空,准备迎接下一个任务
# 清空意味着这次任务的所有中间状态都消失了
self.messages = []
一次任务执行的示例
memory = ShortTermMemory()
memory.add("user", "帮我分析这几家竞品的核心功能差异")
memory.add("assistant", "好的,我先搜索一下竞品 A 的信息")
memory.add("tool", "搜索结果:竞品 A 的核心功能是实时协作编辑,支持最多 50 人同时在线......")
memory.add("assistant", "已拿到竞品 A 的信息,再搜竞品 B")
每次调 LLM 都传完整历史,它才能知道自己做到哪一步了
response = llm.chat(messages=memory.get_context())