Bahasa

Buat teks dengan model bahasa Anda sendiri menggunakan Windows ML

Important

API Windows ML Runtime dan Pembuatan Teks saat ini bersifat eksperimental dan tidak didukung untuk digunakan di lingkungan produksi. Aplikasi yang mencoba API ini tidak boleh diterbitkan ke Microsoft Store.

Important

API Windows ML Runtime dan Pembuatan Teks saat ini tersedia di C++ dan Python; C# saat ini tidak didukung. Beri tahu kami jika Anda tertarik menggunakan API ini dari C# dengan memposting masalah di repositori GitHub ML Windows!

API Windows ML Text Generation menyederhanakan menjalankan pembuatan teks pada model bahasa Anda sendiri. Ini menangani tokenisasi, dekode otomatis, output streaming, dan pembatalan untuk Anda, di atas WINDOWS ML Runtime API — mirip dengan bagaimana ONNX Runtime GenAI menyederhanakan perulangan tersebut di atas ONNX Runtime. Windows tidak menyertakan model untuk API ini; Anda memilih, mengemas, dan mendistribusikan model — file ONNX atau GGUF, ditambah tokenizer — dengan aplikasi Anda.

Tip

Jika Anda tidak memerlukan model tertentu dan hanya ingin pembuatan teks di perangkat dengan model yang Microsoft kelola, gunakan salah satu LLM lokal yang siap digunakan sebagai gantinya.

Anda masih membuat objek Runtime yang mendasarinya — model, target eksekusi, dan pipeline — dan meneruskannya ke sesi. API tidak menyembunyikan penempatan perangkat keras; itu hanya menghapus kebutuhan untuk menulis perulangan token Anda sendiri.

Model yang didukung

API Pembuatan Teks menerima:

  • model berformat ONNX (.onnx) atau format ORT (.ort), dijalankan melalui ONNX Runtime. Model harus mengekspos input token-ID, output logits, dan satu pasangan tensor state berkapasitas tetap yang menyimpan cache kunci/nilai dan posisi urutan. Anda menyediakan sumber tokenizer terpisah (misalnya, tokenizer.json).
  • model GGUF (.gguf) yang berjalan di backend llama.cpp. Tokenizer disematkan dalam model, sehingga tidak diperlukan sumber tokenizer terpisah.

Sampel memvalidasi kontrak ini terhadap keluarga model Qwen2.5-0.5B-Instruct , yang diekspor dengan grafik Khusus tugas yang mengemas cache kunci/nilai dan posisi urutan ke dalam satu pasangan status. Model bahasa khusus dekoder lainnya yang mengekspos input token, output logit, dan kontrak status yang sama juga harus berfungsi.

Hasilkan teks

Sesi pembuatan teks membungkus tokenizer dan pipeline stateful (model yang memiliki cache kunci/nilai). Muat model dan tokenizer, jelaskan input token model, output logit, dan kontrak state, dan buat sesi:

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

Panggil GenerateText dengan perintah untuk memulai operasi streaming, lalu tarik fragmen dari aliran yang dikembalikan hingga melaporkan penyelesaian:

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

Hasil yang telah selesai melaporkan:

  • ID teks dan token lengkap yang dihasilkan
  • Jumlah prompt dan token yang dihasilkan
  • Alasan selesai — token akhir urutan, token berhenti, batas token yang diminta, kapasitas urutan, pembatalan, atau kesalahan

C++ dan Python

API asli diekspos melalui WinMLTasks.h dan helper C++ bertipe di bawah winml/tasks/text_generation/TextGeneration.hpp. Aplikasi Python menggunakan proyeksi windowsml.tasks bersama dengan windowsml.runtime.

Sampel Windows ML mencakup sampel pembuatan teks C++ dan Python. Sampel menunjukkan penyiapan Runtime lengkap di samping konfigurasi pembuatan teks sehingga Anda dapat melihat di mana abstraksi dimulai dan cara menyesuaikan alur kerja yang mendasarinya.

Baca juga