Vertex AI ב-Firebase

כדי לגשת ל-Gemini API ולמשפחת המודלים של Gemini ישירות מהאפליקציה, מומלץ להשתמש ב-Vertex AI ב-Firebase SDK ל-Android. ערכת ה-SDK הזו היא חלק מפלטפורמת Firebase הרחבה, שעוזרת לכם ליצור ולהריץ אפליקציות בסביבה מלאה.

ארכיטקטורת השילוב של Vertex AI ב-Firebase
איור 1. ארכיטקטורת השילוב של Vertex AI ב-Firebase.

מעבר מ-Google AI Client SDK

Vertex AI ב-Firebase SDK דומה ל-Google AI client SDK, אבל ה-Vertex AI ב-Firebase SDK מציע אפשרויות אבטחה קריטיות ותכונות נוספות לתרחישים לדוגמה בסביבת הייצור. לדוגמה, כשמשתמשים ב-Vertex AI ב-Firebase, אפשר גם להשתמש באפשרויות הבאות:

  • Firebase App Check כדי להגן על Gemini API מפני ניצול לרעה על ידי לקוחות לא מורשים.

  • הגדרת תצורה מרחוק ב-Firebase כדי להגדיר ולשנות באופן דינמי ערכים לאפליקציה בענן (לדוגמה, שמות מודלים) בלי צורך לפרסם גרסת אפליקציה חדשה.

  • Cloud Storage for Firebase כדי לכלול בקשה ל-Gemini API עם קובצי מדיה גדולים.

אם כבר שילבתם את ה-SDK של לקוח Google AI באפליקציה, תוכלו להעביר אותה ל-Vertex AI ב-Firebase.

תחילת העבודה

לפני שתבצעו אינטראקציה עם Gemini API ישירות מהאפליקציה, תצטרכו לבצע כמה פעולות, כולל היכרות עם ההנחיות והגדרת Firebase והאפליקציה לשימוש ב-SDK.

התנסות בהנחיות

אפשר להתנסות בהנחיות ב-Vertex AI Studio. Vertex AI Studio היא סביבת פיתוח משולבת (IDE) ליצירת פרומפטים וליצירת אב טיפוס. אפשר להעלות קבצים כדי לבדוק הנחיות עם טקסט ותמונות, ולשמור הנחיה כדי לחזור אליה מאוחר יותר.

יצירת ההנחיה המתאימה לתרחיש לדוגמה היא יותר אמנות מאשר מדע, ולכן חשוב מאוד לבצע ניסויים. מידע נוסף על הנחיות זמין במסמכי העזרה של Firebase.

הגדרת פרויקט Firebase וקישור האפליקציה ל-Firebase

כשתהיו מוכנים לבצע קריאה ל-Gemini API מהאפליקציה, תוכלו לפעול לפי ההוראות במדריך לתחילת העבודה עם Vertex AI ב-Firebase כדי להגדיר את Firebase ואת ה-SDK באפליקציה. המדריך הזה יעזור לכם לבצע את כל המשימות הבאות במדריך הזה.

  1. מגדירים פרויקט Firebase חדש או קיים, כולל שימוש בתוכנית התמחור Blaze שמבוססת על תשלום לפי שימוש והפעלה של ממשקי ה-API הנדרשים.

  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 של Cloud Storage ל-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);
  }
});

השלבים הבאים