RAG
RAG概念
RAG(Retrieval Augmented Generation):检索增强生成。
顾名思义,就是通过检索外部数据,增强大模型的生成效果。
RAG为LLM提供了从某些数据源检索到的信息,并基于此修正生成的答案。
RAG基本上是Search + LLM提示,可以通过大模型回答查询,并将搜索算法所找到的信息作为大模型的上下文。查询和检索到的上下文都会被注入发送到LLM的提示语中。
将大模型应用于实际业务场景时会发现,通用的基础大模型基本无法满足我们的实际业务需求,主要有以下几个方面的原因:
- LLM的知识不是实时的,不具备知识更新
- LLM可能不知道你私有的领域/业务知识
- LLM有时会在回答中生成看似合理但实际上是错误的信息
为什么会用RAG
- 提高准确性: 通过检索相关的信息,RAG可以提高生成文本的准确性
- 减少训练成本: 与需要大量数据来训练的大型生成模型相比,RAG可以通过检索机制来减少所需的训练数据量,从而降低训练成本。
- 适应性强: RAG模型可以适应新的或不断变化的数据,由于它们能够检索最新的消息,因此在新数据和事件出现时,它们能够快速适应并生成相关的文本。
RAG系统兼具检索与生成的双重能力,可视为传统生成系统的升级版:既有效减少了幻觉现象,又显著提升了回答的事实准确性。该技术还支持“与数据对话”(chat with my data)的应用场景,使企业和个人能够将LLM与内部数据或特定数据源(如书籍内容)对接。
RAG技术是一种结合信息检索与生成模型的新型架构,其核心思想是利用外部知识库或文档集合为大模型提供实时、准确的背景信息,从而弥补大模型的局限性。
一个绝佳的类比
-
纯大模型 = 一个知识渊博但闭卷考试的学霸,遇到没背过的就只能猜
-
RAG = 同一个学霸,但允许开卷考试 -- 答题前先翻书找到相关章节,再基于书本作答
这样答案质量立刻大幅提升,而且有据可查(能告诉你答案来自哪份文档)。
RAG工作流程
RAG标准流程由索引(Indexing)、检索(Retriever)和生成(Generation)三个核心阶段组成。
-
索引阶段
- 加载文件
- 内容提取
- 文本分割,形成chunk
- 文本向量化
- 存向量数据库
-
检索阶段
- query向量化
- 在文本向量中匹配出与问句向量相似的top_k个
-
生成阶段
- 匹配出的文本作为上下文和问题一起添加到prompt中
- 提交给LLM生成答案
RAG的完整链路
【离线:准备资料库】
你的文档 -> ① 切分成小块(Chunk) -> ② 向量化(Embedding) -> ③ 存入向量数据库
【在线: 回答提问】
用户提问 -> ④ 把问题也向量化 -> ⑤ 在向量库里检索最相似的片段(TopK),重排序(rerank) -> ⑥ 把【检索到的片段 + 问题】拼成 Prompt -> ⑦ 模型基于片段作答
主要环节
- Embedding: 把文本映射成高维向量,语义相近 -> 向量距离近(常用余弦相似度)
-
分块(chunking): 文档太长必须切块再向量化。块太大 -> 检索不精确,块太小 -> 上下文残缺。常见策略: 固定长度 + 重叠(overlap)、按标题/段落结构切。
-
向量数据库: Qdrant、Milvus、Chroma、FAISS、pgvector。核心能力是近似最近邻(ANN)检索 -- 百万级向量里毫秒级找TopK。
-
重排序(rerank): 向量检索快但糙,先召回Top50,再用更精细的cross - encoder模型(把问题+候选文档成对送进模型逐一打分,比单独算向量距离更准、但也更慢),所以只用于小范围重排),排出Top5,精细度显著提升。
核心概念: Embedding(向量化)与向量检索
什么是Embedding
Embedding = 把一段文字变成一串数字(向量),这串数字代表了这段文字的语义。
神奇之处在于: 语义相近的文字,它们的向量在空间里也距离相近(常用余弦相似度)。
举例(简化):
•「小猫」→ [0.2, 0.9, 0.1, ...]
•「猫咪」→ [0.21, 0.88, 0.12, ...] ← 和「小猫」很近
•「汽车」→ [0.8, 0.1, 0.7, ...] ← 离得很远
所以找语义相关的内容就变成了找向量距离最近的内容 --- 一个纯数学问题,计算机极快。
为什么这比关键词搜索强?
关键词搜索怎么处理空指针找不到写着如何避免NPE的文档(因为字不一样),但它俩语义相近,向量检索能找到。 这就是语义搜索,比关键词搜索强。
怎么作Embedding
调一个专门的Embedding模型API(和聊天API类似)。
向量数据库
存这些向量、并能快速找到最相近的K个的数据库,就叫向量数据库。
RAG
- MySQL问答: 缓存高频问题
- RAG问答:
- 离线知识库
- 在线问答
RAG、微调、上下文的区别
- 知识频繁更新、要溯源 -> RAG (改库即生效,能标注出处)
- 要改变模型的风格、格式、领域行为 -> 微调 (用自己的数据继续训练模型、SFT=监督微调,LoRA=只训练少量附加参数的低成本微调法)
- 资料量不大且固定 -> 直接塞长上下文、最简单