news 2026/9/24 17:34:06

langchain递归切片器原理分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
langchain递归切片器原理分析

机制分析

关键文件和类

文件路径:langchain_text_splitters/character.py

类名:RecursiveCharacterTextSplitter

核心入口函数:_split_text

解析步骤及源码分析

步骤说明示例/细节
1. 分隔符降级按separators=["\n\n", "\n", " ", ""]顺序尝试,分隔符可自定义先用\n\n切段落,若任一段>chunk_size 字符,则对该段降级使用\n切,依次类推
2. 递归切分对“超长段”重复步骤 1,直到所有片段 ≤ chunk_size 或已用完分隔符若句子级仍超长,最终用空字符串""按字符硬切
3. 段合并(Merge)把“好段”依次拼成尽可能长的块,保证 ≤ chunk_size如果拼到再加就超chunk_size,则封口、起新块
4. 重叠(Overlap)当合并完成一个块A1之后,算法回退<=chunk_overlap的长度,以便下个块A2包含前一个块末尾overlap的内容。特别的,若块A1的最后一段长度大于chunk_overlap,则为保证语义完整,不强行生成overlap。相邻两个块 A1和A2,则 A2 头部 = A1 尾部 overlap 内容

上述步骤的总体逻辑在_split_text函数中,关键处均有代码注释说明:

def_split_text(self,text:str,separators:list[str])->list[str]:"""Split incoming text and return chunks."""final_chunks=[]# Get appropriate separator to use# 得到当前层级的分隔符separator=separators[-1]new_separators=[]fori,_sinenumerate(separators):_separator=_sifself._is_separator_regexelsere.escape(_s)if_s=="":separator=_sbreak# 快速搜索文本中是否存在分隔符,不存在,则分隔符降级ifre.search(_separator,text):separator=_s new_separators=separators[i+1:]break_separator=separatorifself._is_separator_regexelsere.escape(separator)splits=_split_text_with_regex(text,_separator,keep_separator=self._keep_separator)# Now go merging things, recursively splitting longer texts.# 所谓的“好段”指的是长度小于chunk_size的段_good_splits=[]_separator=""ifself._keep_separatorelseseparatorforsinsplits:ifself._length_function(s)<self._chunk_size:_good_splits.append(s)else:# 如果发现一个段不是好段,就把前面累积的好段做合并if_good_splits:merged_text=self._merge_splits(_good_splits,_separator)final_chunks.extend(merged_text)_good_splits=[]ifnotnew_separators:# 这里看似会生成一个超长块,但考虑到最后一个分隔符是空(亦即按字符切分),这行代码其实是跑不到的。final_chunks.append(s)else:# 对于超长段,用下级分隔符递归切分other_info=self._split_text(s,new_separators)final_chunks.extend(other_info)if_good_splits:merged_text=self._merge_splits(_good_splits,_separator)final_chunks.extend(merged_text)returnfinal_chunks

合并与重叠的逻辑则在_merge_splits函数中,关键处均有代码注释说明:

def_merge_splits(self,splits:Iterable[str],separator:str)->list[str]:# We now want to combine these smaller pieces into medium size# chunks to send to the LLM.separator_len=self._length_function(separator)docs=[]current_doc:list[str]=[]total=0# splits是所谓的好段,我们将好段尽可能拼接为较大的块fordinsplits:_len=self._length_function(d)# 拼到再加就超chunk_size,则封口、起新块if(total+_len+(separator_leniflen(current_doc)>0else0)>self._chunk_size):iftotal>self._chunk_size:logger.warning(f"Created a chunk of size{total}, "f"which is longer than the specified{self._chunk_size}")iflen(current_doc)>0:doc=self._join_docs(current_doc,separator)ifdocisnotNone:docs.append(doc)# Keep on popping if:# - we have a larger chunk than in the chunk overlap# - or if we still have any chunks and the length is long# 这一段是overlap的核心处理逻辑# 算法回退<=chunk_overlap的长度,以便下个块A2包含前一个块A1末尾overlap的内容。特别的,若块A1的最后一段长度大于chunk_overlap,则为保证语义完整,不会生成overlap。current_doc里存的就是一个块的所有段。whiletotal>self._chunk_overlapor(total+_len+(separator_leniflen(current_doc)>0else0)>self._chunk_sizeandtotal>0):total-=self._length_function(current_doc[0])+(separator_leniflen(current_doc)>1else0)current_doc=current_doc[1:]current_doc.append(d)total+=_len+(separator_leniflen(current_doc)>1else0)doc=self._join_docs(current_doc,separator)ifdocisnotNone:docs.append(doc)returndocs
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 21:36:44

Kotaemon能否用于药品说明书查询?医疗合规提醒

Kotaemon能否用于药品说明书查询&#xff1f;医疗合规提醒 在一家三甲医院的药房窗口&#xff0c;一位患者拿着刚开的处方单反复确认&#xff1a;“这药孕妇真不能吃吗&#xff1f;”药师翻出厚厚的药品说明书&#xff0c;逐行查找“禁忌”部分。这样的场景每天都在上演——信息…

作者头像 李华
网站建设 2026/9/25 8:52:31

Diff Checker终极指南:快速掌握文件差异对比的完整解决方案

Diff Checker终极指南&#xff1a;快速掌握文件差异对比的完整解决方案 【免费下载链接】diff-checker Desktop application to compare text differences between two files (Windows, Mac, Linux) 项目地址: https://gitcode.com/gh_mirrors/di/diff-checker 你是否曾…

作者头像 李华
网站建设 2026/9/25 5:48:46

告别复制烦恼:这款可视化工具让文件同步变得如此简单

告别复制烦恼&#xff1a;这款可视化工具让文件同步变得如此简单 【免费下载链接】ChoEazyCopy Simple and powerful RoboCopy GUI 项目地址: https://gitcode.com/gh_mirrors/ch/ChoEazyCopy 你是否曾经为了同步两个文件夹而焦头烂额&#xff1f;手动对比、逐个复制、…

作者头像 李华
网站建设 2026/9/25 9:29:59

Kotaemon Helm Chart 发布:Kubernetes一键部署

Kotaemon Helm Chart 发布&#xff1a;Kubernetes一键部署 在企业级AI系统日益复杂的今天&#xff0c;如何快速、稳定地将一个智能对话系统从开发环境推送到生产环境&#xff0c;已成为许多团队面临的现实挑战。传统的RAG&#xff08;检索增强生成&#xff09;框架虽然功能强大…

作者头像 李华
网站建设 2026/9/24 22:49:22

干法刻蚀中可以调节的工艺参数有哪些?各有什么作用?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;干法刻蚀中可以调节的工艺参数有哪些&#xff1f;各有什么作用&#xff1f;1&#xff0c;温度&#xff1a;晶圆表面温度&#xff0c;温…

作者头像 李华
网站建设 2026/9/25 1:01:35

HIDDriver虚拟输入设备终极指南:从零构建自动化控制方案

虚拟输入设备在现代自动化应用中扮演着关键角色&#xff0c;而HIDDriver作为一款开源的驱动程序&#xff0c;能够实现硬件级别的鼠标键盘仿真。本教程将带你深入了解这一强大工具&#xff0c;掌握从环境配置到实际应用的全套技能。 【免费下载链接】HIDDriver 虚拟鼠标键盘驱动…

作者头像 李华