前面几篇文章已经深入讨论过LangChain、RAG架构的细节,对RAG有了基础的了解,今天重点梳理一下RAG的切片策略;一、什么是RAG切片 给定一个场景,我们有一本非常厚的百科全书 RAG 的切片策略,就是帮我们把这本厚厚的书,提前拆分成一页一页、或者一段一段的“小纸片”,并给这些小纸片做好详细的“目录”和“标签”,做成一个高效的“索引”或者“目录”,当AI助手需要回答问题时,它不需要去翻整本书 不同的切片策略,就是做“目录”的不同方法。 所以,到底什么是RAG切片? RAG切片就是把一份长长的文档(如PDF、Word),合理地切割成一个个小块(Chunks)的过程。 切片后,搜索引擎可以精准地定位到包含“年假”关键词的那些小块。三、几种切片策略1. 用不同的策略和参数(大小、重叠)处理你的文档。 运行你的RAG管道,评估答案的质量。评估答案是否准确?检索到的上下文是否真正相关? 迭代优化:选择效果最好的那种策略。
文档切分策略,就是解决这个平衡问题的关键艺术。在RAG系统中,文档切分不只是简单的"砍一刀",它直接影响检索的准确性和生成答案的质量。 二、什么是RAG文档切分策略RAG文档切分策略是将大型文档分割成适合检索和生成的小块(chunks)的方法论。 三、RAG文档切分策略如何工作文档切分策略主要包含三种核心方法,每种都有其独特的工作机制和适用场景。 流式切分技术能够在文档新增时动态调整chunk边界,避免全量重建索引,这对大规模RAG系统至关重要。多模态文档切分:随着RAG从文本扩展到图片、表格、视频,切分策略也需要演进。 六、总结与思考RAG文档切分策略的本质,是在检索效率与语义完整之间寻找动态平衡的艺术。
①获取当前输入目录中所有的文件 ②以文件为单位切片,如果文件为空文件,默认创建一个空的切片 ③如果文件不为空,尝试判断文件是否可切(不是压缩文件,都可切) ④如果文件不可切,整个文件作为1片 ⑤如果文件可切 ArrayList<InputSplit>(); // 获取当前Job输入目录中所有文件的状态(元数据) List<FileStatus> files = listStatus(job); // 以文件为单位进行切片 blkLocations = fs.getFileBlockLocations(file, 0, length); } // 判断当前文件是否可切,如果可切,切片 } } else { //Create empty hosts array for zero length files // 如果文件是个空文件,创建一个切片对象 ,这个切片从当前文件的0offset起,向后读取0个字节 splits.add(makeSplit(path, 0, length, new String[0])); }
一、背 景在 RAG 系统中,即便采用性能卓越的 LLM 并反复打磨 Prompt,问答仍可能出现上下文缺失、事实性错误或拼接不连贯等问题。 某种意义上,分块质量几乎决定了RAG的性能上限——它决定知识是以连贯的上下文呈现,还是退化为无法拼合的碎片。 当分块尊重文档的叙事与结构时,检索的相关性与答案的事实一致性往往显著提升,远胜于一味更换向量模型或调参;换言之,想要真正改善 RAG 的稳健性与上限,首先要把“知识如何被切开并呈现给模型”这件事做好。 四、分块策略详解4.1 基础分块基于固定长度分块分块策略:按预设字符数 chunk_size 直接切分,不考虑文本结构。优点:实现最简单、速度快、对任意文本通用。 目标:为RAG检索创建高内聚、可追溯的块。
不管是使用 nil 切片还是空切片,对其调用内置函数 append,len 和 cap 的效果都是一样的。 三 切片扩容 当一个切片的容量满了,就需要扩容了。怎么扩,策略是什么? return slice{unsafe.Pointer(&zerobase), old.len, cap} } // 这里就是扩容的策略 newcap := old.cap 主要需要关注的有两点,一个是扩容时候的策略,还有一个就是扩容是生成全新的内存地址还是在原来的地址后追加。 扩容策略 func main() { slice := []int{10, 20, 30, 40} newSlice := append(slice, 50) fmt.Printf Go 中切片扩容的策略是这样的: 如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。上面那个例子也验证了这一情况,总容量从原来的4个翻倍到现在的8个。
本篇来看下 RAG 的架构优化策略 利用知识图谱(KG)进行上下文增强 在现有的向量数据库中,典型的上下文增强可能面临挑战:难以捕捉长距离的关联知识,信息稀疏性高(尤其是当LLM上下文窗口有限时)。 Self-RAG 的重要创新 Self-RAG 的 Reflection tokens (反思字符) 通过生成反思字符这一特殊标记来检查输出。 Self-RAG 的推理过程 Self-RAG 通过运用反思性标记对自己的输出进行自评,这使得它在推理过程中展现出调整与适应能力。 它可以与多模态 LLM 结合,实现跨模态的 RAG。 小结 本篇文章介绍了 RAG 的架构优化策略,主要包括利用知识图谱进行上下文增强以及让大模型对召回结果进行筛选的方法。
在本文中,我们将介绍使用私有数据优化检索增强生成(RAG)的四种策略,可以提升生成任务的质量和准确性。 通过使用一些优化策略,可以有效提升检索增强生成系统的性能和输出质量,使其在实际应用中能够更好地满足需求。 RAG简单回顾 RAG主要有两个过程。 为了评估这些策略的有效性,我根据ColdF的数据准备了一套10个带有实际答案的问题。 真实性和答案相关性是生成器度量标准,分别衡量幻觉和答案对问题的直接程度。 = pd.DataFrame(rag_dataset) rag_eval_datset = Dataset.from_pandas(rag_df) # Return the 还有最重要的一点成功的关键在于理解现有的数据,尝试不同的策略,并不断改进的流程。
2024年7月7号,OpenAI安全团队负责人,Lilian Weng分享了一篇博客介绍了LLM中幻觉的由来、检测和对抗策略,分享给大家,以下为翻译全文。 注:本文共分为三节:LLM幻觉由来、检测和对抗,其中对抗方法包括RAG相关的策略,感兴趣的同学可以直达。 1. 什么导致幻觉? 3.1 RAG → 编辑和归属 RAG(检索增强生成)[20]是一种非常常见的提供基础信息的方法,即检索相关文档,然后使用相关文档作为额外上下文进行生成。 Self-RAG 每次生成一个片段。 有证据表明,微调新知识可能会导致幻觉,而 RAG 的监督包含 LLM 未知的信息。 (1)以RAG数据样本作为正样本,以原始模型生成为RM数据作为负样本。
对象切片的核心机制1.1 切片的发生条件对象切片(Object Slicing)发生在派生类对象向基类对象赋值或传值时,编译器仅复制基类子对象部分,派生类特有成员被丢弃。 对象切片的潜在风险3.1 多态性破坏std::vector<Base> objects;objects.push_back(Derived()); // 切片发生objects[0].func(); 专业规避策略4.1 基于智能指针的多态容器std::vector<std::unique_ptr<Base>> polymorphic_objects;polymorphic_objects.push_back 工程实践建议明确设计意图:如果确实需要切片,使用显式接口如getBaseCopy()代码审查重点:将对象切片作为代码审查的重点检查项静态分析配置:启用编译器警告(-Wslicing)和静态分析工具检测文档化约定 :在团队编码规范中明确切片的使用条件和限制6.
因此这篇论文考虑在COT的基础上加上了RAG,即 RAT,通过利用检索到的外部信息为大模型提供推理依据。 论文核心 RAT 的核心是将 RAG 用于修正由 CoT 提示生成的每一个思维步骤中,通过查找不同参考文档来不断修正每一个思维步骤,确保推理的每一步都有准确且可靠的信息支持。 使用RAG来修复大模型生成思维步骤:假设已经修复了之前的思考步骤,现在要修复第 个思维步骤 ,将现在和过去的思维步骤 转化为将可以被LLM检索系统处理的查询,得到 检索文档:使用RAG检索 相关的文档 论文总结 这篇文章提出的RAT结合了RAG和CTO思想,使用RAG检索的文档动态优化COT中的每一个步骤,确保每一个推理步骤都是有依据的,避免大模型的幻觉。 实验结果表明,RAT在这些任务上相比传统的CoT提示和RAG方法都有显著的性能提升。
字数: 900+ | 阅读时间: 3-4分钟 热点解读:在AI快速发展的今天,RAG技术正成为各行各业的"必备神器"。但要真正驾驭这头"AI猛兽",你必须先搞定数据切片这个"拦路虎"! 一、数据切片:RAG技术的"阿喀琉斯之踵" 朋友们,想象一下:你辛辛苦苦收集了海量数据,却因为切片不当,让你的AI变成了"结巴"或"健忘症患者"。 1. AI:基于长切片中的丰富信息,我可以从AI、量子计算、生物科技等多个角度为您分析... 四、解决方案三:先粗切片 + 再细切片 小贴士:这就像给AI装备了"望远镜+显微镜",既能看大局又能观细节! 优点: 效率和准确性的完美平衡 适应复杂文档的处理需求 示例: 粗切片:硬件部分、软件部分 细切片:处理器、内存、硬盘... 用户:处理器的性能如何? AI:通过粗切片定位到硬件部分,再通过细切片找到处理器相关信息,为您详细分析... 五、总结 朋友们,在这个AI浪潮中,掌握RAG技术就像学会了"驯服AI猛兽"的秘诀。
检索增强生成(RAG)已成为构建生成式 AI 应用的主流架构,企业选择它主要原本是可以用自有数据约束模型输出,使答案更准确、可更新且更贴合业务场景。 RAG 的效果在很大程度上取决于检索到的上下文质量——提升效果的常用手段包括合理切分文本块(chunking)、选用合适的嵌入模型与采用稳健的检索策略。 嵌入在 RAG 中为何重要? 语义理解:嵌入将词、句子或文档转成向量(数字列表),让相近语义彼此靠近。这帮助系统理解语境与含义,而非仅做字面匹配。 高效检索:RAG 需要快速找到最相关的段落或文档。 选择嵌入时的关键考量 设计 RAG 时我首先会问:"系统要处理什么数据?" RAG 系统的优化是个迭代过程,嵌入模型只是其中一环。有了数据、有了用户反馈,你自然知道该朝哪个方向调整。
#切片 #切片指从现有列表中,获取一个子列表 #创建一个列表,一般创建列表时,变量的名字会使用复数 stus = ['孙悟空','猪八戒','沙和尚'] #列表的索引可以是负数,如果索引是负数,则从后向前获取元素 print(stus[-1]) #通过切片来获取指定的元素 #语法:列表[起始:结束],通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素 #做切片操作时,总会返回一个新的列表,不会影响原来的列表 #切片的起始位置和结束位置的索引都可以省略不写 #如果省略结束位置,则会一直截取到最后,如果省略开始位置,则会从第一个元素开始截取 print(stus[1:]) print(stus[:2]) print
RAG 分块重叠提升了召回率但增加了隐藏成本,比如说索引膨胀、Embedding 开销、延迟、重排序负载和评估漂移。 本文将总结的八项 RAG 分块重叠隐藏的成本,以及如何判断什么时候重叠真正有用,什么时候只是花钱买心安。 正确做法是对所有环节做版本管理:语料库快照、分块参数(S,O)、Embedding 模型、索引构建配置、检索和重排序策略,一个都不能少。 如果你正在调优 RAG,建议做一个实验:在增大 overlap 的同时,强制启用去重和每文档上限。如果这套组合能以更少的冗余拿到大部分质量收益。 by Velorum
RAG 里的文档应该怎么切割比较好呢?按固定的字符数或词数?按句?按段落?加个重叠窗口?感觉这些都太简单粗暴,容易把相关的内容给拆散了蛋先生:恩,你说得对。 我们在上面的流程处理后,拿到了新的起点段落,然后重复以上流程,直到所有段落都被处理完毕丹尼尔:哎呦不错哦,又简单又有效,这样看上去每个相关的块基本都可以在一起,不会被硬拆开蛋先生:没错,有了高质量的分块,RAG
从分块方式到搜索策略,从排序逻辑到异常兜底,每一层都藏着独立的故障模式。 Level 1:Naive RAG 文档做 embedding,存向量,按相似度取 top-k,丢给模型生成。 教程教的就是这套,大多数RAG系统也停在了这一步。 Level 5:生产级RAG 前面几个级别都在提升检索质量。生产级RAG要处理的是另一件事:检索已经尽力了,但还是失败了,怎么办? 因为它一定会失败,用户会问文档里根本没覆盖的问题。 分块策略会漏掉某个关键段落。或者问题本身就很模糊,召回的几个 chunk 互相矛盾。 真正该问的不是"怎么杜绝检索失败",而是"检索失败的时候,系统该怎么表现"。 判断该不该升级,看用户反馈就行: 用户在抱怨什么RAG就坏在哪里。 从 Level 1 开始。记录并监控系统在哪翻车,搞清楚原因之后再往上走。 这才是构建一个真正能用的RAG系统的路径。
#【RAG新范式】超越向量搜索:企业级知识库构建必知的3大RAG高级策略摘要:本文深度剖析企业级知识库构建中RAG(检索增强生成)技术的进阶实践。 阅读后您将掌握:如何将RAG召回率提升37%,推理成本降低52%,并构建支持千亿级文档的工业级知识引擎。一、从客服危机看RAG升级的紧迫性上周三凌晨2点,我们电商平台的智能客服突然崩溃。 二、RAG技术演进:从基础架构到工业级实践2.1RAG核心机制解析检索增强生成(Retrieval-AugmentedGeneration)通过动态检索外部知识库来增强大语言模型的生成能力。 其技术原理可拆解为:展开代码语言:PythonAI代码解释#经典RAG伪代码框架defbasic_rag(question,knowledge_base):#1.查询向量化query_vector=embed 架构必须升级三、核心策略一:查询改写增强技术3.1多提示改写引擎我们在项目中采用HyDE(假设文档嵌入)+查询扩展双引擎策略:展开代码语言:PythonAI代码解释fromllama_index.coreimportHyDEQueryTransformfromlangchain.retrieversimportContextualCompressionRetriever
一个具有更大上下文窗口的新模型问世,社交媒体上便会充斥着“RAG 已死”的宣言。 RAG 的初衷 五年前,我在 Meta 基础人工智能研究中心(FAIR,前身为 Facebook 人工智能研究中心)的团队提出了 RAG(Retrieval-Augmented Generation,检索增强生成 底线是:您同时需要长上下文 LLM 和 RAG。 但既然“RAG”这个术语似乎如此具有争议性,那我们不妨这样说: 我们不必非得称之为 RAG。 我们可以就叫它 检索 (retrieval)。 RAG 提供了相当于直接翻到相关页面的能力。处理更多 token 不仅更慢,而且极其低效,并且比使用 RAG 精准定位所需信息要昂贵得多。 RAG、微调和大型上下文窗口在 AI 中也是如此。 结论 我们不需要在 RAG 与长上下文窗口、微调或 MCP 之间做出选择。
灵活性:可以根据文档类型和需求灵活定义“小”和“大”的尺寸,以及它们的重叠策略。4. 假设性文档嵌入(HyDE):这是非常强大且具有创新性的一种策略。 核心检索函数search(query),执行双向检索策略,结合直接检索和改写后检索的结果 接收用户查询作为输入实施两种检索策略:直接检索,使用原始查询进行向量相似性搜索;改写后检索,使用改写后的查询进行向量相似性搜索编码查询为向量表示使用 :检索用小块,生成用大块引导策略:用假设答案引导检索真实答案桥梁策略:让查询和文档的表述更接近主要处理阶段索引阶段(定义块大小和映射)检索阶段(生成假设文档)检索阶段(查询改写)或索引阶段(文档增强)解决的核心问题块大小的权衡 例如,可以为采用Small-to-Big策略索引的文档,在检索时同时采用HyDE和查询扩展,构建一个极其强大的RAG系统。我们可以根据自己的具体场景、数据特点和性能要求,选择合适的策略组合。
的 序列 数据容器 , 因此 都可以进行 切片操作 ; 由于 元组 和 字符串 都是 不可更改的 数据容器 , 因此 序列切片操作 , 不会影响原来的序列 , 而是得到一个新的序列 ; 序列切片语法 1、代码示例 - 省略 起始坐标 / 结束坐标 / 步长 代码示例 : """ 序列切片 代码示例 """ # 列表 切片 my_list = [0, 1, 2, 3, 4, 5] # I. 对 字符串 str 切片 my_str = "123456789" # 字符串切片 从头到尾 步长 2 slice = my_str[::2] print(slice) # 13579 执行结果 : 13579 3、代码示例 - 步长为 -1 的切片 如果步长设置为 -1 , 则从后向前进行切片 ; 如果步长为负数 , 其起始下标索引 要 大于 结束下标索引 ; 代码示例 : # III. 、代码示例 - 完整版 代码示例 : """ 序列切片 代码示例 """ # 列表 切片 my_list = [0, 1, 2, 3, 4, 5] # I.