sgcAI 5분 시작 가이드
컴포넌트 하나, 공급자 속성 하나, 호출 하나면 돼요. 이 페이지에서는 Delphi 애플리케이션이 대규모 언어 모델과 대화하도록 만들고, 답변을 기다리는 대신 스트리밍으로 받는 방법을 보여 드려요. 많은 분이 걸려 넘어지는 플랫폼 제한도 분명하게 알려 드려요.
컴포넌트 하나, 공급자 속성 하나, 호출 하나면 돼요. 이 페이지에서는 Delphi 애플리케이션이 대규모 언어 모델과 대화하도록 만들고, 답변을 기다리는 대신 스트리밍으로 받는 방법을 보여 드려요. 많은 분이 걸려 넘어지는 플랫폼 제한도 분명하게 알려 드려요.
컴포넌트, 키, 모델 이름, 프롬프트가 필요해요. JSON을 만들 필요도, HTTP 클라이언트를 설정할 필요도 없어요.
SGC AI 팔레트 페이지의 TsgcAIChat이에요. 포함된 데모가 코드로 생성하는 TsgcAI_Chat을 감싼 얇은 published 래퍼예요.
클래스에는 sgcAI_Chat.pas를, 팔레트 컴포넌트에는 바렐 유닛 sgcAI.pas를 쓰세요. 데모는 uses sgcAI_Chat;라고 작성해요.
TsgcAIChatProvider 타입의 Provider예요. 멤버 일곱 개는 aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok, aicpMistral이에요. 코드의 나머지는 바뀌지 않아요.
TsgcAIChat은 Windows 전용으로 컴파일돼요. Win32와 Win64예요. 공급업체별 REST 클라이언트와 MCP 클라이언트 및 서버에는 제한이 없어요. 이유는 아래 표를 보세요.
에디션 열은 코드를 제어하는 define이며, Source/sgcVer.inc에서 그 define이 있는 줄 번호도 함께 적었어요.
| 항목 | 값 |
|---|---|
| IDE | Delphi 7부터 RAD Studio 13까지, 그리고 그에 대응하는 C++Builder 버전. ChatAsync는 {$IFDEF D2010}으로 감싸져 있어서 지원 하한이 더 높은 유일한 멤버예요. |
| Uses 절 | TsgcAI_Chat, TsgcAIChatProvider, 이벤트 타입을 위한 sgcAI_Chat. |
| 에디션, sgcWebSockets 안에서 | SGC_AI는 798번째 줄에 정의되어 있으며, 760번째 줄부터 839번째 줄까지 이어지는 {$IFDEF SGC_EDT_ENT} 블록 안에 있어요. 따라서 Enterprise 이상이며 Standard나 Professional은 아니에요. |
| 에디션, 독립 패키지 | sgcAI 제품은 854번째 줄에서 SGC_PACK_AI를 정의하고, 943번째 줄부터 957번째 줄까지의 자체 블록이 945번째 줄에서 SGC_AI를 정의해요. 라이브러리의 나머지 부분 없이 같은 컴포넌트를 쓸 수 있어요. |
| 왜 Windows 전용인가요 | SGC_AI의 두 정의는 모두 797번째 줄과 944번째 줄의 {$IFDEF MSWINDOWS} 안에 있어요. Windows가 아니면 이 define이 나타나지 않으므로 sgcAI_Chat.pas는 빈 유닛으로 컴파일돼요. 컴포넌트에도 ComponentPlatforms(pidWin32 or pidWin64)가 붙어 있어요. |
| 크로스플랫폼인 것 | 800번째 줄과 954번째 줄의 SGC_AI_MCP에는 플랫폼 가드가 없어요. 그래서 MCP 클라이언트와 서버는 Linux, macOS, iOS, Android에서도 실행돼요. 787번째 줄부터 793번째 줄까지의 공급자 define인 SGC_OPENAI, SGC_ANTHROPIC, SGC_GEMINI, SGC_DEEPSEEK, SGC_OLLAMA, SGC_GROK, SGC_MISTRAL도 플랫폼으로 제한되지 않아요. |
Linux 서비스나 모바일 앱을 만드나요? TsgcAIChat은 건너뛰고 공급업체 REST 클라이언트를 직접 호출하세요. 예를 들면 TsgcHTTP_API_OpenAI나 TsgcHTTP_API_Anthropic이에요. Delphi에서 LLM 호출하기 가이드에서 두 방법을 나란히 보여 줘요.
sgcAI는 sgcWebSockets 설치 프로그램에 들어 있고 독립 패키지로도 제공돼요. 어느 쪽이든 설치 방식은 같아요.
다운로드한 파일을 폴더에 압축 해제하세요. 아래에서는 이 폴더를 {$DIR}이라고 불러요.
Tools, Options, Library로 이동해요. {$DIR}\source와 사용하는 IDE의 lib 폴더를 추가하세요. 예를 들면 {$DIR}\libD13\$(Platform)이에요.
{$DIR}\Packages\ 아래에서 IDE 버전에 맞는 패키지 그룹을 여세요. 런타임 .dpk를 먼저 컴파일하고 그다음 디자인 타임 dcl 패키지를 설치해요.
컴포넌트 열다섯 개가 들어 있는 SGC AI 페이지가 나타나요. TsgcAIChat이 첫 번째예요. Windows가 아닌 대상에서 페이지가 보이지 않는 것은 정상이에요. SGC_AI가 Windows로 제한되어 있기 때문이에요.
호스팅되는 공급자를 쓰려면 해당 업체에서 직접 키를 발급받아 ChatOptions.ApiKey에 할당하세요. Ollama는 모델이 내 컴퓨터에서 실행되므로 키가 전혀 필요 없어요.
컴포넌트를 만들고, 공급자, 키, 모델을 설정한 다음, Chat을 호출해 반환된 문자열을 읽어요.
uses
Classes, SysUtils,
// sgc
sgcAI_Chat;
procedure TfrmUnifiedChat.btnChatClick(Sender: TObject);
var
oChat: TsgcAI_Chat;
begin
oChat := TsgcAI_Chat.Create(nil);
try
oChat.Provider := aicpOpenAI;
oChat.ChatOptions.ApiKey := GetApiKey;
oChat.ChatOptions.Model := 'gpt-4o-mini';
oChat.ChatOptions.MaxTokens := 1024;
oChat.SystemMessage := 'You are a concise assistant inside a Delphi ERP.';
memoResponse.Lines.Text := oChat.Chat(memoPrompt.Text);
finally
oChat.Free;
end;
end;
공급업체를 바꾸는 것은 한 줄이에요. Provider는 aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok, aicpMistral을 받아요. 나머지는 모두 그대로예요.
procedure TfrmUnifiedChat.OnChatStream(Sender: TObject; const aChunk: string;
var Cancel: Boolean);
begin
memoResponse.Text := memoResponse.Text + aChunk;
// set Cancel to stop the generation early
end;
procedure TfrmUnifiedChat.OnChatError(Sender: TObject; const aError: string);
begin
memoResponse.Text := 'error: ' + aError;
end;
procedure TfrmUnifiedChat.btnChatStreamClick(Sender: TObject);
begin
GetChat.Provider := aicpAnthropic;
GetChat.ChatOptions.ApiKey := GetApiKey;
GetChat.ChatOptions.Model := 'claude-sonnet-4-20250514';
GetChat.SystemMessage := memoSystem.Text;
memoResponse.Lines.Clear;
GetChat.ChatStream(memoPrompt.Text);
end;
데모는 컴포넌트를 GetChat에서 한 번만 만들고 거기서 OnChatStream과 OnChatError를 할당해요. ChatStream은 전체 답변도 반환하므로 반환값을 무시하고 이벤트만 쓰거나 둘 다 써도 돼요.
uses
Classes, SysUtils,
// sgc
sgcAI_Chat;
var
oChat: TsgcAI_Chat;
begin
oChat := TsgcAI_Chat.Create(nil);
try
// no API key at all: the model runs on this machine
oChat.Provider := aicpOllama;
oChat.ChatOptions.Model := 'llama3';
// BaseUrl is read only for the Ollama provider, and only when
// the server is not on the default address. Internally it is
// forwarded to the Ollama client's Host property.
oChat.ChatOptions.BaseUrl := 'http://localhost:11434';
Writeln(oChat.Chat('Summarise this invoice in one line.'));
finally
oChat.Free;
end;
end;
OllamaOptions.BaseUrl은 없어요. 원시 API 수준에서는 TsgcHTTP_API_Ollama의 OllamaOptions.Host가 그 속성이고, 이 계층에서 그 값을 채워 주는 것이 ChatOptions.BaseUrl이에요.
처음 두 탭은 포함된 데모 Demos\15.AI\02.Applications\06.UnifiedChat\fUnifiedChat.pas이며 폼 컨트롤은 리터럴로 바꿨어요. 세 번째 탭은 같은 컴포넌트를 로컬 Ollama 서버로 향하게 한 거예요. 같은 폴더의 두 번째 데모 07.ConversationHistory는 히스토리 API를 보여 줘요.
Chat은 호출이 실패해도 예외를 발생시키지 않아서 많은 분이 놀라요. 대신 빈 문자열을 반환하고 이벤트를 발생시켜요.
Chat은 어시스턴트의 텍스트를 string으로 반환해요. 빈 문자열은 호출이 실패했다는 뜻이에요. 실패해도 예외가 발생하지 않기 때문이에요.
OnChatErrorprocedure(Sender: TObject; const aError: string). Chat과 ChatStream 모두 예외를 잡아서 여기로 전달해요. 다른 무엇보다 먼저 연결해야 하는 이벤트예요.
OnChatStreamprocedure(Sender: TObject; const aChunk: string; var Cancel: Boolean). 모델이 아직 쓰는 중인데 메모에 텍스트가 나타난다면 버퍼링이 아니라 스트리밍이 동작하고 있다는 증거예요.
GetHistory는 컴포넌트가 다음 호출에서 다시 보낼 내용을 반환해요. MaxHistoryMessages로 상한을 정하고, ClearHistory로 처음부터 다시 시작해요.
실패한 첫 호출은 거의 다 여섯 가지 문제 중 하나가 원인이에요.
의도된 동작이에요. SGC_AI는 797번째 줄과 944번째 줄의 {$IFDEF MSWINDOWS} 안에서만 정의되므로 Linux, macOS, iOS, Android에서는 sgcAI_Chat.pas가 빈 유닛이 돼요. 그 대상에서는 공급업체 REST 클라이언트를 사용하세요.
Chat과 ChatStream은 예외를 삼키고 OnChatError로 전달해요. 시그니처는 procedure(Sender: TObject; const aError: string)이에요. 다른 것을 디버깅하기 전에 이 이벤트부터 연결하세요.
Ollama의 기본 주소는 공급업체 옵션 객체가 아니라 ChatOptions.BaseUrl에 지정해요. 내부적으로 OllamaOptions.Host로 전달되며, BaseUrl을 읽는 공급자는 Ollama뿐이에요.
Chat과 ChatStream은 동기 방식이에요. Delphi 2010 이상에서는 IsgcFuture<string>을 반환하는 ChatAsync를 쓰세요. 더 오래된 컴파일러에서는 직접 만든 스레드에서 호출을 실행하세요.
모델 이름은 컴포넌트가 아니라 공급업체의 것이며 자주 바뀌어요. ChatOptions.Model은 그대로 전달되므로, 공급업체 콘솔에서 동작하는 이름이면 여기서도 동작해요.
컴포넌트는 호출할 때마다 히스토리를 다시 보내며, 그래서 후속 질문이 동작해요. MaxHistoryMessages로 상한을 정하고 ClearHistory로 처음부터 다시 시작하세요.
프롬프트 상자는 시작일 뿐이에요. 아래 네 가지는 모두 이미 패키지에 들어 있어요.
TsgcAIOpenAIEmbeddings로 콘텐츠를 벡터로 바꾸고, TsgcAIDatabaseVectorFile이나 TsgcAIDatabaseVectorPinecone에 저장한 다음, 가장 가까운 구절을 찾아 프롬프트에 넣어요.
TsgcAIOpenAIChatBot은 녹음기, 음성 인식, 채팅 호출, 음성 합성을 하나의 컴포넌트로 연결해요. TsgcAIOpenAITranslator는 실시간 번역을 같은 방식으로 처리해요.
MCP 서버 컴포넌트는 애플리케이션을 어시스턴트가 호출할 수 있는 도구로 만들어 주고, MCP 클라이언트는 다른 서버를 사용해요. 둘 다 Windows로 제한되지 않으므로 Delphi로 작성한 MCP 서버를 Linux에서 실행할 수 있어요.
비전, 문서, 확장 사고, 배치, 이미지 생성, 음성 인식, 콘텐츠 검토는 중립적인 채팅 계층이 아니라 공급업체별 REST 클라이언트에 있어요.
레퍼런스 페이지에는 모든 옵션과 이벤트가 문서화되어 있어요. 데모 프로젝트는 다운로드 안의 Demos\15.AI 아래에 있어요.
| 가이드, Delphi에서 LLM 호출하기 스트리밍, 도구 호출, 호스팅과 로컬 비교까지 다루는 자세한 안내. | 열기 | |
레퍼런스, OpenAI 클라이언트
TsgcHTTP_API_OpenAI의 모든 메서드, 옵션, 이벤트.
|
열기 | |
레퍼런스, Anthropic 클라이언트
TsgcHTTP_API_Anthropic의 메시지, 도구, 비전, 배치, 토큰 계산.
|
열기 | |
| 레퍼런스, MCP 서버 어시스턴트가 내 애플리케이션을 호출할 수 있게 해 주는 컴포넌트. | 열기 | |
| TsgcAIChat 컴포넌트 페이지 채팅 컴포넌트의 모든 속성과 이벤트, 그리고 여기서 연결되는 나머지 열네 개 컴포넌트. | 열기 | |
| 온라인 도움말 자동 생성된 레퍼런스로, 항상 최신 릴리스와 일치해요. | 열기 |
함께 읽어 보세요. AI 기반 Delphi 앱 만들기, Delphi에서 공급자 비교하기, MCP 서버 작성하기. 모든 제품에는 각자의 빠른 시작이 있으며, 시작하기 페이지에서 모아 볼 수 있어요.
TsgcAIChat을 올리세요. sgcAI.pas에 선언된 published 래퍼이며, 감싸는 대상인 TsgcAI_Chat은 sgcAI_Chat.pas에 선언되어 있어요. 포함된 데모처럼 런타임에 객체를 만드는 코드는 TsgcAI_Chat과 uses sgcAI_Chat;을 써요. 두 방식 모두 같은 속성을 제공해요.
sgcVer.inc의 798번째 줄에 정의된 SGC_AI이며, 760번째 줄부터 839번째 줄까지 이어지는 SGC_EDT_ENT 블록 안에 있어요. 즉 Enterprise 에디션 이상이에요. 675번째 줄부터 724번째 줄까지의 Standard와 727번째 줄부터 758번째 줄까지의 Professional은 이를 정의하지 않아요. 라이브러리의 나머지가 필요 없다면, 독립 sgcAI 패키지가 854번째 줄에서 SGC_PACK_AI를 정의하고, 943번째 줄부터 957번째 줄까지의 자체 블록이 같은 컴포넌트를 켜요.
SGC_AI는 Enterprise 블록의 797번째 줄과 독립 팩 블록의 944번째 줄에 있는 {$IFDEF MSWINDOWS} 안에서만 정의되기 때문이에요. define이 없으면 sgcAI_Chat.pas와 sgcAI.pas의 TsgcAIChat 부분은 아무것도 컴파일되지 않아요. 디자인 타임에서도 ComponentPlatforms(pidWin32 or pidWin64)가 같은 제한을 적용해요. 그 대상에서는 대신 공급업체 REST 클라이언트를 호출하거나 플랫폼 가드가 없는 MCP 컴포넌트를 쓰세요.
Provider를 바꾸세요. aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok, aicpMistral을 받아요. 그다음 해당 공급업체의 키와 모델을 설정하세요. aicpOllama는 키가 없고, 서버가 기본 주소에 있지 않다면 ChatOptions.BaseUrl을 설정하세요. 컴포넌트가 내부적으로 Ollama 클라이언트에 전달해요.
Chat 대신 ChatStream을 호출하고 OnChatStream을 처리하세요. 시그니처는 procedure(Sender: TObject; const aChunk: string; var Cancel: Boolean)이에요. aChunk가 도착하는 대로 메모에 덧붙이고, 생성을 일찍 멈추려면 Cancel을 True로 설정하세요.
Chat과 ChatStream은 예외를 발생시키지 않아요. 예외를 잡아서 메시지와 함께 OnChatError를 발생시키고 빈 문자열을 반환해요. 그래서 처리하지 않은 OnChatError는 모델이 아무 말도 하지 않은 것과 똑같이 보여요. 가장 먼저 연결하세요.
{$IFDEF D2010}으로 감싸져 있고 IsgcFuture<string>을 반환하는 ChatAsync를 호출하세요. Delphi 7부터 2009까지는 그 메서드가 없으므로 직접 만든 스레드에서 Chat을 실행하세요.
MaxHistoryMessages는 다시 보낼 양의 상한을 정하고, ClearHistory는 새 대화를 시작하며, GetHistory는 저장된 메시지를 반환해요.