תמיכה בריבוי שפות באמצעות Google Translate

בעזרת הלוקאלים של Business Messages והפלטפורמה החכמה והאוטומטית של Google Translate אפשר להרחיב את פוטנציאל החשיפה של הנציג על ידי יצירת קשר עם משתמשים לשפה המועדפת עליהם. המדריך הזה מסביר איך ליצור הוכחת קונספט שילוב של Google Translate עם תגובה לפעולה מאתר אחר (webhook) של Business Messages.

למה תזדקק?

כדי להתחיל, אתם צריכים להכין את הדברים הבאים:

קבל את הקוד

במדריך הזה מוסבר איך ליצור קוד webhook לדוגמה שמשולב עם 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

באמצעות המכשיר הנייד, שולחים מספר הודעות לנציג. אפשר לשלוח את הודעות בשפות שונות ולראות מה קורה.

הגדרת ה-API של Translate

הקוד לדוגמה כבר מגיע עם חבילת ה-Node עבור Translate API מותקנת. אם אתם מעוניינים איך להתקין את חבילת ה-Node או איך להתקין את ממשק ה-API של Translate בשפת תכנות אחרת, מסמכי העזרה של 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();

מעכשיו אפשר לגשת לשיטות ה-API של Translate באובייקט התרגום.

מעיינים במשתנים שנוצרו בחלק העליון של הקובץ:

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);
      });
  });
}

השיטה הזו משתמשת בשיטת הזיהוי בלקוח התרגום. כי ממשק Translate API עשוי לזהות כמה שפות ברמות סמך שונות (וגם בגלל שהוא תומך במגוון של ), הפונקציה הזו מחזירה מערך של תוצאות. הדגימה לוקחת את השלב הראשון תוצאה מסוימת, שהיא התוצאה עם רמת הסמך הגבוהה ביותר.

שימוש בלוקאל שזוהה

לפעמים ה-Translate API לא יכול לקבוע את שפת ההודעה עם שגיאות במידה רבה. לדוגמה, אם החתול שלך רץ על המקלדת ומזין מחרוזת חסרת משמעות, Translate API עדיין מנסה לזהות את השפה, השפה שזוהתה כנראה שגויה. (אחרי הכול, Google Translate לא תומכת בשפות חתולים, אבל עדיין!) מציין את זה ב-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))
          );
        });
      }

הקוד יוצר הנחיה, מתרגם אותה לשפה הנוכחית (מידע נוסף בנושא בקטע 'תרגום הודעה יוצאת'), ולאחר מכן שולחת תשובה עם הצעות לתשובות. ייתכן שהמשתמש ירצה לדבר בכל אחת מהאפשרויות הבאות שפות:

  • השפה הנכנסת שזוהתה.
  • השפה הנוכחית של השיחה.
  • השפה המובנית של השרת.

עשויה להיות חפיפה בשלוש השפות האלה (לדוגמה, אם השפה היא כבר שפת השרת), השרת משתמש באובייקט מוגדר כדי להסיר כפולים. לאחר מכן נוצרת הצעה לתשובה לכל שפה:

/**
 * 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". כדי לקבל מידע על שפה מהשפה קוד שפה דו-ספרתי – אפשר להשתמש בספריית ISO-639-1 ל-Node.js.

שימו לב לנתוני הדיווח החוזר על המרה (PostBack), שנשלחים לשרת כשהמשתמש לוחץ על בהצעה הזו. נתוני הדיווח החוזר על המרה (PostBack) מורים לשרת איך להגיב ולספק הקשר מסוים לגבי ההצעה.

ה-method 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, []);
      });
    }
  }

אם הבקשה מכילה תשובה להצעה, השרת משתמש בדיווח החוזר על ההמרה. כדי להחליט מה לעשות. במקרה פשוט, השרת תומך רק באחד סוג של נתוני דיווח חוזר על המרה (PostBack), 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. בדומה לשיטת הזיהוי, גם שיטת התרגום הם יכולים לקבל כמה קלטים. מכיוון שהשרת מספק רק קלט אחד, הוא לוקח את התוצאה הראשונה מ-Translate API.

בודקים את הקטע של שיטת הקריאה החוזרת שמגיבה להודעות נכנסות השפה הנוכחית:

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

השרת משתמש בפלט מ-translateText כדי לבחור הודעת תגובה. החלק הבא יתעמק בתהליך הבחירה של הודעת התשובה לתרגם אותו.

תרגום של הודעות יוצאות

לאחר שהשרת מתרגם את ההודעה הנכנסת לאנגלית, היא כדי לבחור, לתרגם ולשלוח תגובה מתאימה לבקשת המשתמש. הקוד לדוגמה משתמש בסכימה פשוטה מאוד שממפה מילות מפתח לתגובות. יש כדאי לקרוא את ה-method 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' במפת התגובות. מערכות מתוחכמות יותר עשויות להסתמך גם על או מתודולוגיות לבחירת תשובה מתאימה, כמו למידת מכונה או ניקוד אלגוריתמים. אחת מהדרכים ליצור תשובות חכמות יותר בעזרת Business Messages הוא להשתלב עם Dialogflow.

עכשיו בודקים את הקוד ששולח את ההודעה שנבחרה בחזרה למשתמש.

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

הקוד לדוגמה עושה שימוש חוזר בשיטה translateText כדי לתרגם תגובה בשפה הנוכחית של השיחה. לאחר מכן השיטה sendResponse מטפלים ביצירת אובייקט ההודעה החדש ובשליחתו למשתמש.

סיכום

במדריך הזה למדתם איך ליצור שילוב פשוט עם Cloud Translate API ולהשתמש בתכונות הלוקאל של Business Messages כדי להגיע ליותר משתמשים. אם אתם יכולים להשתמש בקוד לדוגמה שבמדריך הזה כנקודת התחלה או לנסות משהו חדש! רעיונות לשינויים:

  • לשלוח הודעות דו-לשוניות שמכילות גם תוכן של הודעות מקוריות וגם את תוכן שתורגם באופן אוטומטי.
  • להציג למשתמש תפריט מלא של שפות נתמכות כשהוא מתחיל שיחה.
  • שימוש בתכונות מתקדמות של Translate API כמו מילוני מונחים, שעוזרים לתרגם בצורה אמינה מילים שספציפיות לעסק שלכם.

השילוב עם ממשקי ה-API של Translate מאפשר לכם ליהנות משימוש במכונות איכותיות כדי לתקשר עם יותר משתמשים בשפה הנוחה ביותר שלהם. נציגי התמיכה יכולים לנהל שיחות פרודוקטיביות ויעילות יותר, את שביעות הרצון של הלקוחות והשלמת המשימות.