首页/新闻资讯/正文详情

Python后端AI专题18:分块策略实测:块多大、重叠多少才不会拆坏答案

发布时间:2026/9/24 17:14:34 来源:云帆数科 栏目:资讯中心
Python后端AI专题18:分块策略实测:块多大、重叠多少才不会拆坏答案
Python后端AI专题18分块策略实测块多大、重叠多少才不会拆坏答案块越小检索定位更精确却容易把条件与结论拆开块越大上下文完整却带入更多噪声并消耗 Tokenoverlap 能缓解边界问题但会重复存储和重复 Embedding。本篇不用“推荐 500 字”结束讨论而是让同一份语料跑九组参数。清洗来源保真测试完整答案deftest_cleaning_removes_repeated_headers_without_losing_source()-None:blocks[ParsedBlock(内部资料,0,page1),ParsedBlock(第一章\t 请假流程\n\n需要审批。,1,page1,section请假,metadata{source:p1}),ParsedBlock(内部资料,2,page2),ParsedBlock(第二章\t报销流程\n\n需要发票。,3,page2,section报销,metadata{source:p2}),ParsedBlock(内部资料,4,page3),ParsedBlock(第三章 采购流程\n\n需要询价。,5,page3,section采购,metadata{source:p3}),]cleanedclean_blocks(blocks)assert[block.textforblockincleaned][第一章 请假流程\n需要审批。,第二章 报销流程\n需要发票。,第三章 采购流程\n需要询价。,]assert[block.ordinalforblockincleaned][0,1,2]assert[block.pageforblockincleaned][1,2,3]assert[block.sectionforblockincleaned][请假,报销,采购]assert[block.metadataforblockincleaned][{source:p1},{source:p2},{source:p3}]真实结果1 passed in 0.33s。先看分块算法怎样找边界每个块先计算硬上限start chunk_size若不是文末就在后 2/3 区间逆向寻找双换行、换行、中文句号/叹号/问号、英文句号空格。找到则在语义边界结束找不到才硬切。candidates[block.text.rfind(marker,startmax(1,chunk_size//3),hard_end)formarkerin(\n\n,\n,。,,,. )]boundarymax(candidates)搜索从块的 1/3 后开始避免为了一个很早的句号产生极短块。每个结果保留start_char/end_char后续可以回到原块高亮而不只保存复制文本。overlap 怎样推进游标startmax(start1,end-overlap)end - overlap让下一块重读上一块尾部start 1防止极端边界下游标不前进。参数入口要求chunk_size overlap 0否则可能无限循环。完整分块模块from__future__importannotationsfromdataclassesimportdataclassfromtypingimportSequencefromapp.services.ingestion.documentsimportParsedBlockdataclass(frozenTrue,slotsTrue)classTextChunk:text:strordinal:intsource_ordinal:intstart_char:intend_char:intpage:int|Nonesection:str|Nonedefchunk_blocks(blocks:Sequence[ParsedBlock],*,chunk_size:int,overlap:int)-list[TextChunk]:ifchunk_size0oroverlap0oroverlapchunk_size:raiseValueError(require chunk_size overlap 0)result:list[TextChunk][]forblockinblocks:start0whilestartlen(block.text):hard_endmin(startchunk_size,len(block.text))endhard_endifhard_endlen(block.text):candidates[block.text.rfind(marker,startmax(1,chunk_size//3),hard_end,)formarkerin(\n\n,\n,。,,,. )]boundarymax(candidates)ifboundarystart:marker_length(2ifblock.text[boundary:boundary2]in{\n\n,. }else1)endboundarymarker_length pieceblock.text[start:end]result.append(TextChunk(textpiece,ordinallen(result),source_ordinalblock.ordinal,start_charstart,end_charend,pageblock.page,sectionblock.section,))ifendlen(block.text):breakstartmax(start1,end-overlap)returnresult实验不是用三句短文本糊弄实验包含退款、SSE 和多租户三份约 700 字的语料把目标答案放在前后背景之间。每组统计块数、平均/最大长度、目标答案是否完整出现在某个块、重复率。命令$env:PYTHONIOENCODINGutf-8.\.venv\Scripts\python scripts\run_chunking_experiment.py结果摘要size/overlap块数平均长度答案覆盖重复率256/010206.301.00.000256/6411234.091.00.248256/12815239.931.00.745512/06343.831.00.000512/646375.831.00.093512/1286407.831.00.186800/03687.671.00.000800/643687.671.00.000800/1283687.671.00.000第二张图中蓝柱是重复率黄线是块数。256/128 把 2063 个唯一字符扩成约 3600 个待 Embedding 字符重复率 74.5%代价明显。800 的 overlap 没生效不是脚本坏了而是每份样本都短于 800、各自只有一块这提醒我们参数效果依赖文档长度分布。九组答案覆盖都为 1不能据此宣布 800 最优实验只有三个目标短语尚未测长条件、表格和跨段问答。参数选择要加入真实标注问答以 RecallK 和成本共同决策。本篇最终完整模块chunking.py前面的代码片段用于解释本次改动下面是本篇结束时可直接核对和替换的磁盘完整版本。from__future__importannotationsfromdataclassesimportdataclassfromtypingimportSequencefromapp.services.ingestion.documentsimportParsedBlockdataclass(frozenTrue,slotsTrue)classTextChunk:text:strordinal:intsource_ordinal:intstart_char:intend_char:intpage:int|Nonesection:str|Nonedefchunk_blocks(blocks:Sequence[ParsedBlock],*,chunk_size:int,overlap:int)-list[TextChunk]:ifchunk_size0oroverlap0oroverlapchunk_size:raiseValueError(require chunk_size overlap 0)result:list[TextChunk][]forblockinblocks:start0whilestartlen(block.text):hard_endmin(startchunk_size,len(block.text))endhard_endifhard_endlen(block.text):candidates[block.text.rfind(marker,startmax(1,chunk_size//3),hard_end)formarkerin(\n\n,\n,。,,,. )]boundarymax(candidates)ifboundarystart:marker_length2ifblock.text[boundary:boundary2]in{\n\n,. }else1endboundarymarker_length pieceblock.text[start:end]result.append(TextChunk(textpiece,ordinallen(result),source_ordinalblock.ordinal,start_charstart,end_charend,pageblock.page,sectionblock.section,))ifendlen(block.text):breakstartmax(start1,end-overlap)returnresult本篇练习设计一条会被切坏的样本在实验 CASES 中加入一份长文让完整答案“定制商品不适用七天无理由退款”恰好可能跨 256 字符附近。不要直接调整字符串到某个魔法下标用多个自然段构造。比较 256/0 与 256/64输出哪些 chunk 包含“定制商品”和“无理由退款”判断完整答案覆盖是否改善计算新增重复字符用结果说明为什么 overlap 只能缓解边界不能替代按标题/段落分块。下一篇会给出可运行实验改法并进入批量 Embedding当第三批失败时如何从持久化游标继续而不重复写入。

相关推荐

从 0 到 1 学习 Java:完整自学路线图
从 0 到 1 学习 Java:完整自学路线图

摘要:作为一名拥有 8 年后端开发经验的程序员,我整理这份 Java 学习路线图,既是巩固自身知识体系的过程,也是为自己沉淀一份可随时查阅的个人知识库。通过系统梳理从基础语法到 AI 智能开发的十一个阶段,我希望在分享中… · 2026/9/24 17:14:34

使用 AWS CLI 与 Bash 脚本操作 Amazon DynamoDB:从基础操作到电影场景实战
使用 AWS CLI 与 Bash 脚本操作 Amazon DynamoDB:从基础操作到电影场景实战

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/24 17:14:27

行情波动 品质不变 金士顿高速固态硬盘系列
行情波动 品质不变 金士顿高速固态硬盘系列

2026年AI产业迎来全面爆发,算力中心扩建、AI终端设备迭代升级,带动全球NAND闪存产能需求持续走高,存储行业迎来新一轮上行周期。伴随消费、商用、工控、数据中心全领域固态硬盘需求的扩张,存储市场供需紧张、行情普涨,… · 2026/9/24 17:14:27

云端 GPU 图形调试:何时需要 VNC 图形入口,而不是只停留在 SSH?
云端 GPU 图形调试:何时需要 VNC 图形入口,而不是只停留在 SSH?

云端 GPU 上跑图形类、视频类或其他需要窗口反馈的任务时,一个很常见的误区是: 已经能 SSH 进去,是不是就说明远程调试入口已经解决了? 不一定。 这里真正需要区分的,并不是“SSH 和 VNC 谁更好”,而是当前… · 2026/9/24 19:08:31

刀具识别数据集实战:从VOC标注到YOLO训练的完整流程
刀具识别数据集实战:从VOC标注到YOLO训练的完整流程

简介:刀具识别数据集面向目标检测与计算机视觉应用,适合工业安全巡检、智能加工设备、零售安防等场景下训练刀具检测模型。压缩包共2000个XML文件,整体约178.76MB,均为VOC格式标注,逐一记录刀具目标的类别与边界框坐标… · 2026/9/24 19:08:31

随机森林花分类实战:从特征工程到参数调优解析
随机森林花分类实战:从特征工程到参数调优解析

简介:一份面向机器学习初学者的随机森林分类实践代码包,以花分类为案例,演示从数据读取、预处理、模型训练到评估的完整流程。代码基于Python与sklearn实现,适合正在学习集成学习或需要快速上手随机森林项目的读者。压缩包为zip格… · 2026/9/24 19:08:31

C#药店管理系统开发指南:架构、权限与部署全解析
C#药店管理系统开发指南:架构、权限与部署全解析

简介:基于C#的药店管理系统项目,专为计算机相关专业学生毕业设计或期末作业而整理,覆盖药品信息维护、销售记录、库存查询等常见业务,同时涉及其中的数据库访问、界面设计与权限控制核心模块。整套资源共912个文件,打包… · 2026/9/24 19:08:31

写储能电站液冷方向论文,我会这样搭配一套 AI 写作工具箱 [特殊字符]️
写储能电站液冷方向论文,我会这样搭配一套 AI 写作工具箱 [特殊字符]️

先把场景说具体:储能科学与工程专业做毕业设计,很常见的一类题目是 “电网侧磷酸铁锂储能电站电池模组液冷策略优化及热失控蔓延抑制研究”。 这个专业本身就很“混搭”:要懂电池电化学、传热传质、储能系统集成,还要碰仿真、工况… · 2026/9/24 19:08:25

CTF逆向工程入门指南:从零开始读懂程序逻辑与二进制世界
CTF逆向工程入门指南:从零开始读懂程序逻辑与二进制世界

如果你的CTF第一站是Web,你可能觉得Reverse是那种“屏幕上跳一堆看不懂的汇编”的邪门模块。等你在比赛里被一道逆向题卡住两小时,然后看大佬十分钟交flag,你又会觉得这东西像个黑盒。其实Reverse没这么玄,它只是一门“把程序当谜… · 2026/9/24 19:08:19

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码