“会话长期记忆”是大模型从“一次性的问答工具”迈向“个性化的长期伙伴”的核心能力。它指的是模型能够记住跨越多次会话交互的用户信息、偏好、历史对话上下文,并在后续对话中自然地调用这些信息,提供连贯且个性化的服务。

一、为什么需要会话长期记忆?

  1. 提升用户体验:用户无需在每次对话中重复基本信息(如“我不吃辣”、“我是做市场营销的”),对话感觉更自然、更智能。
  2. 实现深度个性化:根据用户的长期偏好和行为历史,提供定制化的建议、内容和解决方案。
  3. 维持对话连贯性:能够提及几天甚至几周前的讨论内容,使对话具有连续性和深度。
  4. 构建用户信任:模型表现出“记得你”的能力,有助于建立与用户的情感连接和信任感。

二、核心挑战

  1. 大模型的固有缺陷
    • 上下文窗口限制:所有大模型都有一个固定的上下文长度(如 4K, 8K, 16K, 128K, 200K)。无法将整个对话历史都放入提示中。
    • 无状态性:模型本身不存储状态。每次请求都是独立的,默认情况下它“不记得”上一次对话的内容。
  2. 信息提取与抽象:需要从海量对话中提取出哪些是值得长期记忆的“知识”,而不是简单地存储所有原始对话。
  3. 记忆的检索与更新:如何快速、准确地从记忆库中检索到与当前对话相关的信息?如何更新过时或错误的信息?
  4. 隐私与安全:存储用户的个人信息涉及严格的隐私保护要求。

三、长期记忆的核心策略

我们可以将长期记忆系统看作一个由多个环节组成的管道。

策略一:记忆的内容——记什么?

不是所有对话都值得记忆。需要识别的关键信息类型:

  1. 用户画像
    • 硬性事实:姓名、职业、地理位置、公司、生日等。
    • 软性偏好:喜欢/讨厌的食物、颜色、音乐类型;行为习惯(如“习惯晚睡”);价值观等。
  2. 对话知识
    • 重要结论:过去讨论达成的关键决定、计划或解决方案。
    • 用户透露的深层信息:例如用户的长期目标、面临的挑战、家庭情况等。
  3. 交互模式
    • 用户风格:用户喜欢正式还是轻松的对话?喜欢详细解释还是简洁回答?
    • 任务历史:用户经常让模型帮忙完成哪类任务(如写周报、翻译、写代码)?

实现技术

  • 命名实体识别:自动提取人名、地名、组织等。
  • 基于提示的摘要提取:设计特定的提示词,让模型主动识别和总结需要记忆的信息。
    • 示例提示:“请从以下对话中,提取出关于用户的新的个人信息、偏好或重要事实。如果没有任何新信息,输出‘无’。对话:[当前对话]”
策略二:记忆的存储——怎么存?

原始对话文本不适合直接存储和检索。主流方法是使用向量数据库

  1. 向量化
    • 将提取出的“记忆片段”(例如:“用户不喜欢吃香菜”)通过嵌入模型转换为一个高维向量。这个向量捕捉了该片段的语义信息。
  2. 存储到向量数据库
    • 将向量和对应的原始记忆文本(以及可能的元数据,如时间戳、用户ID、记忆类型)一起存入向量数据库(如 Pinecone, Chroma, Weaviate, Qdrant)。
  3. 结构化数据库辅助
    • 对于高度结构化的信息(如用户名、生日),可以同时存入传统的关系型数据库或键值存储,以便进行精确匹配和快速查询。
策略三:记忆的检索——怎么取?

在每次用户发起新对话时,系统需要决定将哪些长期记忆放入本次对话的上下文窗口中。

  1. 相关性检索
    • 将用户的当前查询也转换为向量。
    • 在向量数据库中进行相似性搜索,找出与当前查询最相关的N条记忆。
    • 例如:用户问“今晚吃什么?”,系统会检索出“用户不喜欢香菜”、“用户是素食主义者”等记忆。
  2. 递归检索与摘要
    • 当检索到的记忆条目过多时,可以先用LLM对这些相关记忆进行摘要,再将摘要放入上下文,以节省Token。
  3. 元数据过滤
    • 结合记忆的元数据进行筛选。例如,只检索“饮食偏好”类的记忆,或者优先检索最近添加的记忆。
策略四:记忆的更新与维护——如何保持记忆鲜活?

记忆不是一成不变的。

  1. 冲突解决
    • 当新提取的记忆与旧记忆冲突时(例如,用户之前说“我喜欢狗”,现在说“我对狗毛过敏”),系统需要有一套策略:
      • 时间戳优先:总是相信最新的信息。
      • 置信度优先:给不同来源的记忆赋予置信度。
      • 主动询问:“我记得你之前说过喜欢狗,但现在你提到对狗毛过敏,我是否需要更新你的偏好?”
  2. 记忆衰减与遗忘
    • 可以为记忆设置“强度”或“最后访问时间”。长期不被检索和使用的记忆可以逐渐被归档或删除,模拟人类的遗忘机制。
  3. 记忆强化
    • 被频繁检索和使用的记忆,其“强度”可以增加。

四、一个典型的实现架构

下图清晰地展示了一个结合了短期工作记忆(上下文窗口)和长期记忆系统的典型架构,以及其核心工作流程:

组装Prompt
短期工作记忆
本次会话上下文
系统指令
与人格设定
相关长期记忆
检索相关长期记忆
使用向量DB与元数据
用户当前查询
用户输入新查询
系统触发记忆处理流程
调用大模型
生成个性化
与连贯的回复
返回回复给用户
需要更新记忆?
提取与编码新记忆
存储至向量DB
流程结束

这个流程的核心在于:在每次对话轮次中,系统都会动态地将最相关的长期记忆与短期上下文和当前查询组合在一起,形成一个完整的提示,送给大模型处理。 同时,系统会在对话过程中持续判断是否需要将新的信息沉淀为长期记忆。

五、具体实现步骤与代码示例

以下是一个简化的Python伪代码/代码概念,展示核心逻辑。

import openai
from vector_db import VectorDB # 假设的向量数据库客户端
from embedder import Embedder # 假设的嵌入模型客户端

# 初始化组件
vector_db = VectorDB()
embedder = Embedder()
llm_client = openai.OpenAI()

class LongTermMemorySystem:
    def __init__(self, user_id):
        self.user_id = user_id

    def retrieve_memories(self, query, top_k=5):
        """检索相关长期记忆"""
        # 1. 将查询转换为向量
        query_vector = embedder.embed(query)
        
        # 2. 在向量数据库中搜索,并按用户ID过滤
        memories = vector_db.search(
            vector=query_vector,
            top_k=top_k,
            filter={"user_id": self.user_id}
        )
        return memories

    def add_memory(self, memory_text, memory_type="fact"):
        """添加一条新的长期记忆"""
        memory_vector = embedder.embed(memory_text)
        vector_db.add(
            vector=memory_vector,
            text=memory_text,
            metadata={
                "user_id": self.user_id,
                "type": memory_type,
                "timestamp": get_current_time()
            }
        )

    def extract_and_save_memory(self, conversation_turn):
        """从对话中提取记忆并保存(可选步骤,可异步执行)"""
        # 使用LLM判断是否需要记忆,并提取结构化信息
        extraction_prompt = f"""
请从以下对话中,提取出关于用户的新的、值得长期记忆的个人信息、偏好或重要事实。
如果没有任何新信息,输出‘无’。

对话:
{conversation_turn}

提取结果:
"""
        response = llm_client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": extraction_prompt}]
        )
        result = response.choices[0].message.content.strip()
        
        if result != "无":
            self.add_memory(result)

    def generate_response(self, user_input, current_session_messages=[]):
        """生成带长期记忆的回复"""
        # 1. 检索相关记忆
        relevant_memories = self.retrieve_memories(user_input)
        memory_context = "\n".join([mem.text for mem in relevant_memories])
        
        # 2. 构建系统提示,注入长期记忆
        system_message = {
            "role": "system",
            "content": f"""你是一个乐于助人且个性化的AI助手。以下是你需要了解的关于用户的背景信息,请在回答中自然地体现出来:
            
【用户长期记忆】
{memory_context}

请基于以上信息进行回复。"""
        }
        
        # 3. 组装对话上下文:系统提示 + 本次会话历史 + 用户最新输入
        messages = [system_message] + current_session_messages + [{"role": "user", "content": user_input}]
        
        # 4. 调用LLM生成回复
        response = llm_client.chat.completions.create(
            model="gpt-4",
            messages=messages
        )
        
        assistant_reply = response.choices[0].message.content
        
        # 5. (可选)在后台处理本轮对话,提取新的长期记忆
        # self.extract_and_save_memory(f"User: {user_input}\nAssistant: {assistant_reply}")
        
        return assistant_reply

# 使用示例
memory_system = LongTermMemorySystem(user_id="user_123")
user_says = "推荐一家附近的餐厅。"
# 假设current_session_messages维护了本次会话的短期历史
reply = memory_system.generate_response(user_says, current_session_messages)
print(reply)

六、进阶考量与未来方向

  1. 记忆的层次与结构:建立更复杂的记忆结构,如事件、故事、知识图谱,而不仅仅是独立的片段。
  2. 主动记忆与回忆:模型不仅能被动回答,还能主动关联记忆:“你上次提到的那个项目进展如何?”
  3. 情感记忆:记忆并理解用户在对话中流露出的情绪,从而提供更有共情的支持。
  4. 多模态记忆:未来不仅能记忆文本,还能记忆用户上传的图片、音频等内容。
  5. 分布式与联邦学习:在保护隐私的前提下,如何在边缘设备上实现用户记忆的存储和处理。

总结
实现有效的会话长期记忆是一个系统工程,它结合了大模型的能力向量数据库的技术精巧的产品设计。成功的记忆系统应该是无缝的、有用的且尊重隐私的,让用户感觉到AI助手真正理解他们,并随着时间推移变得越来越不可或缺。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐