因为摸鱼太久导致被美团二面暴打,我痛定思痛决定好好学一下。
现在准备秋招了,上个星期面了字节和奇绩创坛,前两天面了美团,很快,上午投的,晚上就面了,
然后面完发现确实玩了太久了,这博客也好久没更新了,赶紧加班加点学一下噻。
那么不说废话了。
先讲讲RAG是什么?
这个RAG我讲过很多次了,(现在看到这里基本上是3.0版本了,现在的东西就不算速成的内容了,我说过我要写教程,写大众通识的内容,所以要深入浅出完整的讲。)
这个东西本质上算外置大脑,在模型进行给出内容之前先检索再生成。
那么RAG 解决了什么问题或者有什么用?
幻觉
知识过时(现在一般通过联网解决问题)
无法访问私有/特定领域数据
那么RAG的核心工作流程是什么?
第一阶段:检索
在你知识库准备好之后,我们需要对数据集进行分块处理,
太大不行(大了加了还不如不加),太小也不行(太少容易丢东西)。
然后进行向量化:
使用嵌入模型(Embedding Model) 将每个文本块转换为一个高维向量(即一组数字),这个向量可以表征文本的语义。
讲一下嵌入层和嵌入模型的区别:
这里就用人家的了,至于神经网络有什么东西请移步机器学习的部分。
总结一:关系与区别
特性 | Embedding层 | 嵌入模型 (Embedding Model) |
本质 | 神经网络中的一个组件/层 | 一个完整的、独立的模型 |
输入 | 单个单词/物品的索引(ID) | 一段文本(句子、段落等) |
输出 | 一个静态的、与上下文无关的向量 | 一个动态的、包含上下文信息的语义向量 |
核心机制 | 查表(Look-up Table) | Transformer编码器 + 自注意力机制 + 汇聚 |
类比 | 字典:给你一个词,返回它的定义。 | 语言专家:给你一句话,他理解后告诉你这句话的核心意思 |
那么高维向量是矩阵集合吗?
不是,这个就是向量,带方向的数字罢了,不过一堆batch组成的算矩阵集合。
存储:将这些向量及其对应的原始文本存储到向量数据库里。
在线检索(用户提问):
当用户问问题时,将问题也转换为一个向量。
将这个“问题向量”送入向量数据库,进行相似性搜索,快速找出与问题向量最相似的几个文本块。
那么怎么筛选最相似的文本块?
然后我就要给你讲搜广推的东西了:
1:给他设置一个分数,如果低于90分的就不要。
2:重排序模型:
先粗排-过滤-精排,
分别有top-k(第一次排序的数量,先筛多点,k一般是50到200)需要高召回率;
然后是top-n(再筛选完送回LLM的文本数量,n一般是1到5)
然后拿到top-n上传LLM。
3:元数据模型:
就是给出标注让他自己搜。
第二阶段:增强生成
构建增强提示(Prompt):
这里大伙就熟悉了,就是提示词问什么,
这个提示通常类似于:
“请严格根据以下提供的信息来回答问题。如果信息中不包含答案,请直接说'根据已知信息无法回答'。
【信息开始】
{这里插入从向量数据库检索到的相关文本}
【信息结束】
问题:{用户的问题}”
模型生成答案:
大语言模型(LLM)的上下文窗口现在不仅包含了用户的问题,更重要的是包含了解决问题所需的确切知识。
或者是这样:
你是一个法律专家,你需要按照。。。。。。
你会用百度,基本上用ai基本没问题。
RAG怎么优化?
那么根据上面怎么来的,就怎么优化,
1:数据优化:
这个数据要出重,降噪,还有文本分割。
1.1:这个文本分割怎么做?
常规都是按照章节,段落句子去分,然后设置一点固定tokens,
同时有一级标题和二级标题,或者子类。
这会就加上关键字(元数据)作者,时间之类的。
2:检索优化:
2.1:选择对应的模型和数据同时进行嵌入增强(就是扩展/压缩语义让他听得懂)
2.2:加上上下文召回之类的,还有上述的粗排+精排。
2.3:换向量数据库和修改索引对应参数。