Szybka odpowiedź: chatbot to uzupełnienie czatu plus pamięć. sgcWebSockets dostarcza dedykowany komponent TsgcAIChat, który utrzymuje za Ciebie pełną historię wiadomości, dzięki czemu każda tura jest wysyłana z dotychczasową rozmową, a model może odpowiadać w kontekście. Upuść komponent, ustaw klucz API i model, a następnie wywołaj Chat dla odpowiedzi lub ChatStream dla efektu pisania na żywo, token po tokenie. Wyczyszczenie rozmowy to jedno wywołanie ClearHistory.
Jeśli już wywoływałeś LLM z Delphi, prawdopodobnie zauważyłeś coś frustrującego: zadaj pytanie uzupełniające, a model zachowuje się, jakby nigdy wcześniej z Tobą nie rozmawiał. To nie jest błąd, tak właśnie działa jednorazowe uzupełnienie. Zamiana tego w prawdziwego asystenta konwersacyjnego to różnica między zabawką a chatbotem, a sprowadza się do jednej idei: pamięci.
Jednorazowe uzupełnienie kontra chatbot
API LLM jest bezstanowe. Każde żądanie jest niezależne, więc model wie tylko to, co umieścisz w tym żądaniu. Jednorazowe wywołanie wysyła pojedynczy prompt:
// User: "What is the capital of France?" -> "Paris."
// User: "And its population?" -> "Population of what?"
Drugie pytanie zawodzi, ponieważ serwer nic nie zachował z pierwszego. Chatbot to naprawia, wysyłając ponownie całą wymianę za każdym razem: wiadomość systemową, każdą turę użytkownika i każdą odpowiedź asystenta, po kolei. Model czyta historię, widzi, że „jej” odnosi się do Paryża, i odpowiada poprawnie. Nie potrzebujesz do tego bazy danych ani serwera sesji, tylko listy wiadomości, która rośnie wraz z rozmową. Jedyną prawdziwą pracą jest budowanie i utrzymywanie tej listy, i to właśnie robi za Ciebie komponent chatbota.
Komponent TsgcAIChat: pamięć obsłużona za Ciebie
Zamiast ręcznie składać tablicę wiadomości, upuść TsgcAIChat na swój formularz. Posiada wewnętrznie historię rozmowy, automatycznie dołącza każdą wiadomość użytkownika i każdą odpowiedź asystenta oraz wysyła nagromadzony kontekst przy każdym wywołaniu. Ustawiasz dostawcę, klucz API i model, a potem po prostu wywołujesz Chat.
uses
sgcAI, sgcAI_Chat;
var
Bot: TsgcAIChat;
begin
Bot := TsgcAIChat.Create(nil);
Bot.Provider := aicpOpenAI;
Bot.ChatOptions.ApiKey := 'sk-...';
Bot.ChatOptions.Model := 'gpt-4o-mini';
Bot.SystemMessage := 'You are a concise assistant for Delphi developers.';
// Each call adds to the same conversation:
ShowMessage(Bot.Chat('What is the capital of France?')); // "Paris."
ShowMessage(Bot.Chat('And its population?')); // answers about Paris
end;
Ponieważ komponent pamięta pierwszą turę, pytanie uzupełniające po prostu działa. SystemMessage ustawia osobowość asystenta i jest dołączane do każdego żądania. Gdy chcesz świeżą rozmowę, wywołaj Bot.ClearHistory; aby przejrzeć lub utrwalić to, co zostało powiedziane, Bot.GetHistory zwraca listę wiadomości. Możesz też ograniczyć pamięć za pomocą MaxHistoryMessages, aby długi czat nie rósł bez ograniczeń (starsze tury są przycinane automatycznie).
Ten sam komponent rozmawia z każdym dostawcą obsługiwanym przez sgcWebSockets. Przełącz Provider na aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok lub aicpMistral, zmień nazwę modelu, a reszta Twojego kodu chatbota pozostaje identyczna. Zobacz stronę komponentu ChatBot oraz centrum komponentów AI i LLM.
Strumieniowanie odpowiedzi na żywo
Czekanie kilku sekund na pojawienie się pełnej odpowiedzi wydaje się wolne. Prawdziwe chatboty strumieniują odpowiedź, więc słowa pojawiają się w miarę ich generowania, znany efekt pisania. TsgcAIChat udostępnia to przez ChatStream oraz zdarzenie OnChatStream, które wyzwala się dla każdej porcji tekstu w miarę jej napływania.
Bot.OnChatStream := BotChatStream;
Bot.ChatStream('Explain WebSockets in two sentences.');
procedure TForm1.BotChatStream(Sender: TObject; const aChunk: string;
var Cancel: Boolean);
begin
Memo1.Text := Memo1.Text + aChunk; // append each token as it arrives
// set Cancel := True to stop the response early
end;
Porcje są dostarczane przyrostowo przez Server-Sent Events pod maską, ale nigdy nie dotykasz instalacji SSE. Gdy strumień się kończy, kompletna odpowiedź asystenta jest dodawana do historii tak samo jak przy wywołaniu bez strumieniowania, więc kolejna tura nadal ma pełny kontekst. Parametr Cancel pozwala zaimplementować przycisk „zatrzymaj generowanie”. Jest też OnChatMessage dla ostatecznie złożonej wiadomości oraz OnChatError, by wyświetlać wszelkie błędy API.
Chatbot głosowy, od początku do końca
Jeśli chcesz, aby asystent słuchał i mówił, komponent TsgcAIOpenAIChatBot opakowuje całą pętlę: przechwytuje dźwięk z mikrofonu, transkrybuje go za pomocą Whisper, wysyła tekst do Chat Completions i odczytuje odpowiedź przez dostawcę zamiany tekstu na mowę. Podłącz nagrywarkę dźwięku i silnik zamiany tekstu na mowę, ustaw klucz i wywołaj Start.
uses
sgcAI, sgcAI_OpenAI_Audio_ChatBot,
sgcAI_AudioRecorder_MCI, sgcAI_TextToSpeech_System;
var
ChatBot: TsgcAIOpenAIChatBot;
begin
ChatBot := TsgcAIOpenAIChatBot.Create(nil);
ChatBot.OpenAIOptions.ApiKey := 'sk-...';
ChatBot.AudioRecorder := TsgcAudioRecorderMCI.Create(nil);
ChatBot.TextToSpeech := TsgcTextToSpeechSystem.Create(nil);
ChatBot.OnChatCompletion := ChatBotChatCompletion;
ChatBot.Start; // begin listening; Stop ends it
ChatBot.ChatAsUser('Tell me a joke'); // or push a turn programmatically
end;
Zdarzenie OnChatCompletion daje Ci rolę i treść każdej odpowiedzi, a OnTranscription pozwala przejrzeć lub edytować to, co usłyszano, zanim zostanie wysłane. To ta sama idea konwersacyjna co TsgcAIChat, tylko z dźwiękiem po obu stronach.
Wolisz sam zarządzać listą?
Nie musisz używać komponentu chatbota. Jeśli chcesz pełnej kontroli, prowadź własną listę wiadomości { role, content } i wysyłaj ją przy każdym wywołaniu za pomocą TsgcHTTP_API_OpenAI._CreateChatCompletion. Dołącz wiadomość użytkownika, wyślij tablicę, a potem dołącz odpowiedź asystenta z powrotem do tej samej listy przed kolejną turą. To dokładnie ta księgowość, którą TsgcAIChat wykonuje wewnętrznie, więc większość osób pozwala komponentowi się tym zająć. API niższego poziomu jest omówione w samouczku OpenAI API w Delphi oraz na stronie komponentu OpenAI.
Jak zacząć
Wszystko tutaj jest dostarczane w sgcWebSockets. Pobierz bezpłatną wersję próbną, upuść TsgcAIChat na formularzu, ustaw klucz API i model, a będziesz mieć świadomego kontekstu chatbota odpowiadającego na pytania uzupełniające w kilku liniach. Dodaj ChatStream dla efektu pisania na żywo, gdy będziesz gotowy.
Pytania, uwagi lub pomoc w podłączeniu tego do Twojej aplikacji? Skontaktuj się z nami — odpowiedź otrzymasz od ludzi, którzy napisali ten kod.
