2024年RAG:回顾与展望

2024年,RAG(Retrieval-Augmented Generation)技术经历了从狂热到理性的蜕变,成为大模型应用领域不可忽视的关键力量。年初,AI的“无所不能”让市场充满乐观情绪,RAG被视为解决复杂问题的万能钥匙;然而,随着技术落地和实际应用的深入,行业逐渐回归理性,开始聚焦于小而难的具体场景,追求技术的实用性和稳定性。

作为大模型应用的创业者,我们见证了RAG在架构和技术细节上的快速迭代,也深刻感受到市场需求从“大而全”向“精而专”的转变。展望未来,RAG的价值将更加体现在实际应用中,成为推动AI落地的核心引擎。这一年,不仅是RAG技术的进化之年,也是从业者从探索到深耕的转折点。

RAG架构演变

根据RAG技术结构可以分成三类,代表了不同的技术复杂度,越复杂也代表实现难度越大。但是可能会收到更好的效果,适应更多的场景,这三类类型是:

  • Naive RAG 简单RAG,这就是大部分人都知道RAG,把文本分段,根据用户的Qurey,去查找分段,输入给模型,然后输出。但是这种方法 Too Simple, Some Time Naive。有各种问题,首先生硬的对文本分段就不科学,然后可能查询到的分段有可能和Qurey并不相关,再有输入给LLM的文本分段可能有大量的冗余、重复或者噪声信息,让模型不能输出和期望一致的内容。

  • Advanced RAG 高级RAG,针对简单RAG的不足,"高级"RAG进行了针对性的改善。主要是针对检索进行了改善,包括Preretrieval(检索前),Post-retrieval(检索后) 和Retrieval Process(检索中) 的各种改善方法(废话…)。检索前包括建立多种文档索引、利用滑动窗对文本进行分块;检索中包括多路召回,Embedding模型微调;检索后包括重排(Re-rank)等。

  • Modular RAG 模块化RAG,模块化方法并不局限在“检索”-“阅读”的框架,利用大模型自身的"反思"能力等,构建起RAG的新的范式。简单点说,上面两种方法都是一个单一的流水线模式,检索结束之后交给模型,然后模型输出结果。但是在论文中的Modular RAG方法中,递归的调用了LLM的能力,例如利用模型来反思、评估第一次输出,然后再输出新的结果。或者让模型自己决定什么时候调用检索工具。这其实有点像实现一个RAG Agent。论文表示这种模块化的 RAG 范式正逐渐成为 RAG 领域的趋势。

Retrieval-Augmented Generation for Large Language Models: A Survey

我们回顾去年年末到今年年末,发现RAG逐渐完成三个架构的演变,笔者也在RAG工作中参与了第一个和第二个架构的开发,其中代表项目分别是Chinese-LangChainTrustRAG

RAG框架开发

以下通过两个笔者参与的开源项目,来大致讲解Naive RAG和Advanced RAG

开源工作1:Chinese-LangChain

在2023年末,当时LLM概念盛行,RAG技术开始展露头脚,机缘巧合下笔者参加了一个线下黑客马拉松的活动,我在大约一天时间内开发了Chinese-LangChain项目,在Github进行了开源,当时收到了朋友圈和社区的关注,可谓捷足先登,在短时间内收获了2.7k累计的Star

https://github.com/yanqiangmiffy/Chinese-LangChain

这个项目可以视为是Naive版本的RAG,在实现中比较简洁地实现了文档解析、索引构建、查询检索以及答案生成模块,并基于duckduck-go引入联网检索,并提供了Gradio的演示代码。


从效果来看,Naive RAG可以基本可以满足演示的Demo需求,但是如何让 RAG 在更多场景和企业用起来,随着用户需求的增加,Naive RAG能力显现的捉襟见肘。

此阶段代表的RAG框架有早期的Langchain、Llama-Index等。

开源工作2:TrustRAG

在2024快速发展的RAG技术环境中**,Advanced RAG架**构因其显著的效果和相对易于实现的特点,占据着主流地位。

在实验室需求和工作中出发,我们将系统工作开源出一个项目TrustRAG,中间穿插了RAG优化相关组件,比如文档解析、文本切块、查询改写、内容压缩、向量提取、索引构建、答案生成以及答案引用等,可以理解为是Advanced级别的RAG框架。具体模块组件可以参考下图:

https://github.com/gomate-community/TrustRAG

当时国内开始出现一些比较欢迎的项目,我印象里是一个是网易的QAnything,之后是Infiniflow的ragflow,之后国内有很多开源的RAG框架,比如haystack、升级之后的Langchain等。TrustRAG改名之前叫GoMate,在6月份受到爱可可博主的关注转发,还是很幸运的!

下面是比较欢迎的RAG框架:

框架名称文档切分召回检索重排序
RAGFlow强调文档的精细化解析,能够从复杂格式的非结构化数据中提取信息,提供基于模板的文本切片功能,文本切片过程可视化,支持手动调整。基于多路召回,融合重排序,提供可靠的问答和有理有据的引用。兼容各类异构数据源,支持丰富的文件类型,包括Word文档、PPT、Excel表格、PDF等。提供有理有据的答案,降低幻觉(hallucination),答案提供关键引用的快照并支持追根溯源。
FastGPT+提供自动数据预处理,支持手动输入、直接分段、LLM自动处理和CSV等多种数据导入途径,自动对文本数据进行预处理、向量化和QA分割。支持混合检索和重排,提供强大的RAG引擎,能够高效地处理和检索大量数据。采用直观的可视化界面,支持多种数据导入方式,自动化工作流程编排,提升检索效率。支持工作流编排,基于Flow模块设计,提供简易模式和工具调用,提升重排序能力。
QAnything+文档处理能力一般,主要依赖于现有的文档解析工具,未强调特定的文档切分技术。强调Embedding与Rerank模型的联合使用提升文档召回质量,Rerank模块设计优秀。采用Embedding技术进行检索,结合Rerank模型提高检索精度。Rerank模块设计优秀,能够有效提升文档召回质量。
MaxKB+提供简单易用的界面,支持多种数据格式的导入和导出,内置知识库管理系统,便于用户管理和利用知识资源。内置知识库管理系统,支持多种数据格式的导入和导出,便于用户管理和利用知识资源。支持多种数据格式的导入和导出,内置知识库管理系统,便于用户管理和利用知识资源。提供高效的Workflow设计,支持拖拽式操作,使得非技术人员也能快速上手。
Dify+功能完善,支持从PDF、PPT和其他常见文档格式中提取文本,提供丰富的预设模板和集成工具。支持跨知识库召回,提供丰富的召回模式,适用于复杂业务逻辑和数据处理需求。提供丰富的预设模板和集成工具,支持多种检索模式,适用于复杂业务逻辑和数据处理需求。支持工作流编排,提供丰富的预设模板和集成工具,适用于复杂业务逻辑和数据处理需求。

在实际效果中,估计大家有一个共同的认识,就是文档解析太难了,当时一度认为文档解析做好了,RAG效果会好很多,事实也是这样,包括我在TrustRAG框架开发的过程中参考了deepdoc以及QAnything项目的文档解析,这块工程量很大,不过说实话到现在也没有一个很完美统一的方案。不过下半年MinerUTextInDoc2XPyMuPDF4LLM等多模态文档解析框架的开源,给复杂文档的统一处理带来的希望,笔者也做了基于MinerU文档解析的PR并接受。

这些多模态开源框架处理的思路是将各种形式的文件转换成或者直接基于PDF,解析出来半结构化的Markdown内容,之后映射成结构化的Json内容。

框架名称主要功能支持的文档格式输出格式特点
MinerU将PDF转换为机器可读格式,如Markdown、JSON,支持公式和表格的识别与转换。PDFMarkdown、JSON、LaTeX、HTML支持复杂公式解析,适用于科技文献的符号转换。
Marker提取PDF文档内容,支持文本、表格和图像的解析。PDFMarkdown、JSON能将表格解析为Markdown结构,但在复杂表格处理上可能存在问题。
PaddleOCR基于深度学习的OCR系统,支持多语言文本检测和识别。图片、PDF文本、JSON具备文字识别和版面分析能力,但缺乏必要的后处理步骤。
Unstructured处理多种文档格式,提取文本和元数据,适用于非结构化数据的解析。PDF、DOCX、PPT、HTML等JSON、文本支持多种文档格式的解析,适合处理非结构化数据。
Zerox基于GPT的OCR工具,将PDF、DOCX等文件转换为Markdown格式。PDF、DOCX、图像Markdown零配置,易于使用,支持批量处理,转换速度快。
Docling多格式文档解析和导出工具,支持高级PDF理解和OCR功能。PDF、DOCX、PPTX、XLSX、图像、HTML、AsciiDoc、MarkdownHTML、Markdown、JSON支持多种文档格式的解析,易于与LlamaIndex和LangChain集成。
OmniGen文档解析和生成工具,支持从多种格式的文档中提取内容并生成结构化数据。PDF、DOCX、PPTX、HTML等JSON、XML、Markdown支持多种文档格式的解析,提供结构化数据输出,适用于数据提取和内容生成。

由于相关技术限制以及系统需求的应对,TrustRAG有很多地方还需要继续完善,不过确实摸着石头过河完成了Advacned RAG模块开发,如果做到更加广泛的使用还需要完成企业级的数据支撑,接入相关向量数据库引擎以及API开发等工作,也希望大家多提建议和Issue。


相关模块技术的文章,论文和博客笔记有很多,笔者在这里不做过多赘述,建议大家可以根据需求找一些综述性文章阅读可以整体系统的了解,比如专门围绕查询改写《A Survey of Query Optimization in Large Language Models》。下面我们可以多多聊一些痛点和未来发展趋势。

RAG痛点

RAG的12个痛点

检索增强生成(RAG)技术虽然在提升内容准确性和相关性方面具有显著优势,但在实际应用中也存在一些痛点。根据参考资料,我们可以大致总结下存在的共性痛点以及解决方案:

  1. 内容缺失:当知识库中缺少上下文时,RAG系统可能会提供一个看似合理但不正确的答案,而不是表示不知道。解决方案包括清理数据和精心设计提示词。

  2. 错过排名靠前的文档:重要文档可能未出现在系统检索组件返回的顶部结果中,导致系统无法提供准确的响应。解决方案包括调整检索策略和嵌入模型调优。

  3. 不在上下文中 — 整合策略限制:文档整合长度限制超过LLM窗口大小,导致整合策略受限。解决方案是调整检索策略和嵌入模型调优。

  4. 文件信息未提取:文档中的关键信息未被提取出来。解决方案包括数据清洗、提示词压缩和长内容优先排序。

  5. 格式错误:输出格式与预期不符。解决方案是改进提示词、格式化输出和使用大模型的Json模式。

  6. 答案不正确:缺乏具体细节,导致特需求的答案不正确。解决方案是采用先进的检索策略。

  7. 回答不完整:回答不全面。解决方案包括查询转换和细分问题。

  8. 数据提取可扩展性:数据摄取的可扩展性问题。解决方案是并行处理和提升处理速度。

  9. 结构化数据QA:结构化数据问答问题。解决方案是链式思维表格包和混合自洽查询引擎包。

  10. 从复杂PDF中提取数据:从复杂PDF中提取数据困难。解决方案是嵌入式表格检索技术。

  11. 后备模型:需要一个后备模型策略。解决方案是Neutrino路由器或OpenRouter。

  12. LLM安全性:大语言模型的安全性问题。这是一个需要持续关注和解决的问题。

下面是一些RAG落地过程中问题:

  • 检索效率低下:

    • 痛点描述: 在庞大的数据集中进行有效检索是一个挑战,尤其是当需要实时响应时。
    • 相关问题: 如何优化检索算法以减少查询延迟?
  • 信息融合困难:

    • 痛点描述: 将检索到的信息与生成的内容无缝融合是一项复杂任务,需要精确的算法来确保信息的准确性和连贯性。
    • 相关问题: 如何设计有效的信息融合策略?
  • 上下文理解的局限性:

    • 痛点描述: 模型可能难以准确理解查询的上下文,特别是在复杂或模糊的情境中。
    • 相关问题: 如何提高模型对上下文的理解能力?
  • 数据偏差和噪声:

    • 痛点描述: 检索到的数据可能包含偏差和噪声,这会影响模型的输出质量。
    • 相关问题: 如何识别并减少数据中的偏差和噪声?
  • 答案准确性和可靠性问题:

    • 痛点描述: 生成的答案可能不够准确或可靠,尤其是在需要精确事实性回答的情况下。
    • 相关问题: 如何验证和提高生成答案的准确性?
  • 可扩展性问题:

    • 痛点描述: 随着数据量的增加,模型可能难以保持高性能和可扩展性。
    • 相关问题: 如何确保模型能够处理大规模数据?
  • 资源消耗:

    • 痛点描述: RAG技术通常需要大量的计算资源,这在资源受限的环境中是一个挑战。
    • 相关问题: 如何优化模型以减少资源消耗?
  • 隐私和安全问题:

    • 痛点描述: 处理敏感数据时,需要确保用户隐私和数据安全。
    • 相关问题: 如何实现隐私保护的数据处理?

在知乎话题大家觉得做一个大模型检索增强生成(RAG)系统,最难搞定的是那部分工作?下,我们也可以看到一些共性的回复,比如最头疼的两个问题是:数据清洗和权限区分文档的处理、短文本的语义挖掘是最难搞定的图表理解等。

整体感觉RAG下半年可谓是:一周出Demo,半年用不好。在实际场景中可以说很快打通的一个RAG流水线,并进行演示效果。在Advanced的模块加持下,我们可以针对具体模块进行优化,比如文档解析、检索等,虽然流程繁琐,但是也可以取得一个比较好的效果。

不过在此也抛出一个问题,相比Kimi、豆包、ChatGPT这种工具来说,对于中小开发团队或者研究人员来说,怎么定制化一个比较靠谱的RAG系统。为什么对于Kimi等,我们随便上传一个文档,它们回答的都还算可以,为什么我们基于自己的RAG模块或者开源框架总是还是面临各种形形色色的问题。笔者猜测:

  • (1)数据源充足,除了给定上传文件,还可以支持联网搜索,比如bing作为额外背景知识补充;
  • (2) 文档解析几乎完美,内容自己积累了相关文档解析技术,或者多模态统一处理的框架,能够覆盖大部分文档文件的解析与清洗,并快速形成结构化内容
  • (3) 强大大模型加持,因为在一些实现过程中,有时候Demo级别尝试是用一个小的模型,比如9b、14b大一点就是32b或者72b,个人认为越大的模型兜底能力越强,起码生成的答案会大差不差,遇到噪音或者不相关信息拒识率很高,幻觉很小。

RAG发展趋势

GraphRaG

GraphRaG是一种结合了图结构知识索引与检索能力的RAG技术。它在处理涉及复杂实体关系、语义推理与多步逻辑关联的查询上更具优势,特别是在隐式事实查询的任务中表现出色。

GraphRaG通过构建Graph结构的知识索引,能够更广泛适配多样化场景,不同索引方式在不同数据类型和查询需求下各有优势,融合多种索引技术后,RAG系统能够更广泛适配多样化场景。

多模态RAG

多模态RAG技术将RAG的能力拓展到了文本之外的更广阔领域。通过集成图像、视频等其他模态数据,RAG系统可以访问更加广泛的源材料,实现文本和视觉数据之间的无缝交互。

这不仅有助于系统产生更加彻底和细致的响应,还为未来实现多模态信息处理及跨模态推理奠定了坚实基础。例如,DSE(Document Screenshot Embedding)是一个不使用广义OCR的多模态RAG方法,直接把原始文档的扫描图片,切片后,使用视觉语言模型的编码器编码,验证了这一想法的可行性。

AgenticRAG

AgenticRAG,即基于代理的RAG实现,通过引入创新的代理框架,彻底改变了我们回答复杂问题的方式。与传统上完全依赖LLM(大型语言模型)的方法不同,AgenticRAG利用智能化代理来高效解决那些需要复杂规划、多步骤推理和利用外部工具的棘手问题。

这种技术赋予了LLM和RAG前所未有的智能化能力,通过引入基于人工智能的智能代理,这些系统不再是被动响应查询请求,而是能够主动分析任务复杂性、评估当前信息状态,并战略性地选择最有效的工具和方法进行多步骤的数据检索和处理。

参考资料

  • RAG的2024—随需而变,从狂热到理性(上)
  • RAG的2024—随需而变,从狂热到理性(下)
  • 【活动回顾】数聚大咖 —《RAG:AI落地的低垂果实》
  • AI开发者工具(1)——2024 年 8 个开源 RAG 项目对比:功能解读、应用场景分析及优缺点比较
  • RAG年终总结之12篇综述:从2022到2024看架构、策略、评测及演化
  • RAG的2024—随需而变,从狂热到理性
  • 万字长文梳理 2024 年的 RAG
  • 12 个 RAG 痛点和建议的解决方案-解决检索增强生成的核心挑战
  • 大模型RAG难点、痛点、常见面试题
  • 大家觉得做一个大模型检索增强生成(RAG)系统,最难搞定的是那部分工作?

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

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

相关文章

Python 爬虫

一、创建项目 1.双击打开pycharm,点击新建项目 2.项目设置- 勾选[继承全局站点软件包]- 勾选[可用于所有项目]- 取消勾选[创建main.py欢迎脚本]- 点击创建 3.项目名称右键--新建--python文件 4.输入文件名--回车二、编辑代码 # 导入请求模块 import requests # 如…

idea项目导入gitee 码云

1、安装gitee插件 IDEA 码云插件已由 gitosc 更名为 gitee。 1 在码云平台帮助文档http://git.mydoc.io/?t153739上介绍的很清楚,推荐前两种方法, 搜索码云插件的时候记得名字是gitee,gitosc已经搜不到了。 2、使用码云托管项目 如果之…

基于JAVA+SpringBoot+Vue的机动车号牌管理系统

基于JAVASpringBootVue的机动车号牌管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 …

活动预告 |【Part1】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课:基础知识”活动,培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动,扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 活…

郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现

0x01 产品简介 郑州时空-TMS运输管理系统是一款专为物流运输企业设计的综合性管理软件,旨在提高运输效率、降低运输成本,并实现供应链的协同运作。系统基于现代计算机技术和物流管理方法,结合了郑州时空公司的专业经验和技术优势,为物流运输企业提供了一套高效、智能的运输…

BUUCTF Pwn ciscn_2019_es_2 WP

1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数: 看看vul函数: 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移: 栈迁移需要用到leave ret 使用ROPgadget找地址: …

07-ArcGIS For JavaScript--隐藏参数qualitySettings(memory和lod控制)

目录 1、综述2、sceneview.qualitySettings2.1、sceneview.qualitySettings.memoryLimit2.2、lodFactor2.3 additionalCacheMemory 3、结论 1、综述 先上重点,SceneView.qualitySettings为隐藏对象参数,该对象的memoryLimit和lodFactor等值,…

【SQL Server】教材数据库(1)

1 利用sql建立教材数据库,并定义以下基本表: 学生(学号,年龄,性别,系名) 教材(编号,书名,出版社编号,价格) 订购(学号…

RP2040 C SDK I2C外设使用

RP2040 C SDK I2C外设使用 📌相关篇《RP2040 VSCode C/C开发环境快速部署》📍I2C API 外设:https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_i2c🔧驱动I2C ssd1306 屏幕需要使用到的库&#xf…

模仿微信小程序wx.showModal自定义弹窗,内容可以修改

实现以下弹框样式功能 1.在components新建一个文件showModel.wpy作为组件&#xff0c;复制下面代码 <style lang"less" scoped> .bg_model {display: flex;justify-content: center;align-items: center;// 弹框背景.bg_hui {width: 100%;height: 100%;posi…

WebP Vs. PNG:哪种图像格式适合您的网站?

图像对任何网站都至关重要,可以增强视觉吸引力和用户体验。但是,图像也会显着影响网站的加载时间,因此必须针对 Web 使用对其进行优化。一种方法是使用正确的图像格式。

mysql乱码、mysql数据中文问号

网上排出此错误方法的很多&#xff0c;但是 都不简洁&#xff0c;找不到根本原因 主要排查两点&#xff1a; 1.代码中jdbc链接的编码规则 urljdbc:mysql://localhost:3306/title?useUnicodetrue&amp;characterEncodingutf8 将characterEncoding设置为utf8 2.设置mysq…

INT303 Big Data Analytics 笔记

Lecture1 Introduction 不考&#xff01; “Data Mining is the study of collecting, processing, analyzing, and gaining useful insights from data” EXPLORATORY ANALYSIS Make measurements to understand what the data looks like first steps when collecting da…

Unity3D仿星露谷物语开发12之创建道具列表

1、目标 道具是游戏的核心部分&#xff0c;道具包括你可以拾取的东西&#xff0c;你可以使用的工具和你能种的东西等。 本节就是创建道具的信息类。同时了解ScriptableObject类的使用。 2、创建道具枚举类 修改Assets -> Scripts -> Enums.cs脚本&#xff0c; 新增如…

如何修复 WordPress 中的“Error establishing a database connection”问题

如何修复 WordPress 中的“Error establishing a database connection”问题 在使用 WordPress 建站时&#xff0c;如果你看到“Error establishing a database connection”的提示&#xff0c;不要慌张。这通常意味着网站无法连接到数据库&#xff0c;因此无法显示内容。下面…

SQL 基础教程 - SQL SELECT 语句

SQL SELECT DISTINCT 语句 SELECT DISTINCT 语句用于返回唯一不同的值。 在表中&#xff0c;一个列可能会包含多个重复值&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …

使用Anaconda管理R语言环境,并使用Jupyter Notebook编写R语言

文章目录 Anaconda中创建R环境0 官方教程存在的问题1 创建R语言环境2 安装常用包集合&#xff1a;r-essentials3 用VS Code的Jupyter插件写R 相信一直使用Python搞数据分析、机器学习的同学们会习惯使用 Anaconda管理不同的Python环境&#xff0c;并使用Jupyter Notebook&#…

3.5mm耳机接口硬件连接

结构 以最复杂的结构为例 简单的结构无非就是没有MIC&#xff08;麦克风&#xff09;接口 上图的5就是Detect的作用 上面这两款产品都为3.5mm的音频插座&#xff0c;图一 为连接4节的音频座&#xff0c;而且有两个开关&#xff0c;1接地&#xff0c;2接MIC&#xff0c;3接左声…

第25天:信息收集-项目系统一键打点资产侦察企查产权空间引擎风险监测利器部署

#知识点 1、信息收集-项目推荐-自动化环境部署 2、信息收集-项目推荐-自动化资产收集管理 一、自动化-网络空间-Yakit&TscanPlus 项目地址&#xff1a;https://www.yaklang.com/ 项目地址&#xff1a;https://github.com/TideSec/TscanPlus 集成Fofa、Hunter、Quake、Zoome…

vue3学习笔记(11)-组件通信

1.props 父传子 子传夫 父传子 接收用defineProps([]) 空字符串也是假 2.自定义事件 $event:事件对象 ref定义的数据在模板里面引用的时候可以不用.value 3.子传父 宏函数 触发事件 声明事件 defineEmits() 挂载之后3s钟触发 4.命名 肉串命名 5.任意组件通信 mitt pubs…