LangChain提供了多种不同类型的文本分词器,我们常说的tokenizer就是分词器的一种。
我们知道对于LLaMA与LLaMA2的文本分词器为基于sentencepiece的BPE模型,Google ,而openai的文本分词器为tiktoken,据openai官方介绍,tiktoken是一个快速的BPE(Byte-Pair Encoding)分词器,支持词汇的扩展。
Byte Pair Encoding是大语言模型当前使用最多的Tokenizer方法。最简单的tokenize方法是:
将每个单词看成一个token,然后对其编号,实际上单词还有前缀,后缀,会有大量单词重复,需减少编码数量,对数据进行压缩,提高编码效率,BPE编码的目的是用一个有限的词表在token数量降到最低的情况下解决所有单词的分词
上面对其他常见的文本分类器进行简单介绍,下面主要来介绍LangChain:
LangChain提供了多种不同类型的文本分词器,表格如下:
Name: 文本分词器的名称
Splits On: 文本分词器是如何分词的
Adds Metadata: 用于控制文本分割器是否添加关于每个文本块来自何处的元数据。
Description: 文本分割器(splitter)的描述,以及适合在什么时候使用
Name(名称) | Splits On(分割依据) | Adds Metadata(是否添加元数据) | Description(描述) |
---|---|---|---|
Recursive(递归式) | 用户定义的字符列表 | 递归地将文本进行分割。递归分割文本的目的是尽量将相关的文本片段放在一起。推荐在开始分割文本时使用。 | |
HTML | HTML特定字符 | ✅ | 基于HTML特定字符进行文本分割。特别地,它会添加关于每个块的来源信息(基于HTML标记)。 |
Markdown | Markdown特定字符 | ✅ | 基于Markdown特定字符进行文本分割。特别地,它会添加关于每个块的来源信息(基于Markdown标记)。 |
Code | 编程代码(Python、JS)特定字符 | 基于编程语言特定的字符进行文本分割。提供了15种不同的编程语言选择。 | |
Token | Tokens | 基于标记进行文本分割。有几种不同的标记计量方法。 | |
Character | 用户定义的字符 | 基于用户定义的字符进行文本分割。这是一种较简单的方法。 | |
[Experimental] Semantic Chunker ([实验性] 语义块分割器) | 句子 | 首先按句子进行分割。然后,如果相邻的句子在语义上足够相似,它们会被合并在一起。这个方法是从Greg Kamradt那里得到的。 |
以上是关于各个分割器的描述,包括它们的分割依据、是否添加元数据以及相应的描述。
可以使用由Greg Kamradt创建的Chunkviz实用工具评估文本分割器。Chunkviz是一个很好的工具,可以可视化您的文本分割器的工作方式。它将展示您的文本如何被切分,并帮助您调整分割参数。
对于Adds Metadata,在langchain中,"Adds Metadata"是用于文本分割器(text splitter)的一个参数或选项。该参数用于控制文本分割器是否添加关于每个文本块来自何处的元数据。
作用:
添加元数据可以提供关于每个文本块的来源信息,即哪个文本或文档被分割成了这些块。这对于跟踪和追溯分割后的文本块非常有用,尤其是在处理大型文本集合或进行后续分析时。
实现方式:
具体的实现方式取决于langchain框架的实现细节和文本分割器的具体实现。一种可能的实现方式是,在将文本分割成块的过程中,将每个块与其来源进行关联,并将这些信息保存为元数据。这些来源可以是文件名、文档ID、URL或其他标识符,具体取决于应用场景和数据集的特点。
例如,如果使用langchain中的文本分割器来将大型文本集合分割成较小的段落或句子,那么"Adds Metadata"选项可以用于控制是否在生成的每个文本块中添加关于原始文档或段落的来源信息。这些来源信息可以作为元数据附加到每个文本块上,并在后续的处理和分析中使用。
参考文献:https://huggingface.co/docs/transformers/model_doc/llama2
https://python.langchain.com/docs/modules/data_connection/document_transformers/
Text Splitters | 🦜️🔗 Langchain
https://github.com/openai/tiktoken
https://blog.csdn.net/shichaog/article/details/132927557
https://towardsdatascience.com/byte-pair-encoding-the-dark-horse-of-modern-nlp-eb36c7df4f10