独自データで OpenAI をカスタマイズ (2 / 2)

· 機能

前回の記事では、OpenAI のチャットメソッドに文脈情報を追加するために OpenAI Embeddings を使用する方法を紹介しました。

今回は、sgcWebSockets パッケージの TsgcOpenAIEmbeddings コンポーネントを使用して、独自データで AI アプリケーションを構築する方法を紹介します。

Delphi Voice ChatBot に関する以前の記事では、TsgcAIOpenAIChatBot コンポーネントを使用して音声で操作するチャットボットを構築しました。今回は、2021 年までに学習された OpenAI のデータだけでなく、独自のカスタムデータも追加してチャットボットを拡張し、ヘルプファイルとパッケージのインターフェースから取得したデータを使った 質問応答 (Questions & Answers) を構築します。


独自データをベクトルに変換

最初のステップは、sgcWebSockets の PDF マニュアルをテキストに変換することです。このファイルを使用して、パッケージの設定方法やコンポーネントの使い方など、有用な情報を含むエンベディングを作成します。この情報は OpenAI に質問する際に使用されます。

PDF マニュアルをテキスト形式にしたら、TsgcAIOpenAIEmbeddings コンポーネントを使用してファイルの各セクションのベクトルを OpenAI から取得し、今回はテキストファイルに保存します (本番環境では Pinecone などのベクトルデータベースを使用できます)。

procedure ConvertFileToVector;
var
  oDialog: TOpenDialog;
  oEmbeddings: TsgcAIOpenAIEmbeddings;
  oFile: TsgcAIDatabaseVectorFile;  
begin
  oDialog := TOpenDialog.Create(nil);
  Try
    oDialog.Filter := 'TXT Files|*.txt';
    if oDialog.Execute then
    begin
      oEmbeddings := TsgcAIOpenAIEmbeddings.Create(nil);
      Try
        oFile := TsgcAIDatabaseVectorFile.Create(nil);
        Try
          oEmbeddings.Database := oFile;
          oEmbeddings.OpenAIOptions.ApiKey := '<your api key>';
          oEmbeddings.CreateEmbeddingsFromFile(oDialog.FileName);
        Finally
          oFile.Free;
        End;
      Finally
        oEmbeddings.Free;
      End;
    end;
  Finally
    FreeAndNil(oDialog);
  End;
end; 

チャットボットとエンベディング

すべてのデータをベクトルに変換したら、独自のモデルを構築できます。基本的な考え方はとてもシンプルです。ボットに質問するたびに、まず質問をベクトルに変換し、データベースから質問に最も類似するベクトルを検索します。最後に、質問に最も類似するデータを文脈として追加します。

procedure AskToChatGPT(const aQuestion: string);
var
  oChatBot: TsgcAIOpenAIChatBot;
  oEmbeddings: TsgcAIOpenAIEmbeddings;
  oFile: TsgcAIDatabaseVectorFile;  
  vContext: string;
begin
  oChatBot := TsgcAIOpenAIChatBot.Create(nil);
  Try
    oChatBot.OpenAIOptions.ApiKey := '<your api key>';
    oEmbeddings := TsgcAIOpenAIEmbeddings.Create(nil);
    Try
      oChatBot.Embeddings := oEmbeddings;
      oFile := TsgcAIDatabaseVectorFile.Create(nil);
      Try
        oEmbeddings.Database := oFile;
        vContext := oChatBot.GetEmbedding(aQuestion);
        oChatBot.ChatAsUser('Answer the question based on the context below.\n\nContext:\n' + 
          vContext + '\nQuestion:' + aQuestion + '\nAnswer:');
      Finally
        oFile.Free;
      End;
    Finally
      oEmbeddings.Free;
    End;
  Finally
    FreeAndNil(oDialog);
  End;
end; 

Delphi Windows デモ

以下に、sgcWebSockets AI パッケージを使用した Delphi のサンプルを示します。カスタマイズしたデータで質問応答アプリケーションを構築する方法を示しています。このデモには 2 つのプロジェクトが含まれます。

1. sgcCreateEmbeddings: このプロジェクトはテキストファイルを読み込み、チャンクに分割して各チャンクをベクトルに変換し、データベースファイルに保存します。デモには使いやすさのためにテキストファイル形式のベクトルデータベースがすでに含まれています。

2. sgcQuestionsAnswers: 上記のデータベースレコードを使用し、ユーザーがチャットボットに質問するたびに、まずアプリケーションがデータベースから質問に最も類似する文脈を検索し、文脈情報として追加することで、チャットボットがより正確な応答を提供できるようにします。