AI认知篇4:RAG技术全流程

前言

这是我的agent系列文章的第4篇,该系列分为三部分:

  • AI认知篇:详细讲解相关基础概念
  • AI实践篇:分享诸如skills怎么写、怎么ai coding、怎么写好prompt等的最佳实践
  • AI八股篇:分享我自己整理的应付大模型应用开发岗位必备的八股笔记

如果觉得有帮助,欢迎关注我并期待后续文章!预期是日更哦!当天没更可能是因为太累了,周末会弥补的。

在大模型应用落地的浪潮中,我们常常面临一个核心矛盾:大模型博学但“失忆”,且容易“胡编乱造”。它不知道我们公司昨天的会议纪要,也不了解最新的内部产品文档。为了解决这个问题,检索增强生成(RAG, Retrieval-Augmented Generation) 成为了当前构建私有知识库、智能客服系统的标准答案。

很多人以为RAG就是“调个API、存个向量库”那么简单,但实际落地时往往发现检索不准、回答混乱。今天,我想结合最近的实战经验,和大家深入拆解一个高质量RAG系统背后的完整技术链路,聊聊那些决定成败的关键细节。

一、核心逻辑:为什么是RAG?

在RAG出现之前,想让大模型懂私有数据,主要靠微调(Fine-tuning)。但微调成本高、周期长,且难以实时更新数据。一旦业务文档变了,模型就得重新训练。

RAG提供了一种更优雅的“开卷考试”模式:

  1. 不修改模型参数:保留大模型通用的推理能力。
  2. 外挂知识库:将私有数据转化为向量索引。
  3. 实时检索:用户提问时,先去知识库里找相关片段,再连同问题一起喂给大模型。

这样,模型就能基于最新的事实依据回答问题,大幅减少幻觉,且数据更新只需刷新索引,无需重训模型。

二、离线阶段:打造高质量的“知识索引”

RAG的效果上限,其实在数据预处理阶段就已经决定了。如果灌进去的数据是垃圾,检索出来的必然是垃圾(Garbage In, Garbage Out)。

1. 数据加载与清洗(Data Loading & Cleaning)

这一步的目标是将非结构化数据(PDF、Word、Markdown、网页等)转化为纯净的文本。

  • 多格式解析:需要针对不同文件格式使用专门的解析器。例如,PDF中的表格、页眉页脚往往是噪音,需要特殊处理;代码文件则需要保留缩进和结构。
  • 噪声过滤:去除无关的特殊字符、乱码、重复的版权声明等,确保进入后续流程的是高纯度文本。

2. 文本分块(Chunking):最关键的策略

直接将整篇文档向量化是不可行的,因为大模型的上下文窗口有限,且长文本会稀释关键信息的权重。如何切分是RAG中最具艺术感的环节。

  • 固定长度切分:最简单的方法,按字符数或Token数切分。但容易切断句子语义,导致检索到的片段“没头没尾”。
  • 语义分块:更高级的策略。利用段落标记、标题层级或递归字符分割(Recursive Character Text Splitter),尽量保持语义单元的完整性。
  • 重叠窗口(Overlap):这是必选动作。相邻的两个块之间必须保留一部分重叠内容(如10%-20%),防止关键信息正好被切在边界上。
  • 粒度选择:块太大,包含噪音多,影响相似度计算;块太小,丢失上下文。通常200-500 Token是一个经验上的甜蜜点,具体需根据业务文档类型调整。

3. 向量化(Embedding)

计算机不懂文字,只懂数字。我们需要通过**嵌入模型(Embedding Model)**将每个文本块转化为一串高维向量。

  • 语义映射:这个向量空间非常神奇,语义相似的文本(如“如何重置密码”和“忘记密码怎么办”),其向量距离会非常近。
  • 模型选择:不同的Embedding模型效果差异巨大。中文场景下,建议选择针对中文语料优化过的模型(如M3E、BGE等),而非直接使用通用的英文模型。

4. 向量存储(Vector Store)

将生成的向量和对应的原始文本块存入向量数据库(如Milvus, Chroma, FAISS, Pinecone等)。此时,我们的知识库就完成了“数字化入库”。

进阶技巧:元数据过滤

在存入向量时,不要只存文本,还要打上元数据标签(Metadata),如“来源文档”、“创建时间”、“所属部门”、“文档类型”等。

这允许我们在检索时进行预过滤。例如,用户问“财务制度”,我们可以先限定department='finance',再在缩小后的范围内做向量搜索,准确率会显著提升。

三、在线阶段:精准检索与智能生成

当用户发起提问时,系统需要在毫秒级时间内完成从“理解问题”到“生成答案”的全过程。

1. 查询向量化

用户的提问(Query)经过与知识库构建时完全相同的Embedding模型处理,转化为查询向量。注意:必须保证模型一致,否则向量空间不对齐,检索将完全失效。

2. 混合检索(Hybrid Search):解决单一检索的短板

单纯的向量检索(语义匹配)有时很尴尬:

  • 专有名词失效:比如用户搜“XG-200型号参数”,如果文档里全是“XG-200”,向量检索可能因为语义泛化而匹配到其他型号。
  • 精确匹配需求:涉及代码、身份证号、特定术语时,语义相似度往往不如关键词匹配准确。

解决方案:混合检索

  • 向量检索:捕捉语义意图(模糊匹配)。
  • 关键词检索(BM25):捕捉精确字面匹配。
  • 结果融合:将两路召回的结果进行加权合并。

3. 重排序(Rerank):画龙点睛的一步

这是提升RAG效果最显著的“杀手锏”。

混合检索召回了Top-20个片段,但它们的排序可能不够完美。此时,引入一个更强大但计算量稍大的Rerank模型(如BGE-Reranker),对这20个片段与用户问题进行精细化的相关性打分,重新排序,最终只取Top-3或Top-5送给大模型。

  • 原理:Rerank模型是Cross-Encoder架构,它能同时看到“问题”和“文档”,进行深层交互计算,比向量检索的Dual-Encoder架构更精准。
  • 效果:往往能将检索准确率(Recall@K)提升20%以上。

4. 提示词构建与生成(Prompt Engineering & Generation)

最后一步,将检索到的精华片段组装成Prompt,发给大模型。

一个优秀的RAG Prompt模板通常包含:

  • 角色设定:你是一个专业的知识库助手。
  • 约束指令:严格基于以下参考信息回答,若信息不足请说明不知道,严禁编造。
  • 上下文注入:插入经过Rerank排序后的文本块。
  • 思维链(CoT):引导模型先分析参考信息,再得出结论。
# Role
你是一个基于企业内部知识库的智能助手。

# Constraints
1. 请仅根据下方的【参考信息】回答问题。
2. 如果【参考信息】中没有包含答案,请直接回答“抱歉,知识库中未找到相关信息”,不要利用你的外部知识编造。
3. 回答要简洁、专业。

# Reference Information
{context_chunks}

# User Question
{query}

# Answer

四、避坑指南与评估迭代

在实际项目中,我踩过不少坑,也总结了一些经验:

  1. 分块不是越细越好:对于逻辑性强的技术文档,过细的分块会导致上下文丢失。可以尝试“父子索引”策略:检索时匹配子块(小粒度),但送入大模型的是包含该子块的父块(大粒度,如整个章节),以保全上下文。
  2. Embedding模型要适配领域:通用模型在医疗、法律、垂直工业领域的表现可能不佳。如果有条件,使用领域数据进行微调得到的Embedding模型效果会更好。
  3. 建立评估集(Golden Dataset):RAG系统不能凭感觉优化。需要构建一套“标准问题+标准答案+参考文档”的测试集。检索评估:检索出的文档是否真的相关?(Hit Rate, MRR)生成评估:回答是否忠实于文档?(Faithfulness)是否解决了问题?(Answer Relevance)利用工具(如Ragas, TruLens)进行自动化评分,指导参数调优。

五、其他

考研失利想速成冲春招的可以看看我发过的这篇帖子:论考研失利如何冲春招

想要学习Java冲实习或冲春招的,我能助你一臂之力,我之前整理了高质量可速成的魔改外卖项目话术和7000字轮子项目话术,还有超全超精品八股大全专栏怎么写简历,怎么包装实习经历,怎么0基础速成冲春招和实习等等精品帖子,大家可以去看看我的精品文章汇总帖子:往期精品秋招帖子汇总

我的java和大模型应用开发全专栏(20w人学习,超千人订阅,牛客最受欢迎最高质量java八股专栏,内容包含: 1.八股大全:多一句没有少一句不行的最精简八股整理,完全可以应付校招社招的八股拷打! 2.速成项目话术:目前有魔改苍穹外卖项目话术(额外扩展了很多技术亮点),能速成拿去面试,后面会更新魔改黑马点评、商城项目等等热门高质量项目话术 3.智力题超详细题解汇总; 4.面试时非技术问题话术整理,绝对震惊面试官一年; 5.算法lc hot100全题系列题解:绝对通俗易懂;6、场景题汇总快速冲刺秋招专栏

#暑期实习##27届求职交流##Prompt分享##AI求职记录##聊聊我眼中的AI#
全部评论

相关推荐

评论
3
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务