Google 번역으로 여러 언어 지원

Business Messages의 언어와 Google 번역의 지능형 자동 번역을 사용하면 사용자가 선호하는 언어로 사용자와 소통하여 에이전트의 도달범위를 확장할 수 있습니다. 이 튜토리얼에서는 Google 번역과 Business Messages 웹훅을 통합하는 개념 증명을 설명합니다.

필요한 항목

시작하려면 다음 항목이 준비되어야 합니다.

코드 가져오기

이 튜토리얼에서는 Google 번역과 통합되는 샘플 웹훅 코드를 안내합니다. 코드를 가져오려면 GitHub에서 저장소를 클론합니다.

git clone https://github.com/google-business-communications/bm-nodejs-translation-tutorial

클론된 디렉터리로 이동하여 서비스 계정 키를 리소스 디렉터리에 배치합니다.

cp credentials.json bm-nodejs-translation-sample/resources/bm-agent-service-account-credentials.json

팁: 서비스 키를 설정하거나 다운로드하는 데 도움이 필요하면 서비스 계정 관리를 위한 Google Cloud 가이드를 참조하세요.

그런 다음 코드를 배포할 수 있습니다.

gcloud app deploy

휴대기기를 사용하여 상담사에게 메시지를 보냅니다. 다양한 언어로 메시지를 보내서 무슨 일이 발생하는지 확인해 보세요.

Translate API 설정

샘플 코드는 이미 설치된 Translate API용 노드 패키지와 함께 제공됩니다. 노드 패키지를 설치하는 방법 또는 다른 프로그래밍 언어로 번역 API를 설치하는 방법에 관심이 있으면 Cloud Translate API 문서를 참조하세요.

Translate API를 사용하려면 라이브러리를 가져오고 Translate API 클라이언트를 만들어야 합니다. routes/index.js 파일을 엽니다. 관련 행은 다음과 같습니다.

// Import the Translate API library.
const { Translate } = require("@google-cloud/translate").v2;
// Create a new Translate API client.
const translate = new Translate();

이제부터 번역 객체에서 Translate API 메서드에 액세스할 수 있습니다.

파일 상단에서 생성된 변수를 살펴보세요.

const SERVER_LANGUAGE = "en";
let currentLanguage = SERVER_LANGUAGE;

샘플 코드는 서버 언어가 상대적으로 고정되어 있기 때문에 상수로 저장합니다. 하지만 대화의 현재 언어는 변경될 수 있으므로 대화는 currentLanguage 변수에서 추적됩니다.

수신 언어 감지

샘플 코드는 수신 언어가 변경되었는지 감지하고, 사용자가 대화에서 사용할 언어를 선택하라는 메시지를 표시합니다. 영어 이외의 언어로 상담사에게 메시지를 입력하여 휴대기기에서 이 기능을 사용해 보세요. 다른 언어를 잘 모른다면 'Hola'(스페인어)를 입력해 보세요.

에이전트는 사용자에게 언어 전환 여부를 묻는 메시지로 응답합니다. 메시지에는 사용자가 클릭하여 해당 언어로 전환할 수 있는 추천 답장이 포함됩니다.

먼저 언어 감지 기능을 살펴보겠습니다.

/**
 * Detects input text language.
 *
 * @param {string} text The text received from the consumer.
 * @param {Context} context The user message request context.
 * @return A Promise with the detected language code.
 */
async function detectLanguage(text, context) {
  return new Promise(function (resolve, reject) {
    translate
      .detect(text)
      .then((result) => {
        if (result && result.length > 0) {
          if (result[0].confidence > CONFIDENCE_THRESHOLD) {
            resolve(result[0].language);
          }
          resolve(bcp47.parse(context.resolvedLocale).language);
        } else {
          reject("No language detected");
        }
      })
      .catch((err) => {
        console.error("ERROR:", err);
        reject(err);
      });
  });
}

이 메서드는 변환 클라이언트에 감지 메서드를 사용합니다. Translation API는 신뢰도 수준이 서로 다른 여러 언어 (및 여러 입력 지원)를 감지할 수 있으므로 결과 배열을 반환합니다. 샘플은 첫 번째 결과를 얻는데, 이는 가장 높은 신뢰도를 제공하는 결과입니다.

확인된 언어 사용

경우에 따라 Translate API가 높은 신뢰도로 메시지 언어를 결정할 수 없습니다. 예를 들어 고양이가 키보드 전체에서 실행되어 의미 없는 문자열을 입력하면 Translate API가 여전히 언어 감지를 시도하지만 감지된 언어가 잘못되었을 수 있습니다. 아직 Google 고양이 번역은 고양이와 같은 언어를 지원하지 않습니다. Translate API는 translate.detect 결과에서 신뢰도가 낮은 값을 설정하여 이를 표시합니다.

이 시나리오에서는 샘플 코드가 Business Messages 확인된 언어의 언어로 돌아갑니다. 이는 Business Messages API에서 메시지의 컨텍스트를 기반으로 언어를 가장 정확하게 추측한 언어입니다. 확인된 언어는 BCP-47 형식이므로 해당하는 Node.js 패키지를 사용하여 언어의 언어 코드를 파싱할 수 있습니다.

상담사에게 긴 의미의 문자열을 입력하여 이 동작을 테스트할 수 있습니다. 대부분의 경우 확인된 언어가 현재 언어와 다른 경우가 아니라면 언어를 변경하라는 메시지가 표시되지 않습니다. 에이전트는 단순히 요청을 이해하지 못한다고 말합니다.

언어 변경 메시지 표시

언어가 변경되었음을 감지하면 에이전트는 언어를 변경하라는 메시지를 다시 보냅니다.

if (detectedLanguage != currentLanguage) {
        translateText(
          "Which language would you like to use?",
          SERVER_LANGUAGE,
          currentLanguage
        ).then((normalizedTranslationNotice) => {
          sendResponse(
            normalizedTranslationNotice,
            conversationId,
            [
              ...new Set([detectedLanguage, currentLanguage, SERVER_LANGUAGE]),
            ].map((x) => createSuggestedReply(x))
          );
        });
      }

이 코드는 프롬프트를 만들고 현재 언어로 번역한 후 (아웃바운드 메시지 번역 섹션에서 자세히 설명함) 추천 응답을 포함하여 응답을 보냅니다. 사용자가 다음 언어로 말할 수 있습니다.

  • 감지된 수신 언어입니다.
  • 현재 대화 언어
  • 서버의 기본 언어입니다.

이 세 언어는 중복될 수 있으므로 (예: 현재 언어가 이미 서버 언어인 경우) 서버는 set 객체를 사용하여 중복을 삭제합니다. 그런 다음 각 언어에 대한 추천 답장을 만듭니다.

/**
 * Create a suggested reply for a language code.
 * @param {string} languageCode A ISO 6391 language code.
 * @return {Suggestion} The suggestion object for switching to the language.
 */
function createSuggestedReply(languageCode) {
  return {
    reply: {
      text: ISO6391.getNativeName(languageCode),
      postbackData: SWITCH_LANGUAGE_POSTBACK + languageCode,
    },
  };
}

추천 답변에 해당 국가의 이름이 표시됩니다. 예를 들어 스페인어는 "Español."로 표시됩니다. 두 자리 언어 코드에서 언어 정보를 가져오려면 Node.js용 ISO-639-1 라이브러리를 사용하면 됩니다.

사용자가 이 제안을 클릭할 때 서버로 전송되는 포스트백 데이터를 확인하세요. 포스트백 데이터는 서버에 응답하는 방법을 알려주고 추천에 대한 컨텍스트를 제공합니다.

sendResponse 메서드는 다음 추천 객체를 답장에 연결합니다.

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

대화 언어 변경하기

이제 휴대기기로 돌아가서 이전 프롬프트에서 새 언어 옵션을 클릭합니다. 예를 들어 'Hola'를 입력한 경우 추천 답변에서 'Español'을 클릭하세요.

상담사가 새로운 언어로 응답합니다. 발신 답장을 번역하는 방법은 이후 단계에서 다룹니다. 지금은 클릭한 추천 답변을 수신하고 처리하는 코드를 살펴봅니다.

if (requestBody.suggestionResponse !== undefined) {
    let postbackData = requestBody.suggestionResponse.postbackData;
    if (postbackData.startsWith(SWITCH_LANGUAGE_POSTBACK)) {
      let languageCode = postbackData.substr(SWITCH_LANGUAGE_POSTBACK.length);
      currentLanguage = languageCode;
      translateText(
        "The language was set to " +
          ISO6391.getName(languageCode) +
          ". Please repeat your request.",
        SERVER_LANGUAGE,
        languageCode
      ).then((translationNotice) => {
        sendResponse(translationNotice, conversationId, []);
      });
    }
  }

요청에 제안 응답이 포함된 경우 서버는 포스트백 데이터를 사용하여 수행할 작업을 결정합니다. 이 간단한 사례에서는 한 가지 유형의 포스트백 데이터인 SWITCH_LANGUAGE_POSTBACK만 지원합니다. 즉, 대화를 다음과 같은 언어 코드로 변경해야 합니다. 이 언어 코드를 파싱한 후 서버는 사용자에게 언어가 변경되었음을 알리는 메시지를 보냅니다.

수신 메일 번역

이제 언어가 변경되었으므로 휴대기기에서 해당 언어로 에이전트에 요청을 보낼 수 있습니다. 새로운 언어로 'help"'라는 단어를 전송해 보세요. 언어를 스페인어로 변경한 경우 "ayuda"를 입력하고 메시지를 보냅니다.

서버는 요청 요청을 이해하고 옵션 메뉴를 사용하여 응답합니다. 다음 중 하나를 사용하여 하드 코딩된 샘플 응답을 확인하세요.

샘플 코드는 translateText 메서드를 사용하여 수신 및 발신 메시지를 모두 번역합니다. 지금 살펴보세요.

/**
 * Translates text to a given target language. No translation if source and
 * target language match.
 *
 * @param {string} text the text to translate
 * @param {string} sourceLanguage The language of the source text.
 * @param {string} targetLanguage The target language.
 * @return A Promise with the translated text.
 */
async function translateText(text, sourceLanguage, targetLanguage) {
  if (sourceLanguage === targetLanguage) {
    return new Promise(function (resolve, reject) {
      resolve(text);
    });
  }
  return new Promise(function (resolve, reject) {
    translate
      .translate(text, targetLanguage)
      .then((result) => {
        if (result && result.length > 0) {
          resolve(result[0]);
        } else {
          reject("Could not translate message");
        }
      })
      .catch((err) => {
        console.error("ERROR:", err);
        reject(err);
      });
  });
}

출발어가 출발어와 같은 경우 실행할 작업이 없습니다. 그렇지 않으면 서버가 Translate API 클라이언트에서 변환 메서드를 호출합니다. 감지 메서드와 마찬가지로 번역 메서드는 여러 입력을 받을 수 있습니다. 서버는 입력을 하나만 제공하므로 번역 API의 첫 번째 결과를 가져옵니다.

수신 메시지에 현재 언어로 응답하는 콜백 메서드의 섹션을 확인합니다.

translateText(incomingMessage, currentLanguage, SERVER_LANGUAGE).then(
          (normalizedMessage) => {
            let serverResponse = chooseResponseMessage(normalizedMessage);
            …
          }
        );

서버는 translateText의 출력을 사용하여 응답 메시지를 선택합니다. 다음 섹션에서는 응답 메시지를 선택하고 번역하는 프로세스를 자세히 설명합니다.

발신 메일 번역

서버가 수신된 메시지를 기본 영어로 번역한 후 사용자의 요청을 선택하고 번역한 후 적절한 응답을 전송해야 합니다. 샘플 코드는 키워드를 응답에 매핑하는 매우 간단한 스키마를 사용합니다. chooseResponseMessage 메서드를 살펴보세요.

/**
 * Select a topically appropriate response based on the message
 * content that the user sent to the agent.
 *
 * @param {string} incomingMessage The content of the message that the user typed in.
 * @param {string} conversationId The unique id for this user and agent.
 * @return {string} A response message.
 */
function chooseResponseMessage(incomingMessage) {
  let responseMapping = {
    balance: "Your current balance is $500.",
    deposit: "Please enter your deposit amount.",
    transfer:
      "Please enter the account number where you wish to transfer the funds.",
    withdraw: "Please enter the amount you wish to withdraw.",
    help: "Please choose what you'd like to do: balance, deposit, transfer, or withdraw.",
  };

  for (const [key, value] of Object.entries(responseMapping)) {
    if (incomingMessage.toLowerCase().includes(key)) {
      return value;
    }
  }

  return "I didn't understand your request. Please try again.";
}

이 스키마는 서버에서 영어만 지원합니다. 즉, 서버가 모든 수신 및 발신 메시지를 번역해야 합니다. 보다 정교한 시스템은 여러 언어를 지원하고 기본적으로 다른 언어의 요청에 응답할 수 있습니다. 예를 들어 에이전트가 스페인어를 지원하는 경우 응답 맵에 이미 'ayuda'의 키가 있을 수 있습니다. 더 정교한 시스템에서는 다른 방법론을 사용하여 ML 또는 점수 알고리즘과 같은 적절한 응답을 선택할 수도 있습니다. Business Messages로 더 스마트한 응답을 만드는 한 가지 방법은 Dialogflow와 통합하는 것입니다.

이제 선택한 메시지를 사용자에게 다시 보내는 코드를 살펴봅니다.

let serverResponse = chooseResponseMessage(normalizedMessage);
            translateText(
              serverResponse,
              SERVER_LANGUAGE,
              currentLanguage
            ).then((normalizedResponse) => {
              sendResponse(normalizedResponse, conversationId, []);
            });

샘플 코드는 translateText 메서드를 재사용하여 선택된 응답을 현재 대화 언어로 변환합니다. 그러면 sendResponse 메서드가 새 메시지 객체를 만들어 사용자에게 전송합니다.

요약

이 튜토리얼에서는 Cloud Translation API와의 간단한 통합을 만들고 더 많은 사용자에게 도달하기 위해 Business Messages 언어 기능을 활용하는 방법을 알아보았습니다. 원하는 경우 이 튜토리얼의 샘플 코드를 자체 통합의 시작점으로 사용하거나 새 방법을 시도해 볼 수 있습니다. 다음은 참고할 수 있는 팁입니다.

  • 원본 메시지 콘텐츠와 자동 번역된 콘텐츠가 모두 포함된 이중 언어 메시지를 전송합니다.
  • 사용자가 대화를 시작할 때 지원되는 언어의 전체 메뉴를 사용자에게 표시합니다.
  • 용어집과 같은 고급 번역 API 기능을 사용하여 비즈니스에 적합한 단어를 안정적으로 번역합니다.

Google 번역 API와 통합하면 고품질 기계 번역을 활용해 가장 익숙한 언어로 더 많은 사용자와 소통할 수 있습니다. 에이전트가 보다 생산적이고 효율적으로 대화하여 고객 만족도와 작업 완료를 높일 수 있습니다.