Google Vertex AI przez gRPC w Delphi

· Komponenty

Vertex AI to platforma generatywnej sztucznej inteligencji firmy Google w Google Cloud. Udostępnia modele Gemini przez gRPC PredictionService, gdzie wywołanie GenerateContent wysyła Twój prompt i zwraca odpowiedź modelu. sgcWebSockets Enterprise dostarcza typowanego klienta gRPC Vertex AI, który działa na TsgcGRPCClient, więc możesz wywoływać Gemini z Delphi i C++Builder bezpośrednio przez gRPC, bez żadnego zewnętrznego środowiska uruchomieniowego i bez ręcznego składania Protocol Buffers.

Jak to działa

gRPC to komunikaty Protocol Buffers opakowane w HTTP/2, więc wywołanie Vertex AI to żądanie HTTP/2 do regionalnego punktu końcowego aiplatform.googleapis.com. Transportem jest TsgcHTTP2Client wskazujący na host regionu na porcie 443 z włączonym TLS, a TsgcGRPCClient obsługuje na jego podstawie opakowywanie, nagłówki, limity czasu i trailery.

Komponent pomocniczy Vertex AI to zestaw typowanych klas komunikatów w sgcGRPC_Google_VertexAI. Budujesz TsgcGRPCVertexAIGenerateContentRequest w kodzie, serializujesz go za pomocą ToBytes, przekazujesz bajty klientowi gRPC, a następnie wczytujesz bajty odpowiedzi z powrotem do TsgcGRPCVertexAIGenerateContentResponse. Żądanie odzwierciedla schemat Vertex AI: żądanie zawiera nazwę zasobu modelu i listę treści, każda treść ma rolę oraz jedną lub więcej części, a część przechowuje tekst albo osadzone dane binarne.

Vertex AI korzysta z uwierzytelniania przez konto usługi Google Cloud. Klient podpisuje JWT konta usługi i wysyła go jako nagłówek authorization: Bearer w metadanych gRPC, więc każde wywołanie jest uwierzytelniane wobec regionalnego punktu końcowego Vertex AI.

Uwierzytelnianie za pomocą konta usługi

Klient Google Cloud podpisuje samodzielnie podpisany JWT konta usługi z Twojego klucza JSON konta usługi. Ten JWT jest powiązany z odbiorcą, więc musi być skierowany na regionalny punkt końcowy Vertex AI, w przeciwnym razie aiplatform.googleapis.com odrzuci go z UNAUTHENTICATED. Gdy token zostanie uzyskany, dodaj go do DefaultMetadata klienta gRPC, aby towarzyszył każdemu wywołaniu.

uses
  sgcHTTP_Google_Cloud, sgcGRPC_Client;

// CloudClient is a TsgcHTTPGoogleCloud_PubSub_Client used here only to sign the JWT
CloudClient.GoogleCloudOptions.Authentication := gcaJWT;
CloudClient.GoogleCloudOptions.JWT.ClientEmail   := ClientEmail;
CloudClient.GoogleCloudOptions.JWT.PrivateKeyId  := PrivateKeyId;
CloudClient.GoogleCloudOptions.JWT.PrivateKey.Text := PrivateKey;
CloudClient.GoogleCloudOptions.JWT.ProjectId     := ProjectId;
CloudClient.GoogleCloudOptions.JWT.API_Endpoint  :=
  'https://' + Region + '-aiplatform.googleapis.com/';

// after the token arrives in OnAuthToken
GRPC.DefaultMetadata.Clear;
GRPC.DefaultMetadata.Add('authorization', 'Bearer ' + Token);

Konfigurowanie transportu

Utwórz TsgcHTTP2Client dla hosta regionalnego i przypisz go do klienta gRPC. Vertex AI mówi w application/grpc+proto, więc pozostaw typ zawartości kanału na grpcProto.

uses
  sgcHTTP2_Client, sgcGRPC_Client, sgcGRPC_Types;

HTTP2 := TsgcHTTP2Client.Create(nil);
HTTP2.Host := Region + '-aiplatform.googleapis.com';   // e.g. us-central1-...
HTTP2.Port := 443;
HTTP2.TLS  := True;

GRPC := TsgcGRPCClient.Create(nil);
GRPC.Client := HTTP2;
GRPC.ChannelOptions.ContentType := grpcProto;
GRPC.ChannelOptions.Compression := grpcNoCompression;

HTTP2.Active := True;

Generowanie treści z promptu

Zbuduj żądanie z typowanych klas komunikatów. Model to pełna nazwa zasobu, jedyna treść ma rolę user, a prompt trafia do części tekstowej. Call blokuje, dopóki nie nadejdzie odpowiedź, i zwraca TsgcGRPCResponse z surowymi bajtami Data, które wczytujesz do typowanej odpowiedzi.

uses
  sgcGRPC_Client, sgcGRPC_Types, sgcGRPC_Google_VertexAI;

var
  oRequest: TsgcGRPCVertexAIGenerateContentRequest;
  oContent: TsgcGRPCVertexAIContent;
  oPart: TsgcGRPCVertexAIPart;
  oResponse: TsgcGRPCResponse;
begin
  oRequest := TsgcGRPCVertexAIGenerateContentRequest.Create;
  try
    oRequest.Model := 'projects/' + ProjectId + '/locations/' + Region +
      '/publishers/google/models/' + Model;   // e.g. gemini-2.0-flash

    oContent := oRequest.AddContent;
    oContent.Role := 'user';
    oPart := oContent.AddPart;
    oPart.Text := 'Explain gRPC in one sentence.';

    oResponse := GRPC.Call(
      'google.cloud.aiplatform.v1.PredictionService', 'GenerateContent',
      oRequest.ToBytes);

    if oResponse.StatusCode = grpcOK then
      ParseResponse(oResponse.Data)
    else
      ShowMessage('gRPC error: ' + oResponse.StatusMessage);
  finally
    oRequest.Free;
  end;
end;

Odczytywanie odpowiedzi

Wczytaj bajty odpowiedzi do TsgcGRPCVertexAIGenerateContentResponse. Udostępnia ona kandydatów, każdego z jego częściami treści i powodem zakończenia, plus blok UsageMetadata z liczbą tokenów promptu, kandydata i sumarycznych.

procedure ParseResponse(const aData: TBytes);
var
  oResponse: TsgcGRPCVertexAIGenerateContentResponse;
  oCandidate: TsgcGRPCVertexAICandidate;
  i, j: Integer;
begin
  oResponse := TsgcGRPCVertexAIGenerateContentResponse.Create;
  try
    oResponse.LoadFromBytes(aData);
    for i := 0 to oResponse.CandidateCount - 1 do
    begin
      oCandidate := oResponse.Candidate(i);
      for j := 0 to oCandidate.Content.PartCount - 1 do
        Memo1.Lines.Add(oCandidate.Content.Part(j).Text);
    end;
    Memo1.Lines.Add('Total tokens: ' +
      IntToStr(oResponse.UsageMetadata.TotalTokenCount));
  finally
    oResponse.Free;
  end;
end;

Konfiguracja generowania i ustawienia bezpieczeństwa

Żądanie zawiera również opcjonalny GenerationConfig i listę ustawień bezpieczeństwa. Użyj konfiguracji do kontrolowania próbkowania i długości: Temperature, TopP, TopK, CandidateCount, MaxOutputTokens i StopSequences. Każde ustawienie bezpieczeństwa łączy Category szkodliwości z blokującym Threshold.

oRequest.GenerationConfig.Temperature     := 0.7;
oRequest.GenerationConfig.MaxOutputTokens := 1024;
oRequest.GenerationConfig.StopSequences.Add('END');

with oRequest.AddSafetySetting do
begin
  Category  := 7;   // HARM_CATEGORY_DANGEROUS_CONTENT
  Threshold := 2;   // BLOCK_MEDIUM_AND_ABOVE
end;

Odpowiedzi strumieniowe

Vertex AI udostępnia również StreamGenerateContent, strumieniowy po stronie serwera odpowiednik, który zwraca odpowiedź jako sekwencję częściowych fragmentów zamiast jednego bloku. Ponieważ komponent pomocniczy Vertex AI jest zbudowany na TsgcGRPCClient, to samo typowane żądanie zasila strumieniowe po stronie serwera API klienta: rozpocznij wywołanie, dekoduj każdy fragment do TsgcGRPCVertexAIGenerateContentResponse, gdy nadejdzie, i dołączaj tekst z jego kandydatów, aby aktualizować interfejs użytkownika w miarę jak model pisze.

Dostępność

Klient gRPC Vertex AI jest częścią edycji Enterprise sgcWebSockets. Gotowy do uruchomienia przykład znajduje się w Demos\21.GRPC\17.Vertex_AI: wklej lub wczytaj swój klucz JSON konta usługi, ustaw projekt, region i model, połącz się, a następnie wyślij prompt za pomocą Generate Content. Pełna dokumentacja jest na stronie produktu gRPC Client.

Pytania lub uwagi? Skontaktuj się z nami. Otrzymasz odpowiedź od osób, które napisały ten kod.