벡터 데이터베이스
Delphi에서 벡터 데이터베이스에 연결하여 의미 검색, RAG, AI 기반 애플리케이션을 구축해 보세요. Pinecone 등을 지원해요.
Delphi에서 벡터 데이터베이스에 연결하여 의미 검색, RAG, AI 기반 애플리케이션을 구축해 보세요. Pinecone 등을 지원해요.
텍스트를 고차원 임베딩으로 저장하고, 키워드가 아닌 의미를 기준으로 가장 관련성 높은 구절을 검색해 보세요.
벡터 데이터베이스는 임베딩 모델이 생성한 수치 임베딩을 저장하고, 쿼리 벡터에 가장 가까운 항목을 찾을 수 있게 해줘요. 이는 의미 검색과 검색 증강 생성(RAG)의 기반이에요. RAG에서는 모델이 학습 중에 암기한 내용에만 의존하는 대신, 사용자의 문서에서 가져온 구절로 대규모 언어 모델을 보강해요.
sgcWebSockets는 동일한 기본 컴포넌트인 TsgcAIDatabaseVector를 공유하는 두 가지 교체 가능한 벡터 저장소 백엔드를 제공해요. 따라서 적재 또는 쿼리 코드를 변경하지 않고도 한 백엔드를 다른 백엔드로 교체할 수 있어요. 두 백엔드 중 어느 쪽이든 TsgcAIOpenAIEmbeddings 컴포넌트와 함께 사용하면 원시 텍스트를 벡터로 변환하여 저장소에 곧바로 넣을 수 있어요.
어느 쪽을 언제 사용할까요: 인프라가 전혀 필요 없고 데이터가 한 머신에 충분히 들어갈 때는 파일 백엔드를 선택하세요. 인덱스가 크거나, 여러 프로세스 또는 사용자 간에 공유해야 하거나, 단일 호스트를 넘어 확장해야 할 때는 Pinecone을 선택하세요.
TsgcAIOpenAIEmbeddings 컴포넌트의 Database 속성에 벡터 저장소를 할당한 다음, CreateEmbeddingsFromFile을 호출하면 문서 전체를 한 번의 배치로 임베딩하여 적재할 수 있어요. 내부적으로 각 청크는 저장소가 TsgcAIDatabaseVector로부터 상속받은 BeginAddData / AddData / EndAddData 시퀀스를 통해 추가돼요. 따라서 파일 백엔드와 Pinecone 백엔드는 코드 관점에서 동일하게 동작해요.
쿼리 시점에는 GetEmbedding으로 사용자의 질문을 임베딩하고, 그 결과 벡터를 QueryData에 전달하면 코사인 유사도 순으로 정렬된 최근접 일치 결과를 반환해요. 이 구절들을 채팅 모델에 컨텍스트로 다시 전달하면 동작하는 RAG 파이프라인이 완성돼요. 자체 데이터에 근거하고 직접 제어하는 인용이 포함된 답변을 얻을 수 있어요. 동일한 방식으로 지식 베이스에 대한 의미 검색, 중복 제거, 추천, 클러스터링까지 모두 Delphi나 C++ Builder를 벗어나지 않고 구현할 수 있어요.
코퍼스를 적재하고 두 백엔드 중 어느 쪽으로든 최근접 이웃을 쿼리해 보세요.
uses
sgcAI, sgcAI_OpenAI_Embeddings,
sgcAI_DB_Vector, sgcAI_DB_Vector_File, sgcAI_DB_Vector_Pinecone;
var
Embeddings: TsgcAIOpenAIEmbeddings;
DBFile: TsgcAIDatabaseVectorFile;
DBPinecone: TsgcAIDatabaseVectorPinecone;
begin
Embeddings := TsgcAIOpenAIEmbeddings.Create(nil);
Embeddings.OpenAIOptions.ApiKey := 'sk-...';
// Local file-based vector store
DBFile := TsgcAIDatabaseVectorFile.Create(nil);
DBFile.VectorFileOptions.InputFilename := 'corpus.sgcif';
DBFile.VectorFileOptions.VectorFilename := 'corpus.sgcvf';
Embeddings.Database := DBFile;
Embeddings.CreateEmbeddingsFromFile('docs.txt');
// Or push to the Pinecone cloud index
DBPinecone := TsgcAIDatabaseVectorPinecone.Create(nil);
DBPinecone.PineconeOptions.ApiKey := 'pc-...';
DBPinecone.PineconeIndexOptions.IndexName := 'sgc-embeddings';
Embeddings.Database := DBPinecone;
// Query the nearest neighbour for an arbitrary text
Results := Embeddings.Database.QueryData(
Embeddings.GetEmbedding('what is sgcWebSockets?', ''));
end;