Java'yı çağıran Gemini işlevine sahip deterministik üretken yapay zeka

1. Giriş

Üretken yapay zeka modelleri, doğal dili anlama ve bunlara yanıt verme konusunda son derece başarılıdır. Peki ya standartlaştırmayı ele alma gibi kritik görevler için net ve öngörülebilir çıkışlara ihtiyacınız varsa? Geleneksel üretken modeller bazen aynı istemler için farklı zamanlarda farklı yanıtlar verebilir. Bu da tutarsızlıklara yol açabilir. İşte bu noktada Gemini'ın işlev çağrısı özelliği ön plana çıkıyor ve yapay zekanın yanıtının öğelerini belirleyici bir şekilde kontrol etmenize olanak tanıyor.

Bu codelab'de, bu kavram, adres tamamlama ve standartlaştırma kullanım alanıyla gösterilmiştir. Bunun için aşağıdaki görevleri gerçekleştiren bir Java Cloud Functions işlevi oluşturacağız:

  1. Enlem ve boylam koordinatlarını alır
  2. İlgili adresleri almak için Google Haritalar Coğrafi Kodlama API'sini çağırır
  3. Bu adresleri, ihtiyacımız olan belirli bir biçimde, kararlı bir şekilde standartlaştırmak ve özetlemek için Gemini 1.0 Pro İşlev Çağrısı özelliğini kullanır.

Haydi başlayalım.

2. Gemini işlevi çağrısı

Gemini İşlev Çağrısı özelliği, üretken dil modellerinin esnekliğini geleneksel programlamanın hassasiyetiyle birleştirmenize olanak tanıdığı için üretken yapay zeka çağında öne çıkar.

Gemini işlev çağrısını uygulamak için tamamlamanız gereken görevler şunlardır:

  1. İşlevleri tanımlayın: İşlevleri net bir şekilde açıklayın. Açıklamalar aşağıdaki bilgileri içermelidir:
  • İşlevin adı (ör. getAddress).
  • İşlevin beklediği parametreler (ör. dize olarak latlng).
  • İşlevin döndürdüğü verilerin türü (ör. adres dizeleri listesi).
  1. Gemini için araçlar oluşturun: İşlev açıklamalarını, API spesifikasyonu biçiminde araçlara dönüştürün. Araçları, Gemini'ın API'nin işlevlerini anlamak için kullanabileceği özel bir araç kutusu gibi düşünebilirsiniz.
  2. Gemini'ı kullanarak API'leri düzenleme: Gemini'a istem gönderdiğinizde, Gemini, isteğinizi analiz edebilir ve sağladığınız araçları nerede kullanabileceğini belirleyebilir. Daha sonra Gemini, aşağıdaki görevleri yerine getirerek akıllı bir orkestratör görevi görür:
  • Tanımladığınız işlevleri çağırmak için gerekli API parametrelerini oluşturur. Gemini, API'yi sizin adınıza çağırmaz. Gemini işlevi çağrısının sizin için oluşturduğu parametrelere ve imzaya göre API'yi çağırmanız gerekir.
  • Gemini, sonuçları API çağrılarınızın sonuçlarını kendi nesline aktararak işler ve nihai yanıtına yapılandırılmış bilgileri dahil eder. Bu bilgileri, başvurunuzda istediğiniz şekilde işleyebilirsiniz.

Aşağıdaki resimde, veri akışı, uygulamadaki adımlar ve her bir adımın (ör. uygulama, LLM veya API) sahibi gösterilmektedir:

b9a39f55567072d3.png

Oluşturacaklarınız

Aşağıdaki işlemleri gerçekleştiren bir Java Cloud Functions işlevi oluşturup dağıtacaksınız:

  • Enlem ve boylam koordinatlarını alır.
  • İlgili adresleri almak için Google Haritalar Coğrafi Kodlama API'sini çağırır.
  • Bu adresleri belirli bir biçimde belirleyici bir şekilde standartlaştırmak ve özetlemek için Gemini 1.0 Pro işlev çağrısı özelliğini kullanır.

3. Şartlar

  • Chrome veya Firefox gibi bir tarayıcı.
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi.

4. Başlamadan önce

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını nasıl kontrol edeceğinizi öğrenin.
  3. Google Cloud konsolundan Cloud Shell'i etkinleştirin. Daha fazla bilgi için Cloud Shell'i kullanma konusuna bakın.
  4. Projeniz ayarlanmadıysa projenizi ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
  1. Cloud Shell'de aşağıdaki ortam değişkenlerini ayarlayın:
export GCP_PROJECT=<YOUR_PROJECT_ID>
export GCP_REGION=us-central1
  1. Cloud Shell'de aşağıdaki komutları çalıştırarak gerekli Google Cloud API'lerini etkinleştirin:
gcloud services enable cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com logging.googleapis.com storage-component.googleapis.com cloudaicompanion.googleapis.com aiplatform.googleapis.com
  1. Cloud Shell Düzenleyici'yi açın, Uzantılar'ı tıklayın, ardından Gemini + Google Cloud Code uzantısını yükleyin.

5. Cloud Functions işlevini uygulama

  1. Cloud Shell Düzenleyici'yi başlatın.
  2. Cloud Code'u tıklayın ve Cloud Functions bölümünü genişletin.
  3. İşlev Oluştur (+) simgesini tıklayın.
  4. Create New Application (Yeni Uygulama Oluştur) iletişim kutusunda Java: Hello World seçeneğini belirleyin.
  5. Proje yolunda proje için GeminiFunctionCalling gibi bir ad girin.
  6. Proje yapısını görüntülemek için Explorer'i tıklayın, ardından pom.xml dosyasını açın. Aşağıdaki resimde proje yapısı gösterilmektedir:

bdf07515f413dd9e.png

  1. pom.xml dosyasındaki <dependencies>... </dependencies> etiketine gerekli bağımlılıkları ekleyin. pom.xml uygulamasının tamamına bu projenin github deposundan erişebilirsiniz. pom.xml dosyasını oradan, mevcut projenizin düzenlemekte olduğunuz pom.xml dosyasına kopyalayın.
  2. GeminiFunctionCalling github bağlantısından HelloWorld.java sınıfını kopyalayın. API_KEY ve project_id değerlerini sırasıyla coğrafi kodlama API'si anahtarınız ve Google Cloud proje kimliğinizle güncellemeniz gerekir.

6. HelloWorld.java sınıfını kullanarak işlev çağrısını anlama

İstem girişi

Bu örnekte, giriş istemi şu şekildedir: 40.714224,-73.961452 gecikme değeri için adres nedir?.

Aşağıda, dosyadaki giriş istemine karşılık gelen kod snippet'i verilmiştir:

String promptText = "What's the address for the latlong value '" + latlngString + "'?"; //40.714224,-73.961452

API spesifikasyonu

Bu örnekte Tersine Coğrafi Kodlama API'si kullanılmıştır. Aşağıda API spesifikasyonu verilmiştir:

/* Declare the function for the API to invoke (Geo coding API) */ 
FunctionDeclaration functionDeclaration =
    FunctionDeclaration.newBuilder()
        .setName("getAddress")
        .setDescription("Get the address for the given latitude and longitude value.")
        .setParameters(
            Schema.newBuilder()
                .setType(Type.OBJECT)
                .putProperties(
                    "latlng",
                    Schema.newBuilder()
                        .setType(Type.STRING)
                        .setDescription("This must be a string of latitude and longitude coordinates separated by comma")
                        .build())
                .addRequired("latlng")
                .build())
        .build();

Gemini ile istemi düzenleme

İstem girişi ve API spesifikasyonu Gemini'a gönderilir:

// Add the function to a "tool"
Tool tool = Tool.newBuilder()
.addFunctionDeclarations(functionDeclaration)
.build();

// Invoke the Gemini model with the use of the tool to generate the API parameters from the prompt input.
GenerativeModel model = GenerativeModel.newBuilder()
.setModelName(modelName)
.setVertexAi(vertexAI)
.setTools(Arrays.asList(tool))
.build();
GenerateContentResponse response = model.generateContent(promptText);
Content responseJSONCnt = response.getCandidates(0).getContent();

Bunun yanıtı, API'ye düzenlenen JSON parametreleridir. Aşağıda örnek bir çıkış verilmiştir:

role: "model"
parts {
 function_call {
   name: "getAddress"
   args {
     fields {
       key: "latlng"
       value {
         string_value: "40.714224,-73.961452"
       }
     }
   }
 }
}

Şu parametreyi Reverse Geocoding API'ye iletin: "latlng=40.714224,-73.961452"

Düzenlenen sonucu "latlng=VALUE" biçimiyle eşleştirin.

API'yi çağırma

Aşağıda, kodun API'yi çağıran bölümü yer almaktadır:

// Create a request
     String url = API_STRING + "?key=" + API_KEY + params;
     java.net.http.HttpRequest request = java.net.http.HttpRequest.newBuilder()
         .uri(URI.create(url))
         .GET()
         .build();
     // Send the request and get the response
     java.net.http.HttpResponse<String> httpresponse = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofString());
     // Save the response
     String jsonResult =  httpresponse.body().toString();

jsonResult dizesi, ters Coğrafi Kodlama API'sinden gelen yanıtı barındırır. Aşağıda, çıkışın biçimlendirilmiş bir sürümü verilmiştir:

"...277 Bedford Ave, Brooklyn, NY 11211, USA; 279 Bedford Ave, Brooklyn, NY 11211, USA; 277 Bedford Ave, Brooklyn, NY 11211, USA;..."

API yanıtını işleme ve istemi hazırlama

Aşağıdaki kod, API'den gelen yanıtı işler ve istemi, yanıtın nasıl işleneceğine ilişkin talimatlarla hazırlar:

// Provide an answer to the model so that it knows what the result
     // of a "function call" is.
     String promptString =
     "You are an AI address standardizer for assisting with standardizing addresses accurately. Your job is to give the accurate address in the standard format as a JSON object containing the fields DOOR_NUMBER, STREET_ADDRESS, AREA, CITY, TOWN, COUNTY, STATE, COUNTRY, ZIPCODE, LANDMARK by leveraging the address string that follows in the end. Remember the response cannot be empty or null. ";

Content content =
         ContentMaker.fromMultiModalData(
             PartMaker.fromFunctionResponse(
                 "getAddress",
                 Collections.singletonMap("address", formattedAddress)));
     String contentString = content.toString();
     String address = contentString.substring(contentString.indexOf("string_value: \"") + "string_value: \"".length(), contentString.indexOf('"', contentString.indexOf("string_value: \"") + "string_value: \"".length()));

     List<SafetySetting> safetySettings = Arrays.asList(
       SafetySetting.newBuilder()
           .setCategory(HarmCategory.HARM_CATEGORY_HATE_SPEECH)
           .setThreshold(SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH)
           .build(),
       SafetySetting.newBuilder()
           .setCategory(HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT)
           .setThreshold(SafetySetting.HarmBlockThreshold.BLOCK_ONLY_HIGH)
           .build()
   );

Gemini'ı çağırma ve standartlaştırılmış adresi döndürme

Aşağıdaki kod, önceki adımda işlenen çıkışı Gemini'a istem olarak iletir:

GenerativeModel modelForFinalResponse = GenerativeModel.newBuilder()
     .setModelName(modelName)
     .setVertexAi(vertexAI)
     .build();
     GenerateContentResponse finalResponse = modelForFinalResponse.generateContent(promptString + ": " + address, safetySettings);
      System.out.println("promptString + content: " + promptString + ": " + address);
       // See what the model replies now
       System.out.println("Print response: ");
       System.out.println(finalResponse.toString());
       String finalAnswer = ResponseHandler.getText(finalResponse);
       System.out.println(finalAnswer);

finalAnswer değişkeni, JSON biçiminde standartlaştırılmış adrese sahip. Aşağıda örnek bir çıkış verilmiştir:

{"replies":["{ \"DOOR_NUMBER\": null, \"STREET_ADDRESS\": \"277 Bedford Ave\", \"AREA\": \"Brooklyn\", \"CITY\": \"New York\", \"TOWN\": null, \"COUNTY\": null, \"STATE\": \"NY\", \"COUNTRY\": \"USA\", \"ZIPCODE\": \"11211\", \"LANDMARK\": null} null}"]}

Gemini İşlev Çağrısı özelliğinin adres standartlaştırma kullanım alanıyla birlikte nasıl çalıştığını anladığınıza göre Cloud Functions işlevini dağıtabilirsiniz.

7. Dağıtma ve test etme

  1. GeminiFunctionCalling projesini zaten oluşturduysanız ve Cloud Functions işlevini uyguladıysanız 2. adıma geçin. Projeyi oluşturmadıysanız Cloud Shell terminaline gidin ve şu depoyu klonlayın: git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  2. Proje klasörüne gidin: cd GeminiFunctionCalling
  3. Cloud Functions işlevini derlemek ve dağıtmak için aşağıdaki ifadeyi çalıştırın:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

Dağıtımdan sonraki URL biçimi şöyledir: https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. Terminalden aşağıdaki komutu çalıştırarak Cloud Functions işlevini test edin:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

Aşağıda, rastgele bir örnek istemin yanıtı verilmiştir: '{"replies":["{ "DOOR_NUMBER": "277", "STREET_ADDRESS": "Bedford Ave", "AREA": null, "CITY": "Brooklyn", "TOWN": null, "COUNTY": "Kings County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "11211", "LANDMARK": null}}```"]}'

8. Temizleme

Bu yayında kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın:

  1. Google Cloud konsolunda Kaynakları yönetin sayfasına gidin.
  2. Proje listesinden, silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusuna proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
  4. Projenizi saklamak istiyorsanız yukarıdaki adımları atlayın ve Cloud Functions işlevine giderek işlev listesinden Cloud Functions işlevini silin, silmek istediğiniz öğeyi işaretleyin ve SİL'i tıklayın.

9. Tebrikler

Tebrikler! Java uygulamasında Gemini işlevi çağrısı özelliğini başarıyla kullanarak bir üretken yapay zeka görevini deterministik ve güvenilir bir sürece dönüştürdünüz. Mevcut modeller hakkında daha fazla bilgi edinmek için Vertex AI LLM ürün belgelerine bakın.