请求处理中...
引言
你有没有遇到过这样的场景:跟AI助手聊了十几轮,前面明明交代过的事情,它转头就忘了;让AI帮你处理一个多步骤的任务,中间打断一下再回来,它完全不记得做到哪了;更别提跨会话的记忆——今天跟它聊过的偏好和习惯,明天打开新会话,一切又要从头说起。
这就是当前大多数AI智能体面临的“数字遗忘症”。没有记忆能力的智能体,每次对话都像是第一次见面,无法积累经验,也无法真正理解用户。传统方案中,智能体常因记忆碎片化、上下文丢失或存储效率低而表现受限。
但这个问题并非无解。通过为智能体设计合理的记忆机制——短期记忆负责当前会话的上下文连贯,长期记忆负责跨会话的知识沉淀,向量存储负责海量记忆的高效检索——你可以让AI从一个只会“回答当前问题”的工具,进化成一个能“基于历史经验做决策”的真正协作伙伴。
本文将从零开始,一步步教你理解并实现智能体的三层记忆系统。预计阅读和动手实践时间约2至3小时,难度中等,适合具备一定编程基础的开发者。
准备阶段
动手实现之前,先做好以下准备:
所需工具/材料:
Python 3.9以上环境
一个LLM的API密钥(如OpenAI、Anthropic或本地部署的开源模型)
一个Embedding模型的API密钥或本地模型(用于将文本转化为向量)
向量数据库(推荐Chroma,轻量级且易于上手;生产环境可选用Pinecone、Milvus或Qdrant)
关系型数据库(如SQLite,用于存储结构化记忆元数据)
LangChain或LangGraph框架(可选,但强烈推荐,可大幅降低开发复杂度)

前置条件:
熟悉Python基础语法
理解大语言模型的基本调用方式(API调用)
对向量和相似度检索有基本概念
环境/状态准备建议:
创建一个新的Python虚拟环境,避免依赖冲突
提前安装好所需依赖:pip install chromadb langchain openai sqlite3
准备好你的API密钥,建议存入环境变量
详细步骤
步骤一:理解三层记忆架构
在动手写代码之前,先搞清楚我们要实现什么。一个完整的智能体记忆系统通常包含三个层次:
短期记忆(Short-Term Memory) :相当于智能体的“工作台”或“意识流”。它存储当前会话中的所有上下文信息——系统提示、对话历史、工具调用结果、中间推理步骤等。短期记忆直接依赖于大模型的上下文窗口,容量有限且会话结束后通常会被清空。
长期记忆(Long-Term Memory) :相当于智能体的“个人日记”或“知识库”。它跨会话持久化存储信息,容量近乎无限。长期记忆存储用户偏好、历史交互经验、领域知识等。
向量存储(Vector Storage) :这是实现长期记忆的关键技术。通过将文本转化为高维向量,基于语义相似度进行检索,智能体可以在海量记忆中快速找到与当前问题最相关的内容。
操作结果: 完成这一步后,你应该能清晰说出三层记忆各自的职责和区别。
常见问题提示: 初学者常犯的错误是把RAG(检索增强生成)和智能体记忆混为一谈。RAG是一种检索方法,而记忆系统是一个包含写入、存储、检索、更新、遗忘等多个环节的完整架构。

步骤二:设计短期记忆——上下文窗口管理
短期记忆的设计核心是“在有限的上下文窗口内,尽可能保留最有价值的信息”。大语言模型的上下文窗口是硬性限制,当对话超出窗口长度时,最早的信息会被丢弃。
最直接的短期记忆实现方式是全量记忆——把每轮对话都保留在上下文中。这种方式实现简单、信息完整,但对话一长就会触发上下文限制。
更实用的方案是滑动窗口——只保留最近N轮对话。实现代码如下:
python
f rom collections import deque
class ShortTermMemory:
def __init__(self, max_rounds=10):
# 使用双端队列,固定最大长度
self.messages = deque(maxlen=max_rounds)
def add_message(self, role, content):
self.messages.append({"role": role, "content": content})
def get_context(self):
# 返回完整的对话历史,供LLM使用
return list(self.messages)
对于更长的对话,可以采用摘要压缩策略——定期将过去的对话浓缩为一段摘要,保留在上下文中。
操作结果: 完成这一步后,你的智能体应能在单次会话中维持多轮对话的连贯性。
常见问题提示: 滑动窗口的大小如何选择?窗口太小会过早遗忘历史,窗口太大又失去了节省上下文的意义。一般建议根据任务复杂度调整,简单对话保留5到10轮即可。
步骤三:设计向量存储——长期记忆的基石
长期记忆的核心是向量存储。流程如下:将记忆片段通过Embedding模型转化为高维向量,存入向量数据库;检索时,将用户查询也转化为向量,通过相似度计算找到最相关的历史记忆。
选择向量数据库时,开发阶段推荐Chroma(轻量级、本地运行、零配置),生产环境可选用Pinecone(托管服务)、Milvus(高性能)或Qdrant(功能丰富)。
以下是使用Chroma搭建向量存储的示例:
python
import chromadb
f rom chromadb.utils import embedding_functions
# 初始化Chroma客户端
client = chromadb.PersistentClient(path="./memory_db")
# 创建集合,指定embedding函数
embed_fn = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-api-key",
model_name="text-embedding-ada-002"
)
collection = client.get_or_create_collection(
name="agent_memory",
embedding_function=embed_fn
)
# 存储一条记忆
def store_memory(text, metadata=None):
collection.add(
documents=[text],
metadatas=[metadata o r {}],
ids=[f"mem_{timestamp}"]
)
# 检索相关记忆
def recall_memories(query, top_k=5):
results = collection.query(
query_texts=[query],
n_results=top_k
)
return results['documents'][0] # 返回最相似的top_k条记忆
操作结果: 完成这一步后,你的智能体应能将记忆持久化存储,并能基于语义相似度检索相关记忆。
常见问题提示: 向量检索返回的结果可能不相关怎么办?可以引入混合检索——结合向量相似度(语义)和关键词匹配(精确),提升检索精度。也可以增加重排序步骤,用更精细的模型对检索结果二次筛选。
步骤四:设计记忆写入策略——决定“记住什么”
不是所有信息都值得记住。设计记忆系统时,需要明确写入策略:哪些信息应该存入长期记忆?
常见的写入策略包括:
全量写入:记录每一次交互(适合审计场景,但存储成本高)
摘要写入:由LLM对交互内容生成摘要后再存储
重要性筛选:为每条信息打分,只保留高重要性内容
用户画像提取:从对话中提取用户偏好、习惯等结构化信息
示例:使用LLM生成记忆摘要
python
def extract_memory(input_text, output_text, llm):
prompt = f"""
请将以下对话交互总结为一条简洁的记忆记录(不超过50字):
用户输入:{input_text}
智能体回复:{output_text}
记忆摘要:
"""
summary = llm.invoke(prompt)
return summary
操作结果: 完成这一步后,你的记忆系统不再是“什么都记”,而是“有选择地记”,存储效率大幅提升。
常见问题提示: 不要让LLM对每轮对话都做摘要——这会显著增加API调用成本。建议设定触发条件,如每5轮对话或检测到关键信息时再触发。
步骤五:设计记忆检索与注入——决定“回忆什么”
记忆存好了,怎么在合适的时机“回忆”起来?这是记忆系统设计的另一个核心问题。
检索策略通常包括:
每次请求前检索:在每次用户输入后、LLM生成回复前,自动从长期记忆中检索相关记忆,注入到上下文中
按需检索:让智能体自己决定何时需要查阅记忆(通过工具调用实现)
预取:根据对话主题预判可能需要的记忆,提前加载
注入方式:将检索到的记忆片段格式化后,作为系统提示或上下文的一部分传递给LLM。
python
def retrieve_and_inject(query, collection, llm):
# 1. 检索相关记忆
memories = recall_memories(query, top_k=3)
# 2. 构建增强的上下文
memory_context = "相关历史记忆:n" + "n".join(memories)
# 3. 将记忆注入到系统提示中
system_prompt = f"""你是一个有记忆能力的智能助手。
以下是关于用户的历史记忆,请在回答时参考:
{memory_context}
"""
return system_prompt
操作结果: 完成这一步后,你的智能体能在回答问题时主动“回忆”并利用历史信息。
常见问题提示: 检索到的记忆可能包含过时或矛盾的信息。需要设计记忆更新机制——当发现新信息与旧记忆冲突时,应更新而非简单追加。
步骤六:整合三层记忆——构建完整的记忆系统
将短期记忆、长期记忆和向量存储整合为一个完整的系统。典型的分层架构如下:
瞬时层(短期记忆) :缓存当前对话,生命周期为单次请求
工作层(短期记忆) :存储当前会话的完整上下文,生命周期为单次会话
持久层(长期记忆+向量存储) :保存跨会话知识,需要时通过向量检索调用
整合后的调用流程:
text
用户输入 → ①写入短期记忆(当前会话上下文)
→ ②从向量存储检索相关长期记忆
→ ③将短期记忆 + 长期记忆合并为完整上下文
→ ④LLM生成回复
→ ⑤(可选)将本次交互写入长期记忆
操作结果: 完成这一步后,你拥有一个完整的、可工作的三层记忆智能体。
常见问题提示: 短期记忆和长期记忆的内容可能会重复或冲突。建议在写入长期记忆时,先检查是否已有相似记忆,避免冗余存储。
步骤七:实现记忆的反思与更新
高级的记忆系统不止于“存储-检索”,还应具备反思和更新能力。
反思:让智能体定期回顾自己的历史行为,评估“任务完成得怎么样”、“推理过程有没有问题”,从中提炼经验。
更新:当发现记忆过时或不准确时,主动修正。例如,用户今天说“我不喜欢喝咖啡”,但三个月前的记忆显示“用户喜欢喝咖啡”——这时应该更新而非简单覆盖。
python
def反思_and_update(agent, collection):
# 1. 从向量存储中检索最近N条记忆
recent_memories = collection.query(n_results=20)
# 2. 让LLM分析这些记忆,提炼模式和经验
analysis_prompt = f"分析以下记忆,总结出用户的偏好模式和可改进的地方:{recent_memories}"
insights = llm.invoke(analysis_prompt)
# 3. 将提炼的洞察作为新的结构化记忆存入
store_memory(insights, metadata={"type": "reflection"})
操作结果: 完成这一步后,你的智能体不仅能“记住”,还能“学习”和“成长”。
常见问题提示: 反思操作比较消耗计算资源,不宜频繁执行。建议设定为定时任务(如每天一次)或触发式任务(如会话数达到一定阈值时)。
整体流程回顾
用一句话串起全部步骤:先设计三层架构(短期+长期+向量) → 再实现写入(记什么) → 再实现检索(回忆什么) → 最后整合与优化(反思更新) 。
关键节点和易错环节:
短期记忆的窗口大小——太大会超上下文限制,太小会丢失重要信息
向量检索的Top-K值——K太小可能漏掉相关信息,K太大可能引入噪声
记忆写入的触发时机——写得太多浪费成本,写得太少记忆不完整
记忆的更新与去重——不及时更新会导致记忆矛盾

高级技巧
技巧一:混合检索提升精度。 纯向量检索基于语义相似度,可能会漏掉精确匹配的场景。引入BM25关键词检索与向量检索结合,实现“语义+精确”的混合搜索,能显著提升检索质量。
技巧二:分层记忆+智能衰减。 不是所有记忆都同等重要。可以设计“记忆衰减”机制——越久没被访问的记忆,权重越低。近期频繁使用的记忆权重更高,检索时优先返回。
技巧三:使用Mem0等成熟框架。 如果不想从零构建,可以考虑使用Mem0这类开源记忆层框架。它提供了完整的记忆提取、存储、检索和更新能力,通过简单API即可集成。在生产环境中,Mem0已被验证能带来约26%的准确率提升和91%的延迟降低。
技巧四:多智能体记忆共享。 如果你的系统中有多个智能体协同工作,可以考虑让它们共享一个记忆空间。一个智能体学到的东西,另一个智能体可以直接使用。

总结与行动呼吁
智能体的记忆机制,本质上是在模拟人类的认知结构。短期记忆让智能体能够在当前对话中保持连贯,长期记忆让它能够跨会话积累经验,向量存储则让海量记忆的检索成为可能。三者协同,才能构建出真正具有“智能”和行为能力的Agent系统。
从实践中看,记忆系统的设计没有“一招鲜”的万能方案。不同的场景需要不同的策略——简单问答用滑动窗口就够了,个性化助手需要向量数据库,企业级应用可能需要分层记忆加知识图谱。建议你先从最简单的方案开始,根据实际需求逐步演进。
现在就开始动手吧!从一个最简单的滑动窗口短期记忆开始,逐步加入向量存储,再引入反思机制——你会发现,你的智能体正在一天天变得“更懂你”。
如果你觉得从零构建记忆系统太复杂,或者想快速验证某个方案是否适合你的业务场景,一品威客网汇聚了全国各地的AI开发者和技术专家。你可以在任务大厅发布智能体记忆系统的开发需求,系统将根据你的描述智能匹配合适的服务商;也可以在人才大厅浏览AI工程师和算法专家的资料,查看他们的项目经验和用户评价;还可以在服务大厅查看各类商铺的案例参考,了解不同团队的实际交付质量。一品威客网覆盖设计、开发、AI应用等300多项细分服务,日均处理海量需求对接。通过雇主攻略学习如何高效发布任务、筛选靠谱服务商,借助V客优享改变你的工作方式——用人而不养人,足不出户就能获得专业的AI开发技术支持。一品威客汇聚百万服务商,提供文化创意与技术服务,热门标签频道让你快速找到所需服务,热门搜索词助你精准定位,给你优质的网站体验。无论你是要找人搭建完整的记忆系统,还是需要某个环节的技术咨询,一品威客都能帮你快速对接专业人才,让AI开发少走弯路。
FAQs
问:短期记忆和长期记忆的根本区别是什么?
短期记忆是智能体在当前会话中维护的即时上下文,直接依赖于大模型的上下文窗口,容量有限且会话结束后通常被清空。长期记忆是跨会话持久化存储的知识库,存储在外部数据库中,容量近乎无限,需要时通过检索调用。简单说:短期记忆是“正在想的事”,长期记忆是“记得的事”。
问:向量数据库那么多,初学者应该选哪个?
开发和学习阶段强烈推荐Chroma——轻量级、纯Python实现、零配置、开箱即用,非常适合快速原型验证。如果项目需要上生产环境,可以根据需求选择:Pinecone提供全托管服务,运维成本低;Milvus性能强悍,适合大规模场景;Qdrant功能丰富,支持过滤和混合检索。建议先从Chroma开始,验证方案可行性后再迁移到生产级数据库。
问:记忆系统的检索准确率不高怎么办?
检索准确率不高通常有几种原因和对应的解决方案:一是Embedding模型质量不够好,可以换用更强力的模型(如OpenAI的text-embedding-3或Cohere的embed系列);二是Top-K值设置不当,可以尝试调大K值再通过重排序筛选;三是纯向量检索的局限,可以引入混合检索(向量+关键词);四是记忆写入时信息丢失严重,可以优化摘要生成策略,保留更多关键细节。
问:记忆系统会不会导致隐私问题?
会的,而且这是一个必须严肃对待的问题。长期记忆会存储用户的对话内容、偏好、行为模式等敏感信息。设计时应注意:对不同用户的记忆进行数据隔离,使用独立的命名空间或用户ID分区;实现基于角色的访问控制,不同智能体或不同用户只能读写自己的记忆;敏感信息在存储前应进行脱敏或加密;提供“忘记”功能,让用户可以主动删除自己的记忆记录。
交易额: 17.07万元
企业 |山东省 |济南市 |济南市
交易额: 16.09万元
企业 |河北省 |石家庄市 |新华区
交易额: 14.22万元
企业 |北京市 |北京市 |丰台区
交易额: 9.79万元
企业 |浙江省 |宁波市 |鄞州区
成为一品威客服务商,百万订单等您来有奖注册中
价格是多少?怎样找到合适的人才?
¥5000 已有0人投标
¥5000 已有1人投标
¥10000 已有1人投标
¥20000 已有1人投标
¥50000 已有3人投标
¥50000 已有1人投标
¥20000 已有1人投标
¥5000 已有0人投标