应用篇| 深入浅出LLM应用之RAG

相信很多人都使用过LLM大模型,但是现有大模型或多或少都有以下问题:

LLM幻觉问题 :从《【小白入门篇1】GPT到底是怎样练成?》我们知道虽然大模型现在能力很强,但是本质就是在做文字接龙,而且每次接龙都具有随机性, 导致模型有时候回答, 很容易出现"幻觉"。Meta AI 的研究人员引入了一种叫做检索增强生成(Retrieval Augmented Generation,RAG)的方法来完成这类知识密集型的任务。RAG 把一个信息检索组件和文本生成模型结合在一起 , 作为解决大模型幻觉的一种利器。

数据保鲜度:除此之外, 现在大模型使用离线数据训练出来,对于新的知识0感知, 导致模型直接回答数据过时、不准等问题。

数据安全性:最后也是最重要的是,数据作为很多企业的重要资产,是不能直接上传到互联网上的大模型, 这样会导致不可预测的后果,既要保证安全,又要借助AI能力,那么最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成。而在线的大模型仅仅完成一个归纳的功能,甚至,LLM都可以完全本地化部署。

出于以上三种主要原因, 使得LLM+RAG有用武之地。

01初识RAG架构

RAG基本思路是将背景知识文档预先向量化,存储至向量数据库中,当用户进行提问时,将用户的提问同样向量化后, 通过向量检索算法(比如向量乘积)之后, 得到top-K的文档, 将获取的top-k文档和用户提问都作为大模型输入, 大模型根据输入最终生成回答.这样 RAG 更加适应事实会随时间变化的情况,因为 LLM 的参数化知识是静态的。RAG 让语言模型不用重新训练就能够获取最新的信息,基于检索生成产生可靠的输出。

可以将RAG的架构拆分成以下部分:

  • (1)数据提取: 我们现实生活的场景中大部分是word、pdf、pptx等各种各样的文档数据, 需要各种数据Loader,将数据抽取出来, 分别进行数据清洗

  • (2) 数据分块: 现在所有大模型都有token长度的限制, 包括数据库也有长度限制, 而我们文档数据长度大部分都超过这些限制, 所以我们必须对文档数据进行分块

  • (3) 向量化: 将文本、图像、音频和视频等转化为向量矩阵的过程,也就是变成计算机可以理解的格式,embedding模型的好坏会直接影响到后面检索的质量, 相比传统的关键词匹配更具有理解性,对近义词检索更友好.

  • (4)检索环节: 现在一般检索技术采用的是向量相似度计算, 这个跟第三步我们将文档数据向量化之后存储到向量数据库中。检索效果有时候不佳,此时采用一些重排技术。

  • (5)生成:检索结果排序后丢给LLM进行归纳,根据 LLM 的推理能力,返回给用户。

02 现有RAG成熟产品

RAG有各种开源的RAG工具,成品的RAG像Langchain-chatchat、ragflow、qanything等。不同开源的RAG架构有细微的差别,大体框架如第一章节所介绍的。

|--------------------|------------------------------------------------------------------|--------------|
| 名称 | 地址 | 说明 |
| Langchain-chatchat | https://github.com/chatchat-space/Langchain-Chatchat/tree/master | 当前Star 29K |
| ragflow | https://github.com/infiniflow/ragflow/tree/main | 当前Star 9.3k |
| Qanything | https://github.com/netease-youdao/QAnything/tree/master | 当前Star 10.2k |
| ....... | ........ | ...... |

当然RAG远不止上面三个框架, 之前在《【大模型应用篇4】普通人构建智能体的工具》介绍中的大部分智能体也内置了RAG的功能,从当前star来看chatchat具有拔得头筹优势, 但是Qanything有网易大厂做背书。那有没有其他方式进行评判, 答案是有的,请继续往下看。

除此之外, 如果以上成熟rag产品还不能满足你的需求, 可以使用基于一些Langchain等工具进行自定义开发。这种方式会更加灵活。比如langchain官网有基于langchain开发rag的简单例子python.langchain.com/v0.1/docs/u...

03 RAG评估

如此之多RAG工具,到底该怎么选?有什么更加量化指标能够评判rag的优劣。大部分RAG评估框架基于答案的相关性、上下文精确度、上下文相关性等上。主要RAG评估框架有以下几种:

|----------------|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 名称 | 地址 | 说明 |
| Ragas | https://github.com/explodinggradients/ragas | Ragas是一个用于评估RAG应用的框架,包括忠诚度(Faithfulness)、答案相关度(Answer Relevance)、上下文精确度(Context Precision)、上下文相关度(Context Relevancy)、上下文召回(Context Recall), 其中从上下文相关性和上下文召回来衡量检索的质量,忠诚度和答案相关度来衡量LLM生成的质量。 |
| TruLens | https://github.com/truera/trulens | TruLens 提供了一套用于开发和监控神经网络的工具,包括大型语言模型。这包括使用 TruLens-Eval 评估基于 LLMs 和 LLM 的应用程序的工具以及使用 TruLens-Explain 进行深度学习可解释性的工具。TruLens-Eval 和 TruLens-Explain 位于单独的软件包中,可以独立使用, 同时可以和Langchain无缝集成。一个RAG 三元组评估模式 --- 分别是对问题的检索内容相关性、答案的基于性(即大语言模型的答案在多大程度上得到了提供的上下文的支持)和答案对问题的相关性。 |
| uptrain | https://github.com/uptrain-ai/uptrain | 用于评估和改进生成式人工智能应用的开源统一平台。提供了20多项预配置检查(涵盖语言、代码、嵌入用例)评分,对失败案例进行根本原因分析,并就如何解决这些问题提出见解。比如prompt注入、越狱检测、整通对话的用户满意度等 |
| #### LangSmith | https://smith.langchain.com/ | LangSmith是一个用于调试、测试和监控LLM应用程序的统一平台。会记录大模型发起的所有请求,除了输入输出,还能看到具体的所有细节,包括: 1. 请求的大模型、模型名、模型参数 2. 请求的时间、消耗的 token 数量 3. 请求中的所有上下文消息,包括系统消息 |
| Langfuse | https://github.com/langfuse/langfuse | Langfuse作为LangSmith的平替,可以帮助开发者和运维团队更好地理解和优化他们的LLM应用。通过提供实时的和可视化的跟踪功能,LangFuse使得识别和解决应用性能问题变得更加简单和高效。实现LLM可观测的功能。 |
| ....... | ....... | ....... |

有了量化评估工具,我们结合具体指标优化RAG的效果。不再停留拍脑袋的优化环节,帮助大家选择合适的RAG产品、RAG中的LLM模型、向量化模型等选型。

04 总结

虽然RAG能够快速解决LLM幻觉、新鲜度、以及数据安全性问题,但是RAG也有它的局限性,比如

(1) 向量数据库是一个尚未成熟的技术,缺乏处理大量数据规模的通用方案,因此数据量较大时,速度和性能存在挑战。

(2)在推理时需要对用户输入进行预处理和向量化等操作,增加了推理的时间和计算成本。

(3)外部知识库的更新和同步,需要投入大量的人力、物力和时间。

(4) 需要额外的检索组件,增加了架构的复杂度和维护成本。

(5)并不是精确问题,有些领域需要检索出来精确的数据,知识检索阶段依赖相似度检索技术,并不是精确检索,因此有可能出现检索到的文档与问题不太相关。同时每次检索出来给LLM,每次返回给用户并不是一样,会导致用户查询体验问题。

(6)关于查全问题,有些领域需要知识查询要求尽量全 ,RAG本质还是一种信息检索系统,无法做到全部查全。

总体来说RAG作为LLM前景广阔工业化应用,还是值得大家在私域上面进行部署和使用。随着相关RAG研究发展, 会使得RAG大有可为。

a1q7lEaSQh5nVoqyDeiaUUdoZ0ib71twL6CLICmOMJ25UuTFwl6ydwOXFbl8uiaYMAQ/640?wx_fmt=gif)

推荐阅读:

实用篇| 破解huggingface大法

研究篇| 一款深入浅出的微调框架

【小白入门篇6】常识|怎么计算模型需要的资源

【大模型应用篇3】LLM时代下的智能体

相关推荐
huapiaoy2 分钟前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法
冷白白15 分钟前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
鹤上听雷24 分钟前
【AGC005D】~K Perm Counting(计数抽象成图)
算法
一叶祇秋36 分钟前
Leetcode - 周赛417
算法·leetcode·职场和发展
武昌库里写JAVA41 分钟前
【Java】Java面试题笔试
c语言·开发语言·数据结构·算法·二维数组
ya888g42 分钟前
GESP C++四级样题卷
java·c++·算法
Funny_AI_LAB1 小时前
MetaAI最新开源Llama3.2亮点及使用指南
算法·计算机视觉·语言模型·llama·facebook
NuyoahC1 小时前
算法笔记(十一)——优先级队列(堆)
c++·笔记·算法·优先级队列
jk_1011 小时前
MATLAB中decomposition函数用法
开发语言·算法·matlab
penguin_bark2 小时前
69. x 的平方根
算法