前面几篇文章已经深入讨论过LangChain、RAG架构的细节,对RAG有了基础的了解,今天重点梳理一下RAG的切片策略;一、什么是RAG切片 给定一个场景,我们有一本非常厚的百科全书 RAG 的切片策略,就是帮我们把这本厚厚的书,提前拆分成一页一页、或者一段一段的“小纸片”,并给这些小纸片做好详细的“目录”和“标签”,做成一个高效的“索引”或者“目录”,当AI助手需要回答问题时,它不需要去翻整本书 不同的切片策略,就是做“目录”的不同方法。 所以,到底什么是RAG切片? RAG切片就是把一份长长的文档(如PDF、Word),合理地切割成一个个小块(Chunks)的过程。 4. 层次切片4.1 详细说明 这种方法不再产生扁平的块,而是构建一个层次化的索引结构。 核心思想:创建不同粒度级别的块。 用不同的策略和参数(大小、重叠)处理你的文档。 运行你的RAG管道,评估答案的质量。评估答案是否准确?检索到的上下文是否真正相关? 迭代优化:选择效果最好的那种策略。
在本文中,我们将介绍使用私有数据优化检索增强生成(RAG)的四种策略,可以提升生成任务的质量和准确性。 通过使用一些优化策略,可以有效提升检索增强生成系统的性能和输出质量,使其在实际应用中能够更好地满足需求。 RAG简单回顾 RAG主要有两个过程。 4、提供模型的最后提示:制作有效提示以提高输出质量。 RAG的A/B测试 A/B测试可以比较每个组件具有不同配置的两个版本,确定哪个版本的性能更好。 为了评估这些策略的有效性,我根据ColdF的数据准备了一套10个带有实际答案的问题。 真实性和答案相关性是生成器度量标准,分别衡量幻觉和答案对问题的直接程度。 还有最重要的一点成功的关键在于理解现有的数据,尝试不同的策略,并不断改进的流程。
文档切分策略,就是解决这个平衡问题的关键艺术。在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的性能上限——它决定知识是以连贯的上下文呈现,还是退化为无法拼合的碎片。 初始的配置建议(仅限于中文技术/说明文档):窗口大小 window_size:2–4 句最小/最大块长:min_chunk_chars=300–400,max_chunk_chars=1000–1200 目标:为RAG检索创建高内聚、可追溯的块。 Apex AI辅助编码助手的设计和实践|得物技术4. 从 JSON 字符串到 Java 对象:Fastjson 1.2.83 全程解析|得物技术5.
上图是用 make 函数创建的一个 len = 4, cap = 6 的切片。内存空间申请了6个 int 类型的内存大小。由于 len = 4,所以后面2个暂时访问不到,但是容量还是在的。 不管是使用 nil 切片还是空切片,对其调用内置函数 append,len 和 cap 的效果都是一样的。 三 切片扩容 当一个切片的容量满了,就需要扩容了。怎么扩,策略是什么? 主要需要关注的有两点,一个是扩容时候的策略,还有一个就是扩容是生成全新的内存地址还是在原来的地址后追加。 [10 20 30 40], Pointer = 0xc4200b0140, len = 4, cap = 4 After newSlice = [10 30 30 40 50], Pointer Go 中切片扩容的策略是这样的: 如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。上面那个例子也验证了这一情况,总容量从原来的4个翻倍到现在的8个。
1 #利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法 2 def trim(s): 3 while s[0:1]==' ': 4 10 print('去除首尾空格后',trim(s)) 知识点: 取一个list或tuple的部分元素,比如取list的前3个元素,对这种经常取指定索引范围的操作,用循环十分繁琐, Python提供了切片 在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成。 因此,字符串也可以用切片操作,只是操作结果仍是字符串。
本篇来看下 RAG 的架构优化策略 利用知识图谱(KG)进行上下文增强 在现有的向量数据库中,典型的上下文增强可能面临挑战:难以捕捉长距离的关联知识,信息稀疏性高(尤其是当LLM上下文窗口有限时)。 但有时回调的上下文可能与查询无关或存在矛盾,这种情况下应当放弃使用这些上下文,尤其是在大模型的上下文窗口有限(当前常见为4k窗口)的情况下。 + 一个片段的生成结果; 3、使用反思字段,检查输出是否相关,选择最符合需要的片段; 4、再重复检索; 5、生成结果会引用相关片段,以及输出结果是否符合该片段,便于查证事实。 2、首先借助多模态大型模型(如GPT4-V、LLaVA、FUYU-8b)对图像内容进行概要生成。紧接着,对文本、表格和图像的概要进行向量化处理,存入综合向量索引系统。 小结 本篇文章介绍了 RAG 的架构优化策略,主要包括利用知识图谱进行上下文增强以及让大模型对召回结果进行筛选的方法。
langchain4j 中的 Advanced RAG 涉及到诸多策略,今天和大家聊一聊这里涉及到的一些策略。 ,RAG 系统就像有个经验丰富的图书管理员,既能广撒网找资料,又能精准锁定目标库,兼顾效率与质量。 4.2.4 其他 其他的还有像 AzureAiSearchContentRetriever 主要负责和 Azure AI 进行交互,Neo4jContentRetriever 则主要负责和 Neo4j with LangChain4j?") with LangChain4j?")
序本文主要研究一下langchain4j的RAG概述RAG(Retrieval-Augmented Generation)即检索增强生成,它通过检索来获取相关信息,注入到prompt,然后用增强的prompt 实现LangChain4j 提供了三种RAG(Retrieval-Augmented Generation,检索增强生成)的实现方式:Easy RAG:这是最简单的方式,适合初学者快速上手。 Easy RAGpom.xml<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-easy-rag RAG Flavors**LangChain4j offers three RAG flavors:* **Easy RAG:** The simplest, quickest way to get LangChain4j 提供了三种RAG(Retrieval-Augmented Generation,检索增强生成)的实现方式:Easy RAG、Naive RAG、Advanced RAG。
2024年7月7号,OpenAI安全团队负责人,Lilian Weng分享了一篇博客介绍了LLM中幻觉的由来、检测和对抗策略,分享给大家,以下为翻译全文。 注:本文共分为三节:LLM幻觉由来、检测和对抗,其中对抗方法包括RAG相关的策略,感兴趣的同学可以直达。 1. 什么导致幻觉? 3.1 RAG → 编辑和归属 RAG(检索增强生成)[20]是一种非常常见的提供基础信息的方法,即检索相关文档,然后使用相关文档作为额外上下文进行生成。 IsUse:输出文本对输入Prompt是否有用;输出值:{5, 4, 3, 2, 1}。 Self-RAG 每次生成一个片段。 有证据表明,微调新知识可能会导致幻觉,而 RAG 的监督包含 LLM 未知的信息。 (1)以RAG数据样本作为正样本,以原始模型生成为RM数据作为负样本。
对象切片的核心机制1.1 切片的发生条件对象切片(Object Slicing)发生在派生类对象向基类对象赋值或传值时,编译器仅复制基类子对象部分,派生类特有成员被丢弃。 对象切片的潜在风险3.1 多态性破坏std::vector<Base> objects;objects.push_back(Derived()); // 切片发生objects[0].func(); :another丢失,可能资源泄漏4. 专业规避策略4.1 基于智能指针的多态容器std::vector<std::unique_ptr<Base>> polymorphic_objects;polymorphic_objects.push_back :在团队编码规范中明确切片的使用条件和限制6.
序本文主要研究一下langchain4j的Naive RAG示例public class Naive_RAG_Example { /** * This example demonstrates 技术,Easy RAG使用了EmbeddingStoreIngestor来隐藏了文档解析、分割、嵌入、嵌入存储,Naive RAG亦可使用。 EmbeddingStoreContentRetrieverdev/langchain4j/rag/content/retriever/EmbeddingStoreContentRetriever.javapublic 小结langchain4j提供了EmbeddingStoreContentRetriever来开启Naive RAG的功能,EmbeddingStoreContentRetriever.builder( docNaive RAG
继续我们的langchain4j之旅,今天来看看RAG如何实现,“RAG萌宠新手盆友们”建议先看看B站大佬的视频RAG 工作机制详解—哔哩哔哩_bilibili,核心步骤就是下面这3张图: 最简单的RAG error: " + e.getMessage() + "\"}"); } } 略做解释: 为了简单起见, 这里分片我们略过,直接手动用二个句子,当成2个分片 使用langchang4j prompt_eval_count":11} 3、重排/生成 private interface Assistant { String chat(String userMessage); } /** * 基于RAG "" + e.getMessage() + "\"}"); } } 日志输出: 2025-12-03T21:06:00.218+08:00 INFO 16956 --- [langchain4j-study "done_reason":"stop","total_duration":1059949995,"prompt_eval_count":21,"eval_count":22} 从日志上看,先做了1次RAG
序本文主要研究一下langchain4j的Advanced RAG核心流程将UserMessage转换为一个原始的QueryQueryTransformer将原始的Query转换为多个Query每个Query *
* Advanced RAG in LangChain4j is described here: https://github.com/langchain4j/langchain4j DefaultQueryTransformerdev/langchain4j/rag/query/transformer/DefaultQueryTransformer.javapublic class ReRankingContentAggregatordev/langchain4j/rag/content/aggregator/ReRankingContentAggregator.javapublic ContentInjectordev/langchain4j/rag/content/injector/ContentInjector.java@Experimentalpublic interface
概述 本文实现的是结合Openlayers4和java servlet实现公网资源切片的本地缓存。 优点 相比较其他下载利器,本实例具有以下优点: 1. 实现简单,操作简单; 2. 结合web,看到哪下到哪,主动保存未缓存的切片; 4. 可通过修改URL和代码缓存多种地图切片。 缺点 鉴于web的实现,该切片缓存的方式具有以下缺点: 1. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>切片下载 VERSION': '1.1.1', STYLES: '', LAYERS: 'bj_grid:bou2_4p "/tile"}) public class TileServiceServlet extends HttpServlet { private String url = "https://s4.
Tensor,可以仿照python的列表,使用从0开始整数顺序索引import paddlea=paddle.arange(1,7)print(a)print(a[0],a[1],a[2],a[3],a[4] )print(a)print(a[2,3])print(a[0,-1])【Tensor切片】切片操作可以选取Tensor的部分元素下面以二维向量为例【选取整行整列】如果某个维度的索引为一个冒号:则表示选取这个维度的所有元素 (a[:,0])print(a[:,1])【指定范围】与numpy数组类似,Tensor类型数据也可以使用start:end:step的格式进行切片import paddlea=paddle.reshape (paddle.arange(1,13),(3,4))print(a)print(a[0,1:4])a[0,1:4]就表示选取向量a的第0行中的第1~第3元素((1,4),左闭右开)与numpy同理,在这里 a[0,:2]表示a[0,0:2]a[0,2:]表示a[0,2:4]大家可以自行尝试
因此这篇论文考虑在COT的基础上加上了RAG,即 RAT,通过利用检索到的外部信息为大模型提供推理依据。 使用RAG来修复大模型生成思维步骤:假设已经修复了之前的思考步骤,现在要修复第 个思维步骤 ,将现在和过去的思维步骤 转化为将可以被LLM检索系统处理的查询,得到 检索文档:使用RAG检索 相关的文档 、GPT-4和CodeLLaMA-7b,所有实验均在零样本(zero-shot)设置下进行。 论文总结 这篇文章提出的RAT结合了RAG和CTO思想,使用RAG检索的文档动态优化COT中的每一个步骤,确保每一个推理步骤都是有依据的,避免大模型的幻觉。 实验结果表明,RAT在这些任务上相比传统的CoT提示和RAG方法都有显著的性能提升。
序本文主要研究一下langchain4j的核心RAG APIs核心RAG APIslangchain4j提供了一套丰富的API来构建自定义的RAG(检索增强生成)pipelines,从简单的到高级的都有涵盖 (langchain4j-document-loader-amazon-s3)、AzureBlobStorageDocumentLoader(langchain4j-document-loader-azure-storage-blob (langchain4j-document-parser-apache-pdfbox)、ApachePoiDocumentParser(langchain4j-document-parser-apache-poi 提供了一套丰富的API来构建自定义的RAG(检索增强生成)pipelines,包括DocumentLoader、DocumentParser、DocumentTransformer、DocumentSplitter doccore-rag-apis
字数: 900+ | 阅读时间: 3-4分钟 热点解读:在AI快速发展的今天,RAG技术正成为各行各业的"必备神器"。但要真正驾驭这头"AI猛兽",你必须先搞定数据切片这个"拦路虎"! 一、数据切片:RAG技术的"阿喀琉斯之踵" 朋友们,想象一下:你辛辛苦苦收集了海量数据,却因为切片不当,让你的AI变成了"结巴"或"健忘症患者"。 1. AI:基于长切片中的丰富信息,我可以从AI、量子计算、生物科技等多个角度为您分析... 四、解决方案三:先粗切片 + 再细切片 小贴士:这就像给AI装备了"望远镜+显微镜",既能看大局又能观细节! 优点: 效率和准确性的完美平衡 适应复杂文档的处理需求 示例: 粗切片:硬件部分、软件部分 细切片:处理器、内存、硬盘... 用户:处理器的性能如何? AI:通过粗切片定位到硬件部分,再通过细切片找到处理器相关信息,为您详细分析... 五、总结 朋友们,在这个AI浪潮中,掌握RAG技术就像学会了"驯服AI猛兽"的秘诀。