本文约2800字,建议阅读时间8~12分钟
关键字:AI,LLM,RAG,Retrieval-Augmented Generation,知识库
一、为什么需要RAG?
众所周知,大语言模型(LLM)发展迅速,其能力特别是生成能力已经足够强大,但是在一些场景中,LLM的应用仍存在一定局限:(1)LLM是基于给定数据训练习得,存在知识截止期,如时事新闻、政策类信息具有时效性;(2)LLM语料常常来自公开可获得语料(尽管也有部分私有数据),无法触及企业内部知识(如企业规章制度、业务流程等)以及专业领域的深度知识(如细分领域规范与标准等);(3)当前主流LLM往往采用Transformer架构,基于softmax层输出目标词汇表中每个词作为下一个词的条件概率,因而本质是一个概率模型,存在一定“幻觉”,当LLM遇到没有见过的知识时,可能导致输出的起始内容分布概率相对接近,使得输出具有一定随机性,进而产生一定"幻觉",编造一个看似合理的答案,出现一本正经地胡说八道。归根结底,是LLM仍存在一定“知识不足”导致的。
解决LLM知识不足的方法有哪些呢?首先,可能最容易想到的就是将需要的知识继续“内化”到LLM中,即通过模型训练或微调等技术进一步将知识融合到当前LLM中,但方法易得,现实难求:(1)大模型训练或微调成本相对较高,不仅需要硬件如GPU的投入,而且还需要对知识进行清洗和标注,且模型训练时间周期相对较长,仍无法很好解决知识时效性问题,对于时事新闻等信息频繁进行模型的训练或微调也是不现实的;(2)知识“内化”到LLM,使得答案的生成过程往往变成一个“黑盒”,无法很好追溯答案的来源;(3)对于没有模型训练或微调条件的场景,可能需要采用云服务,如果接入私有知识,可能存在数据泄露的风险;(4)训练或者微调模型的首要条件是必须有一个模型,对于普遍调用LLM的API场景,根本就无法去训练或微调服务商的大模型(当然开源的除外)。
知识“内化”因成本高、不方便、不灵活不是解决问题的理想方法,RAG技术便应运而生。
二、RAG是什么?
RAG(Retrieval-Augmented Generation),直译就是检索增强生成,是一种结合信息检索与文本生成的AI技术,它通过动态检索外部知识库,为LLM注入实时、精准的领域知识,提升LLM生成内容的准确性、可靠性与专业性,其核心模块主要包括检索模块、增强模块和生成模块。RAG主要解决传统大模型知识“固化”、易产生“幻觉”的问题,具有高可解释性、低部署成本和强隐私保护能力,特别适用于垂直领域和需要私有数据的场景。
三、RAG如何实现?
RAG具体的实施步骤主要包括如下五大步骤:
(1)知识文档收集与预处理。首先根据业务目标搜集相关的知识文档,从这些文本、图片、音频等文档中解析提取出文本知识。然后对解析出的文本知识进行降噪:1)剔除无关信息如页眉、页脚、页码、空格、换行符等,并采用SimHash 或 MinHash 等算法检测并剔除高度相似或完全重复的段落;2)将一些口语化文本转化为正式的标准文本,如剔除一些无实际意义的语气词“嗯”、“啊”、“其实呢”、“那个”等;3)针对专业术语较多的场景,需要将文档中涉及的专业术语统一映射为标准术语,能用全称尽量用全称,并转化为标准的简体中文。最后对降噪后的知识进行分类:1)按照业务逻辑(如业务域、部门、产品线或时间等维度)建立目录树,目的是为了在后续检索时提供意图识别,降低检索的噪声;2)基于知识片段进行属性(包括对象、内容、时效、状态等)打标,创建知识片段过滤元数据,目的是为了提高后续检索的速度和准确性;3)针对跨目录实体存在关联的情形,可以通过关联关键词打标以及创建实体之间的关系等方法进行标识,目的是为了解决有时用户提问表达模糊的问题,通过关联给出全面的答案。
(2)知识库的创建。首先对预处理之后的文本文档进行分块:分块的原则需要遵循语义完整性、上下文相关性、块长度适中、适当的冗余性,具体方法包括固定分块、递归分块、语义分块、文档结构分块等,块大小通常在256到1024之间,文档重叠率在15%~30%。其次是向量化,向量化主要包括分词和嵌入两个阶段:1)分词(Tokenization),采用分词工具(如中文场景的jieba,在专业术语较多的场景,建议可创建一个自定义的词典)将文档分成逐个的token,然后基于语料映射成数字ID;2)嵌入(Embedding):通过Embedding模型(如中文场景下的bge系列模型)将上述每个token转化成固定维度的向量。最后是索引构建与入库:存入向量数据库(通常存入文档块及其向量)前需要对文档块构建索引便于后续检索,入库前的索引构建一般包括:1)适用过滤检索的元数据索引,如文档路径、时间戳、文档属性、父索引ID、语义层级Level等,通常采用键值对;2)适用关键词检索的稀疏索引,通常采用BM25算法;3)适用语义检索的稠密索引,通常采用图结构索引算法。
(3)知识检索。首先是问题/查询的向量化,向量化方法需要知识库创建时保持一致。其次是文档粗筛,通过过滤检索、关键词检索、语义检索、混合检索等方法从向量数据库中检索出问题相关文档。最后是候选文档的精排,也称为重排序(rerank),它是在粗筛检索之后,引入一个更精细的模型(通常是 Cross-Encoder 架构),对这批候选文档与用户提问的相关性进行二次精准打分和重新排序,重排序是提升文档检索质量的关键步骤。
(4)知识增强与答案生成。结合检索出来的文档知识生成一个增强版的提示词,主要包括系统指令、参考资料(检索出来的文档)、用户提问(用户的原始问题)、回答约束等,回答约束包括事实约束(知之为知之,不知为不知,禁止LLM瞎编)、引用约束(得出答案的依据或参考文档)、冲突约束(针对不同参考资料出现矛盾时需据实指出)、输出约束(包括输出结构、语气和字数)等,当然,还可以通过设置LLM的温度和核采样参数来控制LLM输出的随机性。
(5)RAG评估。可以将上述步骤中某些可变部分,比如分块方法、分块大小、块重叠率、embedding模型、embedding输出维度、检索方法等作为超参数,通过比较不同组合情形下RAG的效果进行最终生产环境的测试。首先需要准备具有一定代表性的RAG评估数据集,主要包括用户原始问题、RAG生成的答案、实际检索到的上下文、用户原始问题标准答案、实际检索到的文档ID、真实相关的文档ID等字段。然后建立RAG评估指标体系,通常包含检索质量和生成质量两大块,其中检索质量指标主要包括排序精准度(平均倒数排名MRR)、综合排序质量(归一化折现累积增益NDCG)、上下文精确率、上下文召回率等,生成质量指标主要包括忠实度、答案相关性等。
四、RAG如何优化?
RAG系统常常面临“检索不准”、“答非所问”以及“系统延迟高”等问题,需要进行针对性的优化。
优化环节 | RAG 系统问题 | 优化技术 |
知识阶段 | 固定分块导致语义断裂、部分相关、丢失上下文、知识更新 | 语义/递归分块、父子切片与索引、元数据(文档结构化标签)增强、分层索引+文档内容HASH |
检索阶段 | 向量检索易漏检、召回率不足、排名不准 | 混合(向量+关键词)检索+RRF、查询重写(多查询检索/HyDE)、重排序(Cross-Encoder) |
生成阶段 | 噪声稀释关键信息、上下文超限、回答出现幻觉 | 上下文压缩、结构化提示词工程、温度/核采样参数控制等 |
夜雨聆风