1. Giriş
Üretken yapay zeka modelleri, doğal dili anlama ve yanıtlama konusunda oldukça başarılıdır. Ancak adres standardizasyonu gibi kritik görevler için kesin ve tahmin edilebilir çıktılara ihtiyacınız varsa ne yapmanız gerekir? Geleneksel üretken modeller bazen aynı istemlere farklı zamanlarda farklı yanıtlar verebilir ve bu da tutarsızlıklara yol açabilir. Gemini'ın işlev çağırma özelliği, yapay zekanın yanıtının öğelerini deterministik olarak kontrol etmenize olanak tanır.
Bu codelab'de, adres tamamlama ve standartlaştırma kullanım alanıyla bu kavram açıklanmaktadır. Bu amaçla, aşağıdaki görevleri gerçekleştiren bir Java Cloud Functions işlevi oluşturacağız:
- Enlem ve boylam koordinatlarını alır.
- Karşılık gelen adresleri almak için Google Haritalar Geocoding API'yi çağırır.
- Bu adresleri, ihtiyaç duyduğumuz belirli bir biçimde deterministik olarak 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şlev çağrısı
Gemini İşlev Çağrısı, üretken dil modellerinin esnekliğini geleneksel programlamanın hassasiyetiyle birleştirmenize olanak tanıdığı için üretken yapay zeka çağında öne çıkıyor.
Gemini işlev çağrısını uygulamak için tamamlamanız gereken görevler şunlardır:
- İşlevleri tanımlayın: İşlevleri net bir şekilde açıklayın. Açıklamalarda aşağıdaki bilgiler yer almalıdır:
- İşlevin adı (ör.
getAddress). - İşlevin beklediği parametreler (ör.
latlngdize olarak). - İşlevin döndürdüğü veri türü (ör. adres dizeleri listesi).
- Gemini için araç oluşturma: API spesifikasyonu biçimindeki işlev açıklamalarını araçlar halinde paketleyin. Aracı, Gemini'ın API'nin işlevini anlamak için kullanabileceği özel bir araç kutusu olarak düşünebilirsiniz.
- Gemini'ı kullanarak API'leri düzenleme: Gemini'a bir istem gönderdiğinizde, isteğinizi analiz edebilir ve sağladığınız araçları nerede kullanabileceğini belirleyebilir. Gemini, aşağıdaki görevleri gerçekleştirerek akıllı bir düzenleyici gibi davranı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. API'yi, Gemini işlev çağrısının sizin için oluşturduğu parametrelere ve imzaya göre çağırmanız gerekir.
- Gemini, API çağrılarınızdan gelen sonuçları tekrar kendi oluşturma sürecine aktararak işler ve yapılandırılmış bilgileri nihai yanıtına dahil eder. Bu bilgileri uygulamanız için istediğiniz şekilde işleyebilirsiniz.
Aşağıdaki resimde veri akışı, uygulamayla ilgili adımlar ve her adımın sahibi (ör. uygulama, LLM veya API) gösterilmektedir:

Ne oluşturacaksınız?
Aşağıdaki işlemleri yapan 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 Geocoding API'yi çağırır.
- Bu adresleri belirli bir biçimde deterministik olarak standartlaştırmak ve özetlemek için Gemini 1.0 Pro işlev çağrısı özelliğini kullanır.
3. Şartlar
4. Başlamadan önce
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin.
- Google Cloud Console'dan Cloud Shell'i etkinleştirin. Daha fazla bilgi için Cloud Shell'i kullanma başlıklı makaleye bakın.
- Projeniz ayarlanmamışsa projenizi ayarlamak için aşağıdaki komutu kullanın:
gcloud config set project <YOUR_PROJECT_ID>
- Cloud Shell'de aşağıdaki ortam değişkenlerini ayarlayın:
export GCP_PROJECT=<YOUR_PROJECT_ID>
export GCP_REGION=us-central1
- 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
- Cloud Shell Düzenleyici'yi açın, Uzantılar'ı tıklayın ve Gemini + Google Cloud Code uzantısını yükleyin.
5. Cloud Functions işlevini uygulama
- Cloud Shell Düzenleyici'yi başlatın.
- Cloud Code'u tıklayın ve Cloud Functions bölümünü genişletin.
- İşlev Oluştur (+) simgesini tıklayın.
- Yeni Uygulama Oluştur iletişim kutusunda Java: Hello World seçeneğini belirleyin.
- Proje yolunda proje için bir ad girin (ör. GeminiFunctionCalling).
- Proje yapısını görüntülemek için Gezgin'i tıklayın ve ardından pom.xml dosyasını açın. Aşağıdaki resimde proje yapısı gösterilmektedir:

pom.xmldosyasındaki<dependencies>... </dependencies>etiketine gerekli bağımlılıkları ekleyin. Bu projenin GitHub kod deposundanpom.xml'nin tamamına erişebilirsiniz. Buradan pom.xml dosyasını, düzenlediğiniz mevcut projenizinpom.xmldosyasına kopyalayın.HelloWorld.javasınıfını GeminiFunctionCalling github bağlantısından kopyalayın.API_KEYveproject_iddeğerlerini sırasıyla Geocoding API anahtarınız ve Google Cloud projesi 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 şöyledir: 40.714224,-73.961452 enlem ve boylam değerinin adresi 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 Geocoding API'si kullanılmaktadır. API spesifikasyonu aşağıda 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();
Bu işlemden gelen yanıt, API'ye gönderilen düzenlenmiş parametreler JSON'udur. Örnek bir çıkış aşağıda verilmiştir:
role: "model"
parts {
function_call {
name: "getAddress"
args {
fields {
key: "latlng"
value {
string_value: "40.714224,-73.961452"
}
}
}
}
}
Aşağıdaki parametreyi Reverse Geocoding API'sine iletin: "latlng=40.714224,-73.961452"
Düzenlenmiş sonucu "latlng=VALUE" biçimiyle eşleştirin.
API'yi çağırma
Aşağıda, API'yi çağıran kod bölümü verilmiştir:
// 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, tersine Geocoding API'sinden gelen yanıtı içerir. 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 yanıtın nasıl işleneceğiyle ilgili talimatları içeren istemi 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ış adresi içerir. 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ı'nın adres standardizasyonu kullanım alanıyla nasıl çalıştığını anladığınıza göre Cloud Functions işlevini dağıtabilirsiniz.
7. Dağıtma ve test etme
- GeminiFunctionCalling projesini oluşturduysanız ve Cloud Function'ı uyguladıysanız 2. adıma geçin. Projeyi oluşturmadıysanız Cloud Shell terminaline gidin ve şu depoyu klonlayın:
git clonehttps://github.com/AbiramiSukumaran/GeminiFunctionCalling - Proje klasörüne gidin:
cd GeminiFunctionCalling - Cloud Functions işlevini oluşturup 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
- 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 örnek istemine verilen yanıt yer almaktadır: '{"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:
- Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
- İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
- Projenizi tutmak istiyorsanız yukarıdaki adımları atlayın ve Cloud Functions'a giderek Cloud Functions işlevini silin. İşlevler listesinden silmek istediğiniz işlevi işaretleyin ve SİL'i tıklayın.
9. Tebrikler
Tebrikler! Bir Java uygulamasında Gemini işlev çağrısı özelliğini başarıyla kullandınız ve üretken yapay zeka görevini deterministik ve güvenilir bir sürece dönüştürdünüz. Kullanılabilir modeller hakkında daha fazla bilgi edinmek için Vertex AI LLM ürün belgelerine bakın.