ailearn

Agent记忆系统 - 上下文管理

**前置知识**:需要先掌握 向量数据库

访问-- -- --

前置知识:需要先掌握 向量数据库

本文重点:Agent记忆系统设计与实现


一、记忆系统概述

Agent记忆类型:
1. 短期记忆 (Short-term Memory)
   - 当前对话上下文
   - 有限的窗口大小
   - 即时交互
2. 长期记忆 (Long-term Memory)
   - 向量数据库存储
   - 检索式回忆
   - 跨会话持久化
3. 工作记忆 (Working Memory)
   - 当前任务状态
   - 中间结果存储
   - 临时缓冲区

二、对话记忆

2.1 简单缓冲记忆

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain_openai import ChatOpenAI
# 创建记忆
memory = ConversationBufferMemory()
# 创建对话链
llm = ChatOpenAI(model="gpt-3.5-turbo")
chain = ConversationChain(llm=llm, memory=memory, verbose=True)
# 对话
response1 = chain.predict(input="我叫张三")
response2 = chain.predict(input="我叫什么名字?")  # 会记住张三
# 查看记忆
print(memory.load_memory_variables({}))

2.2 窗口记忆

from langchain.memory import ConversationBufferWindowMemory
# 只保留最近k轮对话
memory = ConversationBufferWindowMemory(k=5)
chain = ConversationChain(llm=llm, memory=memory)

2.3 摘要记忆

from langchain.memory import ConversationSummaryMemory
# 自动总结历史对话
memory = ConversationSummaryMemory(llm=llm)
chain = ConversationChain(llm=llm, memory=memory)
# 长对话自动压缩
for i in range(20):
    chain.predict(input=f"第{i+1}条消息")
print(memory.load_memory_variables({}))

三、向量记忆

3.1 基本实现

from langchain.memory import VectorStoreRetrieverMemory
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embeddings, persist_directory="./memory_db")
# 创建向量记忆
memory = VectorStoreRetrieverMemory(
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
# 保存记忆
memory.save_context(
    {"input": "我喜欢编程"},
    {"output": "好的,我会记住你喜欢编程"}
)
memory.save_context(
    {"input": "我住在北京"},
    {"output": "北京是个好地方"}
)
# 检索相关记忆
relevant = memory.load_memory_variables({"input": "我的爱好是什么?"})
print(relevant)

3.2 完整记忆系统

class AgentMemory:
    """完整的Agent记忆系统"""
    
    def __init__(self, llm, persist_dir="./memory"):
        self.llm = llm
        
        # 短期记忆
        self.short_term = ConversationBufferWindowMemory(k=10)
        
        # 长期记忆
        self.embeddings = OpenAIEmbeddings()
        self.vectorstore = Chroma(
            embedding_function=self.embeddings,
            persist_directory=persist_dir
        )
        self.long_term = VectorStoreRetrieverMemory(
            retriever=self.vectorstore.as_retriever(search_kwargs={"k": 5})
        )
    
    def add_memory(self, user_input, assistant_output):
        """添加记忆"""
        # 短期记忆
        self.short_term.save_context(
            {"input": user_input},
            {"output": assistant_output}
        )
        
        # 长期记忆(重要信息)
        if self._is_important(user_input, assistant_output):
            self.long_term.save_context(
                {"input": user_input},
                {"output": assistant_output}
            )
    
    def _is_important(self, user_input, assistant_output):
        """判断是否是重要信息"""
        keywords = ["喜欢", "讨厌", "名字", "住", "工作", "爱好"]
        return any(kw in user_input for kw in keywords)
    
    def get_context(self, current_input):
        """获取相关上下文"""
        # 短期上下文
        short_context = self.short_term.load_memory_variables({})
        
        # 长期相关记忆
        long_context = self.long_term.load_memory_variables({"input": current_input})
        
        return {
            "recent_conversation": short_context.get("history", ""),
            "relevant_memories": long_context.get("history", "")
        }
    
    def chat(self, user_input):
        """带记忆的对话"""
        context = self.get_context(user_input)
        
        prompt = f"""
历史对话:{context['recent_conversation']}
相关记忆:{context['relevant_memories']}
用户:{user_input}
请回答:"""
        
        response = self.llm.invoke(prompt).content
        self.add_memory(user_input, response)
        
        return response

四、实体记忆

from langchain.memory import ConversationEntityMemory
# 提取和记忆实体
memory = ConversationEntityMemory(llm=llm)
chain = ConversationChain(llm=llm, memory=memory)
# 自动提取实体
response = chain.predict(input="我和小明在北京见面了")
# 查看实体记忆
print(memory.entity_store)

五、知识图谱记忆

class KnowledgeGraphMemory:
    """知识图谱记忆"""
    
    def __init__(self):
        self.entities = {}  # 实体
        self.relations = []  # 关系
    
    def add_triple(self, subject, relation, obj):
        """添加三元组"""
        self.relations.append({
            "subject": subject,
            "relation": relation,
            "object": obj
        })
        
        if subject not in self.entities:
            self.entities[subject] = []
        self.entities[subject].append({"relation": relation, "object": obj})
    
    def query_entity(self, entity):
        """查询实体"""
        return self.entities.get(entity, [])
    
    def extract_and_store(self, text):
        """从文本提取实体和关系"""
        # 使用LLM提取
        prompt = f"""从以下文本中提取实体和关系:
文本:{text}
输出格式:实体1 | 关系 | 实体2
每行一个三元组。"""
        
        response = self.llm.invoke(prompt).content
        
        for line in response.split("\n"):
            if "|" in line:
                parts = [p.strip() for p in line.split("|")]
                if len(parts) == 3:
                    self.add_triple(parts[0], parts[1], parts[2])

参考资源


返回AI Agent智能体 最后更新: 2026年4月20日

访问 --

讨论与反馈