الذكاء الاصطناعي التوليدي مع Gemini يطلب البيانات من خلال وظيفة في Java

1. مقدمة

نماذج الذكاء الاصطناعي التوليدي رائعة في فهم اللغة الطبيعية والاستجابة لها. ولكن ماذا لو كنت بحاجة إلى مخرجات دقيقة ويمكن التنبؤ بها للمهام الهامة مثل معالجة توحيد معايير العمل؟ قد تقدّم النماذج التوليدية التقليدية أحيانًا ردودًا مختلفة في أوقات مختلفة للطلبات نفسها، ما قد يؤدي إلى عدم الاتساق. وهنا تبرز ميزة "استدعاء الدوال" في Gemini، ما يتيح لك التحكّم بشكل حاسم في عناصر استجابة الذكاء الاصطناعي (AI).

يوضح هذا الدرس التطبيقي حول الترميز هذا المفهوم من خلال إكمال العنوان وتوحيد حالة الاستخدام. لهذا السبب، سننشئ دالة Java Cloud لتنفيذ المهام التالية:

  1. يتم أخذ إحداثيات خط العرض وخط الطول
  2. استدعاء واجهة برمجة تطبيقات Geocoding لخرائط Google للحصول على العناوين المقابلة
  3. استخدام ميزة "استدعاء الوظائف الاحترافية" في Gemini 1.0 لتوحيد تلك العناوين وتلخيصها بشكل واضح بتنسيق محدّد نحتاج إليه

لنطّلِع على التفاصيل.

2. استدعاء وظيفة Gemini

تتميّز ميزة "استدعاء وظائف Gemini" في عصر الذكاء الاصطناعي التوليدي لأنّها تتيح لك دمج مرونة النماذج اللغوية التوليدية مع دقة البرمجة التقليدية.

في ما يلي المهام التي يجب إكمالها لتنفيذ استدعاء الوظائف في Gemini:

  1. تحديد الدوال: صِف الدوال بوضوح. يجب أن تتضمن الأوصاف المعلومات التالية:
  • تمثّل هذه السمة اسم الدالة، مثل getAddress.
  • تمثّل هذه السمة المعلَمات التي تتوقعها الدالة، مثل latlng كسلسلة.
  • نوع البيانات التي تعرضها الدالة، مثل قائمة بسلاسل العناوين.
  1. إنشاء أدوات لـ Gemini: يمكنك تجميع أوصاف الوظائف في شكل مواصفات واجهة برمجة التطبيقات على شكل أدوات. الأداة هي مجموعة أدوات متخصّصة يمكن أن يستخدمها Gemini لفهم وظائف واجهة برمجة التطبيقات.
  2. تنسيق واجهات برمجة التطبيقات باستخدام Gemini: عند إرسال طلب إلى Gemini، يمكنه تحليل طلبك ومعرفة أين يمكنه استخدام الأدوات التي قدّمتها. يؤدي Gemini بعد ذلك دور منسّق برامج ذكي من خلال تنفيذ المهام التالية:
  • تنشئ مَعلمات واجهة برمجة التطبيقات اللازمة لاستدعاء الدوال المحدَّدة. لا يطلب Gemini واجهة برمجة التطبيقات نيابةً عنك. يجب طلب واجهة برمجة التطبيقات استنادًا إلى المعلَمات والتوقيعات التي أنشأها لك استدعاء وظيفة Gemini.
  • يعالج Gemini النتائج من خلال إضافة النتائج الناتجة من طلبات البيانات من واجهة برمجة التطبيقات إلى عملية الإنشاء، ويدمج المعلومات المنظَّمة في الردّ النهائي. يمكنك معالجة هذه المعلومات بالطريقة التي تريدها لتطبيقك.

توضّح الصورة التالية تدفّق البيانات والخطوات اللازمة لعملية التنفيذ ومالك كل خطوة، مثل تقديم الطلب أو النموذج اللغوي الكبير أو واجهة برمجة التطبيقات:

b9a39f55567072d3.png

ما الذي ستنشئه

ستنشئ دالة Java Cloud وتنشرها لتنفيذ ما يلي:

  • تأخذ إحداثيات خط العرض وخط الطول.
  • لاستدعاء واجهة برمجة التطبيقات Geocoding لخرائط Google للحصول على العناوين المقابلة.
  • تستخدم ميزة استدعاء الدوال في Gemini 1.0 Pro لتلخيص هذه العناوين بشكل قاطع وتلخيصها بتنسيق محدّد

3- المتطلبات

  • متصفح، مثل Chrome أو Firefox
  • مشروع على Google Cloud مع تفعيل الفوترة فيه

4. قبل البدء

  1. في Google Cloud Console، ضمن صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشئه.
  2. تأكَّد من تفعيل الفوترة لمشروعك على Google Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع.
  3. فعِّل Cloud Shell من وحدة تحكُّم Google Cloud. لمزيد من المعلومات، يُرجى الاطّلاع على استخدام Cloud Shell.
  4. إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبط مشروعك:
gcloud config set project <YOUR_PROJECT_ID>
  1. في Cloud Shell، اضبط متغيّرات البيئة التالية:
export GCP_PROJECT=<YOUR_PROJECT_ID>
export GCP_REGION=us-central1
  1. يمكنك تفعيل واجهات Google Cloud API اللازمة من خلال تنفيذ الأوامر التالية في 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. افتح محرِّر Cloud Shell، وانقر على الإضافات، ثم ثبِّت إضافة Gemini + Google Cloud Code.

5- تنفيذ دالة السحابة الإلكترونية

  1. شغِّل محرِّر Cloud Shell.
  2. انقر على Cloud Code، ثم وسِّع قسم Cloud Functions.
  3. انقر على الرمز إنشاء دالة (+).
  4. في مربع الحوار إنشاء تطبيق جديد، حدِّد الخيار Java: Hello World.
  5. أدخِل اسمًا للمشروع في مسار المشروع، مثل GeminiFunctionCalling.
  6. انقر على Explorer للاطّلاع على بنية المشروع، ثم افتح ملف pom.xml. توضح الصورة التالية هيكل المشروع:

bdf07515f413dd9e.png

  1. أضِف الموارد التابعة اللازمة ضمن العلامة <dependencies>... </dependencies> في ملف pom.xml. يمكنك الوصول إلى pom.xml بالكامل من مستودع GitHub لهذا المشروع. انسخ ملف pom.xml من هناك إلى ملف pom.xml الذي تعدّله لمشروعك الحالي.
  2. انسخ الفئة HelloWorld.java من رابط GeminiFunctionCalling github. يجب تعديل API_KEY وproject_id باستخدام مفتاح واجهة برمجة التطبيقات للترميز الجغرافي ورقم تعريف المشروع على Google Cloud بالترتيب.

6- فهم استدعاء الدوال باستخدام الفئة HelloWorld.java

إدخال الطلب

في هذا المثال، في ما يلي طلب الإدخال: ما هو عنوان قيمة "latlong" (خط الطول والعرض) 40.714224,-73.961452.

في ما يلي مقتطف الرمز المقابل لمطالبة الإدخال في الملف:

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

مواصفات واجهة برمجة التطبيقات

يتم استخدام Reverse Geocoding 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();

تنسيق الطلب باستخدام Gemini

يتم إرسال الطلب ومواصفات واجهة برمجة التطبيقات إلى 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();

الردّ من هذه الصفحة هو المعلَمات المنسَّقة JSON لواجهة برمجة التطبيقات. إليك مثال على الناتج:

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

نقْل المَعلمة التالية إلى Reverse Geocoding API: "latlng=40.714224,-73.961452"

مطابَقة النتيجة المنسّقة بالتنسيق "latlng=VALUE".

استدعاء واجهة برمجة التطبيقات

إليك قسم الرمز الذي يستدعي واجهة برمجة التطبيقات:

// 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 على الاستجابة من واجهة برمجة تطبيقات Geocoding API. في ما يلي إصدار منسَّق من الناتج:

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

معالجة ردّ واجهة برمجة التطبيقات وإعداد الطلب

يعالج الرمز البرمجي التالي الردّ من واجهة برمجة التطبيقات ويحضّر الطلب الذي يتضمّن تعليمات حول كيفية معالجة الردّ:

// 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 وعرض العنوان الموحّد

يرسل الرمز التالي إلى 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);

يحتوي المتغيّر finalAnswer على العنوان الموحّد بتنسيق JSON. في ما يلي مثال على الناتج:

{"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" مع حالة استخدام توحيد العناوين، يمكنك تفعيل ميزة Cloud Function.

7. النشر والاختبار

  1. إذا سبق لك إنشاء مشروع GeminiFunctionCalling ونفّذت دالة Cloud، انتقِل إلى الخطوة 2. إذا لم تكن قد أنشأت المشروع، انتقِل إلى الوحدة الطرفية Cloud Shell واستنسِخ هذا المستودع: git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  2. الانتقال إلى مجلد المشروع: cd GeminiFunctionCalling
  3. شغِّل العبارة التالية لإنشاء دالة Cloud ونشرها:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

في ما يلي تنسيق عنوان URL بعد النشر: https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. اختبِر "دالة السحابة الإلكترونية" من خلال تنفيذ الأمر التالي من الوحدة الطرفية:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'

في ما يلي ردّ على نموذج عشوائي لطلب: '{"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. تَنظيم

لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المُستخدَمة في هذه المشاركة، يُرجى اتّباع الخطوات التالية:

  1. في وحدة تحكُّم Google Cloud، انتقِل إلى صفحة إدارة الموارد.
  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على "حذف".
  3. في مربع الحوار، اكتب معرّف المشروع، ثم انقر على "إيقاف التشغيل" لحذف المشروع.
  4. إذا أردت الاحتفاظ بمشروعك، تخطّي الخطوات أعلاه وحذف "دالة السحابة الإلكترونية" من خلال الانتقال إلى Cloud Functions ومن قائمة الدوال، حدِّد الوظيفة التي تريد حذفها وانقر على "حذف".

9. تهانينا

تهانينا! لقد نجحت في استخدام ميزة استدعاء وظائف Gemini في أحد تطبيقات Java، وحوّلت مهمة الذكاء الاصطناعي التوليدي إلى عملية حتمية وموثوقة. لمزيد من المعلومات حول النماذج المتوفّرة، يمكنك الاطّلاع على مستندات منتج Vertex AI LLM.