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 có khả năng đáng chú ý 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 và 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ác 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, có thể dẫn đến sự không nhất quán. Đó là lúc tính năng Gọi hàm của Gemini phát huy tác dụng, cho phép bạn kiểm soát một cách có tính xác định các thành phần trong câu trả lờ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 tất và chuẩn hoá địa chỉ. Để làm việc này, chúng ta sẽ tạo một Hàm trên đám mây bằng Java thực hiện các nhiệm vụ sau:

  1. Lấy toạ độ vĩ độ và kinh độ
  2. Gọi Google Maps Geocoding API để lấy địa chỉ tương ứng
  3. Sử dụng tính năng Gọi hàm 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 một cách xác định

Hãy cùng tìm hiểu nhé!

2. Tính năng gọi hàm của Gemini

Tính năng Gọi hàm của Gemini nổi bật trong kỷ nguyên AI tạo sinh vì 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 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 các hàm: mô tả rõ ràng các hàm. Nội dung mô tả phải bao gồm những thông tin sau:
  • Tên của hàm, chẳng hạn như getAddress.
  • Các tham số mà hàm dự kiến, 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: đóng gói nội dung mô tả hàm dưới dạng thông số kỹ thuật API vào các công cụ. Hãy coi công cụ là một hộp công cụ chuyên dụng mà Gemini có thể dùng để hiểu chức năng của API.
  2. Điều phối 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 vị trí mà Gemini có thể sử dụng các công cụ bạn đã cung cấp. Sau đó, Gemini sẽ đóng vai trò là một trình điều phối thông minh bằng cách thực hiện các nhiệm vụ sau:
  • Tạo các tham số API cần thiết để gọi các hàm mà bạn đã xác định. Gemini không gọi API thay cho bạn. 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 của Gemini đã tạo cho bạn.
  • Gemini xử lý kết quả bằng cách đưa kết quả từ các lệnh gọi API của bạn trở lại quá trình tạo và kết hợp thông tin có cấu trúc vào câu trả lời cuối cùng. Bạn có thể xử lý thông tin này theo cách bạn muốn cho ứng dụng của mình.

Hình ảnh sau đây cho thấy luồng dữ liệu, các bước liên quan đến việ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 Cloud Function bằng Java để thực hiện những việc sau:

  • Lấy toạ độ vĩ độ và kinh độ.
  • Gọi Google Maps Geocoding API để lấy các địa chỉ tương ứng.
  • Sử dụng tính năng gọi hàm 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ột cách có tính xác đị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 chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
  2. Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên đám mây của mình trên Google Cloud. 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 từ bảng điều khiển Cloud. Để biết thêm thông tin, hãy xem bài viết Sử dụng Cloud Shell.
  4. Nếu bạn chưa đặt dự án, hãy dùng lệnh sau để đặt 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 Cloud API cần thiết của Google 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 Cloud Function

  1. Khởi chạy Trình chỉnh sửa Cloud Shell.
  2. Nhấp vào Cloud Code rồi 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 mục Java: Hello World (Java: Xin chào thế giới).
  5. Đặt tên cho dự án trong đường dẫn dự án, chẳng hạn như GeminiFunctionCalling.
  6. Nhấp vào Explorer (Trình khám phá) để 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 trong thẻ <dependencies>... </dependencies> trong tệp pom.xml. Bạn có thể truy cập vào toàn bộ pom.xml từ kho lưu trữ github của dự án này. Sao ché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 GeminiFunctionCalling github. 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ề việc 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, câu lệnh nhập là: Địa chỉ cho giá trị vĩ độ và kinh độ 40.714224,-73.961452 là gì.

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

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

Quy cách API

Geocoding API ngược được dùng trong ví dụ này. Sau đây là quy cách 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();

Điều phối câu lệnh bằng Gemini

Câu lệnh đầu vào và thông số kỹ thuật 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êu cầu này là JSON tham số được điều phối đến API. Sau đây là một 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 vào API Reverse Geocoding: "latlng=40.714224,-73.961452"

Ghép kết quả được phối hợp với định dạng "latlng=VALUE".

Gọi API

Sau đây là phần mã gọi 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 lưu trữ 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ả đầu ra:

"...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ị câu lệnh

Đoạn mã sau đây xử lý phản hồi từ API và chuẩn bị câu lệnh 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á

Đoạn mã sau đây truyền đầu ra đã xử lý từ bước trước làm 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à một ví dụ về kết quả đầu ra:

{"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, bạn đã hiểu cách hoạt động của tính năng Gọi hàm của Gemini với trường hợp sử dụng chuẩn hoá địa chỉ, bạn có thể tiếp tục triển khai Cloud Function.

7. Triển khai và kiểm thử

  1. Nếu bạn đã tạo dự án GeminiFunctionCalling và triển khai Cloud Function, 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 để tạo và triển khai Cloud Function:
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 thử Cloud Function bằng cách chạy lệnh sau trong 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 của bạn cho các tài nguyên được 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 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, hãy nhập mã dự án rồi 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á Cloud Function bằng cách chuyển đến Cloud Functions, rồi trong danh sách các hàm, hãy đánh dấu vào hàm bạn muốn xoá và 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 của Gemini trong một ứng dụng Java và chuyển đổi một tác vụ AI tạo sinh thành một quy trình đáng tin cậy và mang tính xác định. Để tìm hiểu thêm về các mô hình hiện có, hãy xem tài liệu về sản phẩm LLM của Vertex AI.