sentencepiece — скилл для Claude Code: токенизация без языковых правил
Скилл учит агента обучать и применять токенизатор SentencePiece на сыром тексте: BPE или Unigram, без предварительной разбивки.
npx skills add Orchestra-Research/AI-Research-SKILLs --skill sentencepiece -a claude-codeЧто делает sentencepiece
SentencePiece работает с текстом как с сырым Unicode, поэтому не нужны правила под конкретный язык. Пробел становится метасимволом ▁, и это снимает возню с предварительной токенизацией. Пригодится, когда корпус смешанный или в нём есть CJK.
Внутри два алгоритма: BPE (его использует mBART) и Unigram, который стоит по умолчанию и на котором построены T5, ALBERT и XLNet. Обучение запускается из командной строки через spm_train или из Python через spm.SentencePieceTrainer.train. Модель грузится в spm.SentencePieceProcessor, дальше encode и decode дают куски или ID. Есть subword regularization: при enable_sampling=True и alpha=0.1 одна и та же строка разбивается по-разному, это даёт аугментацию данных.
Для работы нужны пакеты sentencepiece и transformers. Сборка из C++ требует CMake. По скорости SentencePiece выдаёт 50 000 предложений в секунду, а HuggingFace Tokenizers — 200 000, то есть вчетверо быстрее; если обучение упирается в часы, это повод взять HF. Для китайского ставьте character_coverage=1.0, для английского хватает 0.9995.
Какие задачи решает
- обучить токенизатор на смешанном корпусе без языковых правил
- получить одинаковую разбивку текста при повторных запусках
- разбить китайский или японский текст на куски
- добавить аугментацию через разные варианты токенизации
- подготовить словарь в стиле T5 с символами
<extra_id_N>
Примеры запросов агенту
- Обучи Unigram-модель на
corpus.txtсо словарём 32000 и сохрани какm.model - Загрузи
m.modelи покажи, на какие куски разобьётся фраза «Hello world» - Включи сэмплирование с
alpha=0.1и выведи три разных варианта токенизации слова tokenization
Как установить sentencepiece
1Через Skills CLI (Vercel)
npx skills add Orchestra-Research/AI-Research-SKILLs --skill sentencepiece -a claude-code2Вручную: положить файлы
~/.claude/skills/sentencepiece/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/sentencepiece/
1Через Skills CLI (Vercel)
npx skills add Orchestra-Research/AI-Research-SKILLs --skill sentencepiece -a codex2Вручную: положить файлы
.agents/skills/sentencepiece/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add Orchestra-Research/AI-Research-SKILLs --skill sentencepiece -a cursor2Вручную: положить файлы
.cursor/skills/sentencepiece/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install Orchestra-Research/AI-Research-SKILLs sentencepiece2Вручную: положить файлы
.github/skills/sentencepiece/SKILL.md1Через Skills CLI (Vercel)
npx skills add Orchestra-Research/AI-Research-SKILLs --skill sentencepiece -a gemini-cli2Командой платформы
gemini skills install https://github.com/Orchestra-Research/AI-Research-SKILLs --path 02-tokenization/sentencepieceВручную: положить файлы
.devin/skills/sentencepiece/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add Orchestra-Research/AI-Research-SKILLs --skill sentencepiece -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о sentencepiece
Как установить sentencepiece в Claude?
Выполните npx skills add Orchestra-Research/AI-Research-SKILLs --skill sentencepiece -a claude-code. Скилл появится в ~/.claude/skills/sentencepiece/SKILL.md.
Что делает sentencepiece?
Даёт агенту инструкции по обучению и применению токенизатора SentencePiece: BPE или Unigram, на сыром тексте, с детерминированным словарём.
Чем SentencePiece отличается от HuggingFace Tokenizers?
HF Tokenizers обучается быстрее и даёт больше гибкости, а SentencePiece проще в развёртывании и работает без языковых правил. По токенизации HF обгоняет вчетверо.
Исходный текст
SKILL.md · MIT
---
name: sentencepiece
description: Language-independent tokenizer treating text as raw Unicode. Supports BPE and Unigram algorithms. Fast (50k sentences/sec), lightweight (6MB memory), deterministic vocabulary. Used by T5, ALBERT, XLNet, mBART. Train on raw text without pre-tokenization. Use when you need multilingual support, CJK languages, or reproducible tokenization.
version: 1.0.0
author: Orchestra Research
license: MIT
tags: [Tokenization, SentencePiece, Language-Independent, BPE, Unigram, Multilingual, CJK Languages, Unicode, Deterministic, Google]
dependencies: [sentencepiece, transformers]
---
# SentencePiece - Language-Independent Tokenization
Unsupervised tokenizer that works on raw text without language-specific preprocessing.
## When to use SentencePiece
**Use SentencePiece when:**
- Building multilingual models (no language-specific rules)
- Working with CJK languages (Chinese, Japanese, Korean)
- Need reproducible tokenization (deterministic vocabulary)
- Want to train on raw text (no pre-tokenization needed)
- Require lightweight deployment (6MB memory, 50k sentences/sec)
**Performance**:
- **Speed**: 50,000 sentences/sec
- **Memory**: ~6MB for loaded model
- **Languages**: All (language-independent)
**Use alternatives instead**:
- **HuggingFace Tokenizers**: Faster training, more flexibility
- **tiktoken**: OpenAI models (GPT-3.5/4)
- **BERT WordPiece**: English-centric tasks
## Quick start
### Installation
```bash
# Python
pip install sentencepiece
# C++ (requires CMake)
git clone https://github.com/google/sentencepiece.git
cd sentencepiece
mkdir build && cd build
cmake .. && make -j $(nproc)
sudo make install
```
### Train model
```bash
# Command-line (BPE with 8000 vocab)
spm_train --input=data.txt --model_prefix=m --vocab_size=8000 --model_type=bpe
# Python API
import sentencepiece as spm
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='m',
vocab_size=8000,
model_type='bpe'
)
```
**Training time**: ~1-2 minutes for 100MB corpus
### Encode and decode
```python
import sentencepiece as spm
# Load model
sp = spm.SentencePieceProcessor(model_file='m.model')
# Encode to pieces
pieces = sp.encode('This is a test', out_type=str)
print(pieces) # ['▁This', '▁is', '▁a', '▁test']
# Encode to IDs
ids = sp.encode('This is a test', out_type=int)
print(ids) # [284, 47, 11, 1243]
# Decode
text = sp.decode(ids)
print(text) # "This is a test"
```
## Language-independent design
### Whitespace as symbol (▁)
```python
text = "Hello world"
pieces = sp.encode(text, out_type=str)
print(pieces) # ['▁Hello', '▁world']
# Decode preserves spaces
decoded = sp.decode_pieces(pieces)
print(decoded) # "Hello world"
```
**Key principle**: Treat text as raw Unicode, whitespace = ▁ (meta symbol)
## Tokenization algorithms
### BPE (Byte-Pair Encoding)
```python
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='bpe_model',
vocab_size=16000,
model_type='bpe'
)
```
**Used by**: mBART
### Unigram (default)
```python
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='unigram_model',
vocab_size=8000,
model_type='unigram'
)
```
**Used by**: T5, ALBERT, XLNet
## Training configuration
### Essential parameters
```python
spm.SentencePieceTrainer.train(
input='corpus.txt',
model_prefix='m',
vocab_size=32000,
model_type='unigram',
character_coverage=0.9995, # 1.0 for CJK
user_defined_symbols=['[SEP]', '[CLS]'],
unk_piece='<unk>',
num_threads=16
)
```
### Character coverage
| Language Type | Coverage | Rationale |
|---------------|----------|-----------|
| English | 0.9995 | Most common chars |
| CJK (Chinese) | 1.0 | All characters needed |
| Multilingual | 0.9995 | Balance |
## Encoding options
### Subword regularization
```python
# Sample different tokenizations
for _ in range(3):
pieces = sp.encode('tokenization', out_type=str, enable_sampling=True, alpha=0.1)
print(pieces)
# Output (different each time):
# ['▁token', 'ization']
# ['▁tok', 'en', 'ization']
```
**Use case**: Data augmentation for robustness.
## Common patterns
### T5-style training
```python
spm.SentencePieceTrainer.train(
input='c4_corpus.txt',
model_prefix='t5',
vocab_size=32000,
model_type='unigram',
user_defined_symbols=[f'<extra_id_{i}>' for i in range(100)],
unk_id=2,
eos_id=1,
pad_id=0
)
```
### Integration with transformers
```python
from transformers import T5Tokenizer
# T5 uses SentencePiece internally
tokenizer = T5Tokenizer.from_pretrained('t5-base')
inputs = tokenizer('translate English to French: Hello', return_tensors='pt')
```
## Performance benchmarks
### Training speed
| Corpus | BPE (16k) | Unigram (8k) |
|--------|-----------|--------------|
| 100 MB | 1-2 min | 3-4 min |
| 1 GB | 10-15 min | 30-40 min |
### Tokenization speed
- **SentencePiece**: 50,000 sentences/sec
- **HF Tokenizers**: 200,000 sentences/sec (4× faster)
## Supported models
**T5 family**: `t5-base`, `t5-large` (32k vocab, Unigram)
**ALBERT**: `albert-base-v2` (30k vocab, Unigram)
**XLNet**: `xlnet-base-cased` (32k vocab, Unigram)
**mBART**: `facebook/mbart-large-50` (250k vocab, BPE)
## References
- **[Training Guide](references/training.md)** - Detailed options, corpus preparation
- **[Algorithms](references/algorithms.md)** - BPE vs Unigram, subword regularization
## Resources
- **GitHub**: https://github.com/google/sentencepiece ⭐ 10,000+
- **Paper**: https://arxiv.org/abs/1808.06226 (EMNLP 2018)
- **Version**: 0.2.0+
© Orchestra Research · MIT · Orchestra-Research/AI-Research-SKILLs