华少的博客

谁的头顶上没有灰尘,谁的肩上没有过齿痕

0%

RAG 观察

前言

近些年,AI 领域蓬勃发展,在NLP 领域,由之前的LSTM、Transformer 到后来的BERT、GPT等大规模预训练模型,NLP 技术不断突破,为下游多种应用场景带来了革新。然而,传统的语言模型存在一些固有的局限性。它们主要依赖于在大规模文本数据上进行预训练,学习到的知识和语言理解能力都蕴含在模型参数中。这导致模型难以适应新的知识和领域,泛化能力有限。此外,当需要根据外部知识进行推理和问答时,传统的语言模型往往捉襟见肘。

为了克服这些局限性,研究者们提出了一种新的范式——RAG(Retrieval-Augmented Generation),即检索增强生成。RAG模型通过融合知识检索和语言生成两个阶段,实现了更加强大和灵活的自然语言处理能力。与传统的语言模型不同,RAG可以根据输入的问题或上下文,实时检索相关的外部知识,并利用这些知识来指导答案的生成。这使得RAG模型能够利用海量的结构化和非结构化知识,动态适应不同的任务需求。

LLM 让RAG 爆发

如今,LLM 的出现让RAG 的应用爆发,主要原因是LLM 在处理领域特定或高度专业化查询方面有明显的局限性。
局限1:生成错误信息,就是所谓的“幻觉”。这类问题在查询的内容超出模型训练数据的范围或需要最新信息的场景中,尤其突出。这里就涉及到LLM 对齐,需要微调或强化学习。
局限2:时效性差。而RAG 正是通过检索外部数据并将其整合到生成过程中,从而增强了模型回复的准确性和相关性。

RAG 实现原理和工程实现

RAG的主要优势在于,在开发针对特定任务的应用时,开发者可以直接附加一个外部知识库来丰富输入,从而提高模型输出的精确度,无需对LLM进行针对性的二次训练。

如图所示RAG 的整体实现过程:
llm-rag

实现RAG 的工作流主要有三个关键步骤:

  1. 语料库被划分为离散的块,使用编码器模型构建向量索引
  2. RAG 根据Query 与 索引块(Indexed Chunk)的向量相似度识别并对块进行检索
  3. LLM 根据检索块(Retrieved Chunk)中获取的上下文信息生成回复

一个简单的本地RAG 实现如下图所示:
rag-ollama

以上流程看似简单,但每一步都有很多创新方法,比如检索什么,何时检索,如何使用检索到的信息等。
再加上工程实现上,每一步的性能和评估都需要详细实践。因此我们需要深入分析每一步。
带着问题来深入思考下RAG,如:

  1. 怎么划分离散块,策略是什么
  2. 使用什么样的编码模型
  3. 向量维度怎么确定,向量存储库的使用
  4. 检索算法如何选择
  5. LLM 上下文长度与检索块大小如何平衡
  6. 如何建立RAG 评估体系
  7. 多模态RAG

未完待续…

参考

读论文:大模型的RAG 调查

基于GPU 的检索增强生成(Nvidia)

一文读懂RAG的来源、发展和前沿

Ollama Embedding: How to Feed Data to AI for Better Response?