Udostępnij przez


Używanie tokenizatorów Microsoft.ML.Tokenizers do tokenizacji tekstu

Biblioteka Microsoft.ML.Tokenizers udostępnia kompleksowy zestaw narzędzi do tokenizowania tekstu w aplikacjach platformy .NET. Tokenizacja jest niezbędna podczas pracy z dużymi modelami językowymi (LLMs), ponieważ umożliwia zarządzanie liczbą tokenów, szacowaniem kosztów i wstępnie przetworzonym tekstem modeli sztucznej inteligencji.

W tym artykule pokazano, jak używać kluczowych funkcji biblioteki i pracować z różnymi modelami tokenizatora.

Wymagania wstępne

Uwaga / Notatka

Biblioteka Microsoft.ML.Tokenizers obsługuje również platformę .NET Standard 2.0, dzięki czemu jest zgodna z programem .NET Framework 4.6.1 lub nowszym.

Instalowanie pakietu

Zainstaluj pakiet NuGet Microsoft.ML.Tokenizers:

dotnet add package Microsoft.ML.Tokenizers

W przypadku modeli Tiktoken (takich jak GPT-4) należy również zainstalować odpowiedni pakiet danych:

dotnet add package Microsoft.ML.Tokenizers.Data.O200kBase

Kluczowe funkcje

Biblioteka Microsoft.ML.Tokenizers udostępnia:

  • Rozszerzalna architektura tokenizatora: umożliwia specjalizację składników Normalizer, PreTokenizer, Model/Encoder i Decoder.
  • Wiele algorytmów tokenizacji: obsługuje kodowanie BPE (kodowanie par bajtowych), Tiktoken, Llama, CodeGen i nie tylko.
  • Liczenie i szacowanie tokenów: pomaga zarządzać kosztami i limitami kontekstu podczas pracy z usługami sztucznej inteligencji.
  • Elastyczne opcje kodowania: udostępnia metody kodowania tekstu na identyfikatory tokenów, zliczanie tokenów i dekodowanie tokenów z powrotem do tekstu.

Używanie tokenizatora Tiktoken

Tokenizer Tiktoken jest często używany z modelami OpenAI, takimi jak GPT-4. W poniższym przykładzie pokazano, jak zainicjować tokenizer Tiktoken i wykonać typowe operacje:

// Initialize the tokenizer for the gpt-4o model.
Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-4o");

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.

Aby uzyskać lepszą wydajność, powinno się buforować i ponownie wykorzystywać instancję tokenizatora w całej aplikacji.

Podczas pracy z modułami LLM często trzeba zarządzać tekstem w ramach limitów tokenów. W poniższym przykładzie pokazano, jak przycinać tekst do określonej liczby tokenów:

Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-4o");

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

Korzystanie z tokenizatora Llama

Tokenizer Llama jest przeznaczony dla rodziny modeli Llama. Wymaga to pliku modelu tokenizatora, który można pobrać z repozytoriów modeli, takich jak 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!

Wszystkie tokenizatory obsługują zaawansowane opcje kodowania, takie jak kontrolowanie normalizacji i pretokenizacji.

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);

Korzystanie z tokenizatora BPE

Kodowanie par bajtowych (BPE) jest podstawowym algorytmem używanym przez wiele tokenizatorów, w tym Tiktoken. Narzędzie BPE zostało początkowo opracowane jako algorytm do kompresowania tekstów, a następnie używane przez OpenAI do tokenizacji podczas wstępnego trenowania modelu GPT. W poniższym przykładzie zademonstrowano tokenizację 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.

Biblioteka udostępnia również wyspecjalizowane tokenizatory, takie jak BpeTokenizer i EnglishRobertaTokenizer, które można skonfigurować za pomocą niestandardowego słownictwa dla specyficznych modeli.

Aby uzyskać więcej informacji na temat BPE, zobacz Tokenizacja metodą byte-pair encoding.

Typowe operacje tokenizatora

Wszystkie tokenizatory w bibliotece implementują klasę bazową Tokenizer . W poniższej tabeli przedstawiono dostępne metody.

Metoda Description
EncodeToIds Konwertuje tekst na listę identyfikatorów tokenów.
Decode Konwertuje identyfikatory tokenów z powrotem na tekst.
CountTokens Zwraca liczbę tokenów w ciągu tekstowym.
EncodeToTokens Zwraca szczegółowe informacje o tokenie, w tym wartości i identyfikatory.
GetIndexByTokenCount Znajduje indeks znaków dla określonej liczby tokenów od początku.
GetIndexByTokenCountFromEnd Znajduje indeks znaków dla określonej liczby tokenów liczonej od końca.

Migrowanie z innych bibliotek

Jeśli obecnie używasz programu DeepDev.TokenizerLib lub SharpTokenrozważ migrację do biblioteki Microsoft.ML.Tokenizers. Biblioteka została rozszerzona o scenariusze z tych bibliotek i zapewnia lepszą wydajność i obsługę. Aby uzyskać wskazówki dotyczące migracji, zobacz przewodnik migracji.