Firebase용 Vertex AI

앱에서 Gemini API 및 Gemini 모델군에 직접 액세스하려면 Android용 Firebase SDK에서 Vertex AI를 사용하는 것이 좋습니다. 이 SDK는 풀 스택 앱을 빌드하고 실행하는 데 도움이 되는 더 큰 Firebase 플랫폼의 일부입니다.

Firebase 통합 아키텍처의 Vertex AI
그림 1. Firebase 통합 아키텍처의 Vertex AI

Google AI 클라이언트 SDK에서 이전

Firebase SDK의 Vertex AI는 Google AI 클라이언트 SDK와 유사하지만 Firebase SDK의 Vertex AI는 프로덕션 사용 사례를 위한 중요한 보안 옵션 및 기타 기능을 제공합니다. 예를 들어 Firebase에서 Vertex AI를 사용할 때 다음을 사용할 수도 있습니다.

  • Firebase 앱 체크: 승인되지 않은 클라이언트의 악용으로부터 Gemini API를 보호합니다.

  • Firebase 원격 구성: 새 버전의 앱을 출시하지 않고도 클라우드에서 앱의 값 (예: 모델 이름)을 동적으로 설정하고 변경할 수 있습니다.

  • Firebase용 Cloud Storage: Gemini API 요청에 대용량 미디어 파일을 포함합니다.

Google AI 클라이언트 SDK를 이미 앱에 통합한 경우 Firebase에서 Vertex AI로 이전할 수 있습니다.

시작하기

앱에서 Gemini API와 직접 상호작용하기 전에 메시지 표시를 숙지하고 Firebase와 앱을 설정하여 SDK를 사용하도록 설정하는 등 몇 가지 작업을 먼저 해야 합니다.

프롬프트 실험

Vertex AI Studio에서 프롬프트를 실험할 수 있습니다. Vertex AI Studio는 프롬프트 설계 및 프로토타입 제작을 위한 IDE입니다. 파일을 업로드하여 텍스트와 이미지로 프롬프트를 테스트하고 나중에 다시 살펴볼 수 있도록 프롬프트를 저장할 수 있습니다.

사용 사례에 적합한 프롬프트를 만드는 것은 과학보다는 기술에 가깝기 때문에 실험이 중요합니다. 프롬프트에 관한 자세한 내용은 Firebase 문서를 참고하세요.

Firebase 프로젝트 설정 및 앱을 Firebase에 연결

앱에서 Gemini API를 호출할 준비가 되면 Firebase용 Vertex AI 시작 가이드의 안내에 따라 앱에서 Firebase와 SDK를 설정하세요. 시작 가이드를 통해 이 가이드의 다음 작업을 모두 수행할 수 있습니다.

  1. 사용한 만큼만 지불하는 Blaze 요금제 사용 및 필요한 API 사용 설정을 포함하여 새 Firebase 프로젝트 또는 기존 Firebase 프로젝트를 설정합니다.

  2. 앱을 등록하고 Firebase 구성 파일 (google-services.json)을 앱에 추가하는 등 앱을 Firebase에 연결합니다.

Gradle 종속 항목 추가

앱 모듈에 다음 Gradle 종속 항목을 추가합니다.

Kotlin

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

자바

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")

자바

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

Firebase 문서에서 Firebase용 Vertex AI와 함께 사용할 수 있는 모델에 관해 자세히 알아보세요. 모델 매개변수 구성에 대해서도 알아볼 수 있습니다.

앱에서 Gemini API와 상호작용

이제 SDK를 사용하도록 Firebase와 앱을 설정했으므로 앱에서 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")
}

자바

// 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()를 호출할 때 미디어를 인라인 데이터로 전달할 수 있습니다(아래 예 참고). 또는 Firebase URL용 Cloud Storage를 사용하여 요청에 대용량 미디어 파일을 포함할 수 있습니다.

Kotlin

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

자바

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?")
}

자바

// (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);
  }
});

다음 단계