06-文本切分不是越小越好-Chunk大小对RAG的影响
文本切分不是越小越好Chunk文本块大小对 RAG 的影响系列从零构建企业 RAG 知识库第 6 篇1. Chunk 是检索与生成之间的接口文档太长无法作为一个检索单元切得太碎又会丢失语义关系。Chunk 同时影响召回查询能否匹配到正确片段精度片段中有多少无关信息上下文答案需要的条件是否完整成本Embedding 数量与生成 Token溯源引用能否定位到有意义的段落。所以不存在适用于所有文档的“最佳 500 字”。合适大小由文档结构、问题粒度、目标模型 Tokenizer 和评测集共同决定。2. 字符数不等于 Token 数中文、英文、代码和表格的 Token 比例不同。生产系统应使用目标 Embedding/生成模型对应的 Tokenizer 计算预算。本文为保持纯 Python 可运行使用字符上限演示算法不能把该字符数称为真实 Token。3. 优先按语义边界切分fromdataclassesimportdataclassimportredataclass(frozenTrue)classSection:heading:strtext:strsource_position:intdataclass(frozenTrue)classTextChunk:chunk_id:strheading:strtext:strstart_position:intend_position:intdefsplit_sentences(text:str)-list[str]:保留句末标点避免切分后原文无法引用。partsre.split(r(?[。!?;]),text)return[item.strip()foriteminpartsifitem.strip()]标题、段落、句子、列表、代码块和表格行都是自然边界。只有单个语义单元超过上限时才考虑硬切。4. 句子打包算法fromhashlibimportsha256defchunk_section(section:Section,max_chars:int300,overlap_sentences:int1,)-list[TextChunk]:ifmax_chars20:raiseValueError(max_chars 不能小于 20)ifnot0overlap_sentences3:raiseValueError(overlap_sentences 必须在 0 到 3 之间)sentencessplit_sentences(section.text)ifnotsentences:return[]groups:list[list[str]][]current:list[str][]forsentenceinsentences:iflen(sentence)max_chars:raiseValueError(单句超过上限应进入长句专项切分)proposed.join(current[sentence])ifcurrentandlen(proposed)max_chars:groups.append(current)overlapcurrent[-overlap_sentences:]ifoverlap_sentenceselse[]currentlist(overlap)current.append(sentence)ifcurrent:groups.append(current)chunks:list[TextChunk][]cursorsection.source_positionforindex,groupinenumerate(groups):text.join(group)chunk_idsha256(f{section.heading}:{index}:{text}.encode(utf-8)).hexdigest()[:16]chunks.append(TextChunk(chunk_idchunk_id,headingsection.heading,texttext,start_positioncursor,end_positioncursorlen(text),))# 有重叠时位置是近似值精确实现应保留原句 offsetcursorlen(text)returnchunksOverlap重叠帮助保留边界上下文但会重复索引、增加存储并产生近重复召回。应通过评测选择而不是默认越大越好。5. 表格和代码不能照搬段落策略表格问题常依赖表头与某一行应让每个 Chunk 携带表名、表头和行定位。代码应以函数、类或语法树节点切分避免把函数签名与函数体拆开。合同与制度则适合保留章节路径退款制度 / 第二章 / 第三条 / 适用条件将标题路径附在 Chunk 文本或元数据中通常比单纯扩大 Chunk 更有效。6. 用实验选择大小fromdataclassesimportdataclassdataclass(frozenTrue)classChunkExperiment:strategy:strmax_size:intoverlap:intrecall_at_5:floatprecision_at_5:floatavg_context_size:floatdefchoose_experiment(results:list[ChunkExperiment])-ChunkExperiment:ifnotresults:raiseValueError(实验结果不能为空)# 示例约束先保证召回再在候选中选择更少上下文的方案eligible[itemforiteminresultsifitem.recall_at_50.90]ifnoteligible:raiseValueError(没有方案达到召回门槛)returnmax(eligible,keylambdaitem:(item.precision_at_5,-item.avg_context_size),)阈值仅是教学示例。真实实验应固定文档版本、Embedding、查询集和检索参数。7. 可复验测试deftest_chunk_size_and_overlap()-None:sectionSection(退款制度,第一条说明适用范围。第二条说明申请材料。第三条说明审核流程。,0,)chunkschunk_section(section,max_chars25,overlap_sentences1)assertlen(chunks)2assertall(len(item.text)25foriteminchunks)# 相邻块共享一个句子assertsplit_sentences(chunks[0].text)[-1]inchunks[1].textdeftest_oversized_sentence_fails_explicitly()-None:try:chunk_section(Section(标题,很*30。,0),max_chars20)exceptValueError:passelse:raiseAssertionError(超长句不能被静默处理)8. 对抗性审查不跨租户或跨权限文档合并 Chunk重叠 Chunk 去重后再交给模型标题和权限元数据不能在重新切分时丢失文档更新后用策略版本重建索引检查极长句、无标点文本、表格和代码不只看召回率还看上下文噪声、Token、延迟和引用体验。9. 总结Chunk 的目标是让“一个可回答的问题”尽量对应“一个语义完整、噪声有限、可定位的证据单元”。大小只是参数结构感知和可重复评测才是核心。

相关新闻

EL Shield:轻量级日志异常检测系统设计与实战

EL Shield:轻量级日志异常检测系统设计与实战

1. 项目缘起:从“裸奔”到“武装”的运维觉醒 在运维和开发这个行当里,日志系统就像我们每天呼吸的空气,无处不在,却又常常被忽视。直到某天深夜,线上服务突然告警,流量曲线断崖式下跌,而你面对…

2026/8/3 10:18:42 阅读更多
Luna模型:高性价比AI编程助手实战指南与本地部署详解

Luna模型:高性价比AI编程助手实战指南与本地部署详解

如果你正在寻找一个既能理解复杂指令、又能快速生成代码,同时还能保持极低推理成本的AI助手,那么最近在开发者圈子里热议的Luna模型,可能就是你一直在等待的那个“性价比之选”。 过去几个月,AI编程助手领域看似热闹,…

2026/8/3 10:18:42 阅读更多
Vibe Coding架构解析:从意图理解到项目生成的AI编程新范式

Vibe Coding架构解析:从意图理解到项目生成的AI编程新范式

如果你最近关注AI编程工具,可能已经听过“Vibe Coding”这个词。它不像传统的Copilot那样只是补全代码,也不像ChatGPT那样需要你详细描述需求。它更像是一个能理解你“编程意图”的伙伴——你给出一个模糊的想法,它就能生成一个可运行的项目骨…

2026/8/3 11:18:46 阅读更多
CentOS7虚拟机部署OpenClaw系统全指南

CentOS7虚拟机部署OpenClaw系统全指南

1. 项目概述在本地CentOS7虚拟机上部署OpenClaw(龙虾)系统是一个典型的开发环境搭建过程。OpenClaw作为一款新兴的开源自动化工具,在数据处理和任务编排领域有着广泛的应用前景。这个安装过程涉及虚拟机配置、系统环境准备、依赖项安装以及Op…

2026/8/3 11:18:46 阅读更多
Unity DOTS架构下大批量骨骼动画的高性能实现方案

Unity DOTS架构下大批量骨骼动画的高性能实现方案

1. 项目概述:当骨骼动画遇上DOTS 如果你正在开发一款需要同屏渲染成千上万个独立角色、且每个角色都需要流畅播放骨骼动画的游戏,比如大规模的RTS、MMO主城、或者丧尸围城类的生存游戏,那么传统的GameObject Animator方案大概率会让你陷入性…

2026/8/3 11:18:46 阅读更多
仅限前500名获取:AI逻辑思维训练能力图谱V2.3(含动态评估引擎+个性化训练路径生成器——已服务阿里达摩院/DeepMind 17个核心项目)

仅限前500名获取:AI逻辑思维训练能力图谱V2.3(含动态评估引擎+个性化训练路径生成器——已服务阿里达摩院/DeepMind 17个核心项目)

更多请点击: https://codechina.net 第一章:AI逻辑思维训练的范式演进与核心价值 AI逻辑思维训练已从早期基于规则引擎的符号推理,逐步演进为融合大语言模型理解力、强化学习反馈机制与可验证形式化逻辑的复合范式。这一演进并非简单替代&am…

2026/8/3 11:18:46 阅读更多
直方图深度解析:从原理到实战的数据分布可视化指南

直方图深度解析:从原理到实战的数据分布可视化指南

1. 直方图:数据世界的“像素级”体检报告如果你处理过数据,无论是用Excel、Python还是任何数据分析工具,大概率都见过直方图。它看起来就是一堆并排的矩形柱子,简单得甚至有些不起眼。但就是这个简单的图形,却是数据探…

2026/8/3 11:08:45 阅读更多
3分钟搞定!QQ空间历史说说完整备份终极指南

3分钟搞定!QQ空间历史说说完整备份终极指南

3分钟搞定!QQ空间历史说说完整备份终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想过,那些年发过的QQ空间说说,那些记录青春的文字…

2026/8/2 0:04:01 阅读更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是应用材料(Applied Materials)公司生产的一款用于半导体设备的I/O信号分配电路板。该型号(0100-02186)的核心特点如下:专用于Endura等半导体工艺腔室。集成信号路由与分配功能。连接控制…

2026/8/2 2:51:21 阅读更多
Nissei Corp FFMN-32L-10-T0 40AX 三相异步电动机

Nissei Corp FFMN-32L-10-T0 40AX 三相异步电动机

Nissei Corp FFMN-32L-10-T0 40AX 三相异步电动机是日本日清(Nissei)品牌的一款工业用三相异步电机,适用于自动化设备及通用机械驱动。该型号(FFMN-32L-10-T0 40AX)的核心特点如下:三相交流异步电动机。额定…

2026/8/2 2:52:49 阅读更多