关于LangChain递归文本分割器分割结果的逻辑疑问
问题解析
代码与运行结果
from langchain.text_splitter import RecursiveCharacterTextSplitter rsplitter = RecursiveCharacterTextSplitter(chunk_size=10,chunk_overlap=0, separators=["\n\n", "\n", " ", ""]) some_text = "Learning new skills is essential for growth" result = rsplitter.split_text(some_text) result
运行结果:
['Learning', 'new', 'skills is', 'essential', 'for', 'growth']
分割逻辑说明
RecursiveCharacterTextSplitter的核心是按指定分隔符优先级递归分割文本,同时保证每个块的字符数不超过设定的chunk_size,具体到这个案例:
- 分隔符优先级从高到低为:段落分隔符
"\n\n"、换行符"\n"、空格" "、字符级分隔符""。文本中没有前两种分隔符,因此先按空格分割成单词列表:["Learning", "new", "skills", "is", "essential", "for", "growth"]。 - 接下来尝试合并相邻单词,直到合并后的总长度(包含空格分隔符)超过
chunk_size=10:Learning(8字符)合并new后总长度为8+1+3=12,超过10,因此单独成块。new(3字符)合并skills后总长度为3+1+6=10,刚好等于chunk_size,在当前使用的LangChain版本中,合并逻辑要求块长度需严格小于chunk_size,因此不合并,new单独成块。skills(6字符)合并is后总长度为6+1+2=9,小于10,符合合并条件,因此合并为skills is。- 后续的
essential(9字符)、for(3字符)、growth(6字符)均无法与相邻单词合并(合并后长度会超过10),因此各自成块。
内容的提问来源于stack exchange,提问作者sachin murali
相关产品推荐
相关产品推荐

