本文主要从源码角度剖析了Dify中FixedRecursiveCharacterTextSplitter的chunk长度计算方式。
1.self._length_function(chunk)
源码位置:dify\api\core\splitter\fixed\_text\_splitter.py\FixedRecursiveCharacterTextSplitter类\split\_text方法\self.\_length\_function(chunk)
计算chunk长度的函数是self._length_function(chunk)
,在中英文还是其它的语言,这个长度是如何计算的呢?
刚开始没找到self.\_length\_function
在哪里,经过分析发现就是EnhanceRecursiveCharacterTextSplitter.from\_encoder.\<locals>.\_token\_encoder
。
2.<locals>表示什么
在Python中,<locals>
是一个特殊标记,用于指示一个函数或变量是在另一个函数的局部作用域内定义的。在这个上下文中,EnhanceRecursiveCharacterTextSplitter.from_encoder.<locals>._token_encoder
表示_token_encoder
函数是在EnhanceRecursiveCharacterTextSplitter
类的from_encoder
类方法内部定义的一个局部函数。当看到<locals>
这样的标记时,它通常意味着正在查看的函数或变量是在一个封闭的作用域内定义的,而不是在全局作用域或类的顶层作用域内。这种方式常用于创建封装好的、只在特定函数内部可用的辅助函数或变量。
3.GPT2Tokenizer.get_num_tokens(text)
源码位置:dify\api\core\splitter\fixed\_text\_splitter.py\FixedRecursiveCharacterTextSplitter类\EnhanceRecursiveCharacterTextSplitter.from\_encoder.\<locals>.\_token\_encoder
通过使用gpt2分词器对文本进行编码,然后计算token的数量:
4.GPT2Tokenizer
merges.txt
、special_tokens_map.json
、tokenizer_config.json
和vocab.json
是构成GPT-2分词器的关键组件,它们各自的作用如下:
(1)merges.txt
此文件包含了用于构建GPT-2分词器的合并规则。GPT-2使用字节对编码(Byte Pair Encoding, BPE)方法来分词,merges.txt
文件中列出了在训练过程中发现的最常见的字节对合并规则。这些规则用于将原始文本分割成更小的令牌,以便模型处理。
(2)special_tokens_map.json
此文件定义了特殊令牌(如开始、结束、未知令牌等)的映射。这些特殊令牌对于模型理解文本的结构和处理未知词汇至关重要。例如,开始和结束令牌可以帮助模型识别文本的起始和结束位置。
(3)tokenizer_config.json
此文件包含了分词器的配置信息,如是否添加特殊令牌、分词器的类型等。这些配置信息用于自定义分词器的行为,以适应不同的文本处理需求。
(4)vocab.json
此文件是一个词汇表,包含了模型训练过程中识别的所有唯一令牌及其对应的索引。在文本转换为模型可处理的数字表示时,vocab.json
用于将文本中的令牌映射到其对应的索引值。
5.special_tokens_map.json
文件
special_tokens_map.json
文件解释如下**:**
{"bos_token": {"content": "<|endoftext|>","lstrip":