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. fileciteturn0file0L29-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). fileciteturn0file0L87-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 SendMessageAsync uż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. fileciteturn0file0L151-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. fileciteturn0file0L126-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. fileciteturn0file0L155-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. fileciteturn0file0L161-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

ProblemCo sprawdzić
Not licensed for this methodUpewnij się, że licencja jest załadowana przed wywołaniem SendMessageAsync.
Multiple AsposeLLMApi instancesUżyj jednej instancji i zwolnij ją prawidłowo.
Slow first responsePoczą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. fileciteturn0file0L249-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 konwersacjaSendMessageAsync
Krótka interaktywna rozmowaSendMessageAsync
CLI lub prototypSendMessageAsync
Wiele niezależnych konwersacjiExplicit sessions
Wielu użytkowników lub równoczesne czatyExplicit sessions
Trwały stan konwersacjiSession 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. fileciteturn0file0L266-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

  1. Czy muszę ręcznie zarządzać sesjami czatu przy użyciu Aspose.LLM? Nie. Metoda SendMessageAsync z sesją implikowaną automatycznie śledzi stan konwersacji przez cały czas życia instancji AsposeLLMApi.

  2. Czy mogę zmienić zachowanie modelu tylko dla jednego pytania? Tak. Dostarcz inny preset (np. z niższą temperaturą) jako argument preset do SendMessageAsync. Tylko to wywołanie używa nowych ustawień.

  3. Jak zatrzymać długotrwałe generowanie? Utwórz CancellationTokenSource z limitem czasu i przekaż jego token do SendMessageAsync. Przechwyć OperationCanceledException, aby obsłużyć limit czasu.

  4. 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.

  5. 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.

Read More