以下是根据检索增强生成RAG-书生浦语大模型实战营学习笔记3的主题整理的学习笔记内容:---### 学习笔记3:检索增强生成(RAG)与书生浦语大模型实战#### 一、检索增强生成(RAG)概述1. **定义**:检索增强生成(Retrieval-Augm

摘要:大语言模型学习-9.检索增强生成RAG 书生浦语大模型实战营学习笔记3 本文主要涉及检索增强生成相关基础知识,也包括第二期实战营的第3课的内容 动机 当今大语言模型存在幻觉现象,即大模型会无意义或不忠实于所提供源内容的生成内容(genera
大语言模型学习-9.检索增强生成RAG 书生浦语大模型实战营学习笔记3 本文主要涉及检索增强生成相关基础知识,也包括第二期实战营的第3课的内容 动机 当今大语言模型存在幻觉现象,即大模型会无意义或不忠实于所提供源内容的生成内容(generated content that is nonsensical or unfaithful to the provided source content)。为解决这一问题,可以从数据、模型、推理三方面入手。检索增强生成(Retrieval Augmented Generation, RAG)即从数据层面入手,解决这一问题。 Huang L, Yu W, Ma W, et al. A survey on hallucination in large language models: Principles, taxonomy, challenges, and open questions[J]. arXiv preprint arXiv:2311.05232, 2023. 检索增强生成 Gao Y, Xiong Y, Gao X, et al. Retrieval-augmented generation for large language models: A survey[J]. arXiv preprint arXiv:2312.10997, 2023. 检索增强生成(Retrieval Augmented Generation, RAG)是对大型语言模型输出进行优化的方法,使其能够在生成响应之前引用训练数据来源之外的权威知识库。在大语言模型(LLM)的基础上,RAG扩展其能力,使其能够访问特定领域或企业的内部知识库,而无需重新训练模型。这种方法经济高效,能够有效改进LLM输出,在不同情境下保持相关性、准确性和实用性。同时,RAG (检索增强生成) 并不需要模型微调。相反, RAG 通过提供检索到的额外的相关内容喂给 LLM 以此来获得更好的回答。 额外的数据通过独立的嵌入模型会被转化为嵌入向量,这些向量会储存在向量数据库里。嵌入模型通常都比较小,因此在常规偏差上更新嵌入向量相比于微调模型会更快,便宜,和简单。 与此同时,由于不需要微调,给了你极大的自由度去切换选择你自己的更强的 LLM,或者对于更快速的推理去切换更小的蒸馏模型。 RAG流程 经典的RAG分为以下几个步骤: 将知识源拆分为片段; 将拆分成片段的知识构建为向量数据库; 将用户提出的问题编码成向量;并在向量数据库中寻找匹配文本 将匹配文本与用户输入构建新prompt,使用新prompt作为LLM输入,得到LLM输出 其中,前2步是知识库构建的流程,后2步是检索生成的过程。 检索器Retriever 检索器的作用类似于内部搜索引擎:给定用户查询,它从你的知识库中返回top_k个长为chunk size的相关片段。这些片段随后将被输入到阅读器模型中,以帮助其生成答案。 chunk size 允许从一段片段到另一段片段有所不同。 增加 top_k 可以提高你检索到的片段中包含相关元素的概率,类似于射更多的箭增加了你命中目标的概率。 文档总长度不应过高。对于大多数当前模型来说,16k 个 token 可能会导致关键信息模糊或包含与真实答案相反的信息,对生成效果产生负面影响,产生中间丢失现象 。 将文档拆分为片段(chuncks) 这个HF空间让你可视化不同的拆分选项如何影响你得到的片段。 对于文本拆分存在许多选项:按单词拆分,按句子边界拆分,递归拆分以树状方式处理文档以保留结构信息。 递归拆分 递归拆分使用给定的一组分隔符逐步将文本分解为更小的部分,这些分隔符按从最重要到最不重要的顺序排序。如果第一次拆分没有给出正确大小或形状的片段,该方法会使用不同的分隔符在新的片段上重复自身。 例如,使用分隔符列表["\n\n", "\n", ".", ""]拆分文档时,操作流程如下: 首先在出现双行中断"\n\n"的任何地方拆分文档得到结果文档。 结果文档将在简单的行中断"\n"处再次拆分,然后在句子结尾"."处拆分。 最后,如果有些片段仍然太大,它们将在超过最大大小时拆分。 使用这种方法,整体结构得到了保留,但片段大小会有轻微的变化。 让我们用片段大小做一些实验,从任意大小开始,看看拆分是如何工作的。我们使用 Langchain 的 RecursiveCharacterTextSplitter 实现递归拆分。 参数 chunk_size 控制单个片段的长度:这个长度默认计算为片段中的字符数。 参数 chunk_overlap 允许相邻片段彼此有一些重叠。
阅读全文