关于Langchain RecursiveCharacterTextSplitter分割行为不符预期的技术问询
关于Langchain RecursiveCharacterTextSplitter的分割逻辑说明
你的代码未指定separators参数,RecursiveCharacterTextSplitter会使用默认分隔符列表:["\n\n", "\n", " ", ""],它的核心逻辑是优先采用列表中优先级更高的分隔符,尽可能将不超过chunk_size的内容合并为一个块,而非遇到分隔符就立即拆分。
看你的测试文本:"""a\nbcefg\nhij\nk""",总长度13。当chunk_size=10时:
- 首先尝试用最高优先级的
\n\n分割(文本中不存在该分隔符),接着切换为\n。 - 第一个候选块
a\nbcefg长度为7(小于10),如果追加下一段\nhij,总长度会达到11(超过10),因此停止合并,将a\nbcefg作为第一个块。 - 剩余的
hij\nk长度为5(小于10),直接作为第二个块。
要实现你预期的['a','bcefg','hij','k'],需显式指定separators=["\n"],让分割器优先按单个换行符分割。由于每个拆分后的块长度均小于chunk_size=10,最终会直接按每一行拆分:
修改后的代码:
from langchain.text_splitter import RecursiveCharacterTextSplitter r_splitter = RecursiveCharacterTextSplitter( chunk_size=10, chunk_overlap=0, separators=["\n"] # 显式指定分隔符 ) test = """a\nbcefg\nhij\nk""" print(len(test)) tmp = r_splitter.split_text(test) print(tmp)
输出结果:
13 ['a', 'bcefg', 'hij', 'k']
内容的提问来源于stack exchange,提问作者GreenEye
相关产品推荐
相关产品推荐

