近阶段,笔者落地了一个蛮深刻的项目,该项目通过RAG技术成功解决了一些问题。因此计划通过两篇文章跟大家分享有关RAG结合ToB Agent应用的探索与实践。本篇文章,主要关于笔者对RAG(围绕Navie RAG)的些许理解。RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索与自然语言生成的技术,通过检索外部知识库增强文本生成能力。
听起来有点复杂,我们不妨从为什么需要用到RAG开始。
为什么需要用到RAG
随着近两年LLM(以下统称为大模型)不断地发展,大模型逐渐成为了我们日常办公场景中不可缺少的一环。但在使用过程中,会发现几个问题:- 知识局限性问题:通用的大模型没有企业内部数据和用户数据,将私域数据上传第三方平台进行训练,存在着数据泄露的风险。从而导致大模型对一些内部数据无从学习,并不具备某一方面的知识,存在局限性。
- 幻觉问题:大模型底层的设计机制决定了它所生成的回答本质是基于概率而非既定事实的,导致只要大模型生成内容是符合它自己的语言逻辑的,就算内容与事实差了十万八千里,它也会毫不犹豫地输出。
- 时效性问题:模型知识的获取是通过使用训练数据集训练获取的,模型训练后产生的一些新知识,是没有学习的,而大模型训练成本极高,不可能为了弥补知识而频繁进行模型训练。
本质来看,大模型输出的结果都是以过去的公共数据进行归纳推理,没有“固定的知识”。那么假如我们给它外挂上一个“知识库”,是否就能解决这类问题呢?简单举个例子:我们问大模型“请帮我简单总结一下今天的工作”。很明显大模型在一本正经地胡说八道,因为它并不了解我今天具体做了什么。但我们把今天的工作内容作为上下文结合到Prompt中,输入给大模型。大模型便能基于我们提供的内容进行针对性的回复。那是否意味着,我们可以把整个知识库都发送给大模型进行处理呢?这是一个方法,比方说通过长上下文的方式,但目前来看并不是最优解,一个原因是模型一次接收的信息仍然是有限的(目前普遍最多支持128K)。第二个原因是发送大量的上下文内容所需的消耗成本远大于短文本。最重要的原因是,输入大模型的内容过于广泛,大模型处理的效果会愈发不准确。因此我们需要先对知识内容进行预处理,这里就引入了RAG的技术。大白话解释RAG
简单理解,在向大模型提问前,我们需要预先对大量私有化知识内容进行梳理,提取(检索)出与提问相关的知识内容后整合到Promt中再向大模型提问,让大模型围绕“固定的知识”进行针对性回答。从而提升模型输出内容的准确性和可靠性(增强生成),如下图所示。▲RAG的大致流程
三、RAG流程
RAG的重点之一在于如何对知识内容进行检索,比如说:关键词检索、相似度检索。1、关键词检索
顾名思义就是我们日常工作中常见的检索方式,比如:通过输入订单标题关键词,模糊检索到订单信息。对于部分场景而言,使用关键词检索会高效快速得多▲关键词检索的示例
2、相似度检索
使用各种不同的相似度算法(如欧氏距离、余弦等)进行数据检索的一种技术。简单理解,就是把问题Embedding为向量,去向量数据库中匹配与此问题相似度最高的几个内容片段。
相似度检索是RAG中常用的检索方式,接下来我们展开说说如何利用相似度检索完成RAG的整个过程。
首先对数据库中的内容进行处理,比方说:把非文本形式的数据转换为标准的纯文本数据。然后将知识内容进行分块,切分成更短的段落或句子,以便更有效地进行处理。其中知识分块的策略会对最终知识片段的检索起到重要的影响
▲知识切分
b)知识向量化存储
把分成小块的知识片段通过一个嵌入模型(Embedding Model)转换成文本向量后创建索引并存储于向量数据库。向量通常会以数字的形式存储于一个多维空间中。当用户提问时,问题将通过和知识分块相同的嵌入模型与转换规则转化成查询向量,以保证问题和知识片段在相同的向量空间里,其中向量间的距离可以反映文本之间的语义相似度。d)向量检索
被转换成向量的问题与向量数据库中存储的知识向量进行比较,找出与查询向量最相似的知识片段,这一步骤通常通过计算向量之间的距离(如余弦距离、欧氏距离等)来实现。
提取相似度得分最高的几个知识片段,这些内容可以作为额外的上下文信息,结合用户的原始提问构建成Prompt后,输入给大模型进行处理。
f)回答
将大模型输出的问题结果返回给用户。这个答案是从知识库中检索到的最相关信息生成,确保了准确性和相关性。
四、RAG存在的挑战
虽说 RAG 能够解决在大模型使用过程中遇到的部分问题,但它仍存在方方面的挑战,比如:
1、索引阶段
Naive RAG在编制索引时,可能无法有效处理非结构化文件中的图像、表格等信息,导致信息提取不完整。其次用简单的知识分块策略,可能会导致重要信息被分割在不同的知识块中,从而影响检索效果 。2、检索阶段
使用用户原始提问做检索,可能会存在意图识别不明确(当遇到含糊或过于简短的用户查询时),这就导致用户提问和知识索引不能很好的匹配,检索质量比较差。又比如采用单一的检索方法,没有融合关键词、语义和向量等多种检索技术组合,也会一定程度上影响到检索效果。3、生成阶段
大模型可能无法将检索到的上下文与当前的生成任务有效整合,导致输出结果不一致或相关性不高。其次在生成过程中过度依赖检索到的信息,导致生成的内容只是重复输出检索到的内容,而没有提供新的价值或综合信息。为了解决上述存在的挑战,RAG技术也在持续地发展和优化中,比方说衍生出了高级RAG(Advanced RAG)与模块RAG(Modular RAG)等解决方案(本文不做细说)。五、结语
作为AIGC应用方,通常以集成第三方向量数据库为主,这意味着把RAG技术应用在实际业务当中相对比较容易,但想做好仍然有很多的困难需要克服,每个步骤都有可能对最终效果产生影响。
下一篇文章,将通过一个案例与大家分享RAG在ToB Agent的探索与实践。
以上是笔者近阶段的学习与思考,希望能帮到你。