当前位置: 首页 > news >正文

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.dtcms.com/a/325058.html

相关文章:

  • 专题二_滑动窗口_最小覆盖子串
  • 【lucene】BlockDocsEnum 跟BlockImpactsDocsEnum 的区别
  • C++入门学习5
  • Boost.Asio io_service 与 线程 的分析
  • playwright-mcp 项目全解析:从理论到实践
  • 消息队列系统测试报告
  • Effective C++ 条款33:避免遮掩继承而来的名称
  • 企业临时文件分享方案:基于本地加密的轻量级实现
  • Unity3D游戏中如何制作空气墙
  • 动态群签名-DGS:实现抗女巫攻击
  • eBay功能升级:卖家提升流量与转化的新契机
  • 深入解析NumPy广播机制:让不同形状的数组无缝运算
  • 【MySQL——第三章 :MySQL库表操作】
  • Redis 数据类型和单线程模型补充
  • HyDE 在 RAG 知识问答助手中的应用解析
  • CentOS7安装和使用Workbench
  • AtomicStampedReference解决方案
  • 基于python/django框架的车型识别系统
  • 复现论文《基于Retinex理论和深度学习的低照度图像增强算法研究》
  • 问津集 #4:The Five-Minute Rule for the Cloud: Caching in Analytics Systems
  • windows运维
  • SF-CPI-SAP问题收集24:集成地址信息的村里字段无法页面显示问题
  • ECharts 的理解和简单应用笔记
  • 【无标题】消息队列(Message Queue)是一种**进程间通信(IPC)机制
  • 深度学习-卷积神经网络-AlexNet
  • index.d.ts 是什么?作用 + 怎么生成?
  • 糖果大冒险:公平分发的智慧挑战
  • Stagewise使用指南:从项目集成到效能跃迁的深度解析
  • 【算法题】:和为N的连续正数序列
  • AI大模型-提示词工程