RAG (Retrieval-Augmented Generation) 原理详解与实例

核心概念:什么是 RAG?

在这里插入图片描述

想象一下,你是一位专家,需要回答一个复杂的问题。你不会凭空编造答案,而是会:

  1. 检索 (Retrieval):先去查阅相关的书籍、论文、报告或数据库,找到最相关的信息片段。
  2. 理解与整合 (Comprehension & Integration):阅读这些信息,理解其核心内容。
  3. 生成 (Generation):基于你检索到的信息和你自身的专业知识,组织语言,生成一个准确、全面、连贯的回答。

RAG 就是让大型语言模型 (LLM) 模拟这个过程。 它不是让 LLM 单纯依赖其训练时学到的(可能过时或不完整的)知识来生成答案,而是在生成答案之前,先从一个外部知识库中检索出与当前问题最相关的信息,然后将这些信息作为上下文提供给 LLM,指导它生成更准确、更可靠、更具时效性的答案。

RAG 的核心原理与工作流程

RAG 系统通常包含两个主要阶段:

阶段一:离线构建阶段(知识库准备)

这个阶段是“打地基”,为后续的检索做准备。

  1. 数据收集与预处理

    • 收集你需要模型能够回答的问题相关的所有知识来源。这可以是:
      • 公司内部文档(产品手册、技术文档、HR政策、销售记录)
      • 领域知识库(医学文献、法律条文、学术论文)
      • 网页内容(新闻、博客、论坛帖子)
      • 数据库记录
    • 对收集到的原始数据进行清洗(去除无关信息、格式错误)、分块 (Chunking)分块是关键步骤,因为 LLM 的上下文窗口长度有限,且小块信息更容易精准匹配。例如,将一篇长文档按段落、句子或语义单元分割成多个小块。
  2. 文本嵌入 (Embedding)

    • 使用一个嵌入模型 (Embedding Model),如 text-embedding-ada-002 (OpenAI), BAAI/bge-large-en-v1.5, sentence-transformers/all-MiniLM-L6-v2 等。
    • 将每个文本块(Chunk)转换成一个向量 (Vector),也叫嵌入 (Embedding)。这个向量是一个由数字组成的列表(例如,长度为 768, 1536 等),它语义上代表了该文本块的核心含义。
    • 核心思想:语义相似的文本块,在向量空间中的位置(向量)会非常接近;语义不相关的文本块,向量位置会相距较远。(具体如何衡量“接近”,详见附录 A:余弦相似度)
  3. 构建向量数据库 (Vector Database)

    • 将所有文本块及其对应的向量存储在一个专门的向量数据库 (Vector Database) 中。常见的向量数据库包括:
      • 开源/自托管: Chroma, FAISS, Weaviate, Qdrant, Milvus
      • 云服务: Pinecone, Azure Cognitive Search, Google Vertex AI Matching Engine
    • 这个数据库建立了文本块 -> 向量 以及 向量 -> 文本块 的映射关系。它支持高效的相似性搜索,能快速找到与给定向量最相似的向量(及其对应的文本块)。(在海量数据下,这种搜索通常使用“近似最近邻”算法,详见附录 B:近似最近邻)

离线阶段总结: 我们将所有知识源处理成小块,用嵌入模型把它们变成向量,存进向量数据库。这个数据库就像一个巨大的、按语义组织的“索引”。

阶段二:在线推理阶段(回答用户问题)

当用户提出一个问题时,RAG 系统开始工作:

  1. 用户问题嵌入 (Query Embedding)

    • 用户输入一个问题,例如:“苹果公司最新发布的 iPhone 型号是什么?它的主要创新点有哪些?”
    • 使用同一个嵌入模型,将这个问题也转换成一个向量。
  2. 相似性检索 (Similarity Search)

    • 将用户问题的向量,输入到向量数据库中。
    • 向量数据库执行相似性搜索,找到与问题向量最接近的 Top K 个(例如,Top 5)向量。
    • 数据库返回这些最相似向量对应的原始文本块。这些文本块就是从知识库中检索到的、与用户问题最相关的信息片段。
  3. 提示词构建 (Prompt Construction)

    • 将检索到的相关文本块(作为上下文 Context)和用户的原始问题组合成一个精心设计的提示词 (Prompt)
    • 这个提示词通常包含:
      • 指令 (Instruction):告诉 LLM 它的角色和任务(例如:“你是一个乐于助人的知识助手。请根据以下提供的背景信息,准确回答用户的问题。”)。
      • 上下文 (Context):插入检索到的 Top K 个文本块(用分隔符分开,如 ---)。
      • 问题 (Ques

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92765.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SOMGAN:利用自组织映射提高生成对抗网络的模式探索能力

论文信息 论文题目:Improving mode exploring capability ofgenerative adversarial nets by self-organizing map(利用自组织映射提高生成对抗网络的模式探索能力) 期刊:Neurocomputing 摘要:生成对抗网络(GANs)的出…

全栈:如果SSM项目里的数据库是mysql而自己使用的是SQLserver应该替换哪些文件?

将基于 SSM(Spring SpringMVC MyBatis)框架项目里的 MySQL 换成 SQL Server,主要需改动以下几部分: 1. 依赖配置(pom.xml) 移除 MySQL 驱动依赖:找到原 MySQL 驱动相关依赖,一般类…

基于 Jenkins Pipeline 实现 DITA 文档自动化构建与发布(开源方案)

这是我最近开发的一个基于 Jenkins Pipeline 的 DITA 文档自动化构建方案。对于需要维护大量 DITA 格式文档的团队来说,手动构建不仅效率低下,还容易出现版本不一致的问题。通过这套开源方案,我们可以实现代码拉取、多地图并行构建、结果归档…

reinterpret_cast and static cast

什么时候使用 reinterpret_cast&#xff1f;指针类型之间的转换&#xff1a; 当需要将一种类型的指针转换为另一种类型的指针时&#xff0c;可以使用 reinterpret_cast。例如&#xff1a;int* intPtr new int(10); void* voidPtr reinterpret_cast<void*>(intPtr); // …

自动化运维 | 乐维8.0安装及简单使用

文章目录1.创建虚拟机2.安装乐维8.03.Web界面登录访问4.添加第一个监控在文章的开头需要感谢乐维带来这么好的自动化运维系统提供我们学习参考或是在生产环境中进行使用&#xff0c;并附上乐维官网供大家参考和学习&#xff1a;https://www.lwops.cn/1.创建虚拟机 在VMware wo…

无印良品:回归本质的管理哲学

一、底层管理哲学 First, the underlying management philosophy核心思想&#xff1a;「无印」即「无品牌标识」&#xff0c;回归产品本质Core idea: "Muji" means "no brand logo", returning to the essence of products.拒绝过度营销&#xff0c;靠产品…

Redis面试精讲 Day 13:Redis Cluster集群设计与原理

【Redis面试精讲 Day 13】Redis Cluster集群设计与原理 开篇 欢迎来到"Redis面试精讲"系列第13天&#xff0c;今天我们将深入探讨Redis Cluster的集群设计与实现原理。作为Redis官方提供的分布式解决方案&#xff0c;Redis Cluster是面试中必问的高频考点&#xff…

LangChain-Unstructured 基础使用:PDF 与 Markdown 处理解析

文章目录LangChain-Unstructured 基础使用&#xff1a;PDF 与 Markdown 处理解析一、核心依赖与库说明二、核心类与方法详解1.UnstructuredLoader&#xff08;1&#xff09;类原型与核心功能&#xff08;2&#xff09;初始化参数详解&#xff08;3&#xff09;核心方法详解① l…

uboot使用指南

1.uboot的分类本节是 uboot 的使用&#xff0c;所以就直接使用正点原子已经移植好的 uboot&#xff0c;这个已经放到了开发板光盘中了&#xff0c;路径为&#xff1a;开发板光盘->1、程序源码->3、正点原子 Uboot 和 Linux 出厂源码->uboot-imx-2016.03-2.1.0-ge468cd…

学习率预热总结

学习率预热是什么&#xff1f; 学习率预热&#xff08;Learning Rate Warmup&#xff09; 是一种在深度学习训练初期逐渐增加学习率的策略。其核心思想是&#xff1a;在训练开始时使用较小的学习率&#xff0c;逐步增加到目标学习率&#xff0c;以避免模型参数在初始阶段因学习…

初识SYSCFG(System Configuration Controller)寄存器映射

SYSCFG&#xff08;System Configuration Controller&#xff09;寄存器映射的详细说明&#xff0c;以 STM32&#xff08;如 F1/F4/F7 系列&#xff09;为例。SYSCFG 控制器用于系统级配置&#xff0c;如外部中断映射、存储器重映射等。SYSCFG 寄存器映射概述 基地址&#xff1…

《P3403 跳楼机》

题目背景DJL 为了避免成为一只咸鱼&#xff0c;来找 srwudi 学习压代码的技巧。题目描述Srwudi 的家是一幢 h 层的摩天大楼。由于前来学习的蒟蒻越来越多&#xff0c;srwudi 改造了一个跳楼机&#xff0c;使得访客可以更方便的上楼。经过改造&#xff0c;srwudi 的跳楼机可以采…

【GPT-OSS 全面测评】释放推理、部署和自主掌控的 AI 新纪元

目录 一、背景与意义 二、核心参数对比 三、性能评测&#xff08;Benchmark&#xff09; 四、硬件适配与优化 五、安全性与风险 六、部署方式 七、适用场景 八、大型语言模型对比表&#xff08;2025 年 8 月版&#xff09; 总结 一、背景与意义 &#x1f4a1; 为什么…

医疗健康Agent:诊断辅助与患者管理的AI解决方案

医疗健康Agent&#xff1a;诊断辅助与患者管理的AI解决方案 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个特性都是我放…

python魔法属性__doc__介绍

doc: 魔法属性。类、函数的描述信息。 __doc__在python中类的使用方法&#xff1a; class Person(object):"""人类---类的描述信息""" # 只能使用多行注释&#xff0c;单行注释无效passprint(Person.__doc__)运行结果如图所示&#xff1a;__d…

PostgreSQL 批量COPY导入优化参数配置

&#x1f4a1; 场景假设我们进行的是 频繁批量导入、对数据持久性容忍较高 的场景&#xff0c;比如日志表、缓存表、临时数据表等。如果系统崩溃可重导入&#xff0c;那我们就可以牺牲一点写入安全性来换极致性能。⚙️ 参数配置推荐&#xff08;postgresql.conf&#xff09;参…

BeanDefinition 与 Bean 生命周期(面试高频考点)

Bean 是 Spring 应用的核心组件&#xff0c;而 BeanDefinition 作为 Bean 的 “元数据描述”&#xff0c;贯穿了 Bean 从定义到销毁的全生命周期。理解 BeanDefinition 的加载注册机制&#xff0c;以及 Bean 的完整生命周期&#xff0c;是掌握 Spring 容器管理逻辑的关键&#…

node.js 学习笔记2 进程/线程、fs

进程和线程 进程&#xff1a;进行中的程序。比如有一段程序&#xff0c;程序已经载入内存了&#xff0c;CPU正在执行这段程序&#xff0c;这时候就会产生一个进程。进程&#xff0c;也可以看做程序的一次执行过程。 在window中打开任务管理器&#xff0c;可以查看计算机中的所…

【线性代数】其他

上一节&#xff1a;【线性代数】线性方程组与矩阵——&#xff08;3&#xff09;线性方程组解的结构 总目录&#xff1a;【线性代数】目录 文章目录11. 向量的内积、长度及正交性12. 方阵的特征值与特征向量13. 相似矩阵14. 对称矩阵的对角化15. 二次型及其标准形11. 向量的内积…