干货:落地企业级RAG的实践指南

news2024/11/24 6:41:24

1. 什么是RAG?

检索增强生成(Retrieval-Augmented Generation,简称 RAG)通过结合大型语言模型(LLM)和信息检索系统来提高生成文本的准确性和相关性.这种方法允许模型在生成回答之前,先从权威知识库中检索相关信息,从而确保输出内容的时效性和专业性,无需对模型本身进行重新训练.

RAG技术之所以重要,是因为它解决了LLM面临的一些关键挑战,例如虚假信息的提供、过时信息的生成、非权威来源的依赖以及由于术语混淆导致的不准确响应.通过引入RAG,可以从权威且预先确定的知识来源中检索信息,增强了对生成文本的控制,同时提高了用户对AI解决方案的信任度.

请添加图片描述

2.企业级RAG落地难点

对于企业级数据,很多来自多种文档类型,例如 PDF、Word 文档、电子邮件和网页, 我们需要关注以下两个阶段:

  • Load & Process,即上图中的A,是指加载数据的过程.在实际应用中,数据的格式和结构各不相同.因此,如何高效地加载和处理这些数据是一个非常具有挑战性的问题.

  • Split/Chunking,即上图中的B,是指将数据分割成多个部分的过程.在实际应用中,数据通常是非结构化的,需要进行小心的分割和处理,以便模型能够更好地理解和处理.

3. 需要load的数据信息

除了获取文档上的文字信息,其它的信息如文件名,页码等都是重要的结构信息.在RAG的实践中,我们需要将这些信息都提取出来,以便更好地理解和处理数据.

文档元素:指文档的基本构成要素,可用于各种 RAG 任务,例如过滤和分块:

  • 标题
  • 叙述文本
  • 列表项
  • 表格
  • 图像

元素元数据: 有关元素的附加信息,可用于在混合搜索中进行筛选以及识别回答来源:

  • 文件名
  • 文件类型
  • 页码
  • 章节

注:如果你不明白什么是混合搜索,没关系,我们后面会详细介绍.

4. 对数据的处理

对数据进行处理是必要但困难的,主要因为:

  • 内容提示:不同的文档类型对元素类型(视觉、markdown)有不同的提示;
  • 标准化需求:要处理来自不同文档类型的内容,需要对其进行标准化;
  • 提取方式不一样:不同的文档格式可能需要不同的提取方法;
  • 元数据洞察:在许多情况下,提取元数据需要了解文档结构

我们需要把不同的文档类型(PDF,Word,EPUB,MarkDown等)转换成统一的格式,以便模型能够更好地理解和处理.一个简单有效的方式是将其转化为Json格式.

Json格式有如下的特点:

  • 结构常见且易于理解
  • 是标准的 HTTP 响应
  • 能够用于多种编程语言
  • 可以转换为 JSONL 用于流式传输用例

下面提供一个转化好的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 或者图像文档,需要使用其它技术进行处理.这些技术一般不是开源的,需要购买或者自己开发.

6. 语义搜索和混合搜索

对于绝大多数人来说,语义搜索Semantic Search 并不陌生,语义搜索的目标是给定一个输入文本,从文档语料库中查找语义相似的内容以用于加入到Prompt中.
但语义搜索并不是万能的,它有一些局限性,比如:

  • 搜索结果过多:在有大量文档的情况下,语义相似的匹配结果太多了;
  • 最新信息:用户可能想要最新的信息,而不仅仅是语义最相似的信息;
  • 重要信息丢失:丢失了文档中与搜索相关的重要结构信息,例如标题、页码等.

混合策略:混合搜索是一种将语义搜索与其他信息检索技术(如过滤和关键字搜索)相结合的搜索策略.过滤选项来自文档的元数据.

7. 分块Chunking

向量数据库需要将文档分割成块,以便检索和生成提示.根据文档的分块方式,相同的查询将返回不同的内容.

均等大小的块:最简单的方法是将文档分割成大小大致均等的块.这会导致相似的内容被分割成多个块.

按原子元素分块:通过识别原子元素,可以通过组合元素而不是分割原始文本来分块.这样可以产生更连贯的块

步骤

  1. 分区:首先,将文档分解为原子元素;
  2. 将元素组合成块:向块中添加文档元素,直到达到字符或标记阈值.
  3. 应用中断条件:应用开始新块的条件,例如当我们到达新的标题元素(表示新部分)、元素元数据更改(表示新页面或部分)或内容相似性超过阈值时.
  4. 组合较小的块:可选地,组合小块,以便块足够大以进行有效的语义搜索.

要点

  • 连贯的块:将来自同一文档元素的内容保持在一起,从而产生更连贯的块.
  • 结构化块:允许分块方法利用文档结构,而传统的分块技术则不是这样,它们根据标记或字符数进行拆分.

请添加图片描述

8. 处理数据中图片的方案

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

  • Document Layout Detection (DLD) 使用目标检测模型在文档图像上绘制和标记布局元素周围的边界框
  • VisionTransformer (ViT) 模型将文档图像作为输入,并生成结构化输出(如 JSON)的文本表示作为输出.

请添加图片描述

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

请添加图片描述

而ViT指的是文档图像传入编码器,由解码器生成文本输出,其中Document Understanding Transformer(DONUT)是一种常见的架构,它不需要 OCR 而是将图像输入直接转换为文本,甚至可以训练模型使用直接输出有效的 JSON 字符串!

9. 处理数据中表格的方案

大多数 RAG 用例都侧重于文档中的文本内容,与此同时,一些行业(例如金融、保险)大量处理嵌入在非结构化文档中的结构化数据.为了支持表格问答等用例,我们需要从文档中提取表格.

业界目前有三种技术:

  • Table Transformer:识别表格单元格边界框并将输出转换为 HTML;
  • Vision Transformer:使用上一节(预处理 PDF 和图像)中的视觉转换器模型,但以 HTML 作为输出;
  • OCR + Table Parser:使用 OCR 提取表格,然后使用表格解析器将其转换为结构化数据.

参考

[1] deeplearning.ai

[2] unstructured.io

[3] github:unstructured

欢迎关注我的GitHub和微信公众号,来不及解释了,快上船!

GitHub: LLMForEverybody

仓库上有原始的Markdown文件,完全开源,欢迎大家Star和Fork!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spdlog学习记录

spdlog Loggers:是 Spdlog 最基本的组件,负责记录日志消息。在 Spdlog 中,一个 Logger 对象代表着一个日志记录器,应用程序可以使用 Logger 对象记录不同级别的日志消息Sinks:决定了日志消息的输出位置。在 Spdlog 中&…

深入拆解TomcatJetty(三)

深入拆解Tomcat&Jetty(三) 专栏地址:https://time.geekbang.org/column/intro/100027701 1 Tomcat组件生命周期 Tomcat如何如何实现一键式启停 Tomcat 架构图和请求处理流程如图所示: 对组件之间的关系进行分析,…

MySQL(python开发)——(3)表数据的基本操作,增删改查

MySQL(python开发)——(1)数据库概述及其MySQL介绍 MySQL(python开发)——(2)数据库基本操作及数据类型 MySQL—— 表数据基本操作 一、表中插入(insert)数据——增 insert into 表名 values (值1&#…

人工智能正在扼杀云计算的可持续性

可持续性曾是公共云计算中备受推崇的优势。企业和云提供商大肆宣扬他们的绿色计划,推广采用可再生能源的数据中心,以减少碳足迹。 近几个月来,这个话题已悄然淡出人们的视线。罪魁祸首是什么?对人工智能功能的无限需求正在推动云…

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Django配置路由后,为什么输入http://127.0.0.1:8000/ 网址后报错了?

问题探讨:为什么输入http://127.0.0.1:8000/ 网址后报错了? 翻译一下: 屏蔽一下新加的路由 发现界面正常了 现在翻译一下: 是不是比较理解了,admin 属于默认配置的URL,所以urlpatterns为空列表或仅配置admin路由时&…

【算法篇】贪心类(1)(笔记)

目录 一、理论基础 1. 大纲 2. 求解步骤 二、Leetcode 题目 1. 分发饼干 2. 摆动序列 3. 最大子序和 4. 买卖股票的最佳时机 II 5. 跳跃游戏 6. 跳跃游戏 II 7. K 次取反后最大化的数组和 8. 加油站 9. 分发糖果 一、理论基础 1. 大纲 2. 求解步骤 将问题分解为…

人工智能:塑造未来生活与工作的力量

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 引言 随着人工智能技术的不断发展,我们已经看到了它在各行业带来的巨大变革。 在医疗行业中…

【wpf】08 xml文件的存取操作

在使用wpf编程过程中,会用到xml的配置文件,实现对其读取和存储的操作是必须的。 1 xml说明 可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许…

git clone报错fatal: pack has bad object at offset 186137397: inflate returned 1

逐步拷贝 https://stackoverflow.com/questions/27653116/git-fatal-pack-has-bad-object-at-offset-x-inflate-returned-5 https://www.cnblogs.com/Lenbrother/p/17726195.html https://cloud.tencent.com/developer/ask/sof/107092182 git clone --depth 1 <repository…

外包干了30年,人都快要废了。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

如何做软件系统的维护成本估算?

一、人员成本 维护工程师 确定维护工程师的数量和技能级别。例如&#xff0c;可能需要 2 名中级维护工程师&#xff0c;月薪 10000 元左右。计算每月的人员成本为 2 10000 20000 元。 技术支持人员 技术支持人员负责解答用户的问题和处理紧急情况。假设需要 1 名技术支持人员…

django5入门【03】新建一个hello界面

注意 ⭐前提&#xff1a;将上节的项目导入到pycharm中操作步骤总结&#xff1a; 1、HelloDjango/HelloDjango目录下&#xff0c;新建一个views.py 2、HelloDjango/HelloDjango/urls.py 文件中&#xff0c;配置url路由信息 3、新建终端&#xff0c;执行运行命令python manag…

Noteexpress在已有作者名字时怎么只标注年份

如图 需要除掉重复的人名 达到如下只出现年份的效果 方法&#xff1a; 打开 编辑引文 然后&#xff0c;选中文献&#xff0c;并勾选“不显示作者名” 按确定即可。

js.杨辉三角和分发饼干

1&#xff0c;链接&#xff1a;118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows …

PostgreSQL的学习心得和知识总结(一百五十五)|[performance]优化期间将 WHERE 子句中的 IN VALUES 替换为 ANY

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

二叉树遍历(前序、中序、后续)

目录 什么是二叉树二叉树遍历以递归创建树的角度看前、中、后序遍历前序遍历中序遍历后序遍历 栈来实现前、中、后序遍历栈的实现栈操作进行前序、中序遍历代码实现中序遍历和先序遍历栈操作进行后序遍历 什么是二叉树 树&#xff1a;树的根节点没有前驱&#xff0c;除根节点以…

Spring声明式事务管理:深入探索XML配置方式

前言 Spring的事务管理&#xff0c;无论是基于xml还是注解实现&#xff0c;本质上还是实现数据库的事务管理机制&#xff0c;因此要注意发送SQL的连接是否为同一个&#xff0c;这是实现声明式事务的关键。 以下案例和实现基于SSM整合框架完成&#xff0c;不知道如何整合SSM&…

CTFHUB技能树之文件上传——无验证

开启靶场&#xff0c;打开链接&#xff1a; 直接上传一句话木马&#xff1a; <?php eval($_POST[pass]);?> 成功提交并显示了上传的文件的路径 访问一下该文件触发一句话木马&#xff1a; 看到一片空白是正常的&#xff0c;因为没有写什么函数&#xff0c;比如&#x…

FineReport 计算同比增长

1、数据库查询 SELECTt1.年,t1.月,t1.总金额 AS 同期金额,t1.仓库名称,t2.总金额 AS 上期金额 FROMtest t1LEFT JOIN test t2 ON ( t1.年 t2.年 1 ) AND t1.月 t2.月 AND t1.仓库名称 t2.仓库名称2、配置字段 月份字段加后缀 月 数据列加后缀 计算同比增长率 if(LEN(B3)0 …