0%

LLM与检索、记忆相关文章分析

因为AI Agents需要处理各种各样的情况,LLM就会作为Agents的一种重要的底层模型。在这个框架下,LLM需要得到多方面的提升才能在Agents中发挥作用。记忆就是其中重要的一部分,Agents需要特定的记忆机制来确保其能够正确的处理复杂的任务,应用之前的策略。此外,这样也能帮助Agents适应陌生的环境。

LLM中实现记忆存在难点:

  1. LLM是以自然语言格式处理交互的;随着总记录的变多,输入数据可能会超过Transformer体系结构的限制,导致之前的数据出现丢失的情况。
  2. LLM很难提取之前获得的记忆。历史记录变多后,Agents的记忆压力增加,在相关的topic之间建立连接的难度变大。

有如下帮助Agents增强记忆的方式:

  1. 提升Transformer模型的长度限制:可以使用文本截断、分割输入、强调关键部分等方法;还可以修改注意力机制从而适应更长的序列。
  2. 记忆总结:将记忆浓缩总结。
  3. 使用向量或数据结构压缩记忆:可以使用embedding vector/triplet等方法存储。

记忆的检索是自动的。模型会给不同的记忆打分,分数较高的会优先选择。

Forward-Looking Active REtrieval augmented generation(FLARE)

文章名:Active Retrieval Augmented Generation,LTI@CMU组实现

前瞻性主动检索增强生成

基本原理

原有的LLM+retrieval主要使用的是一次查询+生成,即:
$$
生成结果y=LM([查询结果\mathcal D_x, \text{query}\ x])
$$
在Active Retrieval Augmented Generation中需要进行多次查询+生成:
$$
查询使用的\text{query}\ q_t=\text{qry}(x,[y_0,\dots,y_{t-1}])\
生成结果y_t=LM([\mathcal D_{q_t},x,[y_0,\dots,y_{t_1}]])
$$
FLARE的intuition:

  1. LLM应该只在知识不足的时候进行查询,而非所有时候都进行不必要的查询;
  2. 查询的query应该包含未来生成目标的意图。

FLARE instruct

eg:image-20240218171820374

对一些不确定的信息进行查询,并插入到生成的回答中。

FLARE direct

在上述的多次查询+生成中进行修改:

在每一次迭代中:

  • 先根据query和已经生成的语句生成下一句$\hat{s}_t$,作为备选项;

  • 当LM对$\hat{s}_t$有信心(所有token概率大于一个阈值)时,就直接使用该语句;

  • 否则,仍然类似Active Retrieval Augmented Generation中生成对应结果$y_t=LM([\mathcal D_{q_t},x,[y_0,\dots,y_{t_1}]])$

query $q_t$的选择:可以直接使用上一次生成的$\hat s_t$作为$q_t$,效果也很好。但是可能会出现生成的语句出错,导致查询也出错的情况。可以用以下方法解决:

  • 将不准确的信息mask掉。
  • 对于不准确的信息,使用LM生成一系列问题,使得答案应为这些不准确的信息。

In-Context Retrieval-Augmented Language Models(In-Context RALM)

文章名:In-Context Retrieval-Augmented Language Models,AI21 Labs实现

就是FLARE中提到的在query前增加retrieval得到的信息。FLARE中说明:该方法可能会导致模型不清楚接下来生成的内容应该与什么方向有关。

Survey: Retrieval-Augmented Generation for LLM

RAG可分为三类:

  1. Naive RAG
  2. Advanced RAG
  3. Modular RAG

架构变化

Naive RAG

遵循检索-读取框架:

  • 首先离线搜索相关资料,将pdf等文件转换为纯文本格式;
  • 依照传统的搜索方法(余弦相似度等)找到最相关的K个文档,作为上下文生成的基础;
  • 将上下文合并,作为prompt

问题:

  • 检索可能出现的问题:精度低、召回率低、信息过时等。
  • 生成可能出现的问题:幻觉(hallucination)等。
  • 增强可能出现的问题:由于搜索结果重复导致的响应重复、输出脱节/不连贯等。
  • 需要平衡不同段落的价值;
  • 协调写作风格和预期的差异,以保证输出的一致性;
  • 模型可能过度依赖检索到的内容,而不提供新的信息。

Advanced RAG

针对性增强Naive RAG的功能。

预检索过程的优化:优化数据索引,提高索引内容的质量。可通过增强数据粒度、优化索引结构、添加源数据、对齐优化和混合检索实现。

检索过程的优化:对嵌入模型(embedding model)进行优化。例:BGE,最新的BGE-M3

检索后过程的优化:对检索到的内容进行额外处理。可以进行重排序、prompt压缩等处理。

Modular RAG

将不同模块合并,形成序列化pipe解决特定问题。

常见模块:搜索模块、记忆模块、路由模块(用于将不同来源的检索结果进行替换、合并)、预测模块(使用LLM直接生成上下文信息,解决噪音问题)、任务适配器(用于使RAG适配下游任务)。

不同模块之间可以进行排列组合以提高灵活性。

例:RRR模型引入了Rewrite-RetrieveRead过程,提高重写部分的性能等。

检索过程优化:可使用混合搜索、递归检索(见Active Retrieval Augmented Generation中的多次检索+查询)、StepBack-prompt(reasoning的方法)、子查询等。

image-20240225212201004

检索优化

解决三个问题:如何实现准确的语义表示?如何将查询和文档的语义空间对齐?如何将输出与LLM的偏好对齐?

语义表示优化

  1. 块优化:文档需要分块才能提取细粒度的特征,但块的大小会影响结果。用户查询的query长度和不同的嵌入模型对不同的块大小性能也不同。-> 不存在最佳策略,应该灵活应用。可以使用滑动窗口技术,也可以使用先小后大的方式进行处理。
  2. 对嵌入模型做微调:嵌入模型对专业领域能力有限,针对不同的下游任务有问题。针对这两个方面作微调可以有效提升性能。

查询与文档对齐

查询重写,嵌入转换

检索器与LLM对齐

使用LLM的反馈信号完善检索模型;

生成优化

对检索出来的文档需要再次进行处理,包括信息压缩、结果重排序。

------------- Thanks for watching -------------