Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La biblioteca Microsoft.ML.Tokenizers proporciona un conjunto completo de herramientas para tokenizar texto en aplicaciones .NET. La tokenización es esencial cuando se trabaja con modelos de lenguaje grandes (LLM), ya que permite administrar recuentos de tokens, calcular costos y preprocesar texto para modelos de IA.
En este artículo se muestra cómo usar las características clave de la biblioteca y trabajar con diferentes modelos de tokenizador.
Prerrequisitos
- SDK de .NET 8 o posterior
Nota:
La biblioteca Microsoft.ML.Tokenizers también admite .NET Standard 2.0, lo que lo hace compatible con .NET Framework 4.6.1 y versiones posteriores.
Instalar el paquete
Instale el paquete NuGet Microsoft.ML.Tokenizers:
dotnet add package Microsoft.ML.Tokenizers
Para los modelos de Tiktoken (como GPT-4), también debe instalar el paquete de datos correspondiente:
dotnet add package Microsoft.ML.Tokenizers.Data.O200kBase
Características clave
La biblioteca Microsoft.ML.Tokenizers proporciona:
- Arquitectura de tokenizador extensible: permite la especialización de los componentes Normalizer, PreTokenizer, Model/Encoder y Decoder.
- Varios algoritmos de tokenización: admite BPE (codificación de pares de bytes), Tiktoken, Llama, CodeGen, etc.
- Recuento y estimación de tokens: ayuda a administrar los costos y los límites de contexto al trabajar con servicios de IA.
- Opciones de codificación flexibles: proporciona métodos para codificar texto en identificadores de token, contar tokens y descodificar tokens en texto.
Uso del tokenizador de Tiktoken
El tokenizador Tiktoken se usa normalmente con modelos openAI como GPT-4. En el ejemplo siguiente se muestra cómo inicializar un tokenizador de Tiktoken y realizar operaciones comunes:
// Initialize the tokenizer for the gpt-5 model.
Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-5");
string source = "Text tokenization is the process of splitting a string into a list of tokens.";
// Count the tokens in the text.
Console.WriteLine($"Tokens: {tokenizer.CountTokens(source)}");
// Output: Tokens: 16
// Encode text to token IDs.
IReadOnlyList<int> ids = tokenizer.EncodeToIds(source);
Console.WriteLine($"Token IDs: {string.Join(", ", ids)}");
// Output: Token IDs: 1279, 6602, 2860, 382, 290, 2273, 328, 87130, 261, 1621, 1511, 261, 1562, 328, 20290, 13
// Decode token IDs back to text.
string? decoded = tokenizer.Decode(ids);
Console.WriteLine($"Decoded: {decoded}");
// Output: Decoded: Text tokenization is the process of splitting a string into a list of tokens.
Para mejorar el rendimiento, debe almacenar en caché y reutilizar la instancia de tokenizador en toda la aplicación.
Al trabajar con modelos de lenguaje de gran escala, a menudo necesita gestionar el texto dentro de los límites de tokens. En el ejemplo siguiente se muestra cómo recortar texto a un recuento de tokens específico:
Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-5");
string source = "Text tokenization is the process of splitting a string into a list of tokens.";
// Get the last 5 tokens from the text.
var trimIndex = tokenizer.GetIndexByTokenCountFromEnd(source, 5, out string? processedText, out _);
processedText ??= source;
Console.WriteLine($"Last 5 tokens: {processedText.Substring(trimIndex)}");
// Output: Last 5 tokens: a list of tokens.
// Get the first 5 tokens from the text.
trimIndex = tokenizer.GetIndexByTokenCount(source, 5, out processedText, out _);
processedText ??= source;
Console.WriteLine($"First 5 tokens: {processedText.Substring(0, trimIndex)}");
// Output: First 5 tokens: Text tokenization is the
Usar el tokenizador Llama
El tokenizador Llama está diseñado para la familia de modelos Llama. Requiere un archivo de modelo de tokenizador, que puede descargar desde repositorios de modelos como Hugging Face:
// Open a stream to the remote Llama tokenizer model data file.
using HttpClient httpClient = new();
const string modelUrl = @"https://huggingface.co/hf-internal-testing/llama-tokenizer/resolve/main/tokenizer.model";
using Stream remoteStream = await httpClient.GetStreamAsync(modelUrl);
// Create the Llama tokenizer using the remote stream.
Tokenizer llamaTokenizer = LlamaTokenizer.Create(remoteStream);
string input = "Hello, world!";
// Encode text to token IDs.
IReadOnlyList<int> ids = llamaTokenizer.EncodeToIds(input);
Console.WriteLine($"Token IDs: {string.Join(", ", ids)}");
// Output: Token IDs: 1, 15043, 29892, 3186, 29991
// Count the tokens.
Console.WriteLine($"Tokens: {llamaTokenizer.CountTokens(input)}");
// Output: Tokens: 5
// Decode token IDs back to text.
string? decoded = llamaTokenizer.Decode(ids);
Console.WriteLine($"Decoded: {decoded}");
// Output: Decoded: Hello, world!
Todos los tokenizadores admiten opciones de codificación avanzadas, como controlar la normalización y la pretokenización:
ReadOnlySpan<char> textSpan = "Hello World".AsSpan();
// Bypass normalization during encoding.
ids = llamaTokenizer.EncodeToIds(textSpan, considerNormalization: false);
// Bypass pretokenization during encoding.
ids = llamaTokenizer.EncodeToIds(textSpan, considerPreTokenization: false);
// Bypass both normalization and pretokenization.
ids = llamaTokenizer.EncodeToIds(textSpan, considerNormalization: false, considerPreTokenization: false);
Utiliza el tokenizador BPE
La codificación de pares de bytes (BPE) es el algoritmo subyacente que usan muchos tokenizadores, incluido Tiktoken. BPE se desarrolló inicialmente como un algoritmo para comprimir textos y luego lo usó OpenAI para la tokenización al entrenar previamente el modelo GPT. En el ejemplo siguiente se muestra la tokenización de BPE:
// BPE (Byte Pair Encoding) tokenizer can be created from vocabulary and merges files.
// Download the GPT-2 tokenizer files from Hugging Face.
using HttpClient httpClient = new();
const string vocabUrl = @"https://huggingface.co/openai-community/gpt2/raw/main/vocab.json";
const string mergesUrl = @"https://huggingface.co/openai-community/gpt2/raw/main/merges.txt";
using Stream vocabStream = await httpClient.GetStreamAsync(vocabUrl);
using Stream mergesStream = await httpClient.GetStreamAsync(mergesUrl);
// Create the BPE tokenizer using the vocabulary and merges streams.
Tokenizer bpeTokenizer = BpeTokenizer.Create(vocabStream, mergesStream);
string text = "Hello, how are you doing today?";
// Encode text to token IDs.
IReadOnlyList<int> ids = bpeTokenizer.EncodeToIds(text);
Console.WriteLine($"Token IDs: {string.Join(", ", ids)}");
// Count tokens.
int tokenCount = bpeTokenizer.CountTokens(text);
Console.WriteLine($"Token count: {tokenCount}");
// Get detailed token information.
IReadOnlyList<EncodedToken> tokens = bpeTokenizer.EncodeToTokens(text, out string? normalizedString);
Console.WriteLine("Tokens:");
foreach (EncodedToken token in tokens)
{
Console.WriteLine($" ID: {token.Id}, Value: '{token.Value}'");
}
// Decode tokens back to text.
string? decoded = bpeTokenizer.Decode(ids);
Console.WriteLine($"Decoded: {decoded}");
// Note: BpeTokenizer might not always decode IDs to the exact original text
// as it can remove spaces during tokenization depending on the model configuration.
La biblioteca también proporciona tokenizadores especializados como BpeTokenizer y EnglishRobertaTokenizer que puede configurar con vocabularios personalizados para modelos específicos.
Para obtener más información sobre BPE, consulte Tokenización de codificación de pares de bytes.
Operaciones comunes de tokenizador
Todos los tokenizadores de la biblioteca implementan la Tokenizer clase base. En la tabla siguiente se muestran los métodos disponibles.
| Método | Description |
|---|---|
| EncodeToIds | Convierte el texto en una lista de identificadores de token. |
| Decode | Convierte los identificadores de token en texto. |
| CountTokens | Devuelve el número de tokens de una cadena de texto. |
| EncodeToTokens | Devuelve información detallada del token, incluidos los valores e identificadores. |
| GetIndexByTokenCount | Busca el índice de caracteres de un recuento de tokens específico desde el principio. |
| GetIndexByTokenCountFromEnd | Busca el índice de caracteres de un recuento de tokens específico desde el final. |
Migración desde otras bibliotecas
Si actualmente usa DeepDev.TokenizerLib o SharpToken, considere la posibilidad de migrar a Microsoft.ML.Tokenizers. La biblioteca se ha mejorado para cubrir escenarios de esas bibliotecas y proporciona un mejor rendimiento y soporte técnico. Para obtener instrucciones sobre la migración, consulte la guía de migración.