Jazyk

Generování textu pomocí vlastního jazykového modelu pomocí Windows ML

Important

Rozhraní API modulu runtime Windows ML a generování textu jsou v současné době experimentální a nejsou podporována pro použití v produkčních prostředích. Aplikace, které si tato rozhraní API vyzkouší, by se neměly publikovat do Microsoft Storu.

Important

Rozhraní API pro generování textu a Windows ML Runtime jsou aktuálně k dispozici v jazyce C++ a Python; C# v současné době není podporováno. Dejte nám vědět, jestli vás zajímají tato rozhraní API z jazyka C# vytvořením issue v úložišti Windows ML na GitHubu.

Rozhraní API pro generování textu Windows ML zjednodušuje spouštění generování textu ve vašem vlastním jazykovém modelu. Zpracovává tokenizaci, autoregresivní dekódování, výstup streamování a zrušení za vás nad rozhraním API modulu runtime Windows ML – podobně jako ONNX Runtime GenAI zjednodušuje tuto smyčku nad modulem runtime ONNX. Windows neobsahuje model pro toto rozhraní API. Model zvolíte, zabalíte a distribuujete – soubor ONNX nebo GGUF a tokenizátor – s vaší aplikací.

Tip

Pokud nepotřebujete konkrétní model a chcete jen generování textu na zařízení s modelem, který spravuje Microsoft, použijte místo toho jeden z místních LLM připravených k použití.

Stále vytváříte základní objekty runtime – model, cíl spuštění a pipeline – a předáte je do relace. Rozhraní API neskrývá umístění hardwaru; odebere jenom potřebu napsat vlastní smyčku tokenu.

Podporované modely

Rozhraní API pro generování textu přijímá:

  • .ort () nebo .onnx () modely, spouštěné prostřednictvím ONNX Runtime. Model musí poskytovat vstup TOKEN-ID, výstup logits a jeden pár tensoru stavu s pevnou kapacitou, který obsahuje mezipaměť klíč/hodnota a pozici sekvence. Zadáte samostatný zdroj tokenizátoru (například tokenizer.json).
  • Modely GGUF (.gguf) spouštěné přes backend llama.cpp. Tokenizátor je vložený do modelu, takže není potřeba žádný samostatný zdroj tokenizátoru.

Ukázky ověřují tento kontrakt vůči rodině modelů Qwen2.5-0.5B-Instruct, exportované s grafem specifickým pro úlohy, který slučuje mezipaměť klíč/hodnota a pozici sekvence do jednoho páru stavů. Měly by fungovat i jiné jazykové modely pouze s dekodérem, které zpřístupňují stejný vstup tokenu, výstup logitů a kontrakt stavu.

Generování textu

Relace pro generování textu zahrnuje tokenizátor a stavovou pipeline (model, který vlastní mezipaměť klíč/hodnota). Načtěte model a tokenizátor, popište vstup tokenu modelu, výstup logits a kontrakt stavu a sestavte relaci:

// Create the runtime and an execution target (CPU here; GPU/NPU also available).
ComPtr<IWinMLRuntime> runtime;
THROW_IF_FAILED(WinMLCreateRuntime(IID_PPV_ARGS(runtime.GetAddressOf())));
ComPtr<IWinMLExecutionTarget> target;
THROW_IF_FAILED(runtime->CreateCpuExecutionTarget(target.GetAddressOf()));

// Load your ONNX model and its tokenizer.
ComPtr<IWinMLModel> model;
THROW_IF_FAILED(runtime->LoadModelFromFile(
    L"C:\\models\\qwen2.5-0.5b-instruct\\task_model.onnx",
    nullptr,
    model.GetAddressOf()));
ComPtr<IWinMLTokenizer> tokenizer;
THROW_IF_FAILED(WinMLCreateTokenizerFromFile(
    L"C:\\models\\qwen2.5-0.5b-instruct\\tokenizer.json",
    tokenizer.GetAddressOf()));

// Describe the model's token input, logits output, and KV-cache state pair.
winml::tasks::text_generation::onnx::StateTensorPair stateTensorPairs[] = {{1, 1}};
winml::tasks::text_generation::Options options;
options.values = winml::tasks::MakeTextGenerationOptions(/* maxNewTokens */ 64);

winml::tasks::text_generation::onnx::BuildTextGenerationArguments arguments;
arguments.runtime = runtime.Get();
arguments.model = model.Get();
arguments.target = target.Get();
arguments.tokenizer = tokenizer.Get();
arguments.tokenInputName = L"input_ids";
arguments.outputName = L"logits";
arguments.debugName = L"my-text-generation";
arguments.stateTensorPairs = stateTensorPairs;
arguments.sequenceCapacityHint = 128;
arguments.outputKind = WINML_TEXT_GENERATION_OUTPUT_KIND_LOGITS;
arguments.eosPolicy = WINML_TEXT_GENERATION_EOS_POLICY_TOKENIZER_DEFAULT;
arguments.options = &options;

winml::tasks::text_generation::TextGeneration textGeneration;
THROW_IF_FAILED(winml::tasks::text_generation::onnx::BuildTextGeneration(
    arguments, textGeneration));

Zavolejte GenerateText s výzvou ke spuštění operace streamování a poté načítejte fragmenty z vráceného datového proudu, dokud neohlásí dokončení:

ComPtr<IWinMLCancellationSource> cancellation;
THROW_IF_FAILED(textGeneration.tasks->CreateCancellationSource(
    cancellation.GetAddressOf()));

ComPtr<IWinMLTextGenerationPullStream> stream;
THROW_IF_FAILED(textGeneration.session->GenerateText(
    L"The sky is often",
    textGeneration.options.Get(),
    cancellation.Get(),
    stream.GetAddressOf()));

// Pull generated text one fragment at a time until the stream completes.
WINML_TEXT_GENERATION_READ_STATUS status{};
UINT32 tokenId = 0;
LPCWSTR fragment = nullptr;
while (SUCCEEDED(stream->ReadNext(&status, &tokenId, &fragment)) &&
    status == WINML_TEXT_GENERATION_READ_STATUS_UPDATE)
{
    std::wprintf(L"%ls", fragment);
}

// The terminal result is the authoritative text, token counts, and finish reason.
ComPtr<IWinMLTextGenerationResult> result;
THROW_IF_FAILED(stream->GetResult(result.GetAddressOf()));

Dokončený výsledek hlásí:

  • Úplný vygenerovaný text a ID tokenů
  • Počty promptů a vygenerovaných tokenů
  • Důvod dokončení – token ukončení sekvence, token zastavení, limit požadovaného tokenu, kapacita sekvence, zrušení nebo chyba

C++ a Python

Nativní rozhraní API je zpřístupněno prostřednictvím WinMLTasks.h a typovaných pomocných funkcí v C++ v části winml/tasks/text_generation/TextGeneration.hpp. Python aplikace používají windowsml.tasks projekci společně s windowsml.runtime.

Ukázky Windows ML zahrnují C++ a Python ukázku generování textu. Ukázka ukazuje úplné nastavení modulu runtime vedle konfigurace generování textu, abyste viděli, kde začíná abstrakce a jak přizpůsobit podkladový pracovní postup.

Viz také