进阶
用 LangChain 给 Agent 加上长期记忆(Memory)
默认情况下,大模型是「金鱼记忆」——一轮对话结束,下一轮就忘光。LangChain 提供一整套 Memory 抽象,让你给 Agent 加上短期上下文和长期记忆:既能记住刚才聊到哪,也能跨会话调取历史偏好。本教程用 Python 演示几种记忆方案。
🧠 本教程适合:会一点 Python、想给自己的 Agent 做「记得用户」的开发者。需要可调用的大模型 API key。
Step 1:环境准备
1 环境准备
安装 LangChain 及一个聊天模型。下面以 OpenAI 兼容接口为例(换成任意厂商 key 均可)。
pip install langchain langchain-openai langchain-community
export OPENAI_API_KEY="sk-..."
Step 2:选对记忆类型
2 选对记忆类型
LangChain 的记忆不是「越大越好」,而是「按场景选」:
| 记忆类 | 适合 |
|---|---|
| ConversationBufferMemory | 短对话,全部历史原样带入 |
| ConversationWindowMemory | 只保留最近 K 轮,省 token |
| ConversationSummaryMemory | 长对话,自动压缩成摘要 |
| VectorStoreRetrieverMemory | 长期记忆,按语义检索历史 |
Step 3:短期记忆:窗口记忆跑通
3 短期记忆:窗口记忆跑通
先上最简单的窗口记忆,限制只带最近 3 轮,避免上下文爆炸。
from langchain.memory import ConversationWindowMemory
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI
memory = ConversationWindowMemory(k=3)
chain = ConversationChain(llm=ChatOpenAI(), memory=memory)
print(chain.invoke({"input": "我叫小明,做电商"})["response"])
Step 4:长期记忆:接向量库
4 长期记忆:接向量库
要「跨会话记得你」,把历史存进向量库(Chroma / FAISS / pgvector),每次按语义检索相关片段。
from langchain.memory import VectorStoreRetrieverMemory
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore = Chroma(embedding_function=OpenAIEmbeddings())
retriever = vectorstore.as_retriever(search_kwargs={{"k": 3}})
memory = VectorStoreRetrieverMemory(retriever=retriever)
Step 5:用摘要记忆压缩长上下文
5 用摘要记忆压缩长上下文
对话一长,token 费钱。用 SummaryMemory 让模型边聊边总结,只保留「精华」。
摘要会丢失细节。对「下单记录」这类必须精确的信息,别只靠摘要——落地到数据库字段更稳妥。
Step 6:持久化:把记忆存到数据库
6 持久化:把记忆存到数据库
内存里的记忆一重启就没。生产环境把向量库 / 摘要落到 Redis、Postgres 或文件,按 user_id 隔离。
# Chroma 持久化到磁盘
vectorstore = Chroma(
persist_directory="./memory_store",
embedding_function=OpenAIEmbeddings())
# 之后每次启动从同一目录加载即可
常见问题速查
| 你遇到的现象 | 大概率原因 & 解决 |
|---|---|
| 越聊越贵 | 换 Window/Summary 记忆,限制带入长度 |
| 记错用户 | 用 user_id 隔离记忆,别共享一条 |
| 重启后失忆 | 记忆未持久化,接数据库/磁盘 |
| 检索到无关历史 | 调小 k、换更好的 embedding 模型 |