1. مقدمة
هل تحب قراءة الكتب ولكنّك تشعر بالارتباك بسبب العدد الهائل من الخيارات؟ تخيل أنّ لديك تطبيقًا مستندًا إلى الذكاء الاصطناعي لا يقترح عليك الكتب المناسبة فحسب، بل يوفّر أيضًا ملخّصًا موجزًا استنادًا إلى النوع الذي تختاره، ما يمنحك لمحة عن جوهر الكتاب. في هذا الدرس التطبيقي حول الترميز، سأقدّم لك إرشادات حول كيفية إنشاء هذا التطبيق باستخدام BigQuery ووظائف Cloud المستند إلى Gemini.
نظرة عامة على المشروع
تتمحور حالة الاستخدام حول هذه المكوّنات الأربعة الرئيسية:
- قاعدة بيانات الكتب: ستشكّل مجموعة البيانات العامة الواسعة في BigQuery من كتب أرشيف الإنترنت كتالوج الكتب الشامل.
- محرّك تلخيص الذكاء الاصطناعي: ستُنشئ وظائف Google Cloud، المزوّدة بنموذج اللغة Gemini-Pro، ملخصات قيّمة مخصّصة لطلبات المستخدمين.
- دمج BigQuery: دالة عن بُعد ضمن BigQuery تستدعي Cloud Function لتقديم ملخّصات الكتب والمواضيع عند الطلب.
- واجهة المستخدم: تطبيق ويب مستضاف على Cloud Run سيوفّر تطبيق ويب للمستخدمين لعرض النتائج.
سنقسم عملية التنفيذ إلى 3 ورشات عمل لكتابة الرموز البرمجية:
الدرس التطبيقي 1: استخدام Gemini لإنشاء Java Cloud Function لتطبيق Gemini
Codelab 2: استخدام Gemini لإنشاء تطبيقات الذكاء الاصطناعي التوليدي المستندة إلى لغة الاستعلامات البنيوية (SQL) فقط باستخدام BigQuery
الدرس التطبيقي 3: استخدام Gemini لإنشاء تطبيق ويب Java Spring Boot يتفاعل مع BigQuery
2. استخدام Gemini لإنشاء تطبيق للذكاء الاصطناعي التوليدي بدون خادم على دالّة Java Cloud
ما الذي ستقوم ببنائه
ستنشئ
- تطبيق Java Cloud Functions الذي ينفِّذ Gemini 1.0 Pro لتلقّي طلب معيّن كإدخال في شكل مصفوفة JSON وعرض استجابة (قيمة Json مصنّفة باسم "replies").
- ستنفّذ خطوات الإنشاء والنشر بمساعدة Gemini.
3- المتطلبات
في ما يلي المتطلبات الأساسية:
إنشاء مشروعك
- في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
- تأكَّد من تفعيل الفوترة لمشروعك على السحابة الإلكترونية. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع.
تفعيل Cloud Shell
- ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud وتكون محمَّلة مسبقًا بـ bq:
من Cloud Console، انقر على Activate Cloud Shell (تفعيل Cloud Shell) في أعلى يسار الصفحة:
- بعد الاتصال بخدمة Cloud Shell، من المفترض أن تظهر لك رسالة تفيد بأنّه سبق أن تم مصادقة حسابك وأنّه سبق ضبط المشروع على معرّف مشروعك. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك.
gcloud config list project
- إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
يمكنك الرجوع إلى المستندات حول أوامر gcloud واستخدامها.
4. تفعيل Gemini لـ Google Cloud وواجهات برمجة التطبيقات اللازمة
تفعيل Gemini
- انتقِل إلى Gemini لـ Google Cloud في Marketplace لتفعيل واجهة برمجة التطبيقات. يمكنك أيضًا استخدام الأمر التالي:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- انتقِل إلى صفحة Gemini وانقر على "بدء المحادثة".
ملاحظة مهمة: اتّبِع الخطوتَين 1 و2 في هذا معمل رموز البرمجة للبدء في استخدام Gemini وتفعيله في Cloud Shell IDE على التوالي.
تفعيل واجهات برمجة التطبيقات الأخرى اللازمة
كيف يمكننا إجراء ذلك؟ لنطلب من Gemini الإجابة عن هذا السؤال. قبل إجراء ذلك، تذكَّر ما يلي:
لا تعتمد نموذجات التعلم الآلي المحدودة (LLM) على قواعد محددة. وبالتالي، أثناء تجربة هذه الطلبات، قد يختلف الردّ الذي تتلقّاه عن الردّ المعروض في لقطة الشاشة.
انتقِل إلى وحدة تحكّم المحادثة في Gemini من خلال النقر على رمز "فتح Gemini" في أعلى يسار الصفحة بجانب شريط البحث في وحدة تحكّم Google Cloud.
اكتب هذا السؤال في قسم "إدخال طلب هنا":
How do I enable the cloud functions api using a gcloud command?
من المفترض أن يظهر لك ردّ مشابه لما يلي:
gcloud services enable cloudfunctions.googleapis.com
انسخ هذا الرمز (يمكنك استخدام رمز النسخ في أعلى مقتطف الأمر) وشغِّله في Cloud Shell Terminal لتفعيل Cloud Functions. اتّبِع الخطوات نفسها لخدمة Cloud Run لأنّنا نحتاج إلى كلتا الخدمتَين لإنشاء دوال Cloud ونشرها:
gcloud services enable \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com
5- إعداد نموذج Cloud Functions باستخدام Gemini
في هذه المرحلة، أفترض أنّه سبق أن تم تفعيل Gemini في بيئة التطوير المتكاملة في Cloud Shell.
افتح "محرِّر Cloud Shell" من خلال النقر على رمز "فتح المحرِّر" في أعلى يسار "وحدة تحكّم Cloud Shell" (أفضّل عادةً فتح وحدة التحكّم والمحرِّر في علامتَي تبويب منفصلتَين بالتوازي حتى نتمكّن من كتابة الرمز في إحدى علامتَي التبويب وإنشاء التطبيق في الأخرى).
بعد فتح المحرّر، تأكَّد من أنّ شعار Gemini في أسفل يسار وحدة تحكّم المحرّر نشط (وألا يكون مُلغى). تأكَّد أيضًا من أنّ مشروعك على Google Cloud في أسفل يمين الصفحة يشير إلى مشروعك النشط الحالي الذي تريد العمل عليه. وإذا كانت هذه الخدمات غير نشطة، انقر عليها أو فوِّضها واختَر مشروع Google Cloud الذي تريد الإشارة إليه وتفعيله.
بعد تفعيل كلا التطبيقَين، انقر على اسم المشروع في أسفل يمين الصفحة، ثم انتقِل إلى "تطبيق جديد" في القائمة المنبثقة التي تظهر بعنوان "رمز السحابة الإلكترونية".
في هذه القائمة، اختَر تطبيق "وظائف Cloud". من القائمة المنبثقة، اختَر Java:
في القائمة الناتجة، اكتب اسم المشروع "duetai-gemini-calling" بدلاً من helloworld وانقر على "حسنًا".
رائع! لقد تمكّنت من إعداد تطبيق Java Cloud Functions البسيط باستخدام Gemini ولم تُجري الكثير من الإجراءات بخلاف تفعيل الإعدادات وتنشيطها، هل هذا صحيح؟
في ما يلي بنية المشروع التي من المفترض أن تظهر لك:
يمكنك الآن نشر الدالة. ولكن ليس هذا هو السبب الذي دفعنا إلى بدء هذه الميزة. لنبدأ بإنشاء عملية تنفيذ Gemini Pro API في Cloud Function هذه باستخدام حزمة Java SDK.
لنبدأ الآن بإنشاء الوظائف الخاصة بحالة الاستخدام التي تستدعي نموذج Gemini Pro في "دالة السحابة الإلكترونية" هذه. لإجراء ذلك، يمكنك إضافة المزيد من الطلبات وتطوير الرمز البرمجي بشكل تدريجي باستخدام Gemini، أو كتابة المنطق بنفسك. سأستخدم مزيجًا من الاثنين.
6- إضافة التبعيات
في وحدة تحكّم المحادثة في Gemini (الوحدة ضمن "محرر رموز Cloud" في اللوحة اليمنى)، اكتب الطلب التالي:
what is the maven dependency for com.google.cloud.vertexai library
السبب في طلب حزمة com.google.cloud.vertexai تحديدًا هو أنّها الحزمة التي أستخدمها في رمز المصدر الذي أُنفّذ فيه رمز استدعاء Gemini.
لقد حصلت على النتيجة التالية:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-vertexai</artifactId>
<version>0.1.0</version>
</dependency>
انسخ هذا النص والصقه في ملف pom.xml مباشرةً قبل العلامة </dependencies>. استبدِل الإصدار بـ 0.1.0 (يمكنك إزالة علامة <version> إذا كنت تستخدم ملف BOM في Spring Cloud GCP لإدارة أرقام إصدارات spring-cloud-gcp نيابةً عنك).
من المفترض أن يظهر قسم "التبعيات" على النحو التالي:
تأكَّد من تحديث أرقام الإصدارات، إذا لزم الأمر، لتتطابق مع الأرقام أعلاه. إذا لاحظت، فقد قمت أيضًا بتضمين تبعية أخرى معها:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10</version>
</dependency>
7- تعديل نقطة دخول الدالة واسم الفئة
- انتقِل إلى الملف "launch.json" ضِمن المجلد " .vscode". عدِّل اسم الدالة من function-hello-world إلى function-gemini-calling.
- عدِّل قيمة entryPoint من cloudcode.helloworld.HelloWorld إلى cloudcode.bookshelf.Bookshelf.
- انتقِل الآن إلى ملف فئة Java "HelloWorld.java". غيِّر اسم الحزمة إلى package cloudcode.bookshelf;. في رسالة الخطأ المنبثقة، انقر على المصباح الكهربائي الأصفر ثم انقر على الخيار "نقل HelloWorld.java" إلى الحزمة cloudcode.bookshelf;.
- عدِّل اسم الفئة إلى Bookshelf، وفي رسالة الخطأ التي تظهر، انقر على المصباح الأصفر الصغير واختَر "إعادة تسمية الملف إلى Bookshelf.java". اختَر ذلك.
8. إنشاء الطريقة التي تستدعي Gemini Pro
لننفِّذ هذه الوظيفة في فئة Bookshelf.java. استبدِل ملف Bookshelf.java بالرمز البرمجي أدناه:
package cloudcode.bookshelf;
import java.io.BufferedWriter;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GenerationConfig;
import com.google.cloud.vertexai.generativeai.preview.GenerativeModel;
import com.google.cloud.vertexai.generativeai.preview.ResponseHandler;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.LinkedHashMap;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;
public class Bookshelf implements HttpFunction {
private static final Gson gson = new Gson();
@Override
public void service(HttpRequest request, HttpResponse response) throws Exception {
BufferedWriter writer = response.getWriter();
// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
JsonArray calls_array = requestJson.getAsJsonArray("calls");
JsonArray calls = (JsonArray) calls_array.get(0);
String context = calls.get(0).toString().replace("\"", "");
//Invoke Gemini model
String raw_result = callGemini(context);
raw_result = raw_result.replace("\n","");
String trimmed = raw_result.trim();
List<String> result_list = Arrays.asList(trimmed);
Map<String, List<String>> stringMap = new LinkedHashMap<>();
stringMap.put("replies", result_list);
// Serialization
String return_value = gson.toJson(stringMap);
writer.write(return_value);
}
public String callGemini(String context) throws IOException{
String res = "";
try (VertexAI vertexAi = new VertexAI("REPLACE_WITH_YOUR_PROJECT_ID", "us-central1"); ) {
GenerationConfig generationConfig =
GenerationConfig.newBuilder()
.setMaxOutputTokens(2048)
.setTemperature(0.4F)
.setTopK(32)
.setTopP(1)
.build();
GenerativeModel model = new GenerativeModel("gemini-pro", generationConfig, vertexAi);
GenerateContentResponse response = model.generateContent(context);
res = ResponseHandler.getText(response);
}catch(Exception e){
System.out.println(e);
}
return res;
}
}
تتوقع هذه الفئة إدخالاً في بنية JSON على النحو التالي:
{ "calls": [["YOUR_PROMPT_HERE"]] }
يعرض الرد على النحو التالي:
(Json) Map<String, List<String>> {"replies": ["response"]}
جرِّب خيار Gemini Chat من "محرر Cloud Shell" في اللوحة اليمنى لشرح الرمز. بدلاً من ذلك، يمكنك اختيار كل الرمز البرمجي والنقر على المصباح الكهربائي الأصفر في أعلى يمين الاختيار واختيار "شرح هذا".
9. نشر دالة Cloud
بعد أن أصبحت وظيفة Cloud جاهزة، لنسأل Gemini عن كيفية نشرها. انتقِل إلى محادثة Gemini في محرِّر Cloud Code وأدخِل ما يلي:
How to deploy this Cloud Function with a gcloud command?
لقد تلقّيتُ الردّ أدناه:
أردنا الآن إجراء المزيد من التحقيق. لذلك، تقدّمت وطلبت من Gemini أن تقدّم لي الأمر الكامل لنشر وظائف gcloud. تظهر الاستجابة كما هو موضّح أدناه:
لا يمكنني الآن أن أقول ما إذا كنت ستتلقّى نفس الردّ، ولكنني أجد أنّه من المثير للاهتمام رؤية أنّه يعلوه ببعض التفاصيل الإضافية، كما هو موضّح في الصورة أدناه:
تنسيق نص الطلب:
و
تنسيق الردّ:
لنبدأ الآن بنشر الدالة من خلال تنفيذ الأمر gcloud الذي أصدره لنا Gemini. لهذا الغرض، نحتاج إلى فتح وحدة Cloud Shell الطرفية. يمكنك فتحه في علامة تبويب جديدة للموقع الإلكتروني https://console.cloud.google.com والتأكّد من اختيار المشروع المناسب. افتح Cloud Shell Terminal من خلال النقر على رمز تفعيل Cloud Shell في أعلى يسار وحدة التحكّم وتأكَّد من أنّك في مجلد المشروع الصحيح باستخدام الأمر أدناه:
cd duetai-gemini-calling
متبوعًا بالأمر أدناه:
gcloud functions deploy bookshelf --runtime java17 --trigger-http --entry-point cloudcode.bookshelf.Bookshelf --allow-unauthenticated
سيُطلب منك الإجابة عن السؤال "هل تريد السماح بطلبات غير مُعتمَدة لاستدعاء الدالة الجديدة [bookshelf]؟" قُل "y" واضغط على مفتاح Enter. بعد ذلك، ستظهر لك بعض الأسئلة، إذا كان ذلك منطبقًا، وسيتم نشر دالة Cloud Function بدون خادم باستخدام عنوان URL المنشور: https://us-central1-*******.cloudfunctions.net/bookshelf.
لنستدعي الآن دوال Cloud Functions المنشورة ونختبرها.
ملاحظة: إذا تخطّيت عن طريق الخطأ سؤال "السماح بطلبات التنفيذ غير المعتمَدة" أو اخترت "لا"، لن تتمكّن من الوصول إلى نتيجة Cloud Functions وسيظهر لك "خطأ في الأذونات" بدون منح إعدادات إضافية لخدمة "إدارة الهوية وإمكانية الوصول". لذا، انتبه إلى ذلك.
10. استدعاء دالة السحابة الإلكترونية المنشورة
لنطلب من Gemini الإجابة عن هذا السؤال. لقد أدخلتُ الطلب.
How to call the deployed cloud function?
لقد حصلت على النتيجة التالية: (قد ترى الردّ نفسه أو لا تراه، فلا تتردد في تغيير الطلب ومعرفة الفرق في الردود).
استفسر عن المحادثة من خلال طرح أسئلة محدّدة حول الطرق البديلة لاستدعاء الدالة المنشورة، والاتصال باستخدام الأمر gcloud وما إلى ذلك. لقد أرسلت الطلب أدناه:
how to call the deployed cloud function using gcloud
لقد تلقّيتُ الردّ أدناه:
يمكنك استخدام هذا الردّ ("gcloud functions call") من المحطة الطرفية مع إجراء تعديلات لجعله يعمل وفقًا لسيناريونا (بدلاً من ذلك، جرِّب تمرير المَعلمات في الطلب نفسه ومعرفة ما إذا كان بإمكانك الحصول على طلب gcloud functions call مفصّل في الردّ):
gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'
في ما يلي النتيجة:
11. تَنظيم
يمكنك حذف "دوال السحابة الإلكترونية" التي أنشأتها سابقًا من خلال النقر على الزر "حذف" في صفحة تفاصيل "دوال السحابة الإلكترونية".
12. تهانينا
لقد نجحت في إنشاء ونشر واختبار Java Cloud Functions للاتصال بخدمة Gemini 1.0 Pro باستخدام Gemini. يأخذ هذا التطبيق طلب الإدخال المتعلق باقتراح الكتاب مع ملخص الكتب وموضوعها.