这是使用 SentencePiece 分词器对文本进行编码和解码的纯 Go 实现。
“编码”是使用经过训练的分词器模型将文本拆分为标记的操作。 “解码”是相反的过程——将标记列表转换为原始文本。
SentencePiece 是由 protobuf 配置文件配置的通用分词器系列。该存储库目前专注于实现重现 Gemma 模型标记化所需的功能(相同的标记器用于 Google 专有的 Gemini 系列模型)。具体来说,它仅实现 BPE 标记化,因为这是 Gemma 使用的。
该包应该可以使用 Gemma 标记器将文本编码为标记;与 SentencePiece Python 绑定相比,它经过了合理的优化和广泛的测试(请参阅此存储库中的system_test.go
)。
如果您发现任何问题或差异,请提出问题。
分词器的配置文件是一个protobuf(结构化数据,以协议缓冲区格式序列化),它描述了经过训练的分词器模型;它包括用于标记化的完整学习词汇,以及其他配置信息。
它不是此存储库的一部分。请从官方 Gemma 实施存储库获取它。 NewProcessor*
构造函数将期望读取此文件。
protobuf 用于配置分词器。 protobuf的结构由internal/model/sentencepiece_model.proto
文件描述,该文件由https://github.com/google/sentencepiece提供
要从中重新生成*.pb.go
文件:
$ cd internal/model
$ ./gen.sh
配置 protobuf 本身是按照 Tokenizer 配置部分中的描述获取的。所有测试都要求MODELPATH
环境变量指向分词器配置文件的本地副本。
要查看此分词器的浏览器内演示,请访问 https://eliben.github.io/go-sentencepiece/
Go 代码被编译为 WebAssembly 并从小型 JS 程序加载,以允许交互式文本编码。