Delphi'de Bir AI Sohbet Botu Oluşturun: Konuşma Belleği ve Akış

· Bileşenler

Hızlı yanıt: bir sohbet botu, bir sohbet tamamlaması artı bellektir. sgcWebSockets, tüm mesaj geçmişini sizin için tutan özel bir TsgcAIChat bileşeni sunar, böylece her tur o ana kadarki konuşmayla birlikte gönderilir ve model bağlam içinde yanıt verebilir. Bileşeni bırakın, API anahtarını ve modeli ayarlayın, ardından bir yanıt için Chat veya canlı, token token bir yazma etkisi için ChatStream çağırın. Konuşmayı temizlemek, ClearHistory'ye yapılan tek bir çağrıdır.

Delphi'den bir LLM çağırdıysanız, muhtemelen sinir bozucu bir şey fark etmişsinizdir: bir takip sorusu sorduğunuzda, model sizinle hiç konuşmamış gibi davranır. Bu bir hata değil, tek seferlik bir tamamlamanın çalışma biçimidir. Bunu gerçek bir konuşma asistanına dönüştürmek, bir oyuncak ile bir sohbet botu arasındaki farktır ve tek bir fikre dayanır: bellek.

Tek seferlik tamamlama ile bir sohbet botu

Bir LLM API'si durumsuzdur. Her istek bağımsızdır, dolayısıyla model yalnızca o isteğe koyduğunuz şeyi bilir. Tek seferlik bir çağrı tek bir istem gönderir:

// User: "What is the capital of France?"  ->  "Paris."
// User: "And its population?"             ->  "Population of what?"

İkinci soru başarısız olur çünkü sunucu birincisinden hiçbir şey saklamadı. Bir sohbet botu bunu tüm alışverişi her seferinde yeniden göndererek düzeltir: sistem mesajı, her kullanıcı turu ve her asistan yanıtı, sırasıyla. Model geçmişi okur, "onun"un Paris'i kastettiğini görür ve doğru yanıt verir. Bunun için bir veritabanına veya bir oturum sunucusuna ihtiyacınız yok, yalnızca konuşmayla birlikte büyüyen bir mesaj listesine. Tek gerçek iş, bu listeyi oluşturmak ve sürdürmektir ve sohbet botu bileşeninin sizin için yaptığı tam olarak budur.

TsgcAIChat bileşeni: bellek sizin için yönetilir

Bir mesaj dizisini elle bağlamak yerine, formunuza bir TsgcAIChat bırakın. Konuşma geçmişine dahili olarak sahip olur, her kullanıcı mesajını ve her asistan yanıtını otomatik olarak ekler ve her çağrıda birikmiş bağlamı gönderir. Sağlayıcıyı, API anahtarını ve bir modeli ayarlarsınız, sonra yalnızca Chat çağırırsınız.

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;

Bileşen ilk turu hatırladığı için, takip sorusu sorunsuz çalışır. SystemMessage, asistanın kişiliğini belirler ve her istekle birlikte gönderilir. Yeni bir konuşma istediğinizde Bot.ClearHistory çağırın; söylenenleri incelemek ya da kalıcı kılmak için Bot.GetHistory mesaj listesini döndürür. Ayrıca MaxHistoryMessages ile belleği sınırlayabilirsiniz, böylece uzun bir sohbet sınırsız büyümez (daha eski turlar otomatik olarak budanır).

Aynı bileşen, sgcWebSockets'in desteklediği her sağlayıcıyla konuşur. ProvideraicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok ya da aicpMistral'a çevirin, model adını değiştirin ve sohbet botu kodunuzun geri kalanı aynı kalsın. ChatBot bileşeni sayfasına ve AI & LLM bileşenleri merkezine bakın.

Canlı bir yanıtı akışla almak

Tam bir yanıtın görünmesi için birkaç saniye beklemek yavaş hissettirir. Gerçek sohbet botları yanıtı akışla alır, böylece sözcükler üretildikçe görünür, tanıdık yazma etkisi. TsgcAIChat bunu, her metin parçası geldikçe tetiklenen ChatStream ve OnChatStream olayı aracılığıyla sunar.

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;

Parçalar kaputun altında Server-Sent Events üzerinden artımlı olarak teslim edilir, ancak SSE tesisatına hiç dokunmazsınız. Akış bittiğinde, tam asistan yanıtı tıpkı akışsız bir çağrı gibi geçmişe eklenir, böylece bir sonraki turun hâlâ tam bağlamı olur. Cancel parametresi, bir "üretmeyi durdur" düğmesi uygulamanızı sağlar. Ayrıca nihai birleştirilmiş mesaj için OnChatMessage ve herhangi bir API başarısızlığını yüzeye çıkarmak için OnChatError da vardır.

Baştan sona bir sesli sohbet botu

Asistanın dinleyip konuşmasını istiyorsanız, TsgcAIOpenAIChatBot bileşeni tüm döngüyü sarmalar: mikrofon sesini yakalar, Whisper ile yazıya döker, metni Chat Completions'a gönderir ve yanıtı bir metinden konuşmaya sağlayıcısı aracılığıyla geri seslendirir. Bir ses kaydedici ve bir metinden konuşmaya motoru takın, anahtarı ayarlayın ve Start çağırın.

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;

OnChatCompletion olayı, her yanıtın rolünü ve içeriğini verir ve OnTranscription, gönderilmeden önce duyulanı incelemenizi ya da düzenlemenizi sağlar. Bu, TsgcAIChat ile aynı konuşma fikridir, yalnızca her iki uçta da ses vardır.

Listeyi kendiniz yönetmeyi mi tercih edersiniz?

Sohbet botu bileşenini kullanmak zorunda değilsiniz. Tam denetim istiyorsanız, kendi { role, content } mesaj listenizi tutun ve her çağrıda onu TsgcHTTP_API_OpenAI._CreateChatCompletion ile gönderin. Kullanıcı mesajını ekleyin, diziyi gönderin, ardından bir sonraki turdan önce asistanın yanıtını aynı listeye geri ekleyin. Bu, TsgcAIChat'in dahili olarak yaptığı kayıt işinin tam olarak kendisidir, bu yüzden çoğu kişi bunu bileşene bırakır. Alt düzey API, Delphi'de OpenAI API eğitiminde ve OpenAI bileşeni sayfasında ele alınmıştır.

Başlarken

Buradaki her şey sgcWebSockets ile gelir. Ücretsiz denemeyi edinin, bir forma bir TsgcAIChat bırakın, API anahtarını ve modeli ayarlayın ve birkaç satırda takip sorularını yanıtlayan bağlam farkındalıklı bir sohbet botunuz olsun. Hazır olduğunuzda canlı yazma etkisi için ChatStream ekleyin.

Sorularınız, geri bildiriminiz mi var ya da onu uygulamanıza bağlama konusunda yardım mı istiyorsunuz? İletişime geçin — kodu yazan kişilerden yanıt alacaksınız.

İlgili