سازنده قفسه کتاب: از Gemini برای ایجاد یک تابع ابری جاوا برای برنامه Gemini استفاده کنید

۱. مقدمه

آیا عاشق کندوکاو در کتاب‌ها هستید اما از حجم زیاد انتخاب‌ها کلافه می‌شوید؟ تصور کنید یک اپلیکیشن مبتنی بر هوش مصنوعی دارید که نه تنها کتاب مناسب برای مطالعه را پیشنهاد می‌دهد، بلکه خلاصه‌ای مختصر بر اساس ژانر انتخابی شما ارائه می‌دهد و به شما نگاهی اجمالی به جوهره کتاب می‌دهد. در این آزمایشگاه کد، شما را در ساخت چنین اپلیکیشنی با BigQuery و Cloud Functions که توسط Gemini پشتیبانی می‌شوند، راهنمایی خواهم کرد.

نمای کلی پروژه

مورد استفاده ما حول این ۴ مؤلفه کلیدی متمرکز است:

  • پایگاه داده کتاب: مجموعه داده‌های عمومی عظیم BigQuery از کتاب‌های آرشیو اینترنتی، به عنوان کاتالوگ جامع کتاب ما عمل خواهد کرد.
  • موتور خلاصه‌سازی هوش مصنوعی: توابع ابری گوگل، مجهز به مدل زبانی Gemini-Pro، خلاصه‌های آموزنده‌ای متناسب با درخواست‌های کاربر تولید می‌کنند.
  • یکپارچه‌سازی با BigQuery: یک تابع از راه دور در BigQuery که تابع ابری ما را فراخوانی می‌کند تا خلاصه کتاب‌ها و تم‌های درخواستی را ارائه دهد.
  • رابط کاربری: یک برنامه وب میزبانی شده در Cloud Run که یک برنامه وب را برای مشاهده نتایج به کاربران ارائه می‌دهد.

ما پیاده‌سازی را به ۳ آزمایشگاه کد تقسیم خواهیم کرد:

آزمایشگاه کد ۱: استفاده از Gemini برای ساخت یک تابع ابری جاوا برای یک برنامه Gemini.

Codelab 2: از Gemini برای ساخت برنامه‌های هوش مصنوعی مولد مبتنی بر SQL با BigQuery استفاده کنید.

Codelab 3: استفاده از Gemini برای ایجاد یک برنامه وب Java Spring Boot که با BigQuery تعامل دارد.

۲. از Gemini برای ساخت یک برنامه Generative AI بدون سرور روی Java Cloud Function استفاده کنید.

آنچه خواهید ساخت

شما یک [چیز/چیزی] ایجاد خواهید کرد

  • برنامه توابع ابری جاوا که Gemini 1.0 Pro را پیاده‌سازی می‌کند تا یک اعلان خاص را به عنوان ورودی در قالب آرایه JSON دریافت کند و پاسخی (مقدار Json با برچسب "پاسخ‌ها") را برگرداند.
  • شما مراحل ساخت و استقرار را با کمک Gemini انجام خواهید داد.

۳. الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس
  • یک پروژه گوگل کلود با قابلیت پرداخت صورتحساب

در زیر پیش‌نیازها آمده است:

پروژه خود را ایجاد کنید

  1. در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .

فعال کردن پوسته ابری

  1. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود و bq از قبل روی آن بارگذاری شده است، استفاده خواهید کرد:

از کنسول ابری، روی فعال کردن پوسته ابری در گوشه بالا سمت راست کلیک کنید: 6757b2fb50ddcc2d.png

  1. پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شده‌اید و پروژه از قبل روی شناسه پروژه شما تنظیم شده است. دستور زیر را در Cloud Shell اجرا کنید تا تأیید شود که احراز هویت شده‌اید:
gcloud auth list
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
  1. اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>

برای دستورات و نحوه‌ی استفاده از gcloud به مستندات مراجعه کنید.

۴. فعال‌سازی جمینی برای گوگل کلود و APIهای لازم

فعال کردن جمینی

  1. برای فعال کردن API، به Gemini برای Google Cloud در Marketplace بروید. همچنین می‌توانید از دستور زیر استفاده کنید:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. به صفحه Gemini مراجعه کنید و روی «شروع چت» کلیک کنید.

مهم: برای شروع کار با Gemini و فعال کردن Gemini در Cloud Shell IDE، به ترتیب مراحل ۱ و ۲ را در این codelab دنبال کنید.

فعال کردن سایر API های لازم

چطور این کار را انجام دهیم؟ بیایید این را از جوزا بپرسیم، موافقید؟ اما قبل از آن به یاد داشته باشید:

LLM ها غیر قطعی هستند. بنابراین، در حالی که شما این سوالات را امتحان می‌کنید، پاسخی که دریافت می‌کنید ممکن است با آنچه در تصویر من است متفاوت باشد.

با کلیک روی آیکون «باز کردن جمینی» در گوشه بالا سمت راست، کنار نوار جستجو در کنسول گوگل کلود، به کنسول چت جمینی بروید.

26e1491322855614.png

این سوال را در بخش «اینجا یک سوال وارد کنید» تایپ کنید:

How do I enable the cloud functions api using a gcloud command? 

شما باید پاسخی مشابه زیر دریافت کنید:

gcloud services enable cloudfunctions.googleapis.com

آن را کپی کنید (می‌توانید از آیکون کپی در بالای قطعه فرمان استفاده کنید) و آن را در ترمینال Cloud Shell اجرا کنید تا توابع Cloud فعال شوند. همین کار را برای Cloud Run انجام دهید زیرا برای ساخت و استقرار توابع Cloud به هر دو نیاز داریم:

gcloud services enable \
  cloudfunctions.googleapis.com \
  aiplatform.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com

۵. آماده‌سازی الگوی توابع ابری با Gemini

در این مرحله، فرض می‌کنم که شما از قبل Gemini را در Cloud Shell IDE خود فعال کرده‌اید.

ویرایشگر Cloud Shell را با کلیک روی آیکون Open Editor در گوشه سمت راست بالای ترمینال Cloud Shell خود باز کنید (من معمولاً ترجیح می‌دهم ترمینال و ویرایشگر را در تب‌های جداگانه و به صورت موازی باز کنم تا بتوانیم در یکی کد بنویسیم و در دیگری کد بسازیم).

edd258384bc74f1f.png

وقتی ویرایشگر را باز کردید، مطمئن شوید که لوگوی Gemini در گوشه پایین سمت راست کنسول ویرایشگر فعال است (و لغو نشده است). همچنین مطمئن شوید که پروژه Google Cloud شما در گوشه پایین سمت چپ به پروژه فعال فعلی شما که می‌خواهید با آن کار کنید اشاره می‌کند. اگر غیرفعال هستند، روی آنها کلیک کنید، تأیید کنید، پروژه Google Cloud مورد نظر خود را انتخاب کنید و آنها را فعال کنید.

وقتی هر دو فعال شدند، روی نام پروژه در گوشه پایین سمت چپ کلیک کنید و در لیست پاپ‌آپ که با عنوان «Cloud Code» باز می‌شود، به پایین اسکرول کنید تا به «New Application» برسید.

ca08602b576ebd57.png

در آن لیست، برنامه Cloud Functions را انتخاب کنید. از لیستی که ظاهر می‌شود، جاوا را انتخاب کنید:

ac2b44245949da68.png

در لیست حاصل، به جای helloworld، نام پروژه را "duetai-gemini-calling" تایپ کنید و روی تأیید کلیک کنید.

bf9cfe86e35cdced.png

هورا! شما برنامه ساده Java Cloud Functions خود را با Gemini بوت‌استرپ کردید و به جز پیکربندی‌های فعال‌سازی و فعال‌سازی، کار زیادی انجام ندادید، موافقید؟

این ساختار پروژه‌ای است که باید ببینید:

d56e410fb76f183f.png

در حال حاضر، شما می‌توانید تابع را مستقر کنید. اما این دلیل شروع کار ما نیست. بیایید ادامه دهیم و پیاده‌سازی Gemini Pro API را در این تابع ابری با استفاده از SDK جاوا بسازیم.

حالا بیایید قابلیت مورد استفاده خود را بسازیم، که فراخوانی مدل Gemini Pro در این تابع ابری است. برای انجام این کار، می‌توانید دستورات بیشتری اضافه کنید و کد خود را به صورت تدریجی با Gemini توسعه دهید یا منطق را خودتان بنویسید. من قصد دارم ترکیبی از هر دو را انجام دهم.

۶. وابستگی‌ها را اضافه کنید

در کنسول چت Gemini (همان کنسولی که در ویرایشگر کد ابری در پنل سمت چپ قرار دارد)، عبارت زیر را تایپ کنید:

what is the maven dependency for com.google.cloud.vertexai library

دلیل اینکه من به طور خاص برای بسته com.google.cloud.vertexai درخواست می‌کنم این است که من در کد منبع خود، جایی که کد فراخوانی Gemini را پیاده‌سازی می‌کنم، از این بسته استفاده می‌کنم.

من به این نتیجه رسیدم:

62c4295b9b4654e9.png

 <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-vertexai</artifactId>
      <version>0.1.0</version>
    </dependency>

این را کپی کرده و در فایل pom.xml، درست قبل از تگ </dependencies> قرار دهید. نسخه را با 0.1.0 جایگزین کنید (اگر از Spring Cloud GCP BOM برای مدیریت شماره نسخه‌های spring-cloud-gcp استفاده می‌کنید، می‌توانید تگ <version> را حذف کنید).

بخش وابستگی باید به این شکل باشد:

1800f10af9331210.png

در صورت لزوم، مطمئن شوید که شماره نسخه‌ها را به‌روزرسانی می‌کنید تا با موارد فوق مطابقت داشته باشند. اگر توجه کرده باشید، من یک وابستگی دیگر را نیز به آن اضافه کردم:

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.10</version>
    </dependency>

۷. نقطه ورود تابع و نام کلاس را تغییر دهید

  1. به فایل "launch.json" در پوشه ".vscode" بروید. نام تابع را از "function-hello-world" به "function-gemini-calling" تغییر دهید.
  2. مقدار entryPoint را از "cloudcode.helloworld.HelloWorld" به cloudcode.bookshelf.Bookshelf به‌روزرسانی کنید.
  3. حالا به فایل کلاس جاوا "HelloWorld.java" بروید. نام بسته را به package cloudcode.bookshelf تغییر دهید؛ در خطایی که ظاهر می‌شود، روی لامپ زرد کلیک کنید و گزینه‌ای که می‌گوید "Move HelloWorld.java" را به package cloudcode.bookshelf منتقل کنید؛

38d721978bddc8a8.png

  1. نام کلاس را به Bookshelf به‌روزرسانی کنید و در خطایی که ظاهر می‌شود، روی لامپ زرد کوچک کلیک کنید و گزینه "Rename file to Bookshelf.java" را انتخاب کنید. آن را انتخاب کنید.

۸. متدی را ایجاد کنید که 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 به صورت زیر را دارد:

{ "فراخوانی‌ها": [["YOUR_PROMPT_HERE"]] }

پاسخی به شکل زیر برمی‌گرداند:

(Json) Map<String, List<String>> {"پاسخ‌ها": ["پاسخ"]}

برای توضیح کد، گزینه چت Gemini را از ویرایشگر Cloud Shell در پنل سمت چپ امتحان کنید. همچنین می‌توانید تمام کد را انتخاب کنید و روی لامپ زرد در گوشه بالا سمت چپ انتخاب کلیک کنید و گزینه "توضیح این" را انتخاب کنید.

66fb67507793e368.png

۹. عملکرد ابری را مستقر کنید

حالا که تابع ابری آماده است، بیایید از Gemini بپرسیم که چگونه آن را مستقر کند. به چت Gemini در ویرایشگر کد ابری بروید و موارد زیر را وارد کنید:

   How to deploy this Cloud Function with a gcloud command?

من پاسخ زیر را دریافت کردم:

9f9db98933841864.png

حالا می‌خواستم بیشتر بررسی‌اش کنم. بنابراین از Gemini خواستم دستور کامل gcloud functions deploy را به من بدهد. پاسخ به صورت زیر بود:

b77701c00dc3eaf1.png

حالا نمی‌توانم بگویم که آیا شما هم همین پاسخ را دریافت خواهید کرد یا نه، اما برایم خیلی جالب بود که دیدم در کمال تعجب، چند جزئیات دیگر هم به آن اضافه شده است، همانطور که در تصویر زیر دیده می‌شود:

فرمت بدنه درخواست:

82bf20304143a374.png

و

قالب پاسخ:

ade55b3de5d823a6.png

حالا، بیایید با اجرای دستور gcloud که Gemini به ما داده است، تابع را مستقر کنیم. برای این کار باید ترمینال Cloud Shell را باز کنیم. می‌توانید آن را در یک تب جدید به آدرس https://console.cloud.google.com باز کنید و مطمئن شوید که پروژه درست انتخاب شده است. ترمینال Cloud Shell را با کلیک روی آیکون Activate Cloud Shell در گوشه سمت راست بالای کنسول باز کنید و با استفاده از دستور زیر مطمئن شوید که در پوشه پروژه درست هستید:

cd duetai-gemini-calling

و به دنبال آن دستور زیر:

gcloud functions deploy bookshelf --runtime java17 --trigger-http --entry-point cloudcode.bookshelf.Bookshelf --allow-unauthenticated

از شما می‌پرسد «اجازه دهید تابع جدید [bookshelf] بدون احراز هویت فراخوانی شود؟» حرف «y» را بزنید و اینتر را بزنید. پس از آن، در صورت لزوم چند سوال مطرح می‌شود و تابع ابری بدون سرور شما را با آدرس اینترنتی (URL) زیر مستقر می‌کند: https://us-central1-*******.cloudfunctions.net/bookshelf.

حالا بیایید توابع ابری مستقر شده را فراخوانی کنیم و آن را آزمایش کنیم!

توجه: اگر به طور تصادفی سوال «مجاز کردن فراخوانی‌های غیرمجاز» را رد کرده باشید یا «N» را انتخاب کرده باشید، نمی‌توانید به نتیجه توابع ابری دسترسی پیدا کنید و بدون اعطای تنظیمات اضافی IAM، «خطای مجوزها» را مشاهده خواهید کرد. بنابراین به این نکته توجه کنید.

۱۰. تابع ابری مستقر شده را فراخوانی کنید

بیایید از جمینی این را بپرسیم؟ من وارد اعلان شدم

How to call the deployed cloud function?

من نتیجه زیر را گرفتم: (ممکن است دقیقاً همان پاسخ را ببینید یا نبینید، می‌توانید با دستور بازی کنید و تفاوت پاسخ‌ها را ببینید.)

۱d۲۲۴۲۷۱۵۵۷۱fe۶f.png

چت را با سوالات خاص در مورد روش‌های جایگزین برای فراخوانی تابع مستقر، فراخوانی با استفاده از دستور gcloud و غیره بررسی کنید. من درخواست زیر را ارسال کردم:

how to call the deployed cloud function using gcloud

من پاسخ زیر را دریافت کردم: e7b29b2cfb57782c.png

شما می‌توانید از این پاسخ (دستور "gcloud functions call") از ترمینال با کمی تغییر استفاده کنید تا برای سناریوی ما کار کند (روش دیگر، سعی کنید پارامترها را در خود prompt ارسال کنید و ببینید آیا می‌توانید فراخوانی دقیق توابع gcloud را در پاسخ دریافت کنید):

gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'

نتیجه من این است:

6f396d915251db78.png

۱۱. تمیز کردن

شما می‌توانید توابع ابری که قبلاً ایجاد کرده‌اید را با کلیک روی دکمه DELETE در صفحه جزئیات توابع ابری حذف کنید.

۱۲. تبریک

شما با موفقیت یک Java Cloud Functions برای فراخوانی Gemini 1.0 Pro با استفاده از Gemini ساختید، مستقر کردید و آزمایش کردید! این برنامه ورودی مربوط به پیشنهاد کتاب به همراه خلاصه و موضوع کتاب‌ها را دریافت می‌کند.