Delphi'de gRPC Üzerinden Google Vertex AI

· Bileşenler

Vertex AI, Google'ın Google Cloud üzerindeki üretken yapay zeka platformudur. Gemini modellerini, bir GenerateContent çağrısının isteminizi gönderip modelin yanıtını döndürdüğü bir gRPC PredictionService aracılığıyla sunar. sgcWebSockets Enterprise, TsgcGRPCClient üzerine oturan türlü bir Vertex AI gRPC istemcisi içerir, böylece Gemini'yi Delphi ve C++Builder'dan doğrudan gRPC üzerinden, herhangi bir harici çalışma zamanı olmadan ve Protocol Buffers'ı elle bir araya getirmeden çağırabilirsiniz.

Nasıl çalışır

gRPC, HTTP/2 üzerinde çerçevelenmiş Protocol Buffers mesajlarıdır, bu nedenle bir Vertex AI çağrısı, bölgesel aiplatform.googleapis.com uç noktasına bir HTTP/2 isteğidir. Taşıma, TLS etkinken 443 numaralı bağlantı noktasında bölge ana bilgisayarına yönlendirilmiş bir TsgcHTTP2Client'tır ve TsgcGRPCClient, onun üzerinde çerçevelemeyi, üst bilgileri, zaman aşımlarını ve trailer'ları işler.

Vertex AI yardımcısı, sgcGRPC_Google_VertexAI içindeki bir dizi türlü mesaj sınıfıdır. Kod içinde bir TsgcGRPCVertexAIGenerateContentRequest oluşturursunuz, onu ToBytes ile serileştirir, baytları gRPC istemcisine verir, ardından yanıt baytlarını bir TsgcGRPCVertexAIGenerateContentResponse'a geri yüklersiniz. İstek, Vertex AI şemasını yansıtır: bir istek, bir model kaynak adı ve bir içerik listesi taşır, her içeriğin bir rolü ve bir veya daha fazla parçası vardır ve bir parça ya metin ya da satır içi ikili veri tutar.

Vertex AI, Google Cloud hizmet hesabı kimlik doğrulaması kullanır. İstemci, bir hizmet hesabı JWT'si imzalar ve onu gRPC meta verisinde bir authorization: Bearer üst bilgisi olarak gönderir, böylece her çağrı bölgesel Vertex AI uç noktasına karşı kimlik doğrulanır.

Bir hizmet hesabıyla kimlik doğrulama

Google Cloud istemcisi, hizmet hesabı JSON anahtarınızdan kendinden imzalı bir hizmet hesabı JWT'si imzalar. Bu JWT hedef kitleye bağlıdır, bu nedenle bölgesel Vertex AI uç noktasını hedeflemesi gerekir, aksi takdirde aiplatform.googleapis.com onu UNAUTHENTICATED ile reddeder. Bir belirteç elde edildikten sonra, her çağrıyla taşınması için onu gRPC istemcisinin DefaultMetadata'sına ekleyin.

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);

Taşımanın kurulması

Bölgesel ana bilgisayar için bir TsgcHTTP2Client oluşturun ve onu gRPC istemcisine atayın. Vertex AI, application/grpc+proto konuşur, bu nedenle kanal içerik türünü grpcProto olarak bırakın.

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;

Bir istemden içerik oluşturma

İsteği türlü mesaj sınıflarından oluşturun. Model, tam kaynak adıdır, tek içerik user rolüne sahiptir ve istem bir metin parçasına girer. Call, yanıt gelene kadar bloklar ve türlü bir yanıta yüklediğiniz ham Data baytlarıyla bir TsgcGRPCResponse döndürür.

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;

Yanıtı okuma

Yanıt baytlarını bir TsgcGRPCVertexAIGenerateContentResponse'a yükleyin. Her biri içerik parçaları ve bir bitiş nedeniyle birlikte adayları, ayrıca istem, aday ve toplam belirteç sayılarını içeren bir UsageMetadata bloğunu sunar.

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;

Oluşturma yapılandırması ve güvenlik ayarları

İstek ayrıca isteğe bağlı bir GenerationConfig ve bir güvenlik ayarları listesi taşır. Örneklemeyi ve uzunluğu kontrol etmek için yapılandırmayı kullanın: Temperature, TopP, TopK, CandidateCount, MaxOutputTokens ve StopSequences. Her güvenlik ayarı, bir zarar Category'sini bir engelleme Threshold'u ile eşleştirir.

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;

Akışlı yanıtlar

Vertex AI ayrıca, yanıtı tek bir blok yerine bir dizi kısmi parça olarak döndüren sunucu akışı karşılığı olan StreamGenerateContent'i sunar. Vertex AI yardımcısı TsgcGRPCClient üzerine kurulu olduğundan, aynı türlü istek istemcinin sunucu akışı API'sini besler: çağrıyı başlatın, her parçayı geldikçe bir TsgcGRPCVertexAIGenerateContentResponse'a çözün ve model yazdıkça kullanıcı arayüzünü güncellemek için adaylarından gelen metni ekleyin.

Kullanılabilirlik

Vertex AI gRPC istemcisi, sgcWebSockets Enterprise sürümünün bir parçasıdır. Çalıştırılmaya hazır bir örnek Demos\21.GRPC\17.Vertex_AI içinde yer alır: hizmet hesabı JSON anahtarınızı yapıştırın veya yükleyin, projeyi, bölgeyi ve modeli ayarlayın, bağlanın, ardından Generate Content ile bir istem gönderin. Tam referans gRPC Client ürün sayfasında bulunur.

Sorularınız veya geri bildirimleriniz mi var? Bize ulaşın. Kodu yazan kişilerden bir yanıt alacaksınız.