AI tạo sinh quyết định với chức năng gọi của Gemini trong Java

1. Giới thiệu

Các mô hình AI tạo sinh đạt hiệu quả vượt trội trong việc hiểu và phản hồi ngôn ngữ tự nhiên. Nhưng nếu bạn cần kết quả chính xác, có thể dự đoán cho các nhiệm vụ quan trọng như chuẩn hoá địa chỉ thì sao? Các mô hình tạo sinh truyền thống đôi khi có thể đưa ra câu trả lời khác nhau tại những thời điểm khác nhau cho cùng một câu lệnh. Điều này có thể dẫn đến sự không nhất quán. Đó là điểm nổi bật của chức năng Gọi chức năng của Gemini, cho phép bạn kiểm soát một cách quyết định các yếu tố trong phản hồi của AI.

Lớp học lập trình này minh hoạ khái niệm này bằng trường hợp sử dụng hoàn thành địa chỉ và chuẩn hoá. Để làm được điều này, chúng ta sẽ xây dựng một Hàm đám mây Java thực hiện các nhiệm vụ sau:

  1. Lấy toạ độ theo vĩ độ và kinh độ
  2. Gọi API mã hóa địa lý của Google Maps để nhận địa chỉ tương ứng
  3. Sử dụng tính năng Gọi chức năng của Gemini 1.0 Pro để chuẩn hoá và tóm tắt các địa chỉ đó theo một định dạng cụ thể mà chúng ta cần

Chúng ta hãy cùng tìm hiểu kỹ hơn nhé!

2. Chức năng gọi của Gemini

Chức năng Gọi chức năng Gemini nổi bật hơn trong kỷ nguyên AI tạo sinh vì tính năng này cho phép bạn kết hợp tính linh hoạt của các mô hình ngôn ngữ tạo sinh với độ chính xác của phương thức lập trình truyền thống.

Sau đây là những việc bạn cần hoàn thành để triển khai tính năng gọi hàm của Gemini:

  1. Xác định hàm: mô tả hàm một cách rõ ràng. Nội dung mô tả phải bao gồm các thông tin sau:
  • Tên hàm, chẳng hạn như getAddress.
  • Các tham số mà hàm yêu cầu, chẳng hạn như latlng dưới dạng một chuỗi.
  • Loại dữ liệu mà hàm trả về, chẳng hạn như danh sách các chuỗi địa chỉ.
  1. Tạo công cụ cho Gemini: nội dung mô tả chức năng của gói ở dạng quy cách API thành các công cụ. Hãy coi một công cụ là một bộ công cụ chuyên biệt mà Gemini có thể dùng để tìm hiểu chức năng của API này.
  2. Sắp xếp các API bằng Gemini: khi bạn gửi một câu lệnh cho Gemini, Gemini có thể phân tích yêu cầu của bạn và nhận ra khi Gemini có thể sử dụng những công cụ mà bạn cung cấp. Sau đó, Gemini sẽ đóng vai trò là một người sắp xếp thông minh bằng cách thực hiện những việc sau:
  • Tạo các tham số API cần thiết để gọi các hàm đã xác định. Gemini không thay mặt bạn gọi API này. Bạn phải gọi API dựa trên các tham số và chữ ký mà tính năng gọi hàm Gemini đã tạo cho bạn.
  • Gemini xử lý kết quả bằng cách cung cấp kết quả từ các lệnh gọi API trở lại phiên bản tạo và kết hợp thông tin có cấu trúc vào phản hồi cuối cùng. Bạn có thể xử lý thông tin này theo cách bạn muốn khi đăng ký.

Hình ảnh sau đây cho thấy luồng dữ liệu, các bước triển khai và chủ sở hữu của từng bước, chẳng hạn như ứng dụng, LLM hoặc API:

b9a39f55567072d3.png

Sản phẩm bạn sẽ tạo ra

Bạn sẽ tạo và triển khai một Hàm đám mây Java có chức năng sau:

  • Lấy toạ độ theo vĩ độ và kinh độ.
  • Gọi API mã hóa địa lý của Google Maps để nhận địa chỉ tương ứng.
  • Sử dụng tính năng gọi hàm trong Gemini 1.0 Pro để chuẩn hoá và tóm tắt các địa chỉ đó theo một định dạng cụ thể một cách quyết định.

3. Yêu cầu

  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox.
  • Một dự án trên Google Cloud đã bật tính năng thanh toán.

4. Trước khi bắt đầu

  1. Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
  2. Nhớ bật tính năng thanh toán cho dự án Google Cloud của bạn. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một dự án hay không.
  3. Kích hoạt Cloud Shell trong bảng điều khiển Google Cloud. Để biết thêm thông tin, hãy xem phần Sử dụng Cloud Shell.
  4. Nếu dự án của bạn chưa được thiết lập, hãy sử dụng lệnh sau để thiết lập dự án:
gcloud config set project <YOUR_PROJECT_ID>
  1. Trong Cloud Shell, hãy thiết lập các biến môi trường sau:
export GCP_PROJECT=<YOUR_PROJECT_ID>
export GCP_REGION=us-central1
  1. Bật các API Google Cloud cần thiết bằng cách thực thi các lệnh sau trong Cloud Shell:
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. Mở Cloud Shell Editor, nhấp vào Tiện ích rồi cài đặt tiện ích Gemini + Google Cloud Code.

5. Triển khai chức năng đám mây

  1. Chạy Trình chỉnh sửa Cloud Shell.
  2. Nhấp vào Cloud Code, sau đó mở rộng phần Cloud Functions.
  3. Nhấp vào biểu tượng Tạo hàm (+).
  4. Trong hộp thoại Create New Application (Tạo ứng dụng mới), hãy chọn Java: Hello World (Java: Hello World).
  5. Đặt tên cho dự án trong lộ trình dự án, chẳng hạn như GeminiFunctionCalling.
  6. Nhấp vào Explorer để xem cấu trúc dự án, sau đó mở tệp pom.xml. Hình ảnh sau đây cho thấy cấu trúc dự án:

bdf07515f413dd9e.png

  1. Thêm các phần phụ thuộc cần thiết bên trong thẻ <dependencies>... </dependencies> trong tệp pom.xml. Bạn có thể truy cập vào toàn bộ pom.xml trong kho lưu trữ GitHub của dự án này. Sao chép tệp pom.xml từ đó vào tệp pom.xml của dự án hiện tại mà bạn đang chỉnh sửa.
  2. Sao chép lớp HelloWorld.java từ đường liên kết GeminiFunctionCallback. Bạn phải cập nhật API_KEYproject_id bằng khoá API mã hoá địa lý và Mã dự án trên Google Cloud tương ứng.

6. Tìm hiểu về cách gọi hàm bằng cách sử dụng lớp HelloWorld.java

Nhập câu lệnh

Trong ví dụ này, sau đây là lời nhắc nhập: Địa chỉ cho giá trị latlong 40.714224,-73.961452 là gì.

Sau đây là đoạn mã tương ứng với lời nhắc nhập trong tệp:

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

Quy cách API

API mã hoá địa lý đảo ngược được sử dụng trong ví dụ này. Sau đây là quy cách của API:

/* 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();

Sắp xếp câu lệnh bằng Gemini

Thông tin nhập câu lệnh và thông số API được gửi đến Gemini:

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

Phản hồi từ đây là các tham số được sắp xếp JSON cho API. Sau đây là ví dụ về kết quả:

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

Truyền tham số sau đến API Reverse Geocoding: "latlng=40.714224,-73.961452"

Hãy ghép kết quả được sắp xếp với định dạng "latlng=VALUE".

Gọi API

Dưới đây là phần của mã gọi ra API:

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

Chuỗi jsonResult chứa phản hồi từ API mã hoá địa lý ngược. Sau đây là phiên bản đã được định dạng của kết quả:

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

Xử lý phản hồi của API và chuẩn bị lời nhắc

Đoạn mã sau đây xử lý phản hồi của API và chuẩn bị lời nhắc kèm theo hướng dẫn về cách xử lý phản hồi:

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

Gọi Gemini và trả về địa chỉ đã chuẩn hoá

Mã sau đây chuyển kết quả đã xử lý từ bước trước đó dưới dạng câu lệnh cho Gemini:

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

Biến finalAnswer có địa chỉ được chuẩn hoá ở định dạng JSON. Sau đây là kết quả mẫu:

{"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}"]}

Giờ đây, khi đã hiểu cách thức hoạt động của Chức năng gọi theo chức năng Gemini với trường hợp sử dụng chuẩn hoá địa chỉ, bạn có thể tiếp tục và triển khai Chức năng đám mây.

7. Triển khai và thử nghiệm

  1. Nếu bạn đã tạo dự án GeminiFunctionCalling và triển khai Chức năng đám mây, hãy chuyển sang bước 2. Nếu bạn chưa tạo dự án, hãy chuyển đến thiết bị đầu cuối Cloud Shell, sao chép kho lưu trữ này: git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  2. Chuyển đến thư mục dự án: cd GeminiFunctionCalling
  3. Chạy câu lệnh sau để xây dựng và triển khai Hàm đám mây:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

Sau đây là định dạng URL sau khi triển khai: https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. Kiểm tra Chức năng đám mây bằng cách chạy lệnh sau trên thiết bị đầu cuối:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

Sau đây là phản hồi cho một câu lệnh mẫu ngẫu nhiên: '{"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. Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud cho các tài nguyên sử dụng trong bài đăng này, hãy làm theo các bước sau:

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Quản lý tài nguyên.
  2. Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, rồi nhấp vào Xoá.
  3. Trong hộp thoại, nhập ID dự án, sau đó nhấp vào Tắt để xoá dự án.
  4. Nếu bạn muốn giữ lại dự án, hãy bỏ qua các bước ở trên và xoá Hàm đám mây bằng cách chuyển đến Cloud Functions và trong danh sách hàm, hãy chọn hàm bạn muốn xoá rồi nhấp vào XOÁ.

9. Xin chúc mừng

Xin chúc mừng! Bạn đã sử dụng thành công tính năng gọi hàm Gemini trong một ứng dụng Java và biến một nhiệm vụ dựa trên AI tạo sinh thành một quy trình tất định và đáng tin cậy. Để tìm hiểu thêm về các mô hình có sẵn, hãy xem tài liệu về sản phẩm mô hình ngôn ngữ lớn (LLM) trong Vertex AI.