Gemini API를 사용하여 멀티모달 프롬프트에서 텍스트 생성


Vertex AI in Firebase SDK를 사용하여 앱에서 Gemini API를 호출하면 Gemini 모델에 멀티모달 입력을 기반으로 텍스트를 생성하도록 프롬프트할 수 있습니다. 멀티모달 프롬프트에는 이미지, PDF, 일반 텍스트 파일, 동영상, 오디오와 함께 텍스트와 같은 여러 모달 (또는 입력 유형)이 포함될 수 있습니다.

각 멀티모달 요청에서 항상 다음을 제공해야 합니다.

  • 파일의 mimeType입니다. 각 입력 파일의 지원되는 MIME 유형을 알아보세요.

  • 파일 파일을 인라인 데이터로 제공하거나 (이 페이지에 표시된 대로) URL 또는 URI를 사용할 수 있습니다.

멀티 모달 프롬프트에서 테스트하고 반복하려면 Vertex AI Studio를 사용하는 것이 좋습니다.

시작하기 전에

아직 완료하지 않았다면 Firebase 프로젝트를 설정하고, 앱을 Firebase에 연결하고, SDK를 추가하고, Vertex AI 서비스를 초기화하고, GenerativeModel 인스턴스를 만드는 방법을 설명하는 시작 가이드를 완료하세요.

텍스트 및 단일 이미지에서 텍스트 생성 텍스트 및 여러 이미지에서 텍스트 생성 텍스트 및 동영상에서 텍스트 생성

샘플 미디어 파일

미디어 파일이 없는 경우 다음과 같은 공개적으로 사용 가능한 파일을 사용할 수 있습니다. 이러한 파일은 Firebase 프로젝트에 없는 버킷에 저장되므로 URL에 https://storage.googleapis.com/BUCKET_NAME/PATH/TO/FILE 형식을 사용해야 합니다.

텍스트 및 단일 이미지에서 텍스트 생성

이 샘플을 사용해 보기 전에 이 가이드의 시작하기 전에 섹션을 완료해야 합니다.

텍스트와 단일 파일 (이 예시에서와 같이 이미지)이 모두 포함된 멀티모달 프롬프트로 Gemini API를 호출할 수 있습니다. 이러한 호출의 경우 프롬프트에서 미디어를 지원하는 모델(예: Gemini 2.0 Flash)을 사용해야 합니다.

입력 파일의 요구사항 및 권장사항을 확인하세요.

응답을 스트리밍할지 (generateContentStream) 아니면 전체 결과가 생성될 때까지 응답을 기다릴지 (generateContent) 선택합니다.

모델 생성의 전체 결과를 기다리지 않고 대신 스트리밍을 사용하여 부분 결과를 처리하면 더 빠른 상호작용을 얻을 수 있습니다.

이 예에서는 generateContentStream()를 사용하여 텍스트와 단일 이미지가 포함된 멀티모달 프롬프트 요청에서 생성된 텍스트를 스트리밍하는 방법을 보여줍니다.

KotlinJava
Kotlin의 경우 이 SDK의 메서드는 정지 함수이므로 코루틴 범위에서 호출해야 합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
val generativeModel = Firebase.vertexAI.generativeModel("gemini-2.0-flash")

// Loads an image from the app/res/drawable/ directory
val bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)

// Provide a prompt that includes the image specified above and text
val prompt = content {
  image(bitmap)
  text("What developer tool is this mascot from?")
}

// To stream generated text output, call generateContentStream with the prompt
var fullResponse = ""
generativeModel.generateContentStream(prompt).collect { chunk ->
  print(chunk.text)
  fullResponse += chunk.text
}
Java의 경우 이 SDK의 스트리밍 메서드는 Reactive Streams 라이브러리Publisher 유형을 반환합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
GenerativeModel gm = FirebaseVertexAI.getInstance()
        .generativeModel("gemini-2.0-flash");
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

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

// Provide a prompt that includes the image specified above and text
Content prompt = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

// To stream generated text output, call generateContentStream with the prompt
Publisher<GenerateContentResponse> streamingResponse = model.generateContentStream(prompt);

final String[] fullResponse = {""};

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        fullResponse[0] += chunk;
    }

    @Override
    public void onComplete() {
        System.out.println(fullResponse[0]);
    }

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

    @Override
    public void onSubscribe(Subscription s) {
    }
});

또는 스트리밍 대신 전체 결과를 기다릴 수 있습니다. 결과는 모델이 전체 생성 프로세스를 완료한 후에만 반환됩니다.

이 예에서는 generateContent()를 사용하여 텍스트와 단일 이미지가 포함된 멀티모달 프롬프트 요청에서 텍스트를 생성하는 방법을 보여줍니다.

KotlinJava
Kotlin의 경우 이 SDK의 메서드는 정지 함수이므로 코루틴 범위에서 호출해야 합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
val generativeModel = Firebase.vertexAI.generativeModel("gemini-2.0-flash")

// Loads an image from the app/res/drawable/ directory
val bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)

// Provide a prompt that includes the image specified above and text
val prompt = content {
  image(bitmap)
  text("What developer tool is this mascot from?")
}

// To generate text output, call generateContent with the prompt
val response = generativeModel.generateContent(prompt)
print(response.text)
Java의 경우 이 SDK의 메서드는 ListenableFuture를 반환합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
GenerativeModel gm = FirebaseVertexAI.getInstance()
        .generativeModel("gemini-2.0-flash");
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

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

// Provide a prompt that includes the image specified above and text
Content content = new Content.Builder()
        .addImage(bitmap)
        .addText("What developer tool is this mascot from?")
        .build();

// To generate text output, call generateContent with the prompt
ListenableFuture<GenerateContentResponse> response = model.generateContent(content);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

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

사용 사례 및 앱에 적합한 모델과 원하는 경우 위치를 선택하는 방법을 알아보세요.

텍스트 및 여러 이미지에서 텍스트 생성

이 샘플을 사용해 보기 전에 이 가이드의 시작하기 전에 섹션을 완료해야 합니다.

텍스트와 여러 파일 (이 예시에서와 같이 이미지)이 모두 포함된 멀티모달 프롬프트로 Gemini API를 호출할 수 있습니다. 이러한 호출의 경우 프롬프트에서 미디어를 지원하는 모델(예: Gemini 2.0 Flash)을 사용해야 합니다.

입력 파일의 요구사항 및 권장사항을 확인하세요.

응답을 스트리밍할지 (generateContentStream) 아니면 전체 결과가 생성될 때까지 응답을 기다릴지 (generateContent) 선택합니다.

모델 생성의 전체 결과를 기다리지 않고 대신 스트리밍을 사용하여 부분 결과를 처리하면 더 빠른 상호작용을 얻을 수 있습니다.

이 예에서는 generateContentStream()를 사용하여 텍스트와 여러 이미지가 포함된 멀티모달 프롬프트 요청에서 생성된 텍스트를 스트리밍하는 방법을 보여줍니다.

KotlinJava
Kotlin의 경우 이 SDK의 메서드는 정지 함수이므로 코루틴 범위에서 호출해야 합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
val generativeModel = Firebase.vertexAI.generativeModel("gemini-2.0-flash")

// Loads an image from the app/res/drawable/ directory
val bitmap1: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)
val bitmap2: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky_eats_pizza)

// Provide a prompt that includes the images specified above and text
val prompt = content {
    image(bitmap1)
    image(bitmap2)
    text("What's different between these pictures?")
}

// To stream generated text output, call generateContentStream with the prompt
var fullResponse = ""
generativeModel.generateContentStream(prompt).collect { chunk ->
  print(chunk.text)
  fullResponse += chunk.text
}
Java의 경우 이 SDK의 스트리밍 메서드는 Reactive Streams 라이브러리Publisher 유형을 반환합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
GenerativeModel gm = FirebaseVertexAI.getInstance()
        .generativeModel("gemini-2.0-flash");
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.sparky_eats_pizza);

// Provide a prompt that includes the images specified above and text
Content prompt = new Content.Builder()
    .addImage(bitmap1)
    .addImage(bitmap2)
    .addText("What's different between these pictures?")
    .build();

// To stream generated text output, call generateContentStream with the prompt
Publisher<GenerateContentResponse> streamingResponse = model.generateContentStream(prompt);

final String[] fullResponse = {""};

streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
    @Override
    public void onNext(GenerateContentResponse generateContentResponse) {
        String chunk = generateContentResponse.getText();
        fullResponse[0] += chunk;
    }

    @Override
    public void onComplete() {
        System.out.println(fullResponse[0]);
    }

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

    @Override
    public void onSubscribe(Subscription s) {
    }
});

또는 스트리밍 대신 전체 결과를 기다릴 수도 있습니다. 결과는 모델이 전체 생성 프로세스를 완료한 후에만 반환됩니다.

이 예에서는 generateContent()를 사용하여 텍스트와 여러 이미지가 포함된 멀티모달 프롬프트 요청에서 텍스트를 생성하는 방법을 보여줍니다.

KotlinJava
Kotlin의 경우 이 SDK의 메서드는 정지 함수이므로 코루틴 범위에서 호출해야 합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
val generativeModel = Firebase.vertexAI.generativeModel("gemini-2.0-flash")

// Loads an image from the app/res/drawable/ directory
val bitmap1: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky)
val bitmap2: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.sparky_eats_pizza)

// Provide a prompt that includes the images specified above and text
val prompt = content {
  image(bitmap1)
  image(bitmap2)
  text("What is different between these pictures?")
}

// To generate text output, call generateContent with the prompt
val response = generativeModel.generateContent(prompt)
print(response.text)
Java의 경우 이 SDK의 메서드는 ListenableFuture를 반환합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
GenerativeModel gm = FirebaseVertexAI.getInstance()
        .generativeModel("gemini-2.0-flash");
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.sparky);
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.sparky_eats_pizza);

// Provide a prompt that includes the images specified above and text
Content prompt = new Content.Builder()
    .addImage(bitmap1)
    .addImage(bitmap2)
    .addText("What's different between these pictures?")
    .build();

// To generate text output, call generateContent with the prompt
ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
    @Override
    public void onSuccess(GenerateContentResponse result) {
        String resultText = result.getText();
        System.out.println(resultText);
    }

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

사용 사례 및 앱에 적합한 모델과 원하는 경우 위치를 선택하는 방법을 알아보세요.

텍스트 및 동영상에서 텍스트 생성

이 샘플을 사용해 보기 전에 이 가이드의 시작하기 전에 섹션을 완료해야 합니다.

텍스트 파일과 동영상 파일이 모두 포함된 멀티모달 프롬프트로 Gemini API를 호출할 수 있습니다(이 예 참고). 이러한 호출의 경우 프롬프트에서 미디어를 지원하는 모델(예: Gemini 2.0 Flash)을 사용해야 합니다.

입력 파일의 요구사항 및 권장사항을 확인하세요.

응답을 스트리밍할지 (generateContentStream) 아니면 전체 결과가 생성될 때까지 응답을 기다릴지 (generateContent) 선택합니다.

모델 생성의 전체 결과를 기다리지 않고 대신 스트리밍을 사용하여 부분 결과를 처리하면 더 빠른 상호작용을 얻을 수 있습니다.

이 예에서는 generateContentStream()를 사용하여 텍스트와 단일 동영상이 포함된 멀티모달 프롬프트 요청에서 생성된 텍스트를 스트리밍하는 방법을 보여줍니다.

KotlinJava
Kotlin의 경우 이 SDK의 메서드는 정지 함수이므로 코루틴 범위에서 호출해야 합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
val generativeModel = Firebase.vertexAI.generativeModel("gemini-2.0-flash")

val contentResolver = applicationContext.contentResolver
contentResolver.openInputStream(videoUri).use { stream ->
  stream?.let {
    val bytes = stream.readBytes()

    // Provide a prompt that includes the video specified above and text
    val prompt = content {
        inlineData(bytes, "video/mp4")
        text("What is in the video?")
    }

    // To stream generated text output, call generateContentStream with the prompt
    var fullResponse = ""
    generativeModel.generateContentStream(prompt).collect { chunk ->
        Log.d(TAG, chunk.text ?: "")
        fullResponse += chunk.text
    }
  }
}
Java의 경우 이 SDK의 스트리밍 메서드는 Reactive Streams 라이브러리Publisher 유형을 반환합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
GenerativeModel gm = FirebaseVertexAI.getInstance()
        .generativeModel("gemini-2.0-flash");
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

ContentResolver resolver = getApplicationContext().getContentResolver();
try (InputStream stream = resolver.openInputStream(videoUri)) {
    File videoFile = new File(new URI(videoUri.toString()));
    int videoSize = (int) videoFile.length();
    byte[] videoBytes = new byte[videoSize];
    if (stream != null) {
        stream.read(videoBytes, 0, videoBytes.length);
        stream.close();

        // Provide a prompt that includes the video specified above and text
        Content prompt = new Content.Builder()
                .addInlineData(videoBytes, "video/mp4")
                .addText("What is in the video?")
                .build();

        // To stream generated text output, call generateContentStream with the prompt
        Publisher<GenerateContentResponse> streamingResponse =
                model.generateContentStream(prompt);

        final String[] fullResponse = {""};

        streamingResponse.subscribe(new Subscriber<GenerateContentResponse>() {
            @Override
            public void onNext(GenerateContentResponse generateContentResponse) {
                String chunk = generateContentResponse.getText();
                fullResponse[0] += chunk;
            }

            @Override
            public void onComplete() {
                System.out.println(fullResponse[0]);
            }

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

            @Override
            public void onSubscribe(Subscription s) {
            }
         });
    }
} catch (IOException e) {
    e.printStackTrace();
} catch (URISyntaxException e) {
    e.printStackTrace();
}

또는 스트리밍 대신 전체 결과를 기다릴 수 있습니다. 결과는 모델이 전체 생성 프로세스를 완료한 후에만 반환됩니다.

이 예에서는 generateContent()를 사용하여 텍스트와 단일 동영상이 포함된 멀티모달 프롬프트 요청에서 텍스트를 생성하는 방법을 보여줍니다.

KotlinJava
Kotlin의 경우 이 SDK의 메서드는 정지 함수이므로 코루틴 범위에서 호출해야 합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
val generativeModel = Firebase.vertexAI.generativeModel("gemini-2.0-flash")

val contentResolver = applicationContext.contentResolver
contentResolver.openInputStream(videoUri).use { stream ->
  stream?.let {
    val bytes = stream.readBytes()

    // Provide a prompt that includes the video specified above and text
    val prompt = content {
        inlineData(bytes, "video/mp4")
        text("What is in the video?")
    }

    // To generate text output, call generateContent with the prompt
    val response = generativeModel.generateContent(prompt)
    Log.d(TAG, response.text ?: "")
  }
}
Java의 경우 이 SDK의 메서드는 ListenableFuture를 반환합니다.
// Initialize the Vertex AI service and create a `GenerativeModel` instance
// Specify a model that supports your use case
GenerativeModel gm = FirebaseVertexAI.getInstance()
        .generativeModel("gemini-2.0-flash");
GenerativeModelFutures model = GenerativeModelFutures.from(gm);

ContentResolver resolver = getApplicationContext().getContentResolver();
try (InputStream stream = resolver.openInputStream(videoUri)) {
    File videoFile = new File(new URI(videoUri.toString()));
    int videoSize = (int) videoFile.length();
    byte[] videoBytes = new byte[videoSize];
    if (stream != null) {
        stream.read(videoBytes, 0, videoBytes.length);
        stream.close();

        // Provide a prompt that includes the video specified above and text
        Content prompt = new Content.Builder()
                .addInlineData(videoBytes, "video/mp4")
                .addText("What is in the video?")
                .build();

        // To generate text output, call generateContent with the prompt
        ListenableFuture<GenerateContentResponse> response = model.generateContent(prompt);
        Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() {
            @Override
            public void onSuccess(GenerateContentResponse result) {
                String resultText = result.getText();
                System.out.println(resultText);
            }

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

사용 사례 및 앱에 적합한 모델과 원하는 경우 위치를 선택하는 방법을 알아보세요.

입력 파일 요구사항 및 권장사항

지원되는 입력 파일 및 Vertex AI Gemini API 요구사항에서 다음에 관해 알아보세요.

  • 요청에 파일을 제공하는 다양한 옵션
  • 지원되는 파일 형식
  • 지원되는 MIME 유형 및 지정 방법
  • 파일 및 멀티모달 요청 요구사항 및 권장사항

또 뭘 할 수 있니?

  • 모델에 긴 프롬프트를 보내기 전에 토큰 수를 집계하는 방법을 알아보세요.
  • Cloud Storage for Firebase를 설정하여 다중 모드 요청에 대용량 파일을 포함하고 프롬프트에서 파일을 제공하는 더 관리된 솔루션을 사용할 수 있습니다. 파일에는 이미지, PDF, 동영상, 오디오가 포함될 수 있습니다.
  • 승인되지 않은 클라이언트의 악용으로부터 Gemini API를 보호하기 위해 Firebase App Check를 설정하는 등 프로덕션 준비를 시작합니다. 또한 프로덕션 체크리스트를 검토하세요.

다른 기능 사용해 보기

콘텐츠 생성을 제어하는 방법 알아보기

Vertex AI Studio를 사용하여 프롬프트 및 모델 구성을 실험할 수도 있습니다.

지원되는 모델 자세히 알아보기

다양한 사용 사례에 사용할 수 있는 모델할당량, 가격에 대해 알아보세요.


Vertex AI in Firebase 사용 경험에 관한 의견 보내기