大模型RAG从零学习笔记

0 阅读5分钟

RAG概念

RAG(Retrieval Augmented Generation)检索增强生成,通过检索外部数据,增强大模型的生成效果。

RAG为LLM提供了从某些数据源检索到的信息,并基于此修正生成的答案。RAG基本上是Search + LLM提示,通过大模型回答查询,并将搜索算法所找到的信息作为大模型的上下文,查询和检索到的上下文都会被注入到发送到LLM的提示语中

RAG 和 Fine-tuning的区别

(1)RAG检索增强生成,是把内部的文档数据先进行embedding,借助检索先获得大致的知识范围答案,再结合prompt提示词给到LLM,让LLM生成最终的答案

(2)Fine-tuning微调,是用一定量的数据集对LLM进行局部参数的调整,以期望LLM更加理解我们的业务逻辑,有更好的zero-shot能力。

扩展:

大模型微调方法中,LoRA(Low-Rank Adaptation)微调是当前大模型领域最常用的高效参数微调方法之一,在不改变原始模型权重结构的基础上,只引入少量可训练参数(<1%),效果却逼近全量微调效果

 

RAG工作流程

(1)知识库构建:将文本分割成较小的片段(chunks),使用文本嵌入模型(如Sentence-Transformer、Nomic-Embed-Text)将这些片段转换成向量,并将这些向量存储在向量数据库

(2)检索模块设计:首先将用户的输入问题进行向量化(使用相同的文本嵌入模型), 然后在向量数据库中检索与问题向量最相似的知识库片段(例如通过余弦相似度计算向量相似度),最后根据相似度得分对检索到的结果进行排序,选择最相关的片段作为后续生成的输入

(3)生成模块设计:首先将检索到的相关片段与原始问题合并(形成更丰富的上下文信息),再使用大语言模型基于上述上下文信息生成回答

 

Embedding模型的目标: 将语义相似的文本映射到相近的向量空间

向量知识库(Vector Database) :是专门用于存储、管理、索引和检索高维向量(Embedding向量)的数据库系统,根据向量距离查找最相关或相似的数据。向量数据库向量数据再大模型中起到了连接”知识“和”理解“的桥梁作用。

扩展:向量知识库的检索评价标准

(1)准确率(Precision)

准确率 = 检索相关的向量 / 检索出的向量总数

(2)召回率(Recall)

召回率 = 检索相关的向量 / 向量数据库中相关的向量总数

(3)每秒平均吞吐(QPS)

Query Per Second,QPS是每秒查询数,每秒向量数据库能够处理的查询请求次数

(4)平均相应延迟(Latency)

向量数据库的请求平均响应时间

 

RAG系统搭建流程

RAG具体实现流程:加载文件 => 读取本 => 本分割 =>本向量化 =>输⼊问题向量化 =>在本向量中匹配出与问题向量最相似的 top k 个 =>匹配出的本作为上下和问题⼀起添加到 prompt 中 =>提交给 LLM 生成回答

索引(indexing):索引⾸先清理和提取各种格式的原始数据,如 PDF、HTML、 Word 和 Markdown,然后将其转换为统⼀的纯⽂本格式。为了适应语⾔模型的上下⽂限制,⽂本被分割成更⼩的、可消化的块(chunk),然后使⽤嵌⼊模型将块编码成向量表示,并存储在向量数据库中。这⼀步对于在随后的检索阶段实现高效的相似性搜索至关重要,知识库分割成 chunks,并将 chunks 向量化到向量库中。

检索(Retrieval):在收到⽤户查询(Query)后,RAG 系统采⽤与索引阶段相同的编码模型将查询转换为向量表示,然后计算索引语料库中查询向量与块向量的相似性得分。该系统优先级和检索最高 k (Top-K)块,显示最⼤的相似性查询。

这些块随后被⽤作 prompt 中的扩展上下⽂。

 

文本切分成chunks,通常有以下几种方式:

(1)基于句子的分块 (Sentence Splitting):核心思想是先切分成句子,再合并句子成块。

(2)基于递归字符分块 (Recursive Character Text Splitting):核心思想是根据段落、换行等分隔符递归地分割文本,尽可能维持文本的逻辑结构。

(3)基于文档结构的分块 (Document Structure-aware Chunking):核心思想是利用文档本身的结构信息进行分割,例如 HTML 的 <div><p><li> 标签,Markdown 的标题 ###, 列表 -*,或者 JSON/YAML 的层级结构。

 

RAG痛点问题策略分析

1.RAG提取的上下文与答案无关

(1)增加召回数量

增加召回的 topK 数量,也就是说,例如原来召回前3个知识块,修改为召回前5个知识块。不推荐此种方法,因为知识块多了,不光会增加token消耗,也会增加大模型回答问题的干扰。

(2)重排(Reranking)

该方法的步骤是,首先检索出 topN 个知识块(N > K,过召回),然后再对这 topN 个知识块进行重排序,取重排序后的 K 个知识块当作上下文。重排是利用另一个排序模型或排序策略,对知识块和问题之间进行关系计算与排序。

2.更好的Prompt设计

通过Prompts,让大模型在找不到答案的情况下,输出“根据当前知识库,无法回答该问题”等提示。这样的提示,就能鼓励模型承认自己的局限,并更透明地向用户传达它的不确定。虽然不能保证 100% 准确度,但在清洁数据之后,精心设计 prompt 是最好的做法之一

原文地址:https://www.cnblogs.com/REN-Murphy/p/18839853