Нужен быстрый способ добавить разговорный AI в приложение .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L161‑L190

В приложении 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, основанным на сессиях.

FAQs

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

  2. Могу ли я изменить поведение модели только для одного вопроса? Да. Передайте другой пресет (например, с более низкой температурой) в качестве аргумента preset функции SendMessageAsync. Только этот вызов использует новые настройки.

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

  4. Какие распространённые ошибки следует учитывать? Отсутствие лицензии, одновременное создание нескольких экземпляров API и медленная загрузка первой модели — самые частые проблемы. Следуйте описанным выше шагам по их устранению.

  5. Готов ли пример кода к продакшн? Фрагменты кода воспроизведены из официальной документации Aspose и не проходили тестирование в песочнице. Протестируйте их в своей среде и добавьте надёжную обработку ошибок перед развертыванием.

Читать далее