LangChain=>RecursiveCharacterTextSplitter

发布时间 2023-11-06 13:36:24作者: 十三年新*

LangChain源码:

github.com

RecursiveCharacterTextSplitter有4个参数:

public RecursiveCharacterTextSplitter(List<string>? separators=null, int chunkSize = 4000, int chunkOverlap = 200, Func<string, int>? lengthFunction = null) : base(chunkSize, chunkOverlap, lengthFunction)

separators: 可以定义分隔符 , 如果不指定自定义的分隔符,默认的分隔符为:{ "\n\n", "\n", " ", "" };

chunkSize:段落的长度;

chunkOverlap:段落重叠部分的长度;

主要包含两个方法:SplitText 和 MergeSplits。

1. SplitText 方法:

SplitText函数的主要功能是将输入的文本字符串按照一定的分隔符进行分割。它首先尝试找到一个合适的分隔符(从 _separators 列表中选择),然后使用这个分隔符来分割文本。如果没有找到合适的分隔符,它会将文本转换为字符数组,并将每个字符作为一个单独的元素。然后,它会检查每个分割的部分,如果长度小于 base.ChunkSize,则将其添加到 goodSplits 列表中。如果长度大于 base.ChunkSize,则将 goodSplits 列表中的元素合并,并将结果添加到 finalChunks 列表中。最后,如果 goodSplits 列表中还有元素,它会再次进行合并,并将结果添加到 finalChunks 列表中。

2. MergeSplits 方法:
这个方法的主要目的是将输入的分割部分(splits)合并成一个文档。它首先计算分隔符的长度,然后遍历每个分割部分。如果当前文档(currentDoc)加上下一个分割部分的长度大于 _chunkSize,它会将当前文档的元素合并,并将结果添加到 docs 列表中。然后,它会从当前文档的开始部分删除元素,直到可以容纳下一个分割部分。最后,它会将最后一个文档的元素合并,并将结果添加到 docs 列表中。