共计 2254 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
在构建大语言模型(LLM)应用时,记忆系统是核心组件之一。我们可以将记忆系统分为两大类:short-term memory(本地上下文)和 long-term memory(外部知识库)。

short-term memory 指的是模型在推理时能够直接访问的上下文信息,通常通过固定长度的上下文窗口实现。这种方式简单直接,但也存在明显局限性:
- 随着对话或文本增长,早期信息会被挤出窗口
- 固定长度窗口无法灵活应对不同场景的信息需求
- 对于长文档处理,重要信息可能被截断
long-term memory 则通过外部存储(如向量数据库)来解决这些问题,允许模型 ” 回忆 ” 过去的知识。但这种方案也带来新的挑战:检索准确性、延迟和存储成本等。
技术对比
实现 long-term memory 主要有两种技术路线:
- 纯 in-context learning:将所有相关信息压缩到上下文窗口中
- 优点:实现简单,无需额外基础设施
-
缺点:受限于模型的最大上下文长度
-
向量数据库检索:将知识存储在外部,按需检索
-
主流向量库对比:
-
Faiss:
- 优点:高性能,支持 GPU 加速,Facebook 开源
- 缺点:需要自行管理持久化
-
Pinecone:
- 优点:全托管服务,简单易用
- 缺点:商业产品,有成本考虑
-
Chroma:
- 优点:轻量级,内置 embedding 功能
- 缺点:相对新,生态不够成熟
核心实现
本地上下文管理
对于 short-term memory,我们可以基于 Transformer 的自注意力机制实现上下文窗口管理。以下是 Python 示例:
class ContextWindow:
"""管理固定长度的上下文窗口"""
def __init__(self, max_length=2048):
self.max_length = max_length
self.context = []
def add_text(self, text):
"""添加新文本并维护窗口大小"""
tokens = text.split() # 简化的分词处理
self.context.extend(tokens)
# 截断超出部分
if len(self.context) > self.max_length:
self.context = self.context[-self.max_length:]
def get_context(self):
"""返回当前上下文"""
return ' '.join(self.context)
长期记忆系统
构建 long-term memory 需要三个关键组件:embedding 模型、向量存储和检索逻辑。以下是使用 SentenceTransformer 和 Faiss 的实现:
import faiss
from sentence_transformers import SentenceTransformer
class LongTermMemory:
def __init__(self, model_name='all-MiniLM-L6-v2'):
# 初始化 embedding 模型
self.embedder = SentenceTransformer(model_name)
self.dimension = self.embedder.get_sentence_embedding_dimension()
# 创建 Faiss 索引
self.index = faiss.IndexFlatL2(self.dimension)
self.content = []
def add_memory(self, text):
"""添加记忆条目"""
embedding = self.embedder.encode([text])
self.index.add(embedding)
self.content.append(text)
def retrieve(self, query, k=3):
"""检索最相关的 k 条记忆"""
query_embed = self.embedder.encode([query])
distances, indices = self.index.search(query_embed, k)
return [self.content[i] for i in indices[0]]
性能考量
在实际部署记忆系统时,需要权衡以下几个关键指标:
- 内存占用:
- embedding 维度选择:768 维 (如 all-MiniLM-L6-v2) 是常用平衡点
-
Faiss 索引类型:Flat 索引精确但耗内存,IVF 等压缩方法可节省空间
-
检索延迟:
- 本地 Faiss 在 CPU 上约 10ms/query(对于小型知识库)
-
GPU 加速可提升 10 倍以上
-
准确性:
- 选用合适的 embedding 模型对结果影响巨大
- 领域适配训练能显著提升相关性
避坑指南
- 冷启动问题:
- 问题:初始阶段记忆库内容少,检索效果差
-
方案:预填充领域相关知识,或设置回退机制
-
embedding 漂移:
- 问题:随着模型更新,新旧 embedding 不一致
-
方案:定期全量重新 embedding,或使用版本化存储
-
检索偏置:
- 问题:高频内容主导检索结果
-
方案:引入多样性采样或时间衰减因子
-
多模态挑战:
- 问题:纯文本记忆无法处理图像等多媒体
- 方案:考虑 CLIP 等跨模态 embedding 模型
开放性问题
当前记忆系统架构仍有很大优化空间:
- 如何实现记忆的动态权重分配?重要记忆应该更容易被检索
- 能否建立记忆之间的关系图谱,而不仅是独立片段?
- 怎样设计遗忘机制?不是所有记忆都需要永久保存
- 如何评估记忆系统的有效性?需要建立量化指标
这些问题的解决将推动 LLM 应用进入新阶段,让 AI 不仅能够 ” 记忆 ”,还能真正 ” 理解 ” 和 ” 运用 ” 知识。
