Hầu hết các nhóm .NET thêm tính năng AI ngày nay cuối cùng đều phải viết cùng một phần hạ tầng: một client HTTP, một chính sách retry, quản lý bí mật cho khóa API, và một dòng thanh toán theo token trên thẻ tín dụng của ai đó. Aspose.LLM chọn một con đường khác. Nó là một gói NuGet chạy suy luận mô hình ngôn ngữ lớn trong tiến trình của bạn – không có dịch vụ nào để gọi, không có khóa nào cần xoay, và không có yêu cầu nào rời khỏi máy.

Bài viết này giới thiệu thư viện, giải thích ba khái niệm mà API của nó được xây dựng dựa trên, và hướng dẫn bạn qua một ứng dụng chat hoạt động. Nếu bạn có thể thêm tham chiếu gói, bạn có thể gửi các lời nhắc chỉ trong vài chục dòng.

Tại sao một mô hình cục bộ lại quan trọng

Việc chạy mô hình trong cùng tiến trình sẽ thay đổi những gì bạn có thể xây dựng.

  • Dữ liệu ở nguyên vị trí. Các lời nhắc không bao giờ rời khỏi máy chủ, điều này quan trọng khi bạn làm việc với hợp đồng, ghi chú y tế, mã nguồn, hoặc bất kỳ thứ gì khác được bao phủ bởi chính sách lưu trú dữ liệu.
  • Không có chi phí theo token. Khi mô hình đã có trên đĩa, việc suy luận chỉ tốn CPU hoặc GPU mà bạn đã sở hữu, không phải một cuộc gọi API tính phí.
  • Không phụ thuộc vào mạng khi chạy. Các công cụ desktop, dịch vụ tại chỗ và môi trường cách ly hoàn toàn đều hoạt động theo cùng một cách.
  • Một artifact triển khai. Cấu hình mô hình được đóng gói cùng ứng dụng của bạn thay vì tồn tại trong bảng điều khiển của tài khoản riêng.

Sự đánh đổi này là trung thực và đáng nêu ra ngay từ đầu: bạn cung cấp phần cứng. Một mô hình chạy cục bộ cần bộ nhớ nội bộ, và lần chạy đầu tiên cần tải xuống vài gigabyte.

Aspose.LLM for .NET trong ba khái niệm

Diện tích bề mặt được cố ý giữ nhỏ. Hầu hết mọi thứ bạn làm với Aspose.LLM liên quan đến ba loại này.

ConceptTypeRole
Giấy phépAspose.LLM.LicenseKích hoạt thư viện. Gọi SetLicense trước bất kỳ việc sử dụng API nào khác.
Cấu hình sẵne.g. Qwen25PresetGói các tệp mô hình cùng các tham số sinh như nhiệt độ bộ lấy mẫu.
Đối tượng APIAsposeLLMApiĐiểm vào. Được tạo từ một cấu hình sẵn, giữ cuộc trò chuyện, cung cấp SendMessageAsync.

Preset là phần thú vị. Thay vì buộc bạn phải tự cấu hình các đường dẫn mô hình, cài đặt tokenizer và giá trị sampler bằng tay, một preset gói một tổ hợp đã được kiểm chứng. Qwen25Preset là điểm khởi đầu mặc định, và bạn có thể điều chỉnh các tham số của nó hoặc hoán đổi sang một preset khác sau này mà không cần chạm vào phần còn lại của mã.

Yêu cầu

Trước khi viết bất kỳ mã nào:

  1. Cài đặt gói - Install-Package Aspose.LLM
  2. Đặt giấy phép - đặt Aspose.LLM.lic ở nơi mà tệp thực thi có thể đọc được khi chạy.
  3. Kiểm tra ngân sách bộ nhớ - preset Qwen25 yêu cầu ít nhất 8 GB RAM trống.

Để biết chi tiết sản phẩm, xem trang sản phẩm Aspose.LLM for .NET.

Cuộc trò chuyện đầu tiên của bạn

Đây là chương trình ngắn nhất có thể duy trì một cuộc trò chuyện thực tế. Lưu ý các lần gọi thứ hai và thứ ba: thể hiện API tự theo dõi ngữ cảnh, vì vậy mô hình vẫn biết Alice là ai.

Công việc của mã

  1. Tạo một License và trỏ nó tới tệp giấy phép của bạn.
  2. Khởi tạo một Qwen25Preset với cấu hình mặc định của nó.
  3. Tạo một thể hiện AsposeLLMApi từ preset đó.
  4. Gửi một vài lời nhắc, tất cả đều chia sẻ cùng một cuộc trò chuyện.
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) trả về một client nhận thức phiên. Mỗi lời gọi SendMessageAsync sẽ thêm prompt vào cuộc trò chuyện đang diễn ra, vì vậy bạn sẽ có hành vi đa vòng mà không cần tự quản lý bất kỳ trạng thái nào. Khai báo using quan trọng – thể hiện sở hữu tài nguyên gốc và cần được giải phóng.

Lưu ý: Các mẫu này tuân theo tài liệu chính thức của Aspose và chưa được thực thi trong môi trường sandbox. Hãy kiểm tra chúng trong môi trường của bạn trước khi phát hành.

Tinh chỉnh hành vi cho một yêu cầu duy nhất

Các câu trả lời dạng hội thoại được hưởng lợi từ một chút ngẫu nhiên. Toán học thì không. Thay vì cấu hình lại thể hiện, hãy tạo một preset thứ hai và truyền nó cho cuộc gọi duy nhất cần nó.

Những gì mã thực hiện

  1. Tạo preset mặc định và thể hiện API như thường lệ.
  2. Xây dựng strictPreset với nhiệt độ sampler thấp.
  3. Truyền nó cho SendMessageAsync thông qua đối số preset.
  4. Để các lời gọi sau sử dụng preset mặc định ban đầu.
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 kiểm soát mức độ ngẫu nhiên mà bộ lấy mẫu tạo ra. Các giá trị gần 0.1 tạo ra đầu ra gần như quyết định; các giá trị cao hơn tạo ra cách diễn đạt đa dạng hơn. Vì cài đặt trước được giới hạn trong cuộc gọi, việc ghi đè sẽ không lan ra phần còn lại của cuộc trò chuyện.

Hủy và thời gian chờ

Độ dài của quá trình tạo không hoàn toàn có thể dự đoán, và một yêu cầu chạy lâu sẽ chặn bất kỳ thứ gì đang chờ nó. SendMessageAsync chấp nhận một CancellationToken, vì vậy hãy cung cấp cho nó một.

Những gì mã thực hiện

  1. Tạo một CancellationTokenSource với ngân sách 30 giây.
  2. Truyền cts.Token vào SendMessageAsync.
  3. Bắt OperationCanceledException và giảm thiểu lỗi một cách nhẹ nhàng.
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.");
}

Việc hủy bỏ giữ nguyên trạng thái phiên, vì vậy cuộc trò chuyện tiếp tục bình thường trong cuộc gọi tiếp theo. Trong một trình xử lý ASP.NET Core, hãy chuyển tiếp token RequestAborted của yêu cầu ở đây nữa - không có lý do nào để tiếp tục tạo ra cho một khách hàng đã ngắt kết nối.

Một ứng dụng console hoàn chỉnh

Kết hợp lại: một REPL giữ một phiên làm việc luôn hoạt động trong suốt thời gian của tiến trình và khôi phục sau các lỗi từng tin nhắn.

Mã thực hiện gì

  1. Thiết lập giấy phép và cấu hình mặc định một lần, khi khởi động.
  2. Tạo một thể hiện AsposeLLMApi duy nhất cho toàn bộ chương trình.
  3. Lặp lại nhập liệu của người dùng cho đến khi người dùng gõ quit.
  4. Gửi mỗi dòng và in ra phản hồi.
  5. Bắt các ngoại lệ cho mỗi tin nhắn để một lỗi không làm kết thúc phiên làm việc.
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}");
            }
        }
    }
}

Hai điểm thiết kế đáng để mang vào các ứng dụng thực tế. Thứ nhất, thể hiện được tạo một lần và tái sử dụng - việc tạo rất tốn kém và, như phần tiếp theo giải thích, không cho phép các thể hiện đồng thời. Thứ hai, khối try‑catch nằm bên trong vòng lặp thay vì bao quanh nó, vì vậy một tin nhắn lỗi duy nhất chỉ gây mất một lượt thay vì toàn bộ phiên.

Đánh giá thư viện bằng giấy phép tạm thời từ trang giấy phép tạm thời của Aspose.

Các lỗi bạn có thể gặp đầu tiên

ErrorTypical causeRemedy
Not licensed for this methodTệp giấy phép bị thiếu hoặc đường dẫn saiXác nhận Aspose.LLM.lic có thể đọc được từ thư mục làm việc và SetLicense được gọi trước bất kỳ lời gọi API nào khác.
Only one AsposeLLMApi instance can be created at a timeHai thể hiện đang tồn tại đồng thời, thường do một factory tạo theo yêu cầuĐăng ký thể hiện dưới dạng singleton, hoặc giải phóng (dispose) thể hiện trước đó trước khi tạo thể hiện mới.
Phản hồi đầu tiên mất vài phútEngine đang tải xuống các binary gốc và trọng số mô hìnhDự kiến mất 5-15 phút trên máy sạch. Kích hoạt Create trong quá trình khởi động để chi phí không được người dùng chịu.

Hàng thứ hai đó cần được nhấn mạnh trong các kịch bản dịch vụ. Nếu bạn đang tích hợp Aspose.LLM vào một container DI, hãy đăng ký AsposeLLMApi dưới dạng singleton và tuần tự hoá việc truy cập vào nó — một đăng ký scoped hoặc transient sẽ thất bại ngay khi hai yêu cầu trùng lặp.

Tài nguyên bổ sung

Kết luận

Aspose.LLM giảm bớt việc “add an LLM to this .NET application” thành ba kiểu và một phương thức. Một giấy phép kích hoạt thư viện, một preset xác định mô hình và cách nó tạo ra, và một thể hiện AsposeLLMApi mang lại cuộc trò chuyện. Từ đó, SendMessageAsync xử lý một câu hỏi duy nhất, một phiên đa lượt, một ghi đè tham số cho mỗi lần gọi, và một quá trình tạo dài hạn có thể hủy.

Bắt đầu với mẫu console, xác nhận mô hình hoạt động theo cách mà tính năng của bạn cần, sau đó chuyển sang công việc đa phiên và lưu trữ khi các nguyên tắc cơ bản đã vững chắc.

Câu hỏi thường gặp

1. Aspose.LLM for .NET là gì?

Thư viện NuGet cho phép thực thi suy luận mô hình ngôn ngữ lớn trong quá trình .NET của bạn. Bạn tạo một preset, tạo một thể hiện API và gửi các prompt – không cần dịch vụ bên ngoài, không cần khóa API.

2. Tôi có cần kết nối internet để sử dụng nó không?

Chỉ áp dụng cho lần chạy đầu tiên. Lệnh Create ban đầu tải xuống engine gốc và các tệp mô hình được định nghĩa bởi preset, và các tài sản sẽ được lưu vào bộ nhớ cache cục bộ sau đó.

3. Các yêu cầu tiên quyết cho các mẫu mã là gì?

Gói NuGet Aspose.LLM, một tệp Aspose.LLM.lic hợp lệ, và đủ RAM miễn phí cho preset bạn chọn - hãy dự tính ít nhất 8 GB cho Qwen25.

4. Làm thế nào để tôi thay đổi hành vi của mô hình cho một yêu cầu duy nhất?

Tạo một preset thứ hai, điều chỉnh các tham số của nó (chẳng hạn SamplerParameters.Temperature), và truyền nó cho SendMessageAsync thông qua đối số preset. Các lần gọi sau sẽ quay lại preset mặc định của instance.

5. Làm thế nào để dừng một quá trình tạo đang mất quá nhiều thời gian?

Truyền một CancellationToken vào SendMessageAsync và bắt OperationCanceledException. Trạng thái phiên làm việc vẫn tồn tại sau khi hủy, vì vậy cuộc trò chuyện tiếp tục bình thường.

6. Tại sao phản hồi đầu tiên lại chậm?

Lần gọi Create đầu tiên sẽ tải xuống các binary gốc và trọng số mô hình, có thể mất từ 5‑15 phút trên một máy sạch. Hãy làm ấm instance khi khởi động ứng dụng thay vì chờ yêu cầu đầu tiên của người dùng.

Đọc thêm