AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Chonkie:一个极速且轻量级文本分块的革命者,解锁 RAG 分块多种策略
发布日期:2024-12-01 11:59:20 浏览次数: 1688 来源:老贾探AI



简介

Chonkie是一个用于RAG(检索增强生成)任务的轻量级、快速的文本分块库。

Chonkie 特点

  • 功能丰富:提供多种分块器,满足不同的RAG应用需求。
  • 易于使用:只需安装、导入即可使用。
  • 速度快:分块速度快,性能优越。
  • 支持广泛:支持多种分块器,包括TokenChunker、WordChunker、SentenceChunker、SemanticChunker和SDPMChunker。
  • 轻量级:核心安装仅有9.7MB,远小于其他开源项目。

安装方法

1. 基础安装

安装命令适用场景依赖
pip install chonkie基本的token和word分块autotiktokenizer
pip install chonkie[semantic]语义分块+ sentence-transformers, numpy
pip install chonkie[all]所有功能all dependencies

2.按照依赖包进行划分chunker

chunker种类defaultsemanticall
TokenChunker
WordChunker
SentenceChunker
SemanticChunker
SDPMChunker

代码示例

1. TokenChunker示例:将文本分割成固定大小token的块。

# Import the TokenChunker
from chonkie import TokenChunker
from autotiktokenizer import AutoTikTokenizer

# Initialize the tokenizer
tokenizer = AutoTikTokenizer.from_pretrained("gpt2")

# Initialize the chunker
chunker = TokenChunker(
    tokenizer=tokenizer,
    chunk_size=512
    chunk_overlap=128 
)

# Chunk a single piece of text
chunks = chunker.chunk("Woah! Chonkie, the chunking library is so cool! I love the tiny hippo hehe.")
for chunk in chunks:
    print(f"Chunk: {chunk.text}")
    print(f"Tokens: {chunk.token_count}")

# Chunk a batch of texts
texts = ["First text to chunk.""Second text to chunk."]
batch_chunks = chunker.chunk_batch(texts)
for text_chunks in batch_chunks:
    for chunk in text_chunks:
        print(f"Chunk: {chunk.text}")
        print(f"Tokens: {chunk.token_count}")

# Use the chunker as a callable
chunks = chunker("Another text to chunk using __call__.")
for chunk in chunks:
    print(f"Chunk: {chunk.text}")
    print(f"Tokens: {chunk.token_count}")

2. WordChunker示例:根据单词/词语分割文本。

from chonkie import WordChunker
from autotiktokenizer import AutoTikTokenizer

tokenizer = AutoTikTokenizer.from_pretrained("gpt2")

chunker = WordChunker(
    tokenizer=tokenizer,
    chunk_size=512,
    chunk_overlap=128,
    mode="advanced"  # 'simple-基本的基于空间的分割' or 'advanced-处理标点符号和特殊大小写'
)

3. SentenceChunker示例:根据句子分割文本。

from chonkie import SentenceChunker
from autotiktokenizer import AutoTikTokenizer

tokenizer = AutoTikTokenizer.from_pretrained("gpt2")

chunker = SentenceChunker(
    tokenizer=tokenizer, # (可选)传入您选择的分词器,可以接受 tiktoken、tokenizer 和 transformers 分词器,优先授予 tiktoken。
    chunk_size=512# (可选)传递块的大小。默认为 tokenizer 支持的最大大小(如果有)或 512。
    chunk_overlap=128# (可选)接受 int 或 float。文本的连续块之间的重叠。默认为 min(0.25 * chunk_size, 128)。
    min_sentences_per_chunk=1 # 每个区块的最小句子数
)

4. SemanticChunker示例:根据语义相似性分割文本。

⚠️:大多数情况下,chunk_size、token_count取决于向量化模型上下文大小,而不是生成模型上下文长度。

from chonkie import SemanticChunker

chunker = SemanticChunker(
    embedding_model="all-minilm-l6-v2",
    max_chunk_size=512# 从 SemanticChunker 接收的 chunk 的最大大小
    similarity_threshold=0.7 # 语义分组的阈值
)

5. SDPMChunker示例:使用语义双重遍历合并方法分割文本。

通过语义双通道合并方法对内容进行分组,该方法通过使用跳过窗口对语义相似的段落进行分组,即使它们不是连续出现的。

from chonkie import SDPMChunker

chunker = SDPMChunker(
    embedding_model="all-minilm-l6-v2",
    max_chunk_size=512,
    similarity_threshold=0.7
    skip_window=1 # 分块程序应注意的跳过窗口的大小。默认为 1。
)

设计理念

1. 核心原则

  • 小但精确:分块大小适中,智能默认参数。
  • 快如闪电:优化路径,缓存机制。
  • 小而完整:最小化安装,模块化增长。
  • 聪明的小块:合理分块,高效处理。
  • 有目的的成长:智能分块带来更好的嵌入和生成质量。

2. 为什么需要分块?

  • 效率:减少模型处理时间,节省内存。
  • 准确性:提供准确的上下文信息,避免噪声干扰。

3. 如何实现快速分块?

  • 使用Tiktoken:速度快,支持多线程。
  • 预计算和缓存:避免重复计算,提高效率。
  • 运行均值池化:节省嵌入模型成本。

问答回顾全文

问题1:Chonkie的TokenChunker有哪些关键参数?如何使用它进行文本分块?

  • :TokenChunker的关键参数包括:
    • tokenizer:一个实现了编码/解码接口的分词器,可以是字符串、tokenizers.Tokenizer或tiktoken.Encoding类型。
    • chunk_size:每个分块的最大token数量。
    • chunk_overlap:分块之间的重叠token数量。
  • 使用TokenChunker进行文本分块的示例代码
from chonkie import TokenChunker
from tokenizers import Tokenizer
tokenizer = Tokenizer.from_pretrained("gpt2")
chunker = TokenChunker(tokenizer)
chunks = chunker("Woah! Chonkie, the chunking library is so cool!")
for chunk in chunks:
    print(f"Chunk: {chunk.text}")
    print(f"Tokens: {chunk.token_count}")

问题2:Chonkie的SemanticChunker如何实现语义相似性分组?有哪些关键参数?

  • :SemanticChunker通过使用预训练的语义嵌入模型来计算文本片段之间的相似性,并根据相似性阈值进行分组。其关键参数包括:
    • embedding_model:用于语义嵌入的模型,可以是字符串(如"all-minilm-l6-v2")或SentenceTransformer模型。
    • max_chunk_size:从SemanticChunker接收的每个分块的最大大小。
    • similarity_threshold:用于语义分组的相似性阈值。
  • 使用SemanticChunker进行文本分块的示例代码
from chonkie import SemanticChunker
chunker = SemanticChunker(embedding_model="all-minilm-l6-v2", max_chunk_size=512, similarity_threshold=0.7)
chunks = chunker("Woah! Chonkie, the chunking library is so cool!")
for chunk in chunks:
    print(f"Chunk: {chunk.text}")
    print(f"Tokens: {chunk.token_count}")

问题3:Chonkie的性能如何,与其他分块库相比有何优势?

  • :Chonkie在性能和轻量级方面具有显著优势:
    • Token分块:比最慢的竞争对手快33倍。
    • 句子分块:快近2倍。
    • 语义分块:快2.5倍。
    • 大小:默认安装仅9.7MB,远小于竞争对手(80-171MB)。
    • 速度
  • Chonkie通过以下优化实现快速分块
    • 使用Tiktoken作为默认分词器,速度比竞争对手快3-6倍。
    • 预计算和缓存机制,避免重复计算,节省时间。
    • 运行均值池化技术,减少嵌入成本。
    • 这些优化使得Chonkie在处理大规模数据和实时应用时表现出色。

问题4:可以在不同的文本中多次运行一个Chunker吗?Chonkie 是线程安全的吗?

  • :可以多次运行Chunker,无需重新初始化。Chonkie的分块器是线程安全的。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询