Splitter - recursive
基本介绍
递归分割器是 Document Transformer 接口的一个实现,用于将长文档按照指定大小递归地切分成更小的片段。该组件实现了 Eino: Document Transformer 使用说明。
工作原理
递归分割器通过以下步骤工作:
- 按照分隔符列表顺序尝试分割文档
- 如果当前分隔符无法将文档分割成小于目标大小的片段,则使用下一个分隔符
- 对分割后的片段进行合并,确保片段大小接近目标大小
- 在合并过程中保持指定大小的重叠区域
使用方式
组件初始化
递归分割器通过 NewSplitter
函数进行初始化,主要配置参数如下:
splitter, err := recursive.NewSplitter(ctx, &recursive.Config{
ChunkSize: 1000, // 必需:目标片段大小
OverlapSize: 200, // 可选:片段重叠大小
Separators: []string{"\n", ".", "?", "!"}, // 可选:分隔符列表
LenFunc: nil, // 可选:自定义长度计算函数
KeepType: recursive.KeepTypeNone, // 可选:分隔符保留策略
})
配置参数说明:
-
ChunkSize
:必需参数,指定目标片段的大小 -
OverlapSize
:片段之间的重叠大小,用于保持上下文连贯性 -
Separators
:分隔符列表,按优先级顺序使用 -
LenFunc
:自定义文本长度计算函数,默认使用len()
-
KeepType
:分隔符保留策略,可选值:KeepTypeNone
:不保留分隔符KeepTypeStart
:在片段开始处保留分隔符KeepTypeEnd
:在片段结尾处保留分隔符
完整使用示例
package main
import (
"context"
"github.com/cloudwego/eino-ext/components/document/transformer/splitter/recursive"
"github.com/cloudwego/eino/schema"
)
func main() {
ctx := context.Background()
// 初始化分割器
splitter, err := recursive.NewSplitter(ctx, &recursive.Config{
ChunkSize: 1000,
OverlapSize: 200,
Separators: []string{"\n\n", "\n", "。", "!", "?"},
KeepType: recursive.KeepTypeEnd,
})
if err != nil {
panic(err)
}
// 准备要分割的文档
docs := []*schema.Document{
{
ID: "doc1",
Content: `这是第一个段落,包含了一些内容。
这是第二个段落。这个段落有多个句子!这些句子通过标点符号分隔。
这是第三个段落。这里有更多的内容。`,
},
}
// 执行分割
results, err := splitter.Transform(ctx, docs)
if err != nil {
panic(err)
}
// 处理分割结果
for i, doc := range results {
println("片段", i+1, ":", doc.Content)
}
}
高级用法
自定义长度计算:
splitter, err := recursive.NewSplitter(ctx, &recursive.Config{
ChunkSize: 1000,
LenFunc: func(s string) int {
// eg: 使用 unicode 字符数而不是字节数
return len([]rune(s))
},
})
调整重叠策略:
splitter, err := recursive.NewSplitter(ctx, &recursive.Config{
ChunkSize: 1000,
// 增大重叠区域以保持更多上下文
OverlapSize: 300,
// 在片段结尾保留分隔符
KeepType: recursive.KeepTypeEnd,
})
自定义分隔符:
splitter, err := recursive.NewSplitter(ctx, &recursive.Config{
ChunkSize: 1000,
// 按优先级排序的分隔符列表
Separators: []string{
"\n\n", // 空行(段落分隔)
"\n", // 换行
"。", // 句号
";", // 分号
",", // 逗号
},
})
相关文档
最后修改
January 9, 2025
: feat: add eino cn docs (#1182) (ad75444)