全栈开发知识库

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技术是一种结合信息检索与生成模型的新型架构,其核心思想是利用外部知识库或文档集合为大模型提供实时、准确的背景信息,从而弥补大模型的局限性。

Image

一个绝佳的类比

  • 纯大模型 = 一个知识渊博但闭卷考试的学霸,遇到没背过的就只能猜

  • 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=只训练少量附加参数的低成本微调法)
  • 资料量不大且固定 -> 直接塞长上下文、最简单
本页由 Markdown 自动渲染 · 共 628 篇笔记