‫Vertex AI في Firebase

للوصول إلى واجهة برمجة التطبيقات Gemini API ومجموعة نماذج Gemini مباشرةً من تطبيقك، ننصح باستخدام حزمة تطوير البرامج (SDK) لخدمة Vertex AI في Firebase لنظام التشغيل Android. تشكّل حزمة تطوير البرامج (SDK) هذه جزءًا من منصّة Firebase الأوسع التي تساعدك في إنشاء تطبيقات متعدّدة الخدمات وتشغيلها.

بنية دمج Vertex AI في Firebase
الشكل 1. بنية دمج Vertex AI في Firebase

نقل البيانات من حزمة SDK لبرنامج Google AI

تشبه حزمة تطوير البرامج (SDK) لـ Vertex AI في Firebase حزمة SDK لعميل Google AI، ولكن تقدّم حزمة تطوير البرامج (SDK) لـ Vertex AI في Firebase خيارات أمان مهمة وغيرها من الميزات لحالات الاستخدام في مرحلة الإنتاج. على سبيل المثال، عند استخدام Vertex AI في Firebase، يمكنك أيضًا استخدام ما يلي:

إذا سبق لك دمج حزمة تطوير البرامج (SDK) لخدمة Google AI في تطبيقك، يمكنك نقل البيانات إلى Vertex AI في Firebase.

الخطوات الأولى

قبل التفاعل مع واجهة برمجة التطبيقات Gemini API مباشرةً من تطبيقك، عليك أولاً تنفيذ بعض الإجراءات، بما في ذلك التعرّف على طلبات الموافقة و إعداد Firebase وتطبيقك لاستخدام حزمة تطوير البرامج (SDK).

تجربة طلبات البحث

يمكنك تجربة طلبات البحث في Vertex AI Studio. ‫Vertex AI Studio هي بيئة تطوير مدمجة لتصميم الطلبات وإنشاء النماذج الأولية. تتيح لك هذه الميزة تحميل الملفات لاختبار الطلبات التي تتضمّن نصًا وصورًا وحفظ طلب لإعادة الاطّلاع عليه لاحقًا.

إنّ إنشاء الطلب المناسب لحالة الاستخدام هو فن أكثر منه علمًا، ما يجعل التجارب ضرورية. يمكنك الاطّلاع على مزيد من المعلومات عن الطلبات في مستندات Firebase.

إعداد مشروع على Firebase وربط تطبيقك به

بعد أن تصبح مستعدًا للاتّصال بواجهة برمجة التطبيقات Gemini API من تطبيقك، اتّبِع التعليمات في دليل بدء استخدام Vertex AI في Firebase لإعداد Firebase وحزمة تطوير البرامج (SDK) في تطبيقك. سيساعدك دليل البدء في تنفيذ كل المهام التالية الواردة في هذا الدليل.

  1. إعداد مشروع جديد أو حالي على Firebase، بما في ذلك استخدام خطة أسعار Blaze المستندة إلى الدفع حسب الاستخدام وتفعيل واجهات برمجة التطبيقات المطلوبة

  2. ربط تطبيقك بمنصّة Firebase، بما في ذلك تسجيل تطبيقك وإضافة ملف إعدادات Firebase (google-services.json) إلى تطبيقك

إضافة تبعية Gradle

أضِف التبعية التالية لـ Gradle إلى وحدة تطبيقك:

Kotlin

dependencies {
  ...
  implementation("com.google.firebase:firebase-vertexai:16.0.2")
}

Java

dependencies {

   [...]

   implementation("com.google.firebase:firebase-vertexai:16.0.2")

   // Required to use `ListenableFuture` from Guava Android for one-shot generation
   implementation("com.google.guava:guava:31.0.1-android")

   // Required to use `Publisher` from Reactive Streams for streaming operations
   implementation("org.reactivestreams:reactive-streams:1.0.4")
}

بدء خدمة Vertex AI والنموذج التوليدي

ابدأ بإنشاء مثيل GenerativeModel وتحديد اسم النموذج:

Kotlin

val generativeModel = Firebase.vertexAI.generativeModel("gemini-1.5-flash")

Java

GenerativeModel gm = FirebaseVertexAI.getInstance().generativeModel("gemini-1.5-flash");

في مستندات Firebase، يمكنك الاطّلاع على مزيد من المعلومات عن النماذج المتاحة لاستخدامها مع Vertex AI في Firebase. يمكنك معرفة المزيد عن ضبط مَعلمات النماذج.

التفاعل مع Gemini API من تطبيقك

بعد إعداد Firebase وتطبيقك لاستخدام حزمة SDK، أصبحت مستعدًا للتفاعل مع Gemini API من تطبيقك.

إنشاء نص

لإنشاء ردّ نصي، اتصل على generateContent() وأدخِل طلبك.

Kotlin

// Note: `generateContent()` is a `suspend` function, which integrates well
// with existing Kotlin code.

scope.launch {
  val response = model.generateContent("Write a story about the green robot")
}

Java

// In Java, create a `GenerativeModelFutures` from the `GenerativeModel`.
// Note that `generateContent()` returns a `ListenableFuture`. Learn more:
// https://developer.android.com/develop/background-work/background-tasks/asynchronous/listenablefuture

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Content prompt = new Content.Builder()
    .addText("Write a story about a green robot.")
    .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

إنشاء نص من الصور والوسائط الأخرى

يمكنك أيضًا إنشاء نص من طلب يتضمّن نصًا بالإضافة إلى صور أو وسائط أخرى. عند الاتصال بـ generateContent()، يمكنك تمرير الوسائط كبيانات مضمّنة (كما هو موضّح في المثال أدناه). بدلاً من ذلك، يمكنك تضمين ملفات وسائط كبيرة في طلب باستخدام مساحة التخزين في السحابة الإلكترونية لعناوين URL في Firebase.

Kotlin

scope.launch {
  val response = model.generateContent(
    content {
      image(bitmap)
      text("what is the object in the picture?")
    }
  )
}

Java

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);

Content prompt = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
}, executor);

محادثة متعددة الخطوات

يمكنك أيضًا إتاحة المحادثات المتعدّدة المقاطع. ابدأ محادثة باستخدام الدالة startChat(). يمكنك اختياريًا تقديم سجلّ رسائل. بعد ذلك، استخدِم الدالة sendMessage() لإرسال رسائل المحادثة.

Kotlin

val chat = generativeModel.startChat(
    history = listOf(
        content(role = "user") { text("Hello, I have 2 dogs in my house.") },
        content(role = "model") { text("Great to meet you. What would you like to know?") }
    )
)

scope.launch {
   val response = chat.sendMessage("How many paws are in my house?")
}

Java

// (Optional) create message history
Content.Builder userContentBuilder = new Content.Builder();
userContentBuilder.setRole("user");
userContentBuilder.addText("Hello, I have 2 dogs in my house.");
Content userContent = userContentBuilder.build();

Content.Builder modelContentBuilder = new Content.Builder();
modelContentBuilder.setRole("model");
modelContentBuilder.addText("Great to meet you. What would you like to know?");
Content modelContent = userContentBuilder.build();

List<Content> history = Arrays.asList(userContent, modelContent);

// Initialize the chat
ChatFutures chat = model.startChat(history);

// Create a new user message
Content.Builder messageBuilder = new Content.Builder();
messageBuilder.setRole("user");
messageBuilder.addText("How many paws are in my house?");

Content message = messageBuilder.build();

Publisher<GenerateContentResponse> streamingResponse =
        chat.sendMessageStream(message);

StringBuilder outputContent = new StringBuilder();

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        outputContent.append(chunk);
    }

    @Override
    public void onComplete() {
        // ...
    }

    @Override
    public void onError(Throwable t) {
        t.printStackTrace();
    }

    @Override
    public void onSubscribe(Subscription s) {
        s.request(Long.MAX_VALUE);
    }

});

عرض الردّ تدريجيًا

يمكنك تحقيق تفاعلات أسرع من خلال عدم انتظار النتيجة الكاملة من إنشاء النموذج، واستخدام البث بدلاً من ذلك للتعامل مع النتائج الجزئية. استخدِم generateContentStream() لبث ردّ.

Kotlin

scope.launch {
  var outputContent = ""

  generativeModel.generateContentStream(inputContent)
          .collect { response ->
            outputContent += response.text
          }
}

Java

// Note that in Java the method `generateContentStream()` returns a
// Publisher from the Reactive Streams library.
// https://www.reactive-streams.org/

GenerativeModelFutures model = GenerativeModelFutures.from(gm);

// Provide a prompt that contains text
Content prompt = new Content.Builder()
        .addText("Write a story about a green robot.")
        .build();

Publisher<GenerateContentResponse> streamingResponse =
    model.generateContentStream(prompt);

StringBuilder outputContent = new StringBuilder();
streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
  @Override
  public void onNext(GenerateContentResponse generateContentResponse) {
    String chunk = generateContentResponse.getText();
    outputContent.append(chunk);
  }

  @Override
  public void onComplete() {
    // ...
  }

  @Override
  public void onError(Throwable t) {
    t.printStackTrace();
  }

  @Override
  public void onSubscribe(Subscription s) {
    s.request(Long.MAX_VALUE);
  }
});

الخطوات التالية