RAG 检索增强生成技术详解

定义

检索增强生成(Retrieval-Augmented Generation,RAG)是一种从外部数据库检索出相关信息来辅助改善LLM生成质量的系统。

背景

训练数据导致的幻觉

  • 知识过时:训练数据在模型训练后发生了更新
  • 知识边界:数据采集无法覆盖所有知识,特别是垂域知识
  • 知识偏差:训练数据包含不实与偏见信息

模型自身导致的幻觉

  • 知识长尾:训练数据中部分信息出现频率较低,导致模型对知识的学习程度较差
  • 曝光偏差:由于模型训练与推理任务存在差异,导致模型在实际推理时存在偏差
  • 对齐不当:在模型与人类偏好对齐阶段中,偏好数据标注不当可能引入了不良偏好
  • 解码偏差:模型解码策略中的随机因素可能影响输出的准确性

组成

RAG系统主要由三个核心组件构成:

  • 外部知识库(Corpus)
  • 信息检索器(Retriever)
  • 生成器(Generator,即大语言模型)

具体而言,给定一个自然语言问题(Query),检索器将问题进行编码,并从知识库中高效检索出与问题相关的文档。然后将检索到的知识和原始问题一并传递给大语言模型,模型根据检索到的知识和原始问题生成最终的输出。

架构

黑盒增强架构

RAG生成器选用的大语言模型参数不可感知/调节。无法获取LLM的结构和参数,没有足够算力对模型微调,只能通过API进行交互,将语言模型视为一个黑盒。仅可对检索器进行策略调整与优化。

适合场景:闭源模型

实现方式

  • 无微调:检索器和LLM都不进行任何微调,仅依靠在预训练阶段掌握的能力完成相应检索和生成
  • 检索器微调:LLM参数不变,检索器根据语言模型的输出反馈进行参数的针对性调整

白盒增强架构

RAG生成器选用的大语言模型参数可以感知/调节。大预言模型和检索器是独立预训练的,二者存在匹配欠佳的情况,白盒RAG通过微调大语言模型为配合检索器,提升RAG的效果。

适合场景:开源模型

实现方式

  • 大语言模型微调:检索器参数不变,语言模型根据检索器提供的相关信息进行参数调整
  • 检索器与大预言模型协同微调

核心内容——知识检索

知识库构建

数据采集与预处理

数据采集:数据被整合、转换为统一的文档对象(包含原始的文本信息,还携带有关文档的元信息Metadata)

数据预处理

  • 数据清洗:清除文本中的干扰元素,特殊字符、异常编码、HTML标签等
  • 数据分块:长文本分割成小文本块

知识库增强

  • 查询生成:生成与文档内容紧密相关的伪查询(相关文档的键,供检索时与用户查询进行匹配)
  • 标题生成:为没有标题的文档生成合适的标题

查询增强

用户查询与知识库之间不能很好的匹配,降低了检索效果,因此可以对用户查询的语义和内容进行扩展:

  • 查询语义增强:同义改写、多视角分解
  • 查询内容增强:生成与原始查询相关的背景信息和上下文

检索器

作用:找到知识库中与用户查询相关的知识文本

分类

  • 判别式检索器:判别模型对查询与文档是否相关进行打分
  • 稀疏检索器:统计文档中特定词出现的统计特征来对文档进行编码
  • 稠密检索器:利用预训练语言模型对文本生成低维、密集的向量表示,通过计算向量间的相似度进行检索
  • 生成式检索器:通过生成模型对输入查询直接生成相关文档的标识符(DocID)

检索效率增强

检索结果重排

核心内容——生成增强

检索器得到相关信息后,传递给大预言模型增强模型的生成能力。

何时增强

判断大预言模型是否具有内部知识(在训练过程中掌握的大量知识):

  • 外部观测法:prompt直接询问是否具备,或应用统计对是否具备内部知识进行估计
  • 内部观测法:检测模型内部神经元的状态信息

项目实现:DeepSeek + RAGFlow构建个人知识库

问题背景

DeepSeek无法满足的场景:面对个性化的需求以及隐私数据等,DeepSeek存在暴露的风险以及对专业知识的未知。

解决方案

本地化部署DeepSeek大模型解决隐私问题,个性化知识库的创建解决专业问题。RAG技术可以构建个人知识库,需要RAGFlow开源架构在本地部署。

RAG技术与微调的区别

微调:大模型在常用数据集训练好之后,对于特定领域或个性化专业问题的解决不是很好,增加一部分特殊数据对模型重新进行训练,使得大模型更好地解决相关问题,但是这样的解决方式对于企业和个人来说成本较高。

RAG:通过已有的知识库,在遇到不懂的专业或特定领域的问题时,大模型会检索相关数据,给出对应的回答。部署蒸馏后的大模型 + RAG技术,可以更好地解决此类问题。

RAG技术实现步骤

  1. 检索(Retrieval):在知识库中检索用户输入的关键词
  2. 增强(Augmentation):结合检索到的知识与用户输入,扩展大模型的上下文,再传递给生成模型(DeepSeek)
  3. 生成(Generation):结合检索知识生成回答,更加准确

Embedding技术

将自然语言通过映射到向量空间,那么含义相近的词在向量空间中的距离就会很近。通过该技术将外部知识库和用户的输入词进行转换,使得大模型可以读取这两部分的内容。

环境配置

Ollama安装配置

Ollama是用于本地运行和管理大模型的平台工具,从官网下载(默认正常安装到C盘,但是模型最好安装在D盘)。

配置环境变量

OLLAMA_HOST    0.0.0.0:11434
OLLAMA_MODELS    D:\OllamaModels

⚠️ 需重启电脑后下载DeepSeek-R1模型的1.5b(大概1.5G)

在cmd中运行命令

C:\Users\邹阳>ollama run deepseek-r1:1.5b
pulling manifest
pulling aabd4debf0c8: 100%
pulling c5ad996bda6e: 100%
pulling 6e4c38e1172f: 100%
pulling f4d24e9138dd: 100%
pulling a85fe2a2e58e: 100%
verifying sha256 digest
writing manifest
success
>>> 你好
你好!很高兴见到你,有什么我可以帮忙的吗?无论是学习、工作还是生活中的问题。

>>> 你是谁
您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您需要帮助,请随时提问。

>>> Send a message (/? for help)

RAGFlow部署

RAGFlow是用于构建RAG应用的开源引擎,可以帮助把PDF、Word、网页等资料变成一个大模型精准检索和问答的知识库。

工作执行步骤

  1. 文档解析:PDF/Word/HTML → 拆分成文本chunk
  2. 向量化(Embedding):文本 → 向量
  3. 向量存储:存入数据库
  4. 检索 + 大模型问答:用户问题 → 向量检索 → 相关文本 → 生成回答

下载安装步骤

  1. 从GitHub上使用git clone下载源代码到D盘的ragflow文件夹中,或者使用download zip包。其中包含后端服务 + 前端UI + 文档解析模块 + 向量化 + Docker编排文件(docker-compose.yml)

  2. d:\ragflow\docker\.env文件中的slim模型切换成带有embedding的设置。该文件用于给Docker配置运行时参数,需要切换到带有embedding的模型,否则需要本地部署embedding模型或调用第三方API

  3. 启动Docker。RAGFlow是一个多服务系统,包含了API服务、Web UI、向量数据库、模型服务、文档解析服务,这些服务的运行环境不同,手动配置成本极高

  4. 命令行中输入:

    docker compose -f docker-compose.yml up -d
    

    或者

    docker compose -f docker/docker-compose.yml up -d
    

    (根据当前位置确定)

通过Docker的编排文件拉取所需镜像,创建容器,按依赖顺序启动服务,并最后暴露Web端口,供浏览器最后访问。

问题解决

下载镜像过慢问题

下载Redis、RAGFlow、MySQL、ES01镜像太慢,1个多小时都不能下载成功。

解决方案
Docker Engine添加镜像源:"https://docker.1ms.run"

可以快速拉取成功,之前下载成功的也会保存下来,就算命令行中停止掉也没关系。

docker compose -f docker/docker-compose.yml pull

这个命令可以看到下载进度。

💡 挂载上梯子之后应该就可以畅通下载了

下载完成之后,输入命令:

docker logs -f ragflow-server

说明服务启动成功。

准备工作

Docker配置
Docker中resources的disk image location位置进行修改:

D:\software\docker\DockerDesktopWSL

关闭自启动
关闭下载的Ollama开机自启动(设置-应用)

💡 这一整套实践本质是在Windows上,使用Linux容器(Docker)运行DeepSeek + RAGFlow这套服务。因此需要CPU的虚拟化(硬件级)、Windows虚拟化平台(Hyper-V/Virtual Machine Platform)、WSL2(Linux内核)、Docker(跑容器)

CPU虚拟化:支持同时运行多个操作系统级环境

为什么DeepSeek + RAGFlow非要虚拟化:通过Docker/docker-compose方式运行,依赖Linux的一些服务。Hyper-V是虚拟化的平台,而WSL2才是Linux的真正内核。

虚拟化配置

查看电脑是否启用虚拟化技术(未开启的话需要进入BIOS开启):

Windows功能配置
开始 → 控制面板 → 程序 → 开启或关闭Windows功能 → Hyper-V
勾选开启Hyper-V

⚠️ Windows家庭中文版默认不显示Hyper-V,所以不想重装专业版Windows的话使用DISM命令显示Hyper-V

将下述命令保存为hyper-v.bat,然后管理员运行后重启电脑,会发现Windows功能中有了Hyper-V选项:

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

检查WSL2是否安装好
cmd中输入:

wsl -l

启用虚拟化
管理员身份运行PowerShell,输入命令:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

设置WSL默认版本

wsl --set-default-version 2

使用配置

之后就可以在RAGFlow上进行模型设置,然后创建自己的知识库,上传自己的数据集,选择设置的模型。

💡 这里模型可以选择Ollama下载的本地模型,也可以直接调用不同模型公司的API,后者一般更好用,但是隐私安全缺乏,并且需要付费

⚠️ 这个实践对PC的运行内存要求很高,16GB很可能不够用

最后停留在了因为内存不够这里: