빠른 답변: 챗봇은 채팅 완성에 메모리를 더한 것입니다. sgcWebSockets는 전체 메시지 히스토리를 대신 관리해 주는 전용 TsgcAIChat 컴포넌트를 제공하므로, 매 차례마다 지금까지의 대화가 함께 전송되어 모델이 맥락 속에서 답할 수 있습니다. 컴포넌트를 놓고, API 키와 모델을 설정한 다음, 응답에는 Chat을, 실시간 토큰 단위 타이핑 효과에는 ChatStream을 호출하세요. 대화를 비우는 것은 ClearHistory 한 번의 호출입니다.
이미 Delphi에서 LLM을 호출해 본 적이 있다면, 아마 답답한 점을 눈치챘을 겁니다. 후속 질문을 하면 모델은 마치 당신과 한 번도 이야기한 적 없는 것처럼 행동합니다. 그것은 버그가 아니라 일회성 완성이 작동하는 방식입니다. 그것을 진짜 대화형 어시스턴트로 바꾸는 것이 장난감과 챗봇의 차이이며, 핵심은 한 가지 아이디어로 귀결됩니다. 바로 메모리입니다.
일회성 완성 대 챗봇
LLM API는 무상태입니다. 각 요청은 독립적이라, 모델은 그 요청에 넣은 것만 압니다. 일회성 호출은 단일 프롬프트를 보냅니다.
// User: "What is the capital of France?" -> "Paris."
// User: "And its population?" -> "Population of what?"
두 번째 질문이 실패하는 이유는 서버가 첫 번째 질문에서 아무것도 보관하지 않았기 때문입니다. 챗봇은 매번 전체 교환을 다시 보내 이를 해결합니다. 시스템 메시지, 모든 사용자 차례, 그리고 모든 어시스턴트 응답을 순서대로요. 모델은 히스토리를 읽고 "its"가 Paris를 가리킨다는 것을 알아채 올바르게 답합니다. 이를 위해 데이터베이스나 세션 서버는 필요 없고, 대화와 함께 늘어나는 메시지 목록만 있으면 됩니다. 유일한 실제 작업은 그 목록을 구성하고 유지하는 것이며, 그것이 바로 챗봇 컴포넌트가 당신을 위해 해주는 일입니다.
TsgcAIChat 컴포넌트: 메모리를 대신 처리
메시지 배열을 손으로 엮는 대신, TsgcAIChat을 폼에 놓으세요. 이 컴포넌트는 대화 히스토리를 내부적으로 소유하고, 각 사용자 메시지와 각 어시스턴트 응답을 자동으로 덧붙이며, 매 호출마다 누적된 컨텍스트를 보냅니다. 제공자, API 키, 모델을 설정한 다음 그저 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;
컴포넌트가 첫 번째 차례를 기억하기 때문에, 후속 질문이 그냥 작동합니다. SystemMessage는 어시스턴트의 페르소나를 설정하며 매 요청에 포함됩니다. 새 대화를 원하면 Bot.ClearHistory를 호출하세요. 무엇이 오갔는지 검사하거나 보존하려면 Bot.GetHistory가 메시지 목록을 반환합니다. MaxHistoryMessages로 메모리에 상한을 두어 긴 채팅이 무제한으로 늘어나지 않게 할 수도 있습니다(오래된 차례는 자동으로 정리됩니다).
같은 컴포넌트가 sgcWebSockets가 지원하는 모든 제공자와 대화합니다. Provider를 aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok 또는 aicpMistral로 전환하고 모델 이름을 바꾸면, 나머지 챗봇 코드는 동일하게 유지됩니다. ChatBot 컴포넌트 페이지와 AI & LLM 컴포넌트 허브를 보세요.
실시간 응답 스트리밍
전체 답변이 나타날 때까지 몇 초를 기다리면 느리게 느껴집니다. 실제 챗봇은 응답을 스트리밍해 단어가 생성되는 대로 나타나도록 합니다. 익숙한 타이핑 효과죠. TsgcAIChat은 이를 ChatStream과 OnChatStream 이벤트를 통해 노출하며, 이 이벤트는 텍스트 청크가 도착할 때마다 발생합니다.
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;
청크는 내부적으로 Server-Sent Events를 통해 점진적으로 전달되지만, 당신은 SSE 배관을 결코 건드리지 않습니다. 스트림이 끝나면, 완성된 어시스턴트 응답이 스트리밍하지 않은 호출과 똑같이 히스토리에 추가되므로, 다음 차례도 여전히 완전한 컨텍스트를 갖습니다. Cancel 매개변수로 "생성 중지" 버튼을 구현할 수 있습니다. 최종으로 조립된 메시지를 위한 OnChatMessage와, API 실패를 드러내는 OnChatError도 있습니다.
음성 챗봇, 처음부터 끝까지
어시스턴트가 듣고 말하기를 원한다면, TsgcAIOpenAIChatBot 컴포넌트가 전체 루프를 감쌉니다. 마이크 오디오를 캡처하고, Whisper로 전사하고, 텍스트를 Chat Completions에 보내고, 답변을 text-to-speech 제공자를 통해 다시 말합니다. 오디오 레코더와 text-to-speech 엔진을 꽂고, 키를 설정한 다음 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;
OnChatCompletion 이벤트는 각 응답의 역할과 내용을 제공하고, OnTranscription은 들린 내용이 전송되기 전에 그것을 검사하거나 편집하게 해줍니다. TsgcAIChat과 같은 대화형 아이디어이며, 양쪽 끝에 오디오가 더해졌을 뿐입니다.
목록을 직접 관리하고 싶나요?
챗봇 컴포넌트를 반드시 써야 하는 것은 아닙니다. 완전한 제어를 원하면, 자신만의 { role, content } 메시지 목록을 유지하면서 매 호출마다 TsgcHTTP_API_OpenAI._CreateChatCompletion으로 보내세요. 사용자 메시지를 덧붙이고, 배열을 보낸 다음, 다음 차례 전에 어시스턴트의 응답을 같은 목록에 다시 덧붙입니다. 그것이 바로 TsgcAIChat이 내부적으로 하는 장부 정리이므로, 대부분의 사람들은 컴포넌트에 맡깁니다. 더 낮은 수준의 API는 Delphi에서 OpenAI API 튜토리얼과 OpenAI 컴포넌트 페이지에서 다룹니다.
시작하기
여기 있는 모든 것은 sgcWebSockets에 포함되어 있습니다. 무료 평가판을 받아서, TsgcAIChat을 폼에 놓고, API 키와 모델을 설정하면, 몇 줄로 후속 질문에 답하는 맥락 인식 챗봇을 갖게 됩니다. 준비가 되면 실시간 타이핑 효과를 위해 ChatStream을 추가하세요.
질문, 피드백이 있거나 앱에 연결하는 데 도움이 필요하신가요? 문의하기 — 코드를 작성한 사람들로부터 답변을 받게 됩니다.
