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

ML Kit를 통해 기기별 모델을 사용하여 메시지 답장을 생성할 수 있습니다.

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

시작하기 전에

  1. 아직 추가하지 않았으면 Android 프로젝트에 Firebase를 추가합니다.
  2. 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle)에 ML Kit Android 라이브러리의 종속 항목을 추가합니다.
    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
      // ...
      implementation 'com.google.firebase:firebase-ml-natural-language:22.0.0'
      implementation 'com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7'
    }
  3. 또한 앱 수준의 build.gradle 파일에서 tflite 파일의 압축을 사용하지 않도록 설정합니다.
    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }

1. 대화 기록 객체 만들기

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

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

자바

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

Kotlin

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

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

자바

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

Kotlin

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

대화 기록 객체의 예시는 다음과 같습니다.

타임스탬프 사용자 ID 로컬 사용자 여부 메시지
Thu Feb 21 13:13:39 PST 2019 true are you on your way?
Thu Feb 21 13:15:03 PST 2019 FRIEND0 false Running late, sorry!

위의 예시에서 가장 최근 메시지는 로컬 사용자가 보낸 것이 아닙니다. 이 점이 중요한 이유는 ML Kit는 앱 사용자, 즉 로컬 사용자가 보낼 답장을 추천하기 때문입니다. ML Kit에 전달하는 대화 로그가 사용자가 답장을 보내려고 하는 메시지로 끝나는지 확인해야 합니다.

2. 메시지 답장 가져오기

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

자바

FirebaseSmartReply smartReply = FirebaseNaturalLanguage.getInstance().getSmartReply();
smartReply.suggestReplies(conversation)
        .addOnSuccessListener(new OnSuccessListener<SmartReplySuggestionResult>() {
            @Override
            public void onSuccess(SmartReplySuggestionResult result) {
                if (result.getStatus() == SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE) {
                    // The conversation's language isn't supported, so the
                    // 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
                // ...
            }
        });

Kotlin

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

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

자바

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

Kotlin

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

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