MemLLM 精读分析笔记
概括
MemLLM 是一项旨在解决大型语言模型(LLM)知识静态、更新困难及幻觉问题的开创性工作。其核心思想并非设计复杂的模型结构,而是通过参数高效微调(LoRA),教会一个标准的LLM(如Mistral-7B)主动学习使用一个外部的、可读写的、结构化的记忆库。
模型通过在精心构建的数据集上训练,学会在生成文本的过程中,在适当的时机生成特定的API调用字符串(如 ({MEM_WRITE-->...})
和 ({MEM_READ(...)-->...})
),从而实现对外部记忆的实时写入和读取。这使得LLM从一个静态的知识库转变为一个能够动态学习、更新和纠错的智能体,极大地增强了其事实准确性、可解释性和个性化能力。
1. 核心解决的问题
- 知识更新困难:LLM参数中存储的知识是静态的,难以适应事实变化(时间退化)。
- 长尾知识遗忘:对训练数据中的稀有事件或实体记忆效果差。
- 幻觉问题:倾向于生成不符合事实的、看似合理的内容。
- 现有方案局限:
- 模型编辑(Model Editing):存在损害模型通用能力(局部性问题)的风险。
- 检索增强生成(RAG):通常是只读的,且非结构化文本难以精确修改单个事实。
2. 核心创新点
- 显式读写记忆(Explicit Read-Write Memory):赋予LLM读取和写入外部记忆的能力,使知识库动态可增长。
- 结构化记忆(Structured Memory):记忆以
(主体, 关系, 客体)
的三元组形式存储,相比非结构化文本,具有可解释、可编辑、存储高效的优点。 - 通过微调学习API调用(API via Finetuning):创新地通过构建特定格式的训练数据,让LLM在标准的语言模型目标下,自然地学会生成API调用指令,无需复杂的提示工程或修改模型架构。
3. 核心技术栈
- 基础模型: Mistral-7B
- 微调技术: LoRA (参数高效微调)
- 记忆库: 类数据库系统,包含实体、关系、三元组三个表,使用向量相似度进行查询。
- 训练数据: 利用 Re-DocRED 等标注语料库,自动化构建用于
读
和写
操作的训练样本。
4. 微调与数据集构建细节
A. MEM_WRITE
数据构建 (学习“提取”)
- 目标: 从句子中提取事实,生成写入指令。
- 流程:
- 将句子用
({USER_ST})
和({USER_END})
包裹,作为输入。 - 将句子中包含的关系三元组格式化为
({MEM_WRITE-->...})
字符串,作为输出标签。 - 训练模型学习这种 "输入句子 -> 输出API指令" 的映射。
- 将句子用
B. MEM_READ
数据构建 (学习“何时查、查什么、怎么用”)
- 目标: 在需要信息时,生成查询指令,并利用返回结果继续生成。
- 流程:
- 时机 (When): 在文档中某个“目标实体”即将出现的位置插入API调用。
- 内容 (What): 利用上文中已出现的相关实体,构建查询。
- 使用 (How): 将
查询指令
和从一个不完美的记忆库中返回的查询结果
一同插入原文,构成训练样本。 - 训练模型学会生成查询,并利用查询结果准确地生成“目标实体”及后续文本。
关键澄清:API指令是普通字符串
({MEM_WRITE-->...})
和 ({MEM_READ(...)-->...})
不是在Tokenizer中定义的特殊Token。它们是模型词汇表中已有字符组成的普通文本序列。LLM通过微调,学会了在特定上下文模式下,将这些普通字符以这种有特殊功能的顺序组合起来,从而实现对外部系统的“指令调用”。
5. 工作流:同步阻塞模式
MemLLM的读写操作是同步且阻塞的,而非异步并行。
- LLM生成文本,直到生成一个完整的
MEM_READ
指令。 - LLM暂停生成。
- 外部系统执行API查询。
- 查询结果返回,并拼接到当前上下文中。
- LLM接收这个新的、包含查询结果的完整上下文,然后继续自回归生成。
因此,API的查询延迟会直接影响总体的生成速度。
6. 局限性
- 关系类型有限:当前仅支持96种关系。
- 无复合推理能力:无法从
(A, in, B)
和(B, in, C)
推理出(A, in, C)
。 - 非记忆感知:当记忆库中不存在某个事实时,模型不知道自己“不知道”,可能会退回到使用内部参数知识,导致幻觉。