앱에서 Gemini API 및 Gemini 모델군에 직접 액세스하려면 Android용 Firebase SDK에서 Vertex AI를 사용하는 것이 좋습니다. 이 SDK는 풀 스택 앱을 빌드하고 실행하는 데 도움이 되는 더 큰 Firebase 플랫폼의 일부입니다.
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와 직접 상호작용하기 전에 메시지 표시를 숙지하고 SDK를 사용하도록 Firebase와 앱을 설정하는 등 몇 가지 작업을 먼저 해야 합니다.
프롬프트 실험
Vertex AI Studio에서 프롬프트를 실험할 수 있습니다. Vertex AI Studio는 프롬프트 설계 및 프로토타입 제작을 위한 IDE입니다. 파일을 업로드하여 텍스트와 이미지로 프롬프트를 테스트하고 나중에 다시 방문할 프롬프트를 저장할 수 있습니다.
사용 사례에 적합한 프롬프트를 만드는 것은 과학보다는 예술에 가깝기 때문에 실험이 중요합니다. 프롬프트에 관한 자세한 내용은 Firebase 문서를 참고하세요.
Firebase 프로젝트 설정 및 앱을 Firebase에 연결
앱에서 Gemini API를 호출할 준비가 되면 Firebase용 Vertex AI 시작 가이드의 안내에 따라 앱에서 Firebase와 SDK를 설정하세요. 시작 가이드를 통해 이 가이드의 다음 작업을 모두 수행할 수 있습니다.
사용한 만큼만 지불하는 Blaze 요금제를 사용하고 필요한 API를 사용 설정하는 등 새 Firebase 프로젝트 또는 기존 Firebase 프로젝트를 설정합니다.
앱을 등록하고 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용 Cloud Storage URL을 사용하여 요청에 대용량 미디어 파일을 포함할 수 있습니다.
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); } });
다음 단계
- GitHub의 Firebase 샘플 앱에서 Vertex AI를 검토합니다.
- Gemini API를 무단 클라이언트의 악용으로부터 보호하기 위해 Firebase 앱 체크를 설정하는 등 프로덕션 준비를 시작합니다.
- Firebase 문서에서 Firebase의 Vertex AI에 관해 자세히 알아보세요.