ML Kit의 GenAI Rewriting API를 사용하면 사용자가 채팅 메시지 또는 짧은 콘텐츠를 다른 스타일이나 어조로 자동으로 재작성할 수 있도록 지원할 수 있습니다.
다음과 같은 경우 사용자에게 콘텐츠를 재작성하는 방법에 관한 제안을 제공하는 것이 유용할 수 있습니다.
- 이해관계자와 커뮤니케이션할 때 더 전문적인 메시지로 재구성
- 소셜 미디어 플랫폼에 게시하기에 더 적합하도록 메시지 줄이기
- 메시지를 전달하는 다른 방법을 찾고 있는 비원어민을 위해 메시지의 표현을 바꾸는 방법
주요 기능
ML Kit의 GenAI Rewriting API는 다음 스타일 중 하나로 짧은 콘텐츠를 재작성할 수 있습니다.
- 상세 정보 입력: 더 많은 세부정보와 설명적인 표현으로 입력 텍스트를 확장합니다.
- 이모티콘으로 변환: 입력한 텍스트에 관련 이모티콘을 추가하여 더 효과적이고 재미있게 표현합니다.
- 축약: 핵심 메시지를 그대로 유지하면서 입력 텍스트를 더 짧은 버전으로 압축합니다.
- 친근함: 대화적인 어조를 사용하여 입력한 텍스트를 더 캐주얼하고 접근하기 쉽게 재작성합니다.
- 전문적: 정중한 어조를 사용하여 입력한 텍스트를 더 격식 있고 비즈니스적으로 재작성합니다.
- 다르게 표현: 원래 의미를 유지하면서 다른 단어와 문장 구조를 사용하여 입력 텍스트를 다시 작성합니다.
요청 시 하나 이상의 추천이 반환됩니다. 추천이 여러 개 반환되면 결과는 신뢰도에 따라 내림차순으로 정렬됩니다.
결과 예시
입력 | 재작성 스타일 | 출력 |
만나서 자세히 이야기하고 싶으신가요? | 전문가 | 이 문제를 자세히 논의하기 위해 다시 만나 뵙고 싶으신가요? |
다음 주 토요일 저녁에 저희 집에서 가벼운 모임을 갖고자 합니다. | 짧게 작성 | 이번 토요일 저녁에 집에서 가벼운 모임을 열려고 하는데 함께 참여하시겠어요? |
이벤트가 완료되었습니다. | 상세하게 작성 | 이번 행사는 모든 기대치를 뛰어넘는 대성공을 거두었으며 큰 성공을 거둔 것으로 입증되었습니다. |
곧 커피 한잔해요 | 이모티콘 변환 | 곧 커피 한잔 ☕ 마시러 가요 👋. |
종료일까지 보고서 제공 | 친근하게 | 오늘 중으로 보고서를 공유해 주실 수 있나요? |
안녕하세요. 최대한 빨리 필요합니다. | 전문가 | 요청된 서류를 최대한 빨리 제출해 주시겠어요? |
프로젝트가 일정보다 지연됨 | 다르게 표현 | 원래 기한을 맞추기 위해 프로젝트 타임라인을 조정해야 함 |
시작하기
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();
지원되는 기능 및 제한사항
GenAI Rewriting API는 한국어, 독일어, 스페인어, 영어, 이탈리아어, 일본어, 프랑스어를 지원하며 RewriterOptions.Language
에 정의되어 있습니다. 입력은 256개 토큰 미만이어야 합니다.
특정 기능 구성 (RewriterOptions
로 지정됨)의 사용 가능 여부는 특정 기기의 구성 및 기기에 다운로드된 모델에 따라 다를 수 있습니다.
개발자가 요청된 RewriterOptions
가 있는 기기에서 의도한 API 기능이 지원되는지 확인하는 가장 안정적인 방법은 checkFeatureStatus()
메서드를 호출하는 것입니다. 이 메서드는 런타임에 기기의 기능 사용 가능 여부에 관한 확실한 상태를 제공합니다.
일반적인 설정 문제
ML Kit GenAI API는 Android AICore 앱을 사용하여 Gemini Nano에 액세스합니다. 기기가 설정된 직후 (초기화 포함)이거나 AICore 앱이 초기화된 직후 (예: 데이터 삭제, 제거 후 재설치)에는 AICore 앱이 초기화를 완료할 시간이 충분하지 않을 수 있습니다 (서버에서 최신 구성 다운로드 포함). 따라서 ML Kit GenAI API가 예상대로 작동하지 않을 수 있습니다. 다음은 표시될 수 있는 일반적인 설정 오류 메시지와 처리 방법입니다.
오류 메시지 예 | 처리 방법 |
AICore가 오류 유형 4-CONNECTION_ERROR 및 오류 코드 601-BINDING_FAILURE으로 실패했습니다. AICore 서비스가 바인딩되지 않았습니다. | 이는 기기 설정 직후 ML Kit GenAI API를 사용하여 앱을 설치하거나 앱이 설치된 후 AICore가 제거될 때 발생할 수 있습니다. AICore 앱을 업데이트한 후 앱을 재설치하면 문제가 해결됩니다. |
AICore가 오류 유형 3-PREPARATION_ERROR 및 오류 코드 606-FEATURE_NOT_FOUND: Feature ... is not available 오류로 실패했습니다. |
이는 AICore가 최신 구성 다운로드를 완료하지 않은 경우 발생할 수 있습니다. 네트워크 연결을 유지하고 몇 분에서 몇 시간 정도 기다립니다.
기기의 부트로더가 잠금 해제된 경우에도 이 오류가 표시됩니다. 이 API는 부트로더가 잠금 해제된 기기를 지원하지 않습니다. |
AICore가 오류 유형 1-DOWNLOAD_ERROR 및 오류 코드 0-UNKNOWN으로 실패했습니다. 기능 ... 실패 상태 0 및 오류 esz: UNAVAILABLE: 호스트를 확인할 수 없음 ... | 네트워크 연결을 유지하고 몇 분 정도 기다린 후 다시 시도합니다. |