Potrzebujesz szybkiego sposobu na dodanie doświadczenia konwersacyjnej sztucznej inteligencji do aplikacji .NET? Dzięki Aspose.LLM możesz zbudować prosty czat bez konieczności explicite tworzenia lub zarządzania identyfikatorami sesji. SendMessageAsync automatycznie używa bieżącej sesji, co pozwala kolejnych wiadomościom dzielić kontekst rozmowy.
Ten wzorzec jest przydatny przy jednej konwersacji na raz, w tym w narzędziach CLI, prototypach, skryptach i innych prostych aplikacjach.
Kiedy prosty czat jest właściwym wyborem
Wzorzec implicit-session jest odpowiedni dla:
- Jedno pytanie i odpowiedź.
- Krótka wymiana zdań.
- Aplikacje i skrypty CLI.
- Prototypy.
- Aplikacje, w których w danym momencie musi być aktywna tylko jedna konwersacja.
Jeśli Twoja aplikacja potrzebuje wielu niezależnych konwersacji — na przykład chatbota obsługującego wielu użytkowników — powinieneś używać Aspose.LLM’s explicit session APIs zamiast tego.
Wyślij wiadomość bez zarządzania sesją
Podstawowy wzorzec komunikacji jest celowo mały:
string reply = await api.SendMessageAsync("What is 2 + 2?");
Console.WriteLine(reply);
Kiedy wykonujesz kolejne wywołania na tym samym obiekcie AsposeLLMApi, należą one do tej samej bieżącej konwersacji:
await api.SendMessageAsync("My name is Alice.");
string reply = await api.SendMessageAsync("What is my name?");
Console.WriteLine(reply);
Nie tworzysz identyfikatora sesji, nie przekazujesz go pomiędzy wywołaniami ani nie dołączasz explicite historii konwersacji. Ta sama instancja AsposeLLMApi utrzymuje bieżącą konwersację za Ciebie. Istniejące źródło dokumentuje to zachowanie jako sesję niejawna utrzymywaną przez cały czas życia instancji API. fileciteturn0file0L29-L34
Pełna konfiguracja nadal wymaga licencjonowanej instancji API oraz zestawu ustawień. Przykładowy kod źródłowy używa Aspose.LLM.License, Qwen25Preset i AsposeLLMApi.Create(preset). fileciteturn0file0L87-L122
Zbuduj interaktywny czat w konsoli
Mając podstawowy wzorzec komunikacji zrozumiany, przekształćmy go w małą interaktywną aplikację konsolową.
Ważną częścią jest stworzenie API raz, a następnie ponowne użycie go dla każdej wiadomości:
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}");
}
}
}
}
Ten przykład utrzymuje czat prostym:
- Instancja API jest tworzona raz.
- Każde wywołanie
SendMessageAsyncużywa tej samej domyślnej sesji. - Poprzednie wiadomości pozostają dostępne dla modelu.
- Pętla zapewnia naturalną rozmowę w stylu „pytanie‑odpowiedź”.
- Wyjątki są obsługiwane dla każdej wiadomości, więc jedno nieudane żądanie nie kończy działania aplikacji.
Przykład źródłowy używa tej samej struktury i zauważa, że pojedyncza instancja API zachowuje kontekst w kolejnych iteracjach. fileciteturn0file0L151-L191
Aby go uruchomić, utwórz projekt konsolowy .NET, zamień wygenerowany Program.cs i uruchom:
dotnet new console
dotnet run
Aspose.LLM udostępnia wysokopoziomową klasę AsposeLLMApi, która abstrahuje ładowanie modelu, tokenizację i wnioskowanie. Aby rozpocząć, zainstaluj pakiet NuGet:
Install-Package Aspose.LLM
Dostosuj pojedynczą wiadomość przy użyciu innego ustawienia wstępnego
Co jeśli większość twojej rozmowy powinna używać domyślnego zachowania, ale jedno konkretne pytanie wymaga bardziej deterministycznej odpowiedzi?
Możesz przekazać inny preset do SendMessageAsync dla tego wywołania:
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);
Nadpisanie dotyczy tylko tego wywołania. Domyślne ustawienie API pozostaje niezmienione, a podstawowa sesja nadal zapewnia kontekst rozmowy. fileciteturn0file0L126-L159
Niska temperatura, taka jak 0.1f, sprawia, że próbkowanie jest bardziej deterministyczne, co może być przydatne w pytaniach, w których chcesz mniejszą zmienność w generowanej odpowiedzi. fileciteturn0file0L155-L159
Zabezpiecz długotrwałe żądania czatu przy użyciu anulowania
Lokalne wnioskowanie modelu może trwać dłużej przy dużych podpowiedziach lub dłuższych odpowiedziach. Możesz zapobiec niekończącemu się wykonywaniu pojedynczego żądania, przekazując CancellationToken.
Na przykład, ustaw limit czasu 30 sekund:
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.");
}
Źródło opisuje ten sam wzorzec: utwórz CancellationTokenSource z limitem czasu, przekaż jego token do SendMessageAsync i przechwyć OperationCanceledException, gdy żądanie zostanie anulowane. fileciteturn0file0L161-L190
W aplikacji ASP.NET Core możesz również przekazać token anulowania żądania, aby generowanie mogło zostać zatrzymane, gdy klient się rozłączy.
Typowe problemy
| Problem | Co sprawdzić |
|---|---|
Not licensed for this method | Upewnij się, że licencja jest załadowana przed wywołaniem SendMessageAsync. |
Multiple AsposeLLMApi instances | Użyj jednej instancji i zwolnij ją prawidłowo. |
| Slow first response | Początkowe pobranie modelu/silnika może zająć kilka minut na nowej maszynie. |
Źródło konkretnie dokumentuje błąd licencjonowania, zachowanie pojedynczej aktywnej instancji oraz wolniejsze pierwsze ładowanie modelu. fileciteturn0file0L249-L255
Prosty czat vs. Sesje jawne
Podejście z sesją implicytną jest celowo ograniczone: utrzymuje implementację niewielką, utrzymując jedną bieżącą konwersację na instancji AsposeLLMApi.
| Jeśli potrzebujesz… | Użyj |
|---|---|
| Jedna konwersacja | SendMessageAsync |
| Krótka interaktywna rozmowa | SendMessageAsync |
| CLI lub prototyp | SendMessageAsync |
| Wiele niezależnych konwersacji | Explicit sessions |
| Wielu użytkowników lub równoczesne czaty | Explicit sessions |
| Trwały stan konwersacji | Session persistence |
Używaj komunikacji niejawnej, gdy wystarczy jedna rozmowa. Przejdź do jawnych interfejsów sesji, gdy potrzebujesz niezależnych rozmów, równoczesnych użytkowników, trwałego stanu lub większej kontroli nad tożsamością sesji. Istniejące źródło zaleca jawne sesje dla równoczesnych rozmów i trwałego stanu. fileciteturn0file0L266-L274
W przypadku podejścia z explicite sesją zobacz dokumentację Aspose.LLM oraz API wieloetapowych/sesji.
Uzyskaj darmową licencję
Aspose oferuje tymczasowe licencje do oceny. Pobierz jedną ze strony tymczasowych licencji Aspose i umieść plik Aspose.LLM.lic w miejscu, gdzie twoja aplikacja może go załadować.
Darmowe dodatkowe zasoby
Podsumowanie
Tworzenie prostego czatu AI przy użyciu Aspose.LLM nie wymaga jawnego zarządzania sesją. Tworząc jedną instancję AsposeLLMApi i wywołując SendMessageAsync, możesz zbudować konwersacyjną interakcję, w której API automatycznie utrzymuje bieżącą sesję.
Dla prostych aplikacji, prototypów, skryptów i doświadczeń czatu jednego użytkownika, to utrzymuje implementację w minimalnym zakresie. Gdy Twoja aplikacja rozrośnie się, aby obsługiwać wiele konwersacji lub wymaga wyraźnej kontroli sesji, możesz przejść do API opartych na sesjach.
FAQs
Czy muszę ręcznie zarządzać sesjami czatu przy użyciu Aspose.LLM? Nie. Metoda
SendMessageAsyncz sesją implikowaną automatycznie śledzi stan konwersacji przez cały czas życia instancjiAsposeLLMApi.Czy mogę zmienić zachowanie modelu tylko dla jednego pytania? Tak. Dostarcz inny preset (np. z niższą temperaturą) jako argument
presetdoSendMessageAsync. Tylko to wywołanie używa nowych ustawień.Jak zatrzymać długotrwałe generowanie? Utwórz
CancellationTokenSourcez limitem czasu i przekaż jego token doSendMessageAsync. PrzechwyćOperationCanceledException, aby obsłużyć limit czasu.Jakie typowe błędy powinienem obserwować? Brak licencji, tworzenie wielu jednoczesnych instancji API oraz wolne pierwsze ładowanie modelu to najczęstsze problemy. Postępuj zgodnie z opisanymi powyżej krokami łagodzenia.
Czy przykładowy kod jest gotowy do produkcji? Fragmenty kodu pochodzą z oficjalnej dokumentacji Aspose i nie zostały przetestowane w piaskownicy. Przetestuj je w swoim środowisku i dodaj solidną obsługę błędów przed wdrożeniem.
