Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
- SDK .NET 8 lub nowszy
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.