Нужен быстрый способ добавить разговорный 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. fileciteturn0file0L29-L34
Полная настройка всё ещё требует лицензированного экземпляра API и предустановки. В примере исходного кода используется Aspose.LLM.License, Qwen25Preset и AsposeLLMApi.Create(preset). fileciteturn0file0L87-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 сохраняет контекст между итерациями. fileciteturn0file0L192-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 остаётся неизменным, а базовая сессия продолжает предоставлять контекст разговора. fileciteturn0file0L126‑L159
Низкая температура, например 0.1f, делает выборку более детерминированной, что может быть полезно для вопросов, где вы хотите меньше вариаций в сгенерированном ответе. fileciteturn0file0L155-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, когда запрос отменяется. fileciteturn0file0L161‑L190
В приложении ASP.NET Core вы также можете передать токен отмены запроса, чтобы генерация могла остановиться, когда клиент отключается.
Общие проблемы
| Проблема | Что проверить |
|---|---|
Not licensed for this method | Убедитесь, что лицензия загружена перед вызовом SendMessageAsync. |
Multiple AsposeLLMApi instances | Повторно используйте один экземпляр и корректно освобождайте его. |
| Slow first response | Первоначальная загрузка модели/движка может занять несколько минут на новой машине. |
Источник конкретно документирует ошибку лицензирования, поведение единственного активного экземпляра и более медленную загрузку первой модели. fileciteturn0file0L249-L255
Простой чат vs. Явные сеансы
Подход с неявной сессией намеренно ограничен: он сохраняет небольшую реализацию, поддерживая один текущий диалог в экземпляре AsposeLLMApi.
| Если вам нужно… | Использовать |
|---|---|
| Один разговор | SendMessageAsync |
| Краткий интерактивный чат | SendMessageAsync |
| CLI или прототип | SendMessageAsync |
| Несколько независимых разговоров | Явные сессии |
| Несколько пользователей или одновременных чатов | Явные сессии |
| Постоянное состояние разговора | Сохранение сессии |
Используйте неявные сообщения, когда достаточно одной беседы. Перейдите к явным API сеансов, когда вам нужны независимые беседы, одновременные пользователи, постоянное состояние или больший контроль над идентичностью сеанса. Существующий источник рекомендует явные сеансы для одновременных бесед и постоянного состояния. fileciteturn0file0L266-L274
Для подхода с явной сессией см. документацию Aspose.LLM и API многократных ходов/сессий.
Получить бесплатную лицензию
Aspose предлагает временные лицензии для оценки. Получите одну со страницы страница временной лицензии Aspose и разместите файл Aspose.LLM.lic там, где ваше приложение может его загрузить.
Бесплатные дополнительные ресурсы
Заключение
Создание простого AI‑чата с Aspose.LLM не требует явного управления сессией. Создав один экземпляр AsposeLLMApi и вызвав SendMessageAsync, вы можете построить разговорный опыт, при котором API автоматически поддерживает текущую сессию.
Для простых приложений, прототипов, скриптов и однопользовательских чат‑опытов это позволяет держать реализацию минимальной. Когда ваше приложение растёт и поддерживает несколько разговоров или требует явного управления сессией, вы можете перейти к API, основанным на сессиях.
FAQs
Нужно ли мне управлять чат‑сессиями вручную с Aspose.LLM? Нет. Метод
SendMessageAsyncс неявной сессией автоматически отслеживает состояние разговора в течение срока жизни экземпляраAsposeLLMApi.Могу ли я изменить поведение модели только для одного вопроса? Да. Передайте другой пресет (например, с более низкой температурой) в качестве аргумента
presetфункцииSendMessageAsync. Только этот вызов использует новые настройки.Как остановить длительно‑работающую генерацию? Создайте
CancellationTokenSourceс тайм‑аутом и передайте его токен вSendMessageAsync. ПерехватитеOperationCanceledException, чтобы обработать тайм‑аут.Какие распространённые ошибки следует учитывать? Отсутствие лицензии, одновременное создание нескольких экземпляров API и медленная загрузка первой модели — самые частые проблемы. Следуйте описанным выше шагам по их устранению.
Готов ли пример кода к продакшн? Фрагменты кода воспроизведены из официальной документации Aspose и не проходили тестирование в песочнице. Протестируйте их в своей среде и добавьте надёжную обработку ошибок перед развертыванием.
