Sebagian besar tim .NET yang menambahkan fitur AI hari ini akhirnya menulis plumbing yang sama: klien HTTP, kebijakan retry, manajemen rahasia untuk kunci API, dan baris penagihan per‑token pada kartu kredit seseorang. Aspose.LLM mengambil jalur yang berbeda. Itu adalah paket NuGet yang menjalankan inferensi model bahasa besar di dalam proses Anda sendiri – tidak ada layanan yang dipanggil, tidak ada kunci yang harus diputar, dan tidak ada permintaan yang meninggalkan mesin.
Artikel ini memperkenalkan pustaka, menjelaskan tiga konsep yang menjadi dasar API‑nya, dan memandu Anda melalui aplikasi obrolan yang berfungsi. Jika Anda dapat menambahkan referensi paket, Anda dapat mengirim prompt dalam beberapa lusin baris.
Mengapa model lokal penting
Menjalankan model secara in‑process mengubah apa yang dapat Anda bangun.
- Data tetap di tempat. Prompt tidak pernah meninggalkan host, yang penting ketika Anda bekerja dengan kontrak, catatan medis, kode sumber, atau apa pun yang tercakup oleh kebijakan residensi data.
- Tidak ada biaya per-token. Setelah model berada di disk, inferensi adalah biaya CPU atau GPU yang sudah Anda miliki, bukan panggilan API yang diukur.
- Tidak ada ketergantungan jaringan saat runtime. Alat desktop, layanan di tempat, dan lingkungan yang terisolasi semuanya bekerja dengan cara yang sama.
- Satu artefak penyebaran. Konfigurasi model dikirim bersama aplikasi Anda alih-alih berada di dasbor akun terpisah.
Pertukaran ini jujur dan layak disebutkan di awal: Anda menyediakan perangkat keras. Model yang dijalankan secara lokal memerlukan memori lokal, dan eksekusi pertama perlu mengunduh beberapa gigabyte.
Aspose.LLM for .NET dalam tiga konsep
Luas permukaan sengaja kecil. Hampir semua yang Anda lakukan dengan Aspose.LLM melibatkan tiga tipe ini.
| Konsep | Tipe | Peran |
|---|---|---|
| License | Aspose.LLM.License | Mengaktifkan pustaka. Panggil SetLicense sebelum penggunaan API lainnya. |
| Preset | e.g. Qwen25Preset | Menggabungkan file model dengan parameter generasi seperti suhu sampler. |
| API instance | AsposeLLMApi | Titik masuk. Dibuat dari preset, menyimpan percakapan, mengekspos SendMessageAsync. |
Preset adalah yang menarik. Alih‑alih membuat Anda mengatur jalur model, pengaturan tokenizer, dan nilai sampler secara manual, preset mengemas kombinasi yang sudah teruji. Qwen25Preset adalah titik awal default, dan Anda dapat menyesuaikan parameternya atau menukar preset lain nanti tanpa menyentuh sisa kode Anda.
Prasyarat
Sebelum menulis kode apa pun:
- Instal paket -
Install-Package Aspose.LLM - Tempatkan lisensi Anda - letakkan
Aspose.LLM.licdi lokasi yang dapat dibaca oleh executable saat runtime. - Periksa anggaran memori Anda - preset Qwen25 membutuhkan setidaknya 8 GB RAM bebas.
Untuk detail produk, lihat halaman produk Aspose.LLM for .NET.
Obrolan pertama Anda
Berikut adalah program terpendek yang dapat melakukan percakapan nyata. Perhatikan panggilan kedua dan ketiga: instance API melacak konteks secara otomatis, sehingga model masih mengetahui siapa Alice.
Apa yang dilakukan kode
- Membuat sebuah
Licensedan menunjuk ke file lisensi Anda. - Menginstansiasi
Qwen25Presetdengan konfigurasi defaultnya. - Membuat satu instance
AsposeLLMApidari preset tersebut. - Mengirim beberapa prompt, semuanya berbagi percakapan yang sama.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;
var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");
var preset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(preset);
string reply = await api.SendMessageAsync("What is 2 + 2?");
Console.WriteLine(reply);
// Output: 2 + 2 equals 4.
await api.SendMessageAsync("My name is Alice.");
string reply2 = await api.SendMessageAsync("What is my name?");
Console.WriteLine(reply2);
// Output: Your name is Alice.
AsposeLLMApi.Create(preset) mengembalikan klien yang sadar sesi. Setiap pemanggilan SendMessageAsync menambahkan prompt ke percakapan yang sedang berjalan, sehingga Anda mendapatkan perilaku multi‑turn tanpa harus mengelola status apa pun sendiri. Deklarasi using penting - instance memiliki sumber daya native dan perlu dibuang.
Catatan: Sampel ini mengikuti dokumentasi resmi Aspose dan belum dijalankan di sandbox. Verifikasi di lingkungan Anda sendiri sebelum dipublikasikan.
Penyetelan perilaku untuk satu permintaan
Jawaban percakapan mendapat manfaat dari beberapa tingkat keacakan. Aritmatika tidak. Alih‑alih mengkonfigurasi ulang instance, buat preset kedua dan berikan ke panggilan tunggal yang membutuhkannya.
Apa yang dilakukan kode
- Membuat preset default dan instance API seperti biasa.
- Membuat
strictPresetdengan suhu sampler yang rendah. - Mengirimkannya ke
SendMessageAsyncmelalui argumenpreset. - Membiarkan panggilan selanjutnya pada default asli.
using Aspose.LLM.Abstractions.Parameters.Presets;
// Default preset used by the API instance
var defaultPreset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(defaultPreset);
// A more deterministic preset, for this question only
var strictPreset = new Qwen25Preset();
strictPreset.SamplerParameters.Temperature = 0.1f;
string reply = await api.SendMessageAsync(
"What is the square root of 144?",
preset: strictPreset);
Console.WriteLine(reply);
// Output: The square root of 144 is 12.
SamplerParameters.Temperature mengontrol seberapa banyak keacakan yang diperkenalkan oleh sampler. Nilai mendekati 0.1 menghasilkan output yang hampir deterministik; nilai yang lebih tinggi menghasilkan frasa yang lebih beragam. Karena preset dibatasi pada panggilan, penimpaan tidak bocor ke sisa percakapan.
Pembatalan dan batas waktu
Panjang generasi tidak sepenuhnya dapat diprediksi, dan permintaan yang berjalan lama akan memblokir apa pun yang menunggunya. SendMessageAsync menerima CancellationToken, jadi berikan satu.
Apa yang dilakukan kode
- Membuat
CancellationTokenSourcedengan anggaran 30 detik. - Mengirim
cts.TokenkeSendMessageAsync. - Menangkap
OperationCanceledExceptiondan menurunkan secara elegan.
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
try
{
string reply = await api.SendMessageAsync(
"Write a 500-word essay about migration patterns of the Arctic tern.",
cancellationToken: cts.Token);
Console.WriteLine(reply);
}
catch (OperationCanceledException)
{
Console.WriteLine("Generation timed out.");
}
Pembatalan meninggalkan status sesi tetap, sehingga percakapan berlanjut secara normal pada panggilan berikutnya. Dalam handler ASP.NET Core, teruskan token RequestAborted milik permintaan di sini juga - tidak ada alasan untuk terus menghasilkan untuk klien yang sudah terputus.
Aplikasi konsol lengkap
Menyatukannya: REPL yang menjaga satu sesi tetap hidup selama proses berjalan dan pulih dari kegagalan per‑pesan.
Apa yang dilakukan kode
- Mengatur lisensi dan preset default sekali, saat startup.
- Membuat satu instance
AsposeLLMApiuntuk seluruh program. - Melakukan loop pada input pengguna hingga pengguna mengetik
quit. - Mengirim setiap baris dan mencetak balasan.
- Menangkap pengecualian per pesan sehingga satu kegagalan tidak mengakhiri sesi.
using Aspose.LLM;
using Aspose.LLM.Abstractions.Parameters.Presets;
internal class SimpleChatDemo
{
public static async Task Main()
{
var license = new Aspose.LLM.License();
license.SetLicense("Aspose.LLM.lic");
var preset = new Qwen25Preset();
using var api = AsposeLLMApi.Create(preset);
Console.WriteLine("Ask me anything. Type 'quit' to exit.");
while (true)
{
Console.Write("> ");
string? line = Console.ReadLine();
if (line == null || line.Equals("quit", StringComparison.OrdinalIgnoreCase))
break;
try
{
string reply = await api.SendMessageAsync(line);
Console.WriteLine(reply);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}
Dua poin desain layak dibawa ke aplikasi nyata. Pertama, instance dibuat sekali dan digunakan kembali - pembuatan mahal dan, seperti yang dijelaskan pada bagian berikutnya, instance bersamaan tidak diizinkan. Kedua, try-catch ditempatkan di dalam loop bukan di sekelilingnya, sehingga satu pesan yang buruk hanya menghabiskan satu giliran, bukan seluruh sesi.
Evaluasi perpustakaan dengan lisensi sementara dari halaman lisensi sementara Aspose.
Kesalahan yang kemungkinan akan Anda temui pertama kali
| Kesalahan | Penyebab umum | Solusi |
|---|---|---|
Not licensed for this method | File lisensi tidak ada atau jalurnya salah | Pastikan Aspose.LLM.lic dapat dibaca dari direktori kerja dan bahwa SetLicense dijalankan sebelum panggilan API lainnya. |
Only one AsposeLLMApi instance can be created at a time | Dua instance hidup bersamaan, biasanya dari pabrik per-permintaan | Daftarkan instance sebagai singleton, atau buang (dispose) yang sebelumnya sebelum membuat yang baru. |
| First response takes minutes | Mesin sedang mengunduh binary native dan bobot model | Harapkan 5-15 menit pada mesin bersih. Jalankan Create saat startup sehingga biaya tidak dibebankan pada pengguna. |
Baris kedua itu layak mendapat penekanan dalam skenario layanan. Jika Anda menghubungkan Aspose.LLM ke dalam container DI, daftarkan AsposeLLMApi sebagai singleton dan serialisasikan akses ke dalamnya - pendaftaran scoped atau transient akan gagal begitu dua permintaan tumpang tindih.
Sumber daya tambahan
Kesimpulan
Aspose.LLM mengurangi “add an LLM to this .NET application” menjadi tiga tipe dan satu metode. Sebuah lisensi mengaktifkan perpustakaan, sebuah preset mendefinisikan model dan cara menghasilkan, dan sebuah instance AsposeLLMApi membawa percakapan. Dari sana, SendMessageAsync menangani satu pertanyaan, sesi multi‑turn, penimpaan parameter per panggilan, dan generasi jangka panjang yang dapat dibatalkan.
Mulailah dengan contoh konsol, pastikan model berperilaku sesuai kebutuhan fitur Anda, kemudian lanjutkan ke pekerjaan multi‑sesi dan persistensi setelah dasar‑dasarnya kuat.
FAQs
1. Apa itu Aspose.LLM for .NET?
Sebuah pustaka NuGet yang menjalankan inferensi model bahasa besar di dalam proses .NET Anda sendiri. Anda membuat preset, membuat instance API, dan mengirim prompt — tanpa layanan eksternal, tanpa kunci API.
2. Apakah saya memerlukan koneksi internet untuk menggunakannya?
Hanya untuk run pertama. Panggilan Create awal mengunduh mesin native dan file model yang didefinisikan oleh preset, dan aset disimpan dalam cache secara lokal setelahnya.
3. Apa prasyarat untuk contoh kode?
Paket NuGet Aspose.LLM, file Aspose.LLM.lic yang valid, dan RAM bebas yang cukup untuk preset yang Anda pilih — rencanakan setidaknya 8 GB untuk Qwen25.
4. Bagaimana cara mengubah perilaku model untuk satu permintaan?
Buat preset kedua, sesuaikan parameternya (seperti SamplerParameters.Temperature), dan berikan ke SendMessageAsync melalui argumen preset. Panggilan selanjutnya akan kembali ke preset default instance.
5. Bagaimana cara menghentikan generasi yang memakan terlalu lama?
Berikan CancellationToken ke SendMessageAsync dan tangkap OperationCanceledException. Status sesi tetap ada setelah pembatalan, sehingga percakapan berlanjut secara normal.
6. Mengapa respons pertama begitu lambat?
Panggilan Create pertama mengunduh binary native dan bobot model, yang dapat memakan waktu 5‑15 menit pada mesin bersih. Panaskan instance saat startup aplikasi alih‑alih pada permintaan pertama pengguna.
