splitter

package
v0.5.11 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 12, 2026 License: Apache-2.0 Imports: 9 Imported by: 1

Documentation

Overview

Package splitter 提供 RAG 系统的文档分割器

code.go 实现代码感知分割器,能够根据编程语言的语法结构进行智能分割。 支持的语言:Go、Python、JavaScript/TypeScript、Java、Rust、C/C++、Ruby、PHP

核心特性:

  • 按函数/方法/类级别分割,保持代码逻辑完整性
  • 自动检测编程语言
  • 保留导入语句和包声明上下文
  • 每个分块包含必要的上下文信息

使用示例:

splitter := NewCodeSplitter(
    WithLanguage(LangGo),
    WithCodeChunkSize(2000),
)
chunks, err := splitter.Split(ctx, docs)

search_tokenize.go 搜索查询分词器

为全文检索(FTS5 / LIKE 降级)提供 CJK 友好的查询分词。

与 SimpleTokenizer.tokenize() 的区别:

  • SimpleTokenizer: 面向 token 计数(CJK 每字一个 token),用于分块估算
  • SearchTokenize: 面向搜索匹配(CJK bigram + 原词保留),用于构建搜索查询

CJK bigram 策略参考:

  • Elasticsearch CJK bigram token filter
  • Lucene CJKBigramFilter
  • SQLite FTS5 + unicode61 tokenizer 的中文检索最佳实践

示例:

SearchTokenize("杭帮菜的正确吃法")
→ ["杭帮", "帮菜", "菜的", "的正", "正确", "确吃", "吃法", "杭帮菜的正确吃法"]

SearchTokenize("hello world 你好世界")
→ ["hello", "world", "你好", "好世", "世界", "你好世界"]

Package splitter 提供 RAG 系统的文档分割器

Splitter 用于将长文档分割成适合向量化的小块:

  • CharacterSplitter: 按字符数分割
  • RecursiveSplitter: 递归分割(优先保持语义完整)
  • MarkdownSplitter: Markdown 专用分割(按标题分割)
  • SentenceSplitter: 按句子分割

Package splitter 提供 RAG 系统的文档分割器

token.go 实现 Token 级分割器:

  • TokenSplitter: 按模型 Token 数而非字符数分割
  • Tokenizer: 分词器接口,支持 tiktoken/sentencepiece 等
  • SimpleTokenizer: 基于空格/标点的简单分词器
  • TiktokenTokenizer: 对接 OpenAI tiktoken 的分词器

对标 LangChain/LlamaIndex 的 Token-based Splitting。

使用示例:

// 使用简单分词器(无外部依赖)
splitter := NewTokenSplitter(
    WithTokenChunkSize(512),
    WithTokenOverlap(50),
    WithTokenizer(NewSimpleTokenizer()),
)

// 使用 tiktoken(精确按 GPT 模型 token 分割)
splitter := NewTokenSplitter(
    WithTokenChunkSize(512),
    WithTokenizer(NewTiktokenTokenizer("gpt-4")),
)

docs, err := splitter.Split(ctx, inputDocs)

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func IsCJK

func IsCJK(r rune) bool

IsCJK 判断 rune 是否为 CJK 统一表意文字(中日韩)

func SearchTokenize

func SearchTokenize(text string) []string

SearchTokenize 将搜索查询文本分词为适合全文检索的 token 列表

策略:

  1. 按空格和标点分割为词组
  2. 纯 CJK 词组做 bigram 切分(保留原词用于精确匹配)
  3. 非 CJK 词组保留原样
  4. 过滤过短的 token(< 2 字符)
  5. 去重

Types

type CharacterOption

type CharacterOption func(*CharacterSplitter)

CharacterOption CharacterSplitter 选项

func WithChunkOverlap

func WithChunkOverlap(overlap int) CharacterOption

WithChunkOverlap 设置分块重叠

func WithChunkSize

func WithChunkSize(size int) CharacterOption

WithChunkSize 设置分块大小

func WithSeparator

func WithSeparator(sep string) CharacterOption

WithSeparator 设置分隔符

type CharacterSplitter

type CharacterSplitter struct {
	// contains filtered or unexported fields
}

CharacterSplitter 按字符数分割

func NewCharacterSplitter

func NewCharacterSplitter(opts ...CharacterOption) *CharacterSplitter

NewCharacterSplitter 创建字符分割器

func (*CharacterSplitter) Name

func (s *CharacterSplitter) Name() string

Name 返回分割器名称

func (*CharacterSplitter) Split

func (s *CharacterSplitter) Split(ctx context.Context, docs []rag.Document) ([]rag.Document, error)

Split 分割文档

type CodeOption

type CodeOption func(*CodeSplitter)

CodeOption CodeSplitter 配置选项

func WithCodeChunkOverlap

func WithCodeChunkOverlap(overlap int) CodeOption

WithCodeChunkOverlap 设置代码分块重叠

func WithCodeChunkSize

func WithCodeChunkSize(size int) CodeOption

WithCodeChunkSize 设置代码分块大小

func WithKeepHeader

func WithKeepHeader(keep bool) CodeOption

WithKeepHeader 是否在每个分块中保留文件头部

func WithLanguage

func WithLanguage(lang Language) CodeOption

WithLanguage 设置编程语言

type CodeSplitter

type CodeSplitter struct {
	// contains filtered or unexported fields
}

CodeSplitter 代码感知分割器 根据编程语言的语法结构进行智能分割,保持代码逻辑完整性

func NewCodeSplitter

func NewCodeSplitter(opts ...CodeOption) *CodeSplitter

NewCodeSplitter 创建代码感知分割器

func (*CodeSplitter) Name

func (s *CodeSplitter) Name() string

Name 返回分割器名称

func (*CodeSplitter) Split

func (s *CodeSplitter) Split(ctx context.Context, docs []rag.Document) ([]rag.Document, error)

Split 分割文档 自动检测语言并按语法结构分割

type Embedder

type Embedder interface {
	Embed(ctx context.Context, texts []string) ([][]float32, error)
}

Embedder 是向量生成器接口(简化版,避免循环依赖)

type Language

type Language int

Language 编程语言类型

const (
	// LangAuto 自动检测语言
	LangAuto Language = iota
	// LangGo Go 语言
	LangGo
	// LangPython Python 语言
	LangPython
	// LangJavaScript JavaScript 语言
	LangJavaScript
	// LangTypeScript TypeScript 语言
	LangTypeScript
	// LangJava Java 语言
	LangJava
	// LangRust Rust 语言
	LangRust
	// LangCPP C/C++ 语言
	LangCPP
	// LangRuby Ruby 语言
	LangRuby
	// LangPHP PHP 语言
	LangPHP
)

type MarkdownSplitter

type MarkdownSplitter struct {
	// contains filtered or unexported fields
}

MarkdownSplitter Markdown 专用分割器 按标题层级分割,保持文档结构

func NewMarkdownSplitter

func NewMarkdownSplitter(opts ...MarkdownSplitterOption) *MarkdownSplitter

NewMarkdownSplitter 创建 Markdown 分割器

func (*MarkdownSplitter) Name

func (s *MarkdownSplitter) Name() string

Name 返回分割器名称

func (*MarkdownSplitter) Split

func (s *MarkdownSplitter) Split(ctx context.Context, docs []rag.Document) ([]rag.Document, error)

Split 分割 Markdown 文档

type MarkdownSplitterOption

type MarkdownSplitterOption func(*MarkdownSplitter)

MarkdownSplitterOption MarkdownSplitter 选项

func WithCodeBlockAware

func WithCodeBlockAware(aware bool) MarkdownSplitterOption

WithCodeBlockAware 设置是否识别代码块

func WithHeadersToSplit

func WithHeadersToSplit(headers []string) MarkdownSplitterOption

WithHeadersToSplit 设置要分割的标题级别

func WithMarkdownChunkOverlap

func WithMarkdownChunkOverlap(overlap int) MarkdownSplitterOption

WithMarkdownChunkOverlap 设置分块重叠

func WithMarkdownChunkSize

func WithMarkdownChunkSize(size int) MarkdownSplitterOption

WithMarkdownChunkSize 设置分块大小

type RecursiveOption

type RecursiveOption func(*RecursiveSplitter)

RecursiveOption RecursiveSplitter 选项

func WithRecursiveChunkOverlap

func WithRecursiveChunkOverlap(overlap int) RecursiveOption

WithRecursiveChunkOverlap 设置分块重叠

func WithRecursiveChunkSize

func WithRecursiveChunkSize(size int) RecursiveOption

WithRecursiveChunkSize 设置分块大小

func WithSeparators

func WithSeparators(seps []string) RecursiveOption

WithSeparators 设置分隔符列表(按优先级)

type RecursiveSplitter

type RecursiveSplitter struct {
	// contains filtered or unexported fields
}

RecursiveSplitter 递归分割器 按照分隔符优先级递归分割,尽量保持语义完整

func NewRecursiveSplitter

func NewRecursiveSplitter(opts ...RecursiveOption) *RecursiveSplitter

NewRecursiveSplitter 创建递归分割器

func (*RecursiveSplitter) Name

func (s *RecursiveSplitter) Name() string

Name 返回分割器名称

func (*RecursiveSplitter) Split

func (s *RecursiveSplitter) Split(ctx context.Context, docs []rag.Document) ([]rag.Document, error)

Split 分割文档

type SemanticOption

type SemanticOption func(*SemanticSplitter)

SemanticOption SemanticSplitter 选项

func WithSemanticBreakpointThreshold

func WithSemanticBreakpointThreshold(threshold float64) SemanticOption

WithSemanticBreakpointThreshold 设置断点阈值

func WithSemanticBufferSize

func WithSemanticBufferSize(size int) SemanticOption

WithSemanticBufferSize 设置句子缓冲区大小

func WithSemanticMaxChunkSize

func WithSemanticMaxChunkSize(size int) SemanticOption

WithSemanticMaxChunkSize 设置最大块大小

func WithSemanticMinChunkSize

func WithSemanticMinChunkSize(size int) SemanticOption

WithSemanticMinChunkSize 设置最小块大小

func WithSemanticSentenceEnds

func WithSemanticSentenceEnds(ends []string) SemanticOption

WithSemanticSentenceEnds 设置句子结束符

type SemanticSplitter

type SemanticSplitter struct {
	// contains filtered or unexported fields
}

SemanticSplitter 语义分割器 基于 embedding 相似度进行智能分割,在语义边界处分割文档

func NewSemanticSplitter

func NewSemanticSplitter(embedder Embedder, opts ...SemanticOption) *SemanticSplitter

NewSemanticSplitter 创建语义分割器

func (*SemanticSplitter) Name

func (s *SemanticSplitter) Name() string

Name 返回分割器名称

func (*SemanticSplitter) Split

func (s *SemanticSplitter) Split(ctx context.Context, docs []rag.Document) ([]rag.Document, error)

Split 语义分割文档

type SentenceOption

type SentenceOption func(*SentenceSplitter)

SentenceOption SentenceSplitter 选项

func WithSentenceChunkOverlap

func WithSentenceChunkOverlap(overlap int) SentenceOption

WithSentenceChunkOverlap 设置分块重叠

func WithSentenceChunkSize

func WithSentenceChunkSize(size int) SentenceOption

WithSentenceChunkSize 设置分块大小

func WithSentenceEnds

func WithSentenceEnds(ends []string) SentenceOption

WithSentenceEnds 设置句子结束符

type SentenceSplitter

type SentenceSplitter struct {
	// contains filtered or unexported fields
}

SentenceSplitter 按句子分割

func NewSentenceSplitter

func NewSentenceSplitter(opts ...SentenceOption) *SentenceSplitter

NewSentenceSplitter 创建句子分割器

func (*SentenceSplitter) Name

func (s *SentenceSplitter) Name() string

Name 返回分割器名称

func (*SentenceSplitter) Split

func (s *SentenceSplitter) Split(ctx context.Context, docs []rag.Document) ([]rag.Document, error)

Split 按句子分割文档

type SimpleTokenizer

type SimpleTokenizer struct {
	// contains filtered or unexported fields
}

SimpleTokenizer 基于空格和标点的简单分词器 不需要外部依赖,适合中英文混合文本 估算规则:英文约 1 词 = 1.3 token,中文约 1 字 = 1.5 token

func NewSimpleTokenizer

func NewSimpleTokenizer(opts ...SimpleTokenizerOption) *SimpleTokenizer

NewSimpleTokenizer 创建简单分词器

func (*SimpleTokenizer) CountTokens

func (t *SimpleTokenizer) CountTokens(text string) int

CountTokens 计算 token 数

func (*SimpleTokenizer) Decode

func (t *SimpleTokenizer) Decode(tokens []int) string

Decode 简单解码

func (*SimpleTokenizer) Encode

func (t *SimpleTokenizer) Encode(text string) []int

Encode 简单编码(分词为 token)

func (*SimpleTokenizer) Name

func (t *SimpleTokenizer) Name() string

Name 返回名称

type SimpleTokenizerOption

type SimpleTokenizerOption func(*SimpleTokenizer)

SimpleTokenizerOption 简单分词器选项

func WithAvgTokenLength

func WithAvgTokenLength(length float64) SimpleTokenizerOption

WithAvgTokenLength 设置平均 token 长度

type TiktokenTokenizer

type TiktokenTokenizer struct {
	// contains filtered or unexported fields
}

TiktokenTokenizer 基于 tiktoken 的分词器 使用按字符类型差异化的 token 比率进行估算。 无实际 BPE 词表,Encode 降级为 fallback 编码。 如需精确分词,建议集成 Go 原生 tiktoken 库。

func NewTiktokenTokenizer

func NewTiktokenTokenizer(model string) *TiktokenTokenizer

NewTiktokenTokenizer 创建 tiktoken 分词器 根据模型名自动选择合适的 token 比率

func (*TiktokenTokenizer) CountTokens

func (t *TiktokenTokenizer) CountTokens(text string) int

CountTokens 按字符类型差异化估算 token 数 逐字符分类(ASCII 词、CJK、数字、标点、空白),乘以对应比率

func (*TiktokenTokenizer) Decode

func (t *TiktokenTokenizer) Decode(tokens []int) string

Decode 解码

func (*TiktokenTokenizer) Encode

func (t *TiktokenTokenizer) Encode(text string) []int

Encode 编码(降级为 fallback,无实际 BPE 词表)

func (*TiktokenTokenizer) Name

func (t *TiktokenTokenizer) Name() string

Name 返回名称

type TokenSplitter

type TokenSplitter struct {
	// contains filtered or unexported fields
}

TokenSplitter 基于 Token 的文档分割器 使用分词器精确按 token 数量分割,而非按字符数

func NewTokenSplitter

func NewTokenSplitter(opts ...TokenSplitterOption) *TokenSplitter

NewTokenSplitter 创建 Token 级分割器

func (*TokenSplitter) Name

func (s *TokenSplitter) Name() string

Name 返回分割器名称

func (*TokenSplitter) Split

func (s *TokenSplitter) Split(ctx context.Context, docs []rag.Document) ([]rag.Document, error)

Split 按 Token 数分割文档

type TokenSplitterOption

type TokenSplitterOption func(*TokenSplitter)

TokenSplitterOption TokenSplitter 选项

func WithTokenChunkSize

func WithTokenChunkSize(size int) TokenSplitterOption

WithTokenChunkSize 设置分块大小(token 数)

func WithTokenOverlap

func WithTokenOverlap(overlap int) TokenSplitterOption

WithTokenOverlap 设置重叠大小(token 数)

func WithTokenSeparator

func WithTokenSeparator(sep string) TokenSplitterOption

WithTokenSeparator 设置首选分割点

func WithTokenizerOpt

func WithTokenizerOpt(tokenizer Tokenizer) TokenSplitterOption

WithTokenizer 设置分词器

type Tokenizer

type Tokenizer interface {
	// Encode 将文本编码为 token ID 序列
	Encode(text string) []int

	// Decode 将 token ID 序列解码为文本
	Decode(tokens []int) string

	// CountTokens 计算文本的 token 数量
	CountTokens(text string) int

	// Name 返回分词器名称
	Name() string
}

Tokenizer 分词器接口 将文本转换为 token 序列,用于精确控制分块大小

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL