乐于分享
好东西不私藏

一文看懂RAG从文档到问答的完整流程

一文看懂RAG从文档到问答的完整流程

得益于数据量的指数增长和模型架构的升级,大模型越来越强,但它并不是万能的。它可以写文章、总结内容、生成代码,也能回答很多通用问题。但一旦问题涉及企业内部文档、最新资料、专业知识库、个人文件,大模型就容易出现不知道或者一本正经地乱说。RAG全称Retrieval-Augmented Generation,中文通常叫检索增强生成。简单理解就是:先从知识库里查资料,再让大模型基于查到的资料回答问题。

一、什么是 RAG

传统的大模型问答流程是这样的:

用户提问 -> 大模型直接回答

RAG的流程是这样的:

用户提问 -> 到知识库中检索相关内容 -> 把检索到的资料交给大模型 -> 大模型基于资料回答

举个例子:

某X课程目标是什么?

如果大模型没有看过相关课程的教学大纲,它只能根据常识猜测。但如果我们提前把这份 文档处理后存入知识库,RAG系统就可以先检索出相关段落,再让大模型根据这些段落回答。这样得到的答案会更准确,也更容易追溯来源。

二、为什么需要RAG

它的价值在于让大模型从凭已有知识回答转向基于指定资料回答。由于大模型本身并不了解企业制度、课程大纲、项目文档、合同条款等私有或最新资料,RAG可以通过接入外部知识库,使模型具备查阅内部资料的能力;同时它能在回答前检索相关内容,减少模型凭空编造带来的幻觉问题。相比重新训练模型,RAG只需要将新文档处理后加入知识库,就能实现知识更新,并且可以保留文档来源、段落位置等信息,方便用户追溯答案依据。因此它的核心不是简单上传文档,而是把原始资料整理成适合检索和调用的知识片段。

三、数据怎么存入 RAG

通常包括以下几个步骤。

第一步是收集可用于问答和检索的原始资料。数据来源可以非常广泛,既包括常见文档,也包括网页内容、数据库记录、FAQ问答资料、企业制度、课程大纲、项目说明书、标注数据、模型说明文档和接口文档等。以学校课程知识库为例,可以将教学大纲、课程标准、实训任务书、项目案例文档和学生能力评价标准等资料统一收集起来,作为后续文档解析、知识切分和向量化入库的基础。

完成资料收集后,需要对不同格式的文件进行文档解析,将其转换为后续可以处理的文本内容。不同类型的资料适合采用不同的解析方式,例如PDF文档可以使用MinerUPyMuPDFOCR工具提取正文、表格和版面信息,网页内容可以借助Playwright等工具抓取,表格数据则可以使用Pandas进行读取和整理。经过解析后,原本分散在不同格式文件中的内容会被统一转换成文本,这样才能继续进行切分、向量化和检索入库。

文档解析出来以后,一般不会把整篇内容原封不动地放进知识库。原因很简单,文档太长,系统检索时很难一下子找到真正相关的部分,后面大模型拿到的内容也容易夹杂无关信息。实际处理时通常会先把文档拆成一小段一小段的内容,也就是常说的chunk。比如一份课程大纲,拆分时也不能太随意,切得太碎,意思可能不完整;切得太长,又会影响检索效果。比较稳妥的做法是保留每段内容对应的标题、页码、文件名等信息,并让前后片段之间有一点重叠,这样后续检索和回答时,内容之间的联系不会断得太厉害。

文本切分完成后,需要将每个文本片段进行向量化处理。普通文本本身不便于计算语义相似度,因此需要借助Embedding模型,将文本转换成一组能够表示语义特征的数字向量。可以简单理解为,每个文本片段都会被映射到一个向量空间中,语义越接近的内容,在这个空间中的距离也越近。例如“数据治理能力”经过向量模型处理后,会变成类似[0.123, -0.456, 0.872, ...]这样的一串数字;如数据治理、数据质量管理、数据标准规范、数据清洗与校验等内容虽然表述不同,但语义相关,因此在向量空间中通常会比较接近,后续系统就可以根据这种距离关系完成相似内容检索。

完成向量化后,文本片段、对应的向量以及相关元数据会被一起存入向量数据库,供后续检索使用。常见的向量数据库或检索方案包括MilvusChromaFAISSElasticsearch 向量检索。实际存储时系统通常不会只保存向量本身,还会同时保存原始文本内容、片段编号、文件名、章节标题、页码等信息。这样在用户提问时,系统不仅可以根据语义相似度找到相关内容,还可以把对应的原文和来源信息一起提供给大模型,用于生成更准确、可追溯的回答。

{"id""chunk_001","content""本课程是数据科学与大数据技术专业的一门集中实践课程……","embedding": [0.123-0.4560.872],"metadata": {"file_name""教学大纲.docx","section""课程定位","page"1  }}

四、RAG 查询时发生了什么

当用户提出问题时,RAG系统会先对问题进行理解和向量化处理,将用户问题转换成可以用于语义检索的向量。例如用户提问数据分析方向的学生需要具备哪些能力,系统会将这个问题拿到向量数据库中进行匹配,检索出与问题最相关的若干文档片段。假设知识库存在数据分析方向要求学生熟练使用Python,掌握统计分析方法,能够进行数据处理、建模、评估和可视化呈现等内容,系统就会把这些资料作为参考信息取出。随后会将用户问题和检索到的资料组合成Prompt一起提交给大模型,并要求模型基于资料作答、避免编造。最终大模型会根据检索内容进行归纳和表达,生成类似数据分析方向学生应具备Python编程能力、数据处理能力、统计分析能力、建模与评估能力,以及可视化表达能力的回答。

五、总结

RAG适合应用在答案主要依赖固定资料、专业文档或内部知识库的场景中,例如企业知识库问答、教学资料查询、政策文件解读、合同条款分析、产品手册助手、客服问答、论文资料管理、项目文档检索、招投标文件分析以及法律、医疗等专业资料辅助查询。它要解决的核心问题,是让大模型基于指定资料回答问题,而不是只依赖训练时形成的记忆。以后很多AI应用都不会只是简单接一个大模型接口,而是要在模型外面配套数据整理、知识管理、检索和反馈等流程。

它的大概流程如下:

文档解析 -> 文本切分 -> 向量化 -> 存入向量库 -> 用户提问 -> 检索资料 -> 大模型生成答案