【大模型应用】2.RAG详细流程

2.RAG的详细流程


所以这时候,就需要RAG登场

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合外部知识库检索与大语言模型生成的技术方案,核心目标是让大模型 "基于事实作答"缓解原生大模型的幻觉问题,同时支持私有 / 实时知识的高效接入

RAG 本质是

  • 从资料库里检索相关内容
  • 基于这些内容生成答案
  • 检索增强生成

为什么需要 RAG?

  • 原生大模型知识存在时效性限制(训练数据截止前)
  • 无法直接使用企业私有文档、内部知识库
  • 容易编造不存在的信息(幻觉),可靠性不足
  • 相比微调(Fine-tuning),RAG 成本更低、知识更新更灵活

下面介绍RAG的基本流程:

RAG 流程分为两大阶段:提问前(离线数据构建阶段)提问后(在线问答阶段),整体流程如下:

提问前:离线数据构建阶段

一步上传文件,会进行文档加载(知识入库)

  • 场景:读取不同格式的私有文档(PDF/Word/Excel/Markdown/ 网页等)

  • 技术实现

    • Java:使用 Apache POI、PDFBox、Tika 等库解析文档
    • Python:使用 LangChain、LlamaIndex 提供的文档加载器
分片

核心作用:将长文档切分成合适大小的文本片段,避免超出大模型上下文窗口,同时保证语义完整性

文档分块策略

分块是RAG效果的关键,块太大检索不精准,块太小又丢失上下文。常见的三种切法:

  • 1)语义切分:用SemanticSplitter这类工具,保证每个块语义完整独立,比如一个问答对不会被切成两半,如换行、标题、章节分隔符
  • 2)结构切分:HTML、PDF这种有层级的文档 ,按标题层级切割,像HTMLHeaderTextSplitter 就能保留文档结构
  • 3)**递归切分:**RecursiveCharacterTextSplitter 先按大的分隔符切切不动了再按小的切,兼顾连贯性和长度限制,保留上下文

实际项目里,300-500字一块是比较通用的起点,具体要根据业务场景调。

当然也有人按下面这么划分:

关键参数

  • 片段长度:通常 256~512 Token(根据模型上下文调整)
  • 重叠长度:设置 50~100 Token 重叠,避免语义被切断
索引

索引存储

  • 核心作用 :将向量与原文本片段关联,存入向量数据库或搜索引擎,实现高效相似检索

  • 常见存储方案

    • 向量数据库:Milvus、FAISS、Chroma、Pinecone(专门优化向量检索)
    • 混合检索:Elasticsearch + 向量插件(支持全文检索 + 语义检索
  • 索引类型

    • 暴力检索(Flat):准确率最高,适合小规模数据
    • 近似最近邻(ANN):如 HNSW、IVF,牺牲少量准确率换取百万级数据的毫秒级检索速度

向量化(Embedding)

  • 核心作用 :将文本片段转换为高维向量 ,让计算机能通过 "相似度" 计算理解文本语义

  • 技术实现

    • 开源模型:BGE、m3e、text2vec 等(适合中文场景)
    • 商用服务:OpenAI Embedding、百度文心 Embedding 等
  • 原理 :语义相近的文本,向量空间中的距离更近(如余弦相似度

向量数据库

每个文本都对应有对应的向量

提取后:在线问答交互阶段

召回(Retrieval)

召回

  • 核心作用 :从向量库中快速找出与用户问题语义最相关的 Top-K 个文本片段

  • 检索方式

    • 语义检索:基于向量相似度(余弦相似度、内积)
    • 全文检索:基于关键词匹配(如 BM25 算法)
    • 混合检索:结合语义 + 全文,提升召回准确率
  • 关键参数

    • Top-K:通常召回 5~20 个片段,后续再筛选
    • 相似度阈值:过滤掉相关性过低的片段

下面是语义检索:

  • 基于向量相似度(余弦相似度、内积)

单纯靠向量检索其实不够用,生产环境通常会做多路召回,混合检索 特别适合那种用户可能用专业术语搜索的场景,纯向量检索容易漏掉精确匹配的结果。

重排(Reranking)

重排即重新排序

  • 核心作用 :对召回的片段进行二次排序,进一步提升相关性,筛选出最优质的片段送入大模型
  • 技术实现
  • 轻量级重排模型:如 BGE Reranker、CrossEncoder(专门优化文本对相似度)
  • 规则重排:结合片段长度、来源权重、时间戳等规则
  • 优势:相比直接召回 Top-K,重排后能有效过滤低质量片段,提升最终回答的准确性
生成

Prompt 拼接+生成

  • 核心作用 :**将用户问题 + 召回的优质片段,**按固定模板拼接成 Prompt,交给大模型生成回答, 大模型基于拼接好的 Prompt,生成结构化、通顺的回答
  • 示例

注意事项

  • 控制 Prompt 总长度避免超出模型上下文窗口
  • 明确要求模型 "仅根据已知信息回答",减少幻觉

技术实现

  • 调用大模型 API(如 OpenAI、讯飞星火、文心一言)
  • 流式生成:结合 WebSocket 实现 "打字机效果",提升用户体验

关键参数

  • temperature:控制生成随机性(0~1,越小越严谨)
  • top_p: nucleus sampling,控制生成多样性
  • max_tokens:限制回答长度

结果后处理:

  • 场景:对大模型生成的回答进行优化、校验

  • 操作

    • 去除冗余内容、格式美化
    • 引用溯源:标注回答内容来自哪篇文档片段(提升可信度)
    • 敏感内容过滤:避免输出违规 / 敏感信息

一些疑惑

核心疑惑解答

  • **Q:分片大小怎么选?**A:优先保证语义完整性,一般 256~512 Token;长文档可先按章节分割,再二次分片。
  • **Q:向量库怎么选?**A:小规模数据用 FAISS/Chroma 快速验证;生产环境用 Milvus/Elasticsearch,支持分布式和高并发。
  • **Q:召回准确率低怎么办?**A:尝试混合检索(全文 + 语义)、优化分片策略、更换更优 Embedding / 重排模型。
  • Q:为什么有召回,还需要重排?

"召回和重排是粗与精的关系。

  • 召回是利用向量数据库进行近似最近邻检索 ,目的是为了快,把相关的文档先捞出来,但此时数据量大、杂质多,是**'广撒网'**。
  • 重排是利用重排模型(如 Cross-Encoder) ,对召回结果进行两两语义精算 ,目的是为了准 。它能过滤掉表面相关但实质不符 的内容,挑选出最贴合用户问题的 Top-K 片段。
  • 两者结合,既保证了系统的高并发检索效率,又保证了最终问答的准确性。"
相关推荐
用户5191495848452 小时前
Synkra AIOX:通用AI代理框架与自进化开发系统
人工智能·aigc
小小怪7502 小时前
高性能密码学库
开发语言·c++·算法
Pyeako2 小时前
大模型--模型部署
人工智能·python·大模型·客户端·模型部署·服务端·路由-端口
神奇小汤圆2 小时前
网易一面:KAFKA写入数据时是先写Leader还是先写Follower?
后端
2301_821700532 小时前
模板代码生成工具
开发语言·c++·算法
xieliyu.2 小时前
Java :类和对象(一)
java·开发语言
baizhigangqw2 小时前
Spring Boot spring.factories文件详细说明
spring boot·后端·spring
佳木逢钺2 小时前
机器人/无人机视觉开发选型指南:RealSense D455 vs D435i 与奥比中光的互补方案
c++·人工智能·计算机视觉·机器人·ros·无人机
阿蒙Amon2 小时前
C#常用类库-详解Polly
开发语言·c#