GenAI Rewriting API

ML Kit의 생성형 AI 재작성 API를 사용하면 사용자가 다른 스타일이나 어조로 채팅 메시지나 짧은 콘텐츠를 재작성하도록 자동으로 지원할 수 있습니다.

사용자는 다음과 같은 경우 콘텐츠를 다시 작성하는 방법에 관한 제안을 받는 것이 유용할 수 있습니다.

  • 이해관계자와 소통할 때 더 전문적으로 보이도록 메시지 구조를 조정
  • 소셜 미디어 플랫폼에 게시하기에 더 적합하도록 메시지를 줄임
  • 메시지를 전달하는 다른 방법을 찾는 비원어민을 위해 메시지를 바꿔 말하기

주요 기능

ML Kit의 GenAI Rewriting API는 다음과 같은 스타일로 짧은 콘텐츠를 다시 쓸 수 있습니다.

  • 정교화: 세부정보와 설명적인 언어를 사용하여 입력 텍스트를 확장합니다.
  • Emojify: 입력 텍스트에 관련 이모티콘을 추가하여 더 표현력 있고 재미있게 만듭니다.
  • 축약: 핵심 메시지를 그대로 유지하면서 입력 텍스트를 더 짧은 버전으로 압축합니다.
  • 친근함: 대화형 어조를 사용하여 입력 텍스트를 더 캐주얼하고 친근하게 다시 작성합니다.
  • 전문적: 입력 텍스트를 더 격식 있고 비즈니스적인 어조로 다시 작성합니다.
  • 다르게 표현: 원래 의미를 유지하면서 다른 단어와 문장 구조를 사용하여 입력 텍스트를 다시 작성합니다.

요청은 하나 이상의 추천을 반환합니다. 여러 제안이 반환되면 결과가 신뢰도 내림차순으로 정렬됩니다.

결과 예시

입력 재작성 스타일 출력
만나서 자세히 이야기해 드릴까요? 프로페셔널 이 문제를 자세히 논의하기 위해 다시 만나보시겠어요?
이번 주 토요일 저녁에 저희 집에서 편안한 모임을 갖고자 합니다. 짧게 작성 이번 주 토요일 저녁에 저희 집에서 편안한 모임을 가지려고 하는데 함께하실 수 있으신가요?
이벤트가 성공했습니다. 상세하게 작성 이 행사는 모든 기대를 뛰어넘는 큰 성공을 거두었습니다.
조만간 커피 한잔해요. 이모티콘 추가 조만간 커피 한잔해요 ☕ 👋
하루가 끝나기 전에 보고서 제공 친근하게 오늘까지 보고서를 공유해 주시겠어요?
안녕하세요. 최대한 빨리 보내주세요. 프로페셔널 요청된 문서를 가능한 한 빨리 제공해 주시겠어요?
프로젝트가 일정보다 늦음 다르게 표현 원래 기한을 맞추려면 프로젝트 타임라인을 조정해야 합니다.

시작하기

GenAI Rewriting API를 시작하려면 프로젝트의 빌드 파일에 이 종속 항목을 추가하세요.

implementation("com.google.mlkit:genai-rewriting:1.0.0-beta1")

그런 다음 필요한 옵션으로 Rewriter 클라이언트를 인스턴스화하고, 필요한 온디바이스 모델 기능을 사용할 수 있는지 확인하고 (필요한 경우 다운로드) 입력 텍스트를 요청으로 준비하고, 다시 쓰기 프로세스를 실행하여 추천을 받고, 리소스를 해제합니다.

Kotlin

val textToRewrite = "The event was successful"

// Define task with selected input and output format
val rewriterOptions = RewriterOptions.builder(context)
    // OutputType can be one of the following: ELABORATE, EMOJIFY, SHORTEN,
    // FRIENDLY, PROFESSIONAL, REPHRASE
    .setOutputType(RewriterOptions.OutputType.ELABORATE)
    // Refer to RewriterOptions.Language for available languages
    .setLanguage(RewriterOptions.Language.ENGLISH)
    .build()
val rewriter = Rewriting.getClient(rewriterOptions)

suspend fun prepareAndStartRewrite() {
    // Check feature availability, status will be one of the following:
    // UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    val featureStatus = rewriter.checkFeatureStatus().await()

    if (featureStatus == FeatureStatus.DOWNLOADABLE) {
        // Download feature if necessary.
        // If downloadFeature is not called, the first inference request will
        // also trigger the feature to be downloaded if it's not already
        // downloaded.
        rewriter.downloadFeature(object : DownloadCallback {
            override fun onDownloadStarted(bytesToDownload: Long) { }

            override fun onDownloadFailed(e: GenAiException) { }

            override fun onDownloadProgress(totalBytesDownloaded: Long) {}

            override fun onDownloadCompleted() {
                startRewritingRequest(textToRewrite, rewriter)
            }
        })
    } else if (featureStatus == FeatureStatus.DOWNLOADING) {
        // Inference request will automatically run once feature is
        // downloaded.
        // If Gemini Nano is already downloaded on the device, the
        // feature-specific LoRA adapter model will be downloaded
        // quickly. However, if Gemini Nano is not already downloaded,
        // the download process may take longer.
        startRewritingRequest(textToRewrite, rewriter)
    } else if (featureStatus == FeatureStatus.AVAILABLE) {
        startRewritingRequest(textToRewrite, rewriter)
    }
}

suspend fun startRewritingRequest(text: String, rewriter: Rewriter) {
    // Create task request
    val rewritingRequest = RewritingRequest.builder(text).build()

    // Start rewriting request with non-streaming response
    // More than 1 result may be returned. If multiple suggestions are
    // returned, results will be sorted by descending confidence.
    val rewriteResults =
        rewriter.runInference(rewritingRequest).await().results

    // You can also start a streaming request
    // rewriter.runInference(rewritingRequest) { newText ->
    //    // Show new text in UI
    // }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close()

자바

String textToRewrite = "The event was successful";

// Define task with required input and output format
RewriterOptions rewriterOptions =
    RewriterOptions.builder(context)
        // OutputType can be one of the following: ELABORATE,
        // EMOJIFY, SHORTEN, FRIENDLY, PROFESSIONAL, REPHRASE
        .setOutputType(RewriterOptions.OutputType.ELABORATE)
        // Refer to RewriterOptions.Language for available
        // languages
        .setLanguage(RewriterOptions.Language.ENGLISH)
        .build();
Rewriter rewriter = Rewriting.getClient(rewriterOptions);

void prepareAndStartRewrite()
    throws ExecutionException, InterruptedException {
    // Check feature availability, status will be one of the
    // following: UNAVAILABLE, DOWNLOADABLE, DOWNLOADING, AVAILABLE
    try {
        int featureStatus = rewriter.checkFeatureStatus().get();
        if (featureStatus == FeatureStatus.DOWNLOADABLE) {
            // Download feature if necessary.
            // If downloadFeature is not called, the first inference
            // request will also trigger the feature to be downloaded
            // if it's not already downloaded.
            rewriter.downloadFeature(
                new DownloadCallback() {
                    @Override
                    public void onDownloadCompleted() {
                        startRewritingRequest(textToRewrite, rewriter);
                    }

                    @Override
                    public void onDownloadFailed(GenAIException e) {}

                    @Override
                    public void onDownloadProgress(
                        long totalBytesDownloaded) {}

                    @Override
                    public void onDownloadStarted(long bytesDownloaded) {}
                });
        } else if (featureStatus == FeatureStatus.DOWNLOADING) {
            // Inference request will automatically run once feature is
            // downloaded.
            // If Gemini Nano is already downloaded on the device, the
            // feature-specific LoRA adapter model will be downloaded
            // quickly. However, if Gemini Nano is not already downloaded,
            // the download process may take longer.
            startRewritingRequest(textToRewrite, rewriter);
        } else if (featureStatus == FeatureStatus.AVAILABLE) {
            startRewritingRequest(textToRewrite, rewriter);
        }
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

void startRewritingRequest(String text, Rewriter rewriter) {
    // Create task request
    RewritingRequest rewritingRequest =
        RewritingRequest.builder(text).build();

    try {
        // Start rewriting request with non-streaming response
        // More than 1 result may be returned. If multiple
        // suggestions are returned, results will be sorted by
        // descending confidence.
        rewriter.runInference(rewritingRequest).get().getResults();

        // You can also start a streaming request
        // rewriter.runInference(rewritingRequest, newText -> {
        //     // Show new text in UI
        // });
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    }
}

// Be sure to release the resource when no longer needed
// For example, on viewModel.onCleared() or activity.onDestroy()
rewriter.close();

지원되는 기능 및 제한사항

생성형 AI 재작성 API는 한국어, 영어, 일본어, 프랑스어, 독일어, 이탈리아어, 스페인어를 지원하며 RewriterOptions.Language에 정의되어 있습니다. 입력은 256개 미만의 토큰이어야 합니다.

특정 기능 구성 (RewriterOptions로 지정)의 사용 가능 여부는 특정 기기의 구성과 기기에 다운로드된 모델에 따라 달라질 수 있습니다.

개발자가 요청된 RewriterOptions가 있는 기기에서 의도한 API 기능이 지원되는지 확인하는 가장 안정적인 방법은 checkFeatureStatus() 메서드를 호출하는 것입니다. 이 메서드는 런타임에 기기에서 기능이 사용 가능한지 여부를 나타내는 최종 상태를 제공합니다.

일반적인 설정 문제

ML Kit GenAI API는 Android AICore 앱을 사용하여 Gemini Nano에 액세스합니다. 기기가 설정된 직후 (초기화 포함) 또는 AICore 앱이 초기화된 직후 (예: 데이터 삭제, 제거 후 재설치)에는 AICore 앱이 초기화 (서버에서 최신 구성 다운로드 포함)를 완료할 시간이 충분하지 않을 수 있습니다. 따라서 ML Kit 생성형 AI API가 예상대로 작동하지 않을 수 있습니다. 표시될 수 있는 일반적인 설정 오류 메시지와 처리 방법은 다음과 같습니다.

오류 메시지 예 처리 방법
AICore가 오류 유형 4-CONNECTION_ERROR 및 오류 코드 601-BINDING_FAILURE로 실패했습니다. AICore 서비스가 바인딩되지 않았습니다. 기기 설정 직후 ML Kit 생성형 AI API를 사용하여 앱을 설치하거나 앱이 설치된 후 AICore가 제거되는 경우에 발생할 수 있습니다. AICore 앱을 업데이트한 후 앱을 다시 설치하면 문제가 해결됩니다.
AICore가 오류 유형 3-PREPARATION_ERROR 및 오류 코드 606-FEATURE_NOT_FOUND로 실패했습니다. 기능 ...을 사용할 수 없습니다. 이는 AICore가 최신 구성 다운로드를 완료하지 않은 경우 발생할 수 있습니다. 기기가 인터넷에 연결되어 있으면 업데이트하는 데 보통 몇 분에서 몇 시간이 걸립니다. 기기를 다시 시작하면 업데이트 속도를 높일 수 있습니다.

기기의 부트로더가 잠금 해제된 경우에도 이 오류가 표시됩니다. 이 API는 부트로더가 잠금 해제된 기기를 지원하지 않습니다.
AICore가 오류 유형 1-DOWNLOAD_ERROR 및 오류 코드 0-UNKNOWN으로 실패했습니다. 기능 ...이 실패 상태 0 및 오류 esz: UNAVAILABLE로 실패했습니다. 호스트 ...를 확인할 수 없습니다. 네트워크 연결을 유지하고 몇 분 정도 기다린 후 다시 시도합니다.