【大模型应用】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 片段。
  • 两者结合,既保证了系统的高并发检索效率,又保证了最终问答的准确性。"
相关推荐
她说..10 小时前
Java 对象相关高频面试题
java·开发语言·spring·java-ee
花酒锄作田11 小时前
Postgres - Listen/Notify构建轻量级发布订阅系统
python·postgresql
土豆125011 小时前
LangGraph TypeScript 版入门与实践
人工智能·llm
watson_pillow11 小时前
c++ 协程的初步理解
开发语言·c++
庞轩px11 小时前
深入理解 sleep() 与 wait():从基础到监视器队列
java·开发语言·线程··wait·sleep·监视器
土豆125011 小时前
OpenSpec:让 AI 编码助手从"乱猜"到"照单执行"
人工智能·llm
Thomas.Sir11 小时前
第二章:LlamaIndex 的基本概念
人工智能·python·ai·llama·llamaindex
故事和你9111 小时前
洛谷-算法1-2-排序2
开发语言·数据结构·c++·算法·动态规划·图论
m0_6948455711 小时前
Dify部署教程:从AI原型到生产系统的一站式方案
服务器·人工智能·python·数据分析·开源
LS_learner11 小时前
VS Code 终端默认配置从 PowerShell 改为 CMD
人工智能