ベクトルデータベース
Delphi からベクトルデータベースに接続し、セマンティック検索、RAG、AI を活用したアプリケーションを構築できます。Pinecone などに対応しています。
Delphi からベクトルデータベースに接続し、セマンティック検索、RAG、AI を活用したアプリケーションを構築できます。Pinecone などに対応しています。
テキストを高次元のエンベディングとして保存し、キーワードではなく意味によって最も関連性の高い文章を取得します。
ベクトルデータベースは、エンベディングモデルが生成する数値エンベディングを保存し、クエリベクトルに最も近いエントリを見つけられるようにします。これはセマンティック検索および検索拡張生成 (RAG) の基盤となるものであり、モデルが学習時に記憶した内容だけに頼るのではなく、独自のドキュメントから取り出した文章で大規模言語モデルをグラウンディングします。
sgcWebSockets は、同じベース コンポーネント TsgcAIDatabaseVector を共有する、相互に置き換え可能な 2 つのベクトルストアバックエンドを提供します。そのため、取り込みやクエリのコードを変更することなく、一方を他方に差し替えられます。いずれのバックエンドも TsgcAIOpenAIEmbeddings コンポーネントと組み合わせることで、生のテキストをベクトルに変換し、そのままストアへ投入できます。
どちらを使うべきか: インフラ不要でデータがマシンに十分収まる場合は、ファイルバックエンドを選びましょう。インデックスが大きい、複数のプロセスやユーザーで共有する必要がある、または単一ホストを超えてスケールさせる必要がある場合は、Pinecone を選択します。
ベクトルストアを TsgcAIOpenAIEmbeddings コンポーネントの Database プロパティに割り当て、CreateEmbeddingsFromFile を呼び出すと、ドキュメント全体を 1 つのバッチでエンベディングして取り込めます。内部的には、各チャンクはストアが 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;