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

1. مقدمه

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

بررسی اجمالی پروژه

مورد استفاده ما حول این 4 جزء کلیدی متمرکز است:

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

پیاده سازی را به 3 کد لبه تقسیم می کنیم:

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

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

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

2. از Gemini برای ایجاد یک برنامه هوش مصنوعی Generative بدون سرور در Java Cloud Function استفاده کنید

چیزی که خواهی ساخت

شما یک را ایجاد خواهید کرد

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

3. الزامات

  • مرورگری مانند کروم یا فایرفاکس
  • یک پروژه Google Cloud با فعال کردن صورت‌حساب

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

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

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

Cloud Shell را فعال کنید

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

از Cloud Console، روی Activate Cloud Shell در گوشه سمت راست بالا کلیک کنید: 6757b2fb50ddcc2d.png

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

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

4. فعال کردن Gemini برای Google Cloud و APIهای ضروری

Gemini را فعال کنید

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

مهم: مراحل 1 و 2 را در این کد لبه دنبال کنید تا Gemini را شروع کنید و Gemini را در Cloud Shell IDE فعال کنید.

سایر API های ضروری را فعال کنید

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

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

با کلیک بر روی نماد "Open Gemini" در گوشه سمت راست بالا در مجاورت نوار جستجو در کنسول Google Cloud به کنسول چت Gemini بروید.

26e1491322855614.png

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

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

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

gcloud services enable cloudfunctions.googleapis.com

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

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

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

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

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

edd258384bc74f1f.png

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

پس از فعال شدن هر دو، روی نام پروژه در گوشه سمت چپ پایین کلیک کنید و در لیست پاپ آپی که با عنوان "Cloud Code" باز می شود، به سمت "برنامه جدید" بروید.

ca08602b576ebd57.png

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

ac2b44245949da68.png

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

bf9cfe86e35cdced.png

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

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

d56e410fb76f183f.png

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

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

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

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

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>

این را کپی کرده و درست قبل از تگ </dependencies> در فایل pom.xml قرار دهید. نسخه را با 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>

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

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

38d721978bddc8a8.png

  1. نام کلاس را به Bookshelf به روز کنید و در خطایی که ظاهر می شود، روی حباب زرد کوچک کلیک کنید و "Rename file to 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 به شکل زیر انتظار ورودی دارد:

{ "تماس": [["YOUR_PROMPT_HERE"]] }

پاسخی را به صورت زیر برمی گرداند:

(Json) Map<String, List<String>> {"replies": ["response"]}

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

66fb67507793e368.png

9. تابع Cloud را اجرا کنید

اکنون که Cloud Function آماده است، بیایید از Gemini بپرسیم که چگونه آن را مستقر کنیم. به چت Gemini در ویرایشگر Cloud Code بروید و موارد زیر را وارد کنید:

   How to deploy this Cloud Function with a gcloud command?

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

9f9db98933841864.png

حالا می خواستم بیشتر بررسی کنم. بنابراین من جلو رفتم و از Gemini خواستم که دستور استقرار کامل توابع gcloud را به من بدهد. پاسخ به شکل زیر است:

b77701c00dc3eaf1.png

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

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

82bf20304143a374.png

و

فرمت پاسخ:

ade55b3de5d823a6.png

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

cd duetai-gemini-calling

با دستور زیر دنبال می شود:

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

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

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

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

10. تابع Cloud Deployed را فراخوانی کنید

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

How to call the deployed cloud function?

من نتیجه زیر را دریافت کردم: (شما ممکن است پاسخ دقیق یکسانی را ببینید یا نبینید، با خیال راحت با اعلان بازی کنید و تفاوت در پاسخ ها را ببینید).

1d2242715571fe6f.png

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

how to call the deployed cloud function using gcloud

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

می‌توانید از این پاسخ (فرمان «تلفن توابع gcloud») از ترمینال با ترفندهایی استفاده کنید تا برای سناریوی ما کار کند (در روش دیگر، سعی کنید پارامترها را در خود فرمان ارسال کنید و ببینید آیا می‌توانید فراخوانی دقیق توابع gcloud را دریافت کنید. پاسخ):

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

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

6f396d915251db78.png

11. پاکسازی کنید

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

12. تبریک می گویم

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