51好读  ›  专栏  ›  程序员好物馆

检索增强生成

程序员好物馆  · 公众号  ·  · 2025-03-18 09:00

正文

请到「今天看啥」查看全文


图片

作者 | 江南一点雨

来源 | 江南一点雨


一 什么是RAG

RAG,英文全称是 Retrieval-Augmented Generation,中文我们一般叫做检索增强生成,这是一种结合信息检索技术与生成式大语言模型(LLM)的框架。

RAG 的核心思想是:在生成答案前,先从外部知识库中检索相关信息,并将这些信息作为上下文输入大模型,从而提升生成内容的准确性和时效性。

简单来说,由于大模型知识比较陈旧,当我们提问时,我们可以利用搜索工具在互联网上搜索我们问题的答案,并且将搜索到的答案和我们原本的问题一起发给大模型,由大模型进行处理。

想象一下:你有一个特别聪明的朋友,但他有个毛病——喜欢“不懂装懂”

  • 比如你问他:“最近有什么好看的科幻电影?”
  • 他可能会瞎编:“《星际穿越2》上周刚上映,评分 9.8!”(其实根本没这部电影)
  • 这时候你会说:“等等,你先去豆瓣查一下再回答!”

这个“先查资料再回答”的过程,就是 RAG(检索增强生成)的核心!

具体来说,RAG 就是让 AI 学会“先查资料再说话”。

二 为什么要用 RAG

  • 防止 AI 胡说八道 :比如你问“华为手机最新款多少钱”,AI 如果不知道,可能乱报价格。但 RAG 会先查华为官网的数据,回答更靠谱。
  • 回答最新信息 :AI 的知识停留在训练的时候(比如只学到 2023 年),但 RAG 能查 2025 年的新闻,比如“比亚迪全民智驾发布会”。
  • 保护隐私 :比如医院的 AI 只用内部病历资料回答,不会泄露病人信息到网上。

举个松哥之前遇到的例子:

场景 :你问 AI 客服:“退货需要带什么?”

  • 没用 RAG 的 AI :可能说“带身份证和购物小票”(其实我们公司规定只要手机订单截图)。
  • 用了 RAG 的 AI :立刻查公司最新的《退货政策文档》,回答:“您好!请出示手机订单截图即可~”

当我们使用 RAG 之后,有如下一些优势:

  1. 减少幻觉 :LLM 可能生成看似合理但缺乏事实依据的内容(如虚构航空公司行李限额),而 RAG 通过引用权威数据源降低错误率。
  2. 突破知识时效性限制 :大模型训练数据存在截止日期(如 GPT-4 知识截止至 2023 年),RAG 可实时更新知识库(如政策变更时同步文档)。
  3. 数据安全与隐私 :企业敏感数据无需上传至公有模型,仅通过本地知识库增强回答(如客服系统引用内部退货政策)。
  4. 降低微调成本 :无需频繁重新训练模型,仅更新外部知识库即可适应新需求。

三 如何实现 RAG

我们来看下这张经典的 RAG 流程图:

这张图清晰展示了检索增强生成(RAG)的核心流程,分为 数据准备 问答生成 两大阶段。

我们分别来看。

3.1 数据准备阶段

3.1.1 文档分块(Documents → Chunked Texts)

文档分块就是将长文档(如 PDF、网页、手册)切割为短文本块,便于后续处理和检索。

比如你有一本 500 页的医疗教科书,直接丢给电脑处理会卡住。就像吃西瓜要切开,我们会把书按章节切块:

  • 疾病介绍切一块
  • 症状描述切一块
  • 治疗方法再切一块

这样电脑处理起来轻松,找信息也精准。就像你问"发烧怎么办",电脑直接翻到"发热症状处理"那小块回答你。

具体切块的方法可以按固定长度(如每段 512 字)或语义边界(段落/标题)分割,常用工具包括 LangChain 的 TextSplitter

3.1.2 生成嵌入(Generate Embeddings)

生成嵌入(Embedding)的核心目的是让计算机能像人类一样“理解”复杂的数据,比如文字、图片甚至用户行为。

计算机天生只能处理数字,但现实世界的数据(比如文字、图片)是抽象的。嵌入就像一种“翻译器”,把抽象内容转换成 多维向量 (一串有规律的数字)。

举个简单例子,比如“猫”对应数字 [0.2, -0.4, 0.7] ,而“狗”对应 [0.3, -0.3, 0.6] 。这两个向量在数学上距离很近,说明它们的含义相似,都是描述宠物。

传统方法(如独热编码)只能机械地给数据编号,但嵌入能挖掘数据之间的 语义关系 。比如“国王”和“王后”在向量空间中的位置接近,因为它们都代表统治者。

一般来说,这种相近的关系通过 向量夹角 来衡量——角度越小,相关性越高。例如,金融类文章和计算机类文章的向量夹角接近90度(正交),说明主题完全不同。

这块相关知识点松哥在前面文章中也有介绍,这里不再赘述。

另一方面,通过 Embeddings 也能节省资源,提升效率。假设原始数据(如 10 万个单词)如果用独热编码会占用大量内存,而嵌入通过 降维 (Dimensionality Reduction)将信息压缩到低维向量(如 300 维),既保留关键特征,又减少计算量。

举个简单例子,一张图片原本由百万像素组成,嵌入后只需几百个数字就能表达其主要内容,方便机器学习模型快速处理。

嵌入模型(如 Word2Vec、BERT)通过大量数据自动学习,无需人工标记。例如,它发现“苹果”和“香蕉”常出现在相似语境中(比如水果沙拉),于是将它们分配到相近的向量位置。

在具体实践中,我们可以使用一些成熟的嵌入模型,如 OpenAI 的 text-embedding-3-small 、开源的 BAAI/bge 系列等将文本块转换为高维向量,捕捉语义信息。

那么这块需要注意的是,向量质量直接影响检索效果,需选择与领域匹配的模型(如法律文本用专业微调模型)。

3.1.3 存储向量数据库(Vector DB)

想象一下,你有一个图书馆,传统的图书馆只能通过书名、作者这类关键词找书,但如果你要找“和《哈利波特》风格相似的书”,传统方式就得一本本翻,效率极低。而向量数据库就像是一个“智能图书馆管理员”,它能把每本书的内容转化成一组数字(比如《哈利波特》可能被编码成[0.3, 0.7, 0.2...]这种数字串),然后通过计算这些数字之间的距离(比如相似度),快速帮你找到内容、风格相近的书。

向量数据库的核心作用就是专门处理图片、文字、语音等非结构化数据,把它们变成“数字指纹”,再通过“指纹”快速匹配相似内容。比如人脸识别、推荐你喜欢的短视频、让聊天机器人理解你的问题背后含义,都离不开它。

常见的向量数据库有如下几种:

Milvus

免费开源,适合技术团队折腾。能处理千亿级数据,适合大规模场景(比如公安系统用它在几十亿人脸中快速匹配罪犯)。

腾讯云 VectorDB

不用自己维护服务器,一键托管。最高支持 10 亿级数据,延迟控制在毫秒级。适合不想折腾的中小企业,还能直接上传文档自动切分、转成向量(比如把公司内部资料库变成 AI 能理解的格式)。

Pinecone

完全托管,提供简单 API,支持实时更新数据。比如电商网站想根据用户最新点击行为实时推荐商品,用它能快速调整推荐结果。

Faiss

Facebook 开源的高效搜索库,适合研究人员和开发者自己集成到系统里。比如学术论文里做实验,需要快速对比百万级数据。

Annoy

简单易用,适合小规模数据或快速验证想法。比如个人开发者想做个“以图搜图”的小程序Demo。

当然,除了上面这些,还有很多其他的,如 Chroma 等,这里松哥就不逐一列举了。

3.2 问答生成阶段

3.2.1 用户提问

当用户问“巴黎奥运会在哪举办?”时:

  • 语义理解 :系统先用同样的嵌入模型把问题转成向量坐标。
  • 意图补充 :自动推测隐藏信息(例如补充“2024年”的时间限定)。

3.2.2 检索阶段

  • 余弦相似度计算 :用数学公式比对问题向量和知识库所有向量,找出角度最接近的坐标(角度越小越相关)。
  • 多维度筛选 :除了相似度,还会考虑文档权威性、时效性(比如优先选择官网文件)。

3.2.3 生成答案

  • 上下文拼接 :把检索到的 3-5 个相关段落(如奥运会历史背景、2024 年主办城市信息)和用户问题一起喂给大模型。
  • 可控性生成 :通过 Prompt 工程 指定回答风格(如“用小学生能听懂的话解释”),避免专业术语堆砌。
  • 幻觉过滤 :后处理模块检查是否存在编造内容(例如“巴黎奥运会将在月球举办”这类错误),通过置信度评分自动拦截。

3.2.4 举个例子

如何给手机充电?

  1. 检索层 找到知识库中的《电子设备维护指南》段落:“使用原装充电器,避免过度放电”
  2. 生成层 将其转化为:“亲,建议您使用手机配套的充电器哦~电量低于 20% 就及时充电,对电池更好呢!(来源:XX 产品手册)”
  3. 修正层 自动删除原文的专业术语“锂离子电池循环寿命”,替换为口语化表达

通过这种“检索+生成”的协作模式,RAG 既能像图书馆精准定位资料,又能像作家写出自然流畅的回答,成为企业知识管理的“智能大脑”。

四 RAG 优势

对比维度
传统搜索引擎
RAG 系统
知识更新
需人工维护
更新知识库即可
回答质量
碎片化链接
结构化总结
安全可控
数据外流风险
本地存储知识库

五 流程特点(从设计视角)

  1. 模块化架构
  • 数据准备与生成阶段解耦,支持独立优化(如更换向量数据库不影响生成模块)。
  • 关键路径可视化
    • 蓝色突出核心流程(文档→嵌入→检索→生成),灰色背景降低视觉干扰。
  • 实时性体现
    • 向量数据库支持动态更新(如第三节图中箭头指向 VectorDB),可实时同步新知识。

    六 典型应用场景

    1. 企业知识库问答
    • 员工提问“报销流程” → 检索内部制度文档 → 生成步骤化指引。
  • 学术研究辅助
    • 输入“量子计算最新进展” → 检索 arXiv 论文摘要 → 生成综述性回答。
  • 个性化推荐
    • 用户询问“适合夏天的轻薄外套” → 检索商品特征库 → 生成推荐理由+链接。

    企业知识库问答也是松哥目前在做的方向。

    七 RAG 的局限性

    尽管 RAG 优势显著,但仍面临以下挑战:

    1. 检索质量依赖性强
    • 若知识库包含错误或无关信息(如过时政策),生成的答案可能受影响。
    • 案例 :模糊查询可能导致检索偏差(如“AI 芯片”误匹配到显卡型号)。
  • 计算资源与效率
    • 检索+生成的双阶段流程增加响应时间,难以满足高实时性场景(如实时翻译)。
  • 领域适配成本高
    • 专业领域(如法律、医学)需构建高质量知识库,数据清洗和标注成本较高。

    优化方向

    • 混合检索 :结合关键词、向量、图谱等多模态检索提升查全率。
    • 动态评估与迭代 :通过用户反馈和 A/B 测试持续优化检索策略。

    最后,我们再通过下面这张图总结下今天的内容:

    • Source 就是各种格式的原文档。
    • Load 则是文档加载器加载文档。
    • Transform 则是我们对文档进行分块处理等操作。
    • Embed 就是向量化。
    • Store 存储向量化的数据。
    • Retrieve 检索。

    好啦,后面松哥将会逐一介绍这里涉及到的每一步操作。

    图片

    好啦,今天的内容分享就到这,感觉不错的同学记得分享点赞哦!
    PS: 程序员好物馆 持续分享程序员学习、面试相关干货,不见不散!
    图片
    点分享
    图片
    点收藏
    图片
    点点赞
    图片
    点在看







    请到「今天看啥」查看全文