大模型的记忆方案,现在本质上大多还是两种方式:一种是最直接的 RAG:先检索,再把相关片段塞进上下文窗口里。另一种是长上下文:干脆把整份文档放进 prompt,让模型每次回答时重新读一遍。这些方式其实都有一个共同点:记忆本身并没有反应在模型参数的更新里,本质就像一个会失忆的人,把自己每天做过的事情记录在一个笔记本上。
之前我尝试把长上下文的对话数据训练到一个 LoRA ,将这个 LoRA 加载到基模后希望基模就能拥有这部分对话的记忆,但实际训练起来,显然这种方式训练 LoRA 来记忆的成本过高了,首先需要根据对话数据生成更泛化的训练数据这一点就需要大模型也来参与,这一步成本就不低。
后来去找相关的研究,发现了 Sakana AI 这个 Doc-to-LoRA ,它用了一种更巧妙的方式:训练了能将文档转换成 LoRA 参数的模型,输入一份文档,这个模型靠一次前向推理就能生成一组 LoRA 权重,然后把这组 LoRA 挂到基模上,这个基模就拥有了这个文档内容的记忆。
本地试了一下它开源的 demo,怎么说呢,如果是拿来直接和塞入上下文比较,那肯定效果差远了。但是如果考虑到我本地电脑性能的原因只选了一个 gemma-2-2b-it 的小模型,以及我之前尝试自己拿上下文数据训练过一个 LoRA ,那么 Sakana AI 这个 Doc-to-LoRA 方式最后的效果、所花费的时间是远远超出我的预期了。