Потрібен швидкий спосіб додати досвід розмовного ШІ до .NET застосунку? За допомогою Aspose.LLM ви можете створити простий чат без явного створення чи управління ідентифікаторами сеансів. SendMessageAsync автоматично використовує поточний сеанс, дозволяючи послідовним повідомленням ділитися контекстом розмови.

Цей шаблон корисний для однієї розмови за раз, включаючи інструменти CLI, прототипи, скрипти та інші прості застосунки.

Коли простий чат — правильний вибір

Неявний шаблон сесії добре підходить для:

  • Одна пара питання та відповіді.
  • Коротка діалогова розмова.
  • CLI‑застосунки та скрипти.
  • Прототипи.
  • Додатки, у яких одночасно має бути активна лише одна розмова.

Якщо вашому застосунку потрібні кілька незалежних розмов — наприклад, чат‑бот, який обслуговує кількох користувачів — слід використовувати явні API сеансів Aspose.LLM.

Надіслати повідомлення без керування сесією

Основний шаблон обміну повідомленнями навмисно невеликий:

string reply = await api.SendMessageAsync("What is 2 + 2?");
Console.WriteLine(reply);

Коли ви робите наступні виклики на тому ж екземплярі AsposeLLMApi, вони належать до тієї ж поточної розмови:

await api.SendMessageAsync("My name is Alice.");

string reply = await api.SendMessageAsync("What is my name?");
Console.WriteLine(reply);

Ви не створюєте ідентифікатор сеансу, не передаєте його між викликами і не додаєте історію розмов явно. Той самий екземпляр AsposeLLMApi підтримує поточну розмову за вас. Існуючі вихідні документи описують цю поведінку як неявний сеанс, який зберігається протягом усього часу життя екземпляра API. fileciteturn0file0L29-L34

Повна настройка все ще вимагає ліцензованого екземпляра API та пресету. У прикладі джерела використовується Aspose.LLM.License, Qwen25Preset і AsposeLLMApi.Create(preset). fileciteturn0file0L87-L122

Створіть інтерактивний консольний чат

Зрозумівши базовий шаблон обміну повідомленнями, давайте перетворимо його на невеликий інтерактивний консольний застосунок.

Важливо створити API один раз, а потім повторно використовувати його для кожного повідомлення:

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}");
            }
        }
    }
}

Цей приклад спрощує чат:

  • Екземпляр API створюється один раз.
  • Кожен виклик SendMessageAsync використовує одну й ту ж неявну сесію.
  • Попередні повідомлення залишаються доступними для моделі.
  • Цикл забезпечує природну діалогову взаємодію.
  • Винятки обробляються для кожного повідомлення, тому один невдалий запит не завершує роботу програми.

У вихідному прикладі використовується та сама структура, і зазначається, що єдиний екземпляр API зберігає контекст протягом ітерацій. fileciteturn0file0L192-L245

Щоб запустити його, створіть консольний проєкт .NET, замініть згенерований Program.cs і запустіть:

dotnet new console
dotnet run

Aspose.LLM надає високорівневий клас AsposeLLMApi, який абстрагує завантаження моделі, токенізацію та інференцію. Щоб розпочати, встановіть пакет NuGet:

Install-Package Aspose.LLM

Налаштування окремого повідомлення з іншим пресетом

А що, якщо більшість вашої розмови має використовувати поведінку за замовчуванням, а одне конкретне питання потребує більш детермінованої відповіді?

Ви можете передати інший пресет до SendMessageAsync для цього виклику:

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

Перевизначення застосовується лише до цього виклику. Типовий пресет API залишається незмінним, а базовий сеанс продовжує надавати контекст розмови. fileciteturn0file0L126-L159

Низька температура, наприклад 0.1f, робить вибір більш детермінованим, що може бути корисним для питань, де ви хочете менше варіацій у згенерованій відповіді. fileciteturn0file0L155‑L159

Захист довготривалих запитів чату за допомогою скасування

Локальне виведення моделі може займати більше часу для великих підказок або довших відповідей. Ви можете запобігти безкінечному виконанню окремого запиту, передавши CancellationToken.

Наприклад, встановіть тайм‑аут у 30 секунд:

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.");
}

У джерелі документується той самий шаблон: створити CancellationTokenSource з тайм‑аутом, передати його токен у SendMessageAsync і перехопити OperationCanceledException, коли запит скасовується. fileciteturn0file0L151-L180

В застосунку ASP.NET Core ви також можете передати токен скасування запиту, щоб генерація могла зупинитися, коли клієнт відключається.

Поширені проблеми

ПроблемаЩо перевірити
Not licensed for this methodПереконайтеся, що ліцензія завантажена перед викликом SendMessageAsync.
Multiple AsposeLLMApi instancesВикористовуйте один екземпляр повторно та правильно його звільняйте.
Slow first responseПочаткове завантаження моделі/двигуна може зайняти кілька хвилин на новій машині.

Джерело конкретно документує помилку ліцензування, поведінку «один активний екземпляр» та повільніше завантаження першої моделі. fileciteturn0file0L249-L255

Простий чат vs. Явні сеанси

Підхід з неявною сесією навмисно обмежений: він зберігає реалізацію компактною, підтримуючи одну поточну розмову в екземплярі AsposeLLMApi.

Якщо вам потрібно…Використовуйте
Одна розмоваSendMessageAsync
Коротка інтерактивна розмоваSendMessageAsync
CLI або прототипSendMessageAsync
Кілька незалежних розмовЯвні сесії
Кілька користувачів або одночасних чатівЯвні сесії
Стан постійної розмовиЗбереження сесії

Використовуйте неявне повідомлення, коли достатньо однієї розмови. Перейдіть до явних API сесій, коли вам потрібні незалежні розмови, одночасні користувачі, постійний стан або більше контролю над ідентифікатором сесії. Існуюче джерело рекомендує явні сесії для одночасних розмов і постійного стану. fileciteturn0file0L266-L274

Для підходу з явною сесією перегляньте документацію Aspose.LLM та API багатокрокових/сесійних.

Отримати безкоштовну ліцензію

Aspose пропонує тимчасові ліцензії для оцінки. Отримайте одну зі сторінки тимчасових ліцензій Aspose і розмістіть файл Aspose.LLM.lic там, де ваш застосунок зможе його завантажити.

Безкоштовні додаткові ресурси

Висновок

Створення простого AI‑чату за допомогою Aspose.LLM не потребує явного керування сесією. Створивши один екземпляр AsposeLLMApi і викликавши SendMessageAsync, ви можете створити розмовний досвід, де API автоматично підтримує поточну сесію.

Для простих застосувань, прототипів, скриптів та однокористувацьких чат‑досвідів це забезпечує мінімальну реалізацію. Коли ваш застосунок розростається, щоб підтримувати кілька розмов або вимагає явного керування сесіями, ви можете перейти до API на основі сесій.

Поширені запитання

  1. Чи потрібно мені керувати чат‑сесіями вручну з Aspose.LLM? Ні. Неявний‑сесійний метод SendMessageAsync автоматично відстежує стан розмови протягом усього часу існування екземпляра AsposeLLMApi.

  2. Чи можу я змінити поведінку моделі лише для одного питання? Так. Передайте інший пресет (наприклад, з нижчою температурою) як аргумент preset у SendMessageAsync. Тільки цей виклик використовує нові налаштування.

  3. Як зупинити довготривалу генерацію? Створіть CancellationTokenSource з тайм-аутом і передайте його токен у SendMessageAsync. Перехопіть OperationCanceledException, щоб обробити тайм-аут.

  4. На які поширені помилки слід звернути увагу? Відсутність ліцензії, одночасне створення кількох екземплярів API та повільне завантаження першої моделі — це найчастіші проблеми. Дотримуйтесь кроків усунення, описаних вище.

  5. Чи готовий зразковий код до продакшн? Фрагменти скопійовані з офіційної документації Aspose і не проходили тестування у пісочниці. Перевірте їх у вашому середовищі та додайте надійне оброблення помилок перед розгортанням.

Read More