Android에서 ML Kit를 사용한 스마트 답장 생성

ML Kit는 기기별 모델을 사용하여 메시지에 대한 짧은 답장을 생성할 수 있습니다.

스마트 답장을 생성하려면 ML Kit에 대화의 최근 메시지 로그를 전달합니다. 대화가 영어로 작성되었으며 대화에 민감한 주제가 포함되어 있지 않다고 판단하면 ML Kit는 사용자에게 제안할 수 있는 답장을 최대 3개까지 생성합니다.

번들번들로 묶이지 않음
라이브러리 이름com.google.mlkit:smart-replycom.google.android.gms:play-services-mlkit-smart-reply
구현모델이 빌드 시간에 앱에 정적으로 연결됩니다.모델이 Google Play 서비스를 통해 동적으로 다운로드됩니다.
앱 크기의 영향크기가 약 5.7MB 증가합니다.크기가 약 200KB 증가합니다.
초기화 시간모델을 즉시 사용할 수 있습니다.처음 사용하기 전에 모델이 다운로드될 때까지 기다려야 할 수도 있습니다.

사용해 보기

  • 샘플 앱을 살펴보고 이 API의 사용 예를 확인합니다.

시작하기 전에

  1. 프로젝트 수준 build.gradle 파일의 buildscriptallprojects 섹션에 Google의 Maven 저장소가 포함되어야 합니다.

  2. 모듈의 앱 수준 Gradle 파일(일반적으로 app/build.gradle)에 ML Kit Android 라이브러리의 종속 항목을 추가합니다. 필요에 따라 다음 종속 항목 중 하나를 선택합니다.

    • 모델을 앱과 번들로 묶으려면 다음 단계를 따르세요.
    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:smart-reply:17.0.3'
    }
    
    • Google Play 서비스에서 모델을 사용하려면 다음 단계를 따르세요.
    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1'
    }
    

    Google Play 서비스에서 모델을 사용하도록 선택한 경우 Play 스토어에서 앱이 설치된 후 기기에 모델을 자동으로 다운로드하도록 앱을 구성할 수 있습니다. 앱의 AndroidManifest.xml 파일에 다음 선언을 추가합니다.

    <application ...>
          ...
          <meta-data
              android:name="com.google.mlkit.vision.DEPENDENCIES"
              android:value="smart_reply" >
          <!-- To use multiple models: android:value="smart_reply,model2,model3" -->
    </application>
    

    Google Play 서비스 ModuleInstallClient API를 통해 모델 가용성을 명시적으로 확인하고 다운로드를 요청할 수도 있습니다.

    설치 시 모델 다운로드를 사용 설정하지 않거나 명시적 다운로드를 요청하지 않으면 스마트 답장 생성기를 처음 실행할 때 모델이 다운로드됩니다. 다운로드가 완료되기 전에 요청하면 결과가 나오지 않습니다.

    1. 대화 기록 객체 만들기

    스마트 답장을 생성하려면 ML Kit에 시간순으로 정렬된 TextMessage 객체의 List를 전달합니다. 가장 오래된 타임스탬프가 먼저 나와야 합니다.

    사용자가 메시지를 보낼 때마다 메시지와 타임스탬프를 대화 기록에 추가합니다.

    Kotlin

    conversation.add(TextMessage.createForLocalUser(
            "heading out now", System.currentTimeMillis()))

    Java

    conversation.add(TextMessage.createForLocalUser(
            "heading out now", System.currentTimeMillis()));

    사용자가 메시지를 받을 때마다 메시지, 타임스탬프, 발신자의 사용자 ID를 대화 기록에 추가합니다. 사용자 ID는 대화 내에서 발신자를 고유하게 식별하는 임의의 문자열일 수 있습니다. 사용자 ID는 사용자 데이터와 일치할 필요가 없으며, 스마트 답장 생성기의 대화 또는 호출 간에 사용자 ID가 일관되지 않아도 됩니다.

    Kotlin

    conversation.add(TextMessage.createForRemoteUser(
            "Are you coming back soon?", System.currentTimeMillis(), userId))

    Java

    conversation.add(TextMessage.createForRemoteUser(
            "Are you coming back soon?", System.currentTimeMillis(), userId));

    대화 기록 객체는 다음 예와 같습니다.

    타임스탬프 userID isLocalUser 메시지
    2019년 2월 21일 목요일 13:13:39 PST true 가는 중인가요?
    2019년 2월 21일 목요일 13:15:03 PST FRIEND0 false 늦어서 죄송합니다.

    ML Kit는 대화 기록의 마지막 메시지에 대한 답장을 제안합니다. 마지막 메시지는 로컬 사용자가 보낸 것이어야 합니다. 위의 예에서 대화의 마지막 메시지는 로컬이 아닌 사용자 FRIEND0님이 보낸 메시지입니다. Pass ML Kit를 사용하면 이 로그는 FRIENDO의 메시지에 대한 회신을 제안합니다. '죄송합니다. 늦습니다.'

    2. 메시지 답장 받기

    메시지에 대한 스마트 답장을 생성하려면 SmartReplyGenerator의 인스턴스를 가져와 suggestReplies() 메서드에 대화 기록을 전달합니다.

    Kotlin

    val smartReplyGenerator = SmartReply.getClient()
    smartReply.suggestReplies(conversation)
            .addOnSuccessListener { result ->
                if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                    // The conversation's language isn't supported, so
                    // the result doesn't contain any suggestions.
                } else if (result.getStatus() == SmartReplySuggestionResult.STATUS_SUCCESS) {
                    // Task completed successfully
                    // ...
                }
            }
            .addOnFailureListener {
                // Task failed with an exception
                // ...
            }

    Java

    SmartReplyGenerator smartReply = SmartReply.getClient();
    smartReply.suggestReplies(conversation)
            .addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(SmartReplySuggestionResult result) {
                    if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                        // The conversation's language isn't supported, so
                        // the result doesn't contain any suggestions.
                    } else if (result.getStatus() == SmartReplySuggestionResult.STATUS_SUCCESS) {
                        // Task completed successfully
                        // ...
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    // Task failed with an exception
                    // ...
                }
            });

    작업이 성공하면 SmartReplySuggestionResult 객체가 성공 핸들러에 전달됩니다. 이 객체에는 사용자에게 표시할 수 있는 최대 3개의 추천 답장 목록이 포함됩니다.

    Kotlin

    for (suggestion in result.suggestions) {
        val replyText = suggestion.text
    }

    Java

    for (SmartReplySuggestion suggestion : result.getSuggestions()) {
        String replyText = suggestion.getText();
    }

    모델이 추천 답변의 관련성을 확신하지 못하거나, 입력 대화가 영어가 아니거나, 모델이 민감한 주제를 감지하는 경우 ML Kit가 결과를 반환하지 않을 수 있습니다.