干货:落地企业级RAG的实践指南 对于企业级数据,很多来自多种文档类型,例如 PDF、Word 文档、电子邮件和网页, 我们需要关注以下两个阶段:Load & Process,Split/Chunking 什么是RAG? 检索增强生成(Retrieval-Augmented Generation,简称 RAG)通过结合大型语言模型(LLM)和信息检索系统来提高生成文本的准确性和相关性.这种方法允许模型在生成回答之前,先从权威知识库中检索相关信息,从而确保输出内容的时效性和专业性,无需对模型本身进行重新训练. RAG技术之所以重要,是因为它解决了LLM面临的一些关键挑战,例如虚假信息的提供、过时信息的生成、非权威来源的依赖以及由于术语混淆导致的不准确响应.
干货:落地企业级RAG的实践指南
对于企业级数据,很多来自多种文档类型,例如 PDF、Word 文档、电子邮件和网页, 我们需要关注以下两个阶段:Load & Process,Split/Chunking
检索增强生成(Retrieval-Augmented Generation,简称 RAG)通过结合大型语言模型(LLM)和信息检索系统来提高生成文本的准确性和相关性.这种方法允许模型在生成回答之前,先从权威知识库中检索相关信息,从而确保输出内容的时效性和专业性,无需对模型本身进行重新训练.
RAG技术之所以重要,是因为它解决了LLM面临的一些关键挑战,例如虚假信息的提供、过时信息的生成、非权威来源的依赖以及由于术语混淆导致的不准确响应.通过引入RAG,可以从权威且预先确定的知识来源中检索信息,增强了对生成文本的控制,同时提高了用户对AI解决方案的信任度.

对于企业级数据,很多来自多种文档类型,例如 PDF、Word 文档、电子邮件和网页, 我们需要关注以下两个阶段:
Load & Process,即上图中的A,是指加载数据的过程.在实际应用中,数据的格式和结构各不相同.因此,如何高效地加载和处理这些数据是一个非常具有挑战性的问题.
Split/Chunking,即上图中的B,是指将数据分割成多个部分的过程.在实际应用中,数据通常是非结构化的,需要进行小心的分割和处理,以便模型能够更好地理解和处理.
除了获取文档上的文字信息,其它的信息如文件名,页码等都是重要的结构信息.在RAG的实践中,我们需要将这些信息都提取出来,以便更好地理解和处理数据.
文档元素:指文档的基本构成要素,可用于各种 RAG 任务,例如过滤和分块:
元素元数据: 有关元素的附加信息,可用于在混合搜索中进行筛选以及识别回答来源:
注:如果你不明白什么是混合搜索,没关系,我们后面会详细介绍.
对数据进行处理是必要但困难的,主要因为:
我们需要把不同的文档类型(PDF,Word,EPUB,MarkDown等)转换成统一的格式,以便模型能够更好地理解和处理.一个简单有效的方式是将其转化为Json格式.
Json格式有如下的特点:
下面提供一个转化好的Json示例:
[ { "element_id":"bff1fd0ec25e78f1224ad7309a1e79c4", "metadata":{ "filename": "CoT.pdf", "filetype":"application/pdf", "languages":[ "eng" ], "page_number":1, }, "text":"B All Experimental Results", "type": "Title" }, { "element_id":"ebf8dfb149bcbbd8c4b7f9a7046900a9", "metadata":{ "filename": "CoT.pdf", "filetype":"application/pdf", "languages":[ "eng" ], "page_number":1, }, "text": "This section contains tables for experimental results for varying models and model sizes, on all benchmarks, for standard prompting vs. chain-of-thought prompting.", "type": "NarrativeText" } ]
对于开发者而言,就是需要找到一个框架,能够处理不同的文档类型,将其转化为Json格式.
一些文档类型(例如 HTML、Word Docs 和 Markdown)包含格式信息,可以使用基于规则的解析器进行预处理;但是对于 PDF 或者图像文档,需要使用其它技术进行处理.这些技术一般不是开源的,需要购买或者自己开发.
对于绝大多数人来说,语义搜索Semantic Search 并不陌生,语义搜索的目标是给定一个输入文本,从文档语料库中查找语义相似的内容以用于加入到Prompt中.
但语义搜索并不是万能的,它有一些局限性,比如:
混合策略:混合搜索是一种将语义搜索与其他信息检索技术(如过滤和关键字搜索)相结合的搜索策略.过滤选项来自文档的元数据.
向量数据库需要将文档分割成块,以便检索和生成提示.根据文档的分块方式,相同的查询将返回不同的内容.
均等大小的块:最简单的方法是将文档分割成大小大致均等的块.这会导致相似的内容被分割成多个块.
按原子元素分块:通过识别原子元素,可以通过组合元素而不是分割原始文本来分块.这样可以产生更连贯的块
步骤:
要点:

对于其他文档,例如PDF和图像,信息是视觉化的.我们需要Document lmage Analysis (DlA) 从文档的原始图像中提取格式信息和文本.
目前,DIA有两个主要的方法:

具体的,DLD的步骤是1)视觉检测:使用计算机视觉模型(例如 YOLOX 或 Detectron2)识别和分类边界框.2)文本提取:必要时使用对象字符识别(OCR)从边界框中提取文本.
注意:对于某些文档(例如 PDF),可以直接从文档中提取文本,而无需使用OCR.

而ViT指的是文档图像传入编码器,由解码器生成文本输出,其中Document Understanding Transformer(DONUT)是一种常见的架构,它不需要 OCR 而是将图像输入直接转换为文本,甚至可以训练模型使用直接输出有效的 JSON 字符串!
大多数 RAG 用例都侧重于文档中的文本内容,与此同时,一些行业(例如金融、保险)大量处理嵌入在非结构化文档中的结构化数据.为了支持表格问答等用例,我们需要从文档中提取表格.
业界目前有三种技术:
[1] deeplearning.ai
[2] unstructured.io
仓库上有原始的Markdown文件,完全开源,欢迎大家Star和Fork!