יצירת אפליקציות ל-Google Chat עם Gemini

1. לפני שמתחילים

מהן אפליקציות Google Chat בשילוב עם Gemini?

האפליקציות ב-Google Chat עם Gemini מבצעות את הפעולות הבאות:

  • אפשר להעביר את השירותים והמשאבים ל-Google Chat. כך המשתמשים יכולים לקבל מידע ולבצע פעולות בלי לצאת מהשיחה.
  • להגדיר שילוב עם מודל ה-AI הגנרטיבי של Gemini, כדי ש-Gemini יוכל ליצור או לחפש נתונים כמו טקסט או תמונות בזמנים מסוימים, כדי לייעל את תהליכי העבודה.

למה כדאי לשלב אפליקציות של Google Chat עם Gemini?

התרחישים לדוגמה הנפוצים ביותר של מודלים של AI גנרטיבי כמו Gemini נכללים בקטגוריות הבאות:

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

היכולת לשלב את היכולות האלה ישירות בממשק המוכר של Google Chat היא הזדמנות אדירה לכל מי שרוצה לשפר את החוויה והפרודוקטיביות של המשתמשים.

דרישות מוקדמות

מה אתם מפתחים

ב-codelab הזה, תיצרו שלוש אפליקציות ל-Google Chat בעזרת Gemini כדי לתת מענה לשלושת התרחישים לדוגמה שמתוארים בקטע הקודם.

אפליקציה לניהול בעיות (יצירה ושיפור של תוכן)

האפליקציה הזו מבצעת את הפעולות הבאות:

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

אתם משתמשים ב-Gemini כדי:

  • יצירת דוחות על בעיות על סמך היסטוריית ההודעות ופרטי הבעיות.
  • סיווג מילים לא כוללות בהודעות עם הנחיות מוגבלות.

הטכנולוגיות העיקריות שבהן נעשה שימוש הן Vertex AI, Gemini, Apps Script ו-Google Workspace APIs (Admin, Chat, Docs, Event).

22efdecff4601417.png

2d127c63518673b2.png

9aea694937f2f3ed.png

האפליקציה הזו מסתמכת על Gemini כדי להבין ולענות על שאלות בשפה טבעית ולהחזיר הפניות למקורות מנתונים לא מובְנים.

הטכנולוגיות העיקריות שבהן נעשה שימוש הן סוכן מאגר הנתונים של Dialogflow CX, Dialogflow CX webhook, Google Cloud Functions ו-Gemini.

9468866bfe848bb8.png

אפליקציית משוב (שיחה)

האפליקציה הזו מסתמכת על Gemini כדי לאסוף ולאחסן ביקורות עם שיחות בשפה טבעית.

הטכנולוגיות העיקריות שבהן נעשה שימוש הן סוכן Dialogflow CX, הכלי Dialogflow CX, OpenAPI, Google Cloud Functions ו-Gemini.

99a7a0295f122f31.png

מה לומדים

  • איך משלבים אפליקציות של Google Chat עם Gemini באמצעות Vertex AI.
  • איך משלבים אפליקציות של Google Chat עם סוכני Dialogflow CX.
  • איך משתמשים בפיצ'רים החדשים של Google Chat: דף הבית של האפליקציה, אירועים ב-Google Chat וווידג'טים של אביזרים.

מה צריך

2. להגדרה

הפעלת משאבים

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

פרויקט Apps Script

במסוף Apps Script, מבצעים את השלבים הבאים:

  1. לוחצים על הגדרות ומפעילים את Google Apps Script API.

ea06c593b347b9d1.png

  1. בוחרים את הפרויקט הרצוי.
  2. לוחצים על Project settings (הגדרות הפרויקט).
  3. מקישים על הצג "appsscript.json" תיבת הסימון של קובץ מניפסט בעורך.
  4. משנים את שם הפרויקט לשם Chat Apps Gemini.

12c1485bd248b766.png

פרויקט ב-Google Cloud

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. לוחצים על תפריט TODO > ממשקי API שירותים > מסך ההסכמה ל-OAuth > עורכים את האפליקציה ומגדירים את שם האפליקציה לערך Chat Apps Gemini.

  1. עוברים להגדרה של Google Chat API ומגדירים את האפשרויות שם האפליקציה ותיאור לערך Chat Apps Gemini.

a71f040755da3b8b.png

Google Chat

ב-Google Chat, מבצעים את הפעולות הבאות:

  1. אם צריך, תוכלו להתחיל צ'אט עם אפליקציית Google Chat.
  2. צריך לשלוח הודעה, למשל Hello, כדי לוודא שהוא פועל.

9625418251528ae9.png

הורדה של קוד מקור ומשאבים באופן מקומי

  1. מורידים את מאגר ה-GitHub הזה.

  1. בסביבת הפיתוח המועדפת, פותחים את הספרייה apps-script/chat-apps-gemini ואז מנווטים לאותה ספרייה בטרמינל.

da9478df97c99194.png

התקנה והגדרה של clasp

אנחנו משתמשים ב-clasp כדי לערוך בקלות גרסאות של קוד המקור מהסביבה המקומית ולהעביר אותן לפרויקט Apps Script.

  1. בסביבה המקומית שלך, מתקינים את הגרסאות האחרונות של node, npm ו-clasp.
npm install -g @google/clasp
  1. מתחברים באמצעות החשבון:
clasp login

8bc2434e6dc6f22a.png

אם התהליך יסתיים בהצלחה, יופיע מסך אישור בסיסי בדפדפן האינטרנט, והקובץ .clasprc.json עם פרטי הכניסה של הלקוח יתעדכן. תוכלו לבדוק איפה הוא נמצא בטרמינל.

e1d833eb4d5b3a8f.png

3. אפליקציה 1: פיתוח פתרונות

סקירת המושגים

Vertex AI

Vertex AI כולל את כל מה שצריך כדי לפתח ולהשתמש ב-AI גנרטיבי, כולל פתרונות AI, כלי לבניית סוכנים, יותר מ-130 מודלים בסיסיים ופלטפורמת AI מאוחדת.

c9e9c7a1945b22ac.png

Gemini

Gemini הוא מודל שפה גדול (LLM) מבית Google שאפשר לגשת אליו דרך Vertex AI. הם עוזרים לאנשים לממש את הפוטנציאל האנושי שלהם, כדי להעשיר את הדמיון, להגביר את הסקרנות ולשפר את הפרודוקטיביות שלהם.

שירות Chat מתקדם

שירות Chat המתקדם מאפשר להשתמש ב-Google Chat API ב-Apps Script. כך סקריפטים יכולים למצוא, ליצור ולשנות מרחבים ב-Chat, להוסיף או להסיר משתתפים במרחבים משותפים ולקרוא או לפרסם הודעות עם טקסטים, כרטיסים, קבצים מצורפים ותגובות.

בדיקת הארכיטקטורה

8c9c7b7328a69ea6.png

האפליקציה הזו של Google Chat מבוססת על Apps Script. היא פועלת באופן הבא:

  1. משתמש שולח הודעה לאפליקציה בצ'אט אישי או במרחב משותף.
  2. האפליקציה מעבדת את ההודעה, שמוטמעת בפרויקט Apps Script ומשויכת לפרויקט ב-Google Cloud.
  3. אפשר לשלב את האפליקציה עם Google Docs ועם Google Chat API.
  4. האפליקציה משתמשת בשירות המאפיינים כדי לשמור נתונים במאפייני הסקריפט.
  5. האפליקציה שולחת תשובה מסונכרנת, בצ'אט ישיר או במרחב המקורי.

תהליכי בדיקה

דיווח על בעיה

7ca0e8ba3c8255bb.png

פתרון בעיות במרחב משותף ייעודי

51b47714c378a24b.png

סגירת הבעיה מהמרחב הייעודי

89e50228deeab0f9.png

בדיקת קוד המקור

פרויקט Apps Script מכיל את הסקריפטים הבאים:

  • Configuration: קבועים לעריכה על סמך הסביבה.
  • ChatApp: טיפול באירועי אינטראקציה ב-Google Chat, כולל הודעות, קליקים על כרטיסים, פקודות ותיבות דו-שיח.
  • Storage: פונקציות שירות שמסתמכות על שירותי הנכסים.
  • ChatAppAuth: פונקציות שימושיות שמסתמכות על אימות של אפליקציית Google Chat.
  • Docs: פונקציות עזר שמסתמכות על Google Docs.
  • VertexAi: פונקציות בסיסיות שמסתמכות על Vertex AI.

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

appsscript.json

// Enables the Admin SDK Directory and Chat services, which you need to retrieve
// messages and usernames.

"enabledAdvancedServices": [
  ...
  {
    "userSymbol": "AdminDirectory",
    "version": "directory_v1",
    "serviceId": "admin"
  },
  {
    "userSymbol": "Chat",
    "version": "v1",
    "serviceId": "chat"
  }
  ...
]
// Includes the OAuth scopes to request the Admin SDK Directory, Google Chat,
// Google Docs, and Vertex AI APIs.

"oauthScopes": [
  ...
  "https://www.googleapis.com/auth/admin.directory.user.readonly",
  "https://www.googleapis.com/auth/chat.messages.readonly",
  "https://www.googleapis.com/auth/documents",
  "https://www.googleapis.com/auth/cloud-platform",
  ...
]

Configuration.js

// Relies on two constants: the first one is the Google Cloud project ID and the
// second one is the Vertex AI location to be used.

...
const PROJECT_ID = 'replace-with-gcp-project-id';
const VERTEX_AI_LOCATION_ID = 'us-central1';
...

ChatApp.js

// The slash command process function retrieves history, generates content, and passes
// it to the report generator.

function processSlashCommand(event) {
  ...
  if (event.message.slashCommand.commandId == CLOSE_COMMAND_ID
    && event.message.space.type !== "DM") {
    ...
    const history = exportSpaceHistory(spaceId);
    const summary = summarizeSpace(history);
    const docUrl = createReport(
      issue.title, issue.description, resolution, history, summary
    );
    ...
  }
  ...
}
/**
 * Fetches and concatenates the 100 first space messages by using the Google Chat API.
 *
 * Messages with slash commands are filtered (app command invocations).
 *
 * @return {string} concatenate space messages in the format "Sender's name: Message"
 */
function exportSpaceHistory(spaceName) {
  const messages = Chat.Spaces.Messages.list(spaceName, { 'pageSize': 100 }).messages;
  // Returns results after fetching message sender display names.
  let users = new Map();
  return messages
    .filter(message => message.slashCommand === undefined)
    .map(message =>
      `${getUserDisplayName(users, message.sender.name)}: ${message.text}`
    ).join('\n');
}
/**
 * Fetches a user's display name by using the Admin Directory API.
 *
 * A cache is used to only call the API once per user.
 *
 * @param {Map} cache the map containing users previously fetched
 * @param {string} userId the user ID to fetch
 * @return {string} the user's display name
 */
function getUserDisplayName(cache, userId) {
  if (cache.has(userId)) {
    return cache.get(userId);
  }
  let displayName = 'Unknown User';
  try {
    const user = AdminDirectory.Users.get(
      userId.replace("users/", ""),
      { projection: 'BASIC', viewType: 'domain_public' });
    displayName = user.name.displayName ? user.name.displayName : user.name.fullName;
  } catch (e) {
    // Ignores errors, uses 'Unknown User' by default.
  }
  cache.set(userId, displayName);
  return displayName;
}

VertexAi.js

/**
 * Summarizes a Google Chat space history with the Gemini Pro model using
 * Vertex AI API.
 *
 * @param {string} history the history
 * @return {string} the summary
 */
function summarizeSpace(history) {
  const url = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
    + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
    + "/publishers/google/models/gemini-1.0-pro:generateContent";
  const options = {
    method: "POST",
    headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    contentType: "application/json",
    payload: JSON.stringify({
      contents: {
        role: "user",
        parts: {
          text: "Summarize the following conversation between engineers resolving"
              + " an issue in a few sentences.\n\n" + history
        }
      },
      safetySettings: {
        category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        threshold: "BLOCK_LOW_AND_ABOVE"
      },
      generationConfig: {
        temperature: 0.2,
        topP: 0.8,
        topK: 40
      }
    })
  };

  return JSON.parse(UrlFetchApp.fetch(url, options).getContentText())
    .candidates[0].content.parts[0].text;
}

Docs.js

// The report generator function adds two sections: the first one is for the summary and the second one is for history.
function createReport(..., history, summary) {
  ...
  body.appendParagraph("Summary").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(summary);
  body.appendParagraph("History").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(history);
  ...
}

עדכון פרויקט Google Cloud

הפעלת ממשקי API

  1. במסוף Google Cloud, מפעילים את ממשקי ה-API של Google Docs, Google Admin SDK ו-Vertex AI:

  1. לוחצים על תפריט TODO > ממשקי API שירותים > ממשקי API מופעלים שירותים ולאחר מכן מוודאים שממשקי ה-API מופעלים.

הפעלת חשבון שירות

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > IAM ו- אדמין > חשבונות שירות > + יצירת חשבון שירות.

74cf57426419f39.png

  1. מגדירים את Service account name כ-chat-app.
  2. מגדירים את Service account description כ-Chat app auth.
  3. לוחצים על יצירה והמשך.
  4. לוחצים על סיום. עכשיו תועברו לדף Service accounts (חשבונות שירות) ושם תוכלו לראות את חשבון השירות שיצרתם.

ca0468f1f93990f9.png

  1. בוחרים את חשבון השירות החדש שנוצר.
  2. בוחרים בכרטיסייה Keys.
  3. לוחצים על Add key.
  4. לוחצים על Create new key.
  5. בוחרים באפשרות JSON.
  6. לוחצים על יצירה.

9f7e6ea020978ab0.png

תיבת הדו-שיח תיסגר והצמד החדש של המפתחות הציבורי/פרטי יורד באופן אוטומטי לסביבה המקומית שלכם כקובץ JSON. התוכן של הפרויקט ישמש אתכם מאוחר יותר כשתערכו את קוד המקור של פרויקט Apps Script.

עדכון ההגדרות האישיות של Google Chat API

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. מוסיפים פקודה של שורת הפקודות.
  2. מגדירים את Name כ-/create.
  3. מגדירים את Command ID בתור 1.
  4. מגדירים את Description (תיאור) ל-Create a new issue.
  5. מסמנים את תיבת הסימון פתיחה של תיבת דו-שיח.
  6. הוספת עוד פקודה של שורת הפקודות.
  7. מגדירים את Name כ-/close.
  8. מגדירים את Command ID בתור 2.
  9. מגדירים את Description (תיאור) ל-Close an issue.
  10. לוחצים על שמירה.

bee2e7b63659ab33.png

עדכון פרויקט ב-Apps Script

  • משנים את הספרייה הנוכחית במסוף המקומי ל-issue-management/1-baseline. הקוד מכיל את קוד המקור. לפני שדוחפים את קוד המקור לפרויקט Apps Script, צריך להגדיר כמה הגדרות.

הגדרת קוד מקור

  1. צריך להגדיר את קבוע ה-JSON בשם CHAT_CREDENTIALS בקובץ Configuration.js לתוכן של קובץ המפתח הפרטי שהורדתם קודם.

d721f6bff73c5304.png

  1. במסוף Google Cloud, לוחצים על תפריט Backspace > IAM ו- אדמין > הגדרות.

  1. מעתיקים את מזהה הפרויקט.

82592fa0bd113469.png

  1. מגדירים את קבוע המחרוזת בשם PROJECT_ID בקובץ Configuration.js למזהה הפרויקט.

383cee561130ceba.png

קביעת הגדרות של clasp

כדי לאתחל את ההגדרות של clasp ולדחוף את קוד המקור לפרויקט Apps Script הנכון, צריך לבצע את השלבים הבאים:

  1. במסוף Apps Script, בוחרים את הפרויקט הרלוונטי.
  2. בוחרים באפשרות Project Settings (הגדרות הפרויקט).
  3. בקטע מזהים, לוחצים על העתקה.

20ea033b6de882c6.png

  1. בספרייה הנוכחית, יוצרים קובץ .clasp.json.
  2. מחליפים את <your-script-id> במזהה שהועתק.
  3. מעתיקים את התוצאה לקובץ .clasp.json.
  4. שומרים את קובץ ה-.clasp.json.
{
  "scriptId": "<your-script-id>"
}

דחיפת קוד מקור

  • מריצים את הפקודה הבאה:
$clasp push
? Manifest file has been updated. Do you want to push and overwrite? Yes
└─ appsscript.json
└─ ChatApp.js
└─ ChatAppAuth.js
└─ Configuration.js
└─ Docs.js
└─ Storage.js
└─ VertexAi.js
Pushed 7 files.

כדאי לנסות זה

  1. ב-Google Chat, שולחים את המספר Hello! בצ'אט אישי לאפליקציה. האפליקציה לא מגיבה, אבל מופיעה הודעה עם בקשה להגדרה.

4c1fc68121dcfified.png

  1. לוחצים על הגדרה.
  2. בוחרים את חשבון Google הרצוי.
  3. אימות.
  4. לבדוק את האפליקציה ולאפשר גישה אליה.

4a2fd7ac5918bf1a.png

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

acb9065568fe47d2.png

2d6ef9c62f47e082.png

  1. לשלוח הודעה נוספת לאפליקציה בצ'אט אישי, אבל באמצעות הפקודה /create.

be3f3c6eb0f929c1.png

  1. בתיבת הדו-שיח, מגדירים את Title בתור Issue Title 1.
  2. מגדירים את תיאור לגיליון Description 1.
  3. לוחצים על יצירה.

22efdecff4601417.png

האפליקציה מבצעת את הפעולות הבאות:

  1. הלחצן סוגר את תיבת הדו-שיח.
  2. יצירת מרחב משותף ייעודי לבעיה החדשה שנוצרה עם אותו שם.
  3. המערכת תצרף את המרחב המשותף החדש שנוצר.
  4. תישלח הודעה עם תיאור הבעיה במרחב המשותף החדש שנוצר.
  5. תישלח אליכם צ'אט אישי עם קישור למרחב המשותף החדש.

3253cec2392e281f.png

  1. במרחב המשותף החדש שנוצר, שולחים הודעה באמצעות פקודת הלוכסן /close ורזולוציה כמו Not reproducible.

132cc4acfc10b98c.png

האפליקציה מבצעת את הפעולות הבאות:

  1. יוצר מסמך דוח ב-Google Docs.
  2. תישלח הודעה למרחב שמיועד לבעיה עם קישור למסמך החדש של הדוח שנוצר.

2d127c63518673b2.png

  1. פותחים את מסמך הדוח. הוא כולל מידע בסיסי, היסטוריה וסיכום.

9aea694937f2f3ed.png

4. אופציונלי: אפליקציה 1: הוספת דף הבית של האפליקציה

סקירת המושגים

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

65f56f70f67a32e4.png

תהליכי בדיקה

ניהול בעיות

10663f5fc107fb3f.png

בדיקת קוד המקור

עליך לערוך את פרויקט Apps Script.

ChatApp.js

/**
 * Handles app home requests in Google Chat.
 * 
 * Displays the latest status of all issues.
 */
function onAppHome() {
  // Generates one card section per issue.
  var sections = [];
  for (var issueKey in appProperties.getProperties()) {
    const issue = JSON.parse(appProperties.getProperty(issueKey));
    if (issue.spaceId) {
      sections.push({
        header: `${issue.status} - ${issue.title}`,
        widgets: [{ textParagraph: {
            text: `Description: ${issue.description}`
          }}, { textParagraph: {
            text: `Resolution: ${issue.resolution}`
          }}, { buttonList: { buttons: [{
              text: "Open space",
              onClick: { openLink: {
                url: `https://mail.google.com/mail/u/0/#chat/space/${issue.spaceId}`
              }}
            }, {
              text: "Open report",
              onClick: { openLink: {
                url: issue.reportUrl !== "" ? issue.reportUrl : "docs.new"
              }},
              disabled: issue.reportUrl === ""
          }]}
        }]
      });
    }
  }

  return { action: { navigations: [{ push_card: {
    sections: sections
  }}]}};
}

עדכון פרויקט Google Cloud

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. בקטע Interactive features (תכונות אינטראקטיביות), מסמנים את התיבה Support app home (דף הבית של אפליקציית התמיכה).

97159c1c69ca8303.png

בסביבה המקומית, מבצעים את הפעולות הבאות:

  1. משנים את הספרייה הנוכחית במסוף ל-issue-management/2-app-home. היא מכילה את קוד המקור שבו צריך להשתמש.
  2. מעתיקים את הקובץ issue-management/1-baseline/.clasp.json לספרייה הנוכחית.
  3. מעתיקים את הקובץ issue-management/1-baseline/Configuration.js לספרייה הנוכחית כדי שיחליף את הקובץ הקיים.
  4. מריצים את הפקודה הבאה:
clasp push

רוצים לנסות?

ב-Google Chat, מבצעים את הפעולות הבאות:

  1. שולחים לאפליקציה הודעה בצ'אט אישי באמצעות הפקודה /create. האפליקציה פותחת תיבת דו-שיח.
  2. מגדירים את שם כIssue Title 2.
  3. מגדירים את תיאור לגיליון Description 2.
  4. לוחצים על יצירה.

3b2a8690e758f965.png

  1. לוחצים על הכרטיסייה דף הבית במרחב המשותף עם אפליקציית Google Chat. ניתן לראות את פרטי הבעיות שיצרת.

ed8e32da0e6f2ac6.png

5. אופציונלי: אפליקציה 1: הוספה של מעקב אחרי המרחב המשותף

לסקור מושגים

Pub/Sub

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

בעלי תוכן דיגיטלי שולחים אירועים לשירות Pub/Sub בלי להתייחס לאופן שבו או למועד העיבוד של האירועים האלה. לאחר מכן, Pub/Sub שולחת אירועים לכל השירותים שמגיבים אליהם. במערכות שמתקשרים באמצעות קריאות RPC, בעלי תוכן דיגיטלי צריכים להמתין עד שהמנויים יקבלו את הנתונים. עם זאת, השילוב האסינכרוני ב-Pub/Sub מגדיל את הגמישות והיציבות של המערכת הכוללת.

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

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

אירועים ב-Google Workspace

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

7816e477b112bfb6.png

כך Google Workspace Event API מעביר אירועים לאפליקציה באמצעות מינוי:

  1. האפליקציה רושמת למשאב באפליקציה של Google Workspace, כמו מרחב משותף.
  2. המשאב שעליו האפליקציה נרשמה משתנה.
  3. אפליקציית Google Workspace מעבירה אירוע לנושא ב-Pub/Sub, שמשמש כנקודת הקצה של ההתראות למינוי Google Workspace של האפליקציה. האירוע מכיל נתונים על מה שהשתנה במשאב.
  4. האפליקציה מעבדת את הודעת Pub/Sub שמכילה את האירוע, ובמקרה הצורך, נוקטת פעולה.

תהליכי בדיקה

דיווח על בעיה (עדכון)

6d7a9d7a68666a80.png

פתרון בעיה במרחב משותף ייעודי (עדכון)

17e60f052f222456.png

סגירת הבעיה במרחב המשותף הייעודי (עדכון)

742d490ea0b6fe3a.png

עיבוד מינויים

de3017100dec6401.png

בדיקת קוד המקור

עליך לערוך את פרויקט Apps Script.

appsscript.json

// Enables the Workspace Events service.

"enabledAdvancedServices": [
  ...
  {
    "userSymbol": "WorkspaceEvents",
    "version": "v1",
    "serviceId": "workspaceevents"
  }
  ...
]

Configuration.js

// Adds two constants: the first one is the Pub/Sub topic ID and the second one
// is the Pub/Sub subscription ID to be used to retrieve Google Workspace events.

...
const GWS_PUBSUB_TOPIC_ID = `projects/${PROJECT_ID}/topics/workspace-events`;
const GWS_PUBSUB_SUBSCRIPTION_ID =
  `projects/${PROJECT_ID}/subscriptions/workspace-events-sub`;
...

ChatApp.js

// Edits the function to delete the subscription at issue closure.

function processSlashCommand(event) {
  ...
  if (event.message.slashCommand.commandId == CLOSE_COMMAND_ID
    && event.message.space.type !== "DM") {
    ...
    deleteSubscription(issue.subscriptionId);
    ...
  }
  ...
}
// Edits the function to create the subscription.

function createIssue(event) {
  ...
  const subscriptionId = createSpaceSubscription(spaceUrl);
  const createdIssue = saveCreatedIssue(..., subscriptionId);
  ...
}
// Edits the function to delete the subscription.

function onRemoveFromSpace(event) {
  ...
  deleteSubscription(issue.subscriptionId);
  ...
}

Storage.js

// Edits the function to keep track of the subscription ID.

function saveCreatedIssue(..., spaceId, subscriptionId) {
  ...
  appProperties.setProperty(spaceId, JSON.stringify({
    ...
    subscriptionId: subscriptionId,
    ...
  }));
  ...
}

WorkspaceEvent.js

/**
 * Creates a new subscription to Google Workspace Events associated to a
 * Google Chat space.
 * 
 * The subscription scope includes message creation events and resources.
 * 
 * @param {string} spaceId the space ID to create a subscription for
 * @return the ID of the newly created subscription
 */
function createSpaceSubscription(spaceId) {
  const operation = WorkspaceEvents.Subscriptions.create({
    targetResource: `//chat.googleapis.com/${spaceId}`,
    eventTypes: ["google.workspace.chat.message.v1.created"],
    notificationEndpoint: { pubsubTopic: GWS_PUBSUB_TOPIC_ID },
    payloadOptions: { includeResource: true },
  });

  return operation.response.name;
}
/**
 * Processes events from subscription by using the Google Cloud PubSub API.
 * 
 * It pulls and acknowledges each event.
 */
function processSubscription() {
  const response = UrlFetchApp.fetch(
    `https://pubsub.googleapis.com/v1/${GWS_PUBSUB_SUBSCRIPTION_ID}:pull`,
    {
      method: "POST",
      contentType: "application/json",
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      payload: JSON.stringify({ maxMessages: 10 })
    }
  );

  const messages = JSON.parse(response.getContentText()).receivedMessages;
  for (var messageIndex in messages) {
    const message = messages[messageIndex];
    const ceType = message.message.attributes["ce-type"];
    const dataStr = Utilities.newBlob(Utilities.base64Decode(message.message.data))
      .getDataAsString();
    if (ceType === "google.workspace.events.subscription.v1.expirationReminder") {
      // Renews subscription.
      renewSubscription(JSON.parse(dataStr).subscription.name);
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      // Processes the message text when it's sent in a space.
      const chatMessage = JSON.parse(dataStr).message;
      if (chatMessage.sender.type !== "BOT") {
        console.log("Message was processed.");
      }
    }
    // Acknowledges successful processing to avoid getting it again next time.
    ackSubscription(message.ackId);
  }
}
/**
 * Acknowledges a subscription event by using the Google Cloud PubSub API.
 * 
 * @param {string} ackId the ID of the event acknowledgment to send
 */
function ackSubscription(ackId) {
  UrlFetchApp.fetch(
    `https://pubsub.googleapis.com/v1/${GWS_PUBSUB_SUBSCRIPTION_ID}:acknowledge`,
    {
      method: "POST",
      contentType: "application/json",
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      payload: JSON.stringify({
        ackIds: [ackId]
      })
    }
  );
}
/**
 * Renews a subscription to Google Workspace Events.
 * 
 * The default time to live option is used.
 * 
 * @param {string} subscriptionId the ID of the subscription to renew
 */
function renewSubscription(subscriptionId) {
  WorkspaceEvents.Subscriptions.patch({ttl: '0s'}, subscriptionId);
}
/**
 * Deletes a subscription to Google Workspace Events.
 * 
 * @param {string} subscriptionId the ID of the subscription to delete
 */
function deleteSubscription(subscriptionId) {
  WorkspaceEvents.Subscriptions.remove(subscriptionId);
}

עדכון פרויקט Google Cloud

הפעלת ממשקי API

  1. במסוף Google Cloud, מפעילים את Google Workspace Event ואת PubSub.

  1. לוחצים על תפריט TODO > ממשקי API services > ממשקי API מופעלים Services ולאחר מכן מוודאים ששניהם מופעלים.

התחלת המינוי

צריך ליצור נושא Pub/Sub ולהירשם אליו כדי לפרסם את כל האירועים של סביבת העבודה.

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. צריך לעבור לתפריט 🏏 > Pub/Sub > נושאים.

  1. לוחצים על יצירת נושא.
  2. מגדירים את מזהה הנושא כ-workspace-events.
  3. מסמנים את התיבה הוספת מינוי ברירת מחדל.
  4. לוחצים על יצירה.

b39f9a0aec7c9939.png

כדי לתת למשתמשים גישה לפרסום הודעות Pub/Sub בנושא החדש שיצרתם ב-Google Chat:

  1. בוחרים נושא מהרשימה.
  2. לוחצים על הכרטיסייה Permissions.
  3. מוסיפים את chat-api-push@system.gserviceaccount.com לחשבונות המשתמשים החדשים.
  4. בוחרים באפשרות פרסום הודעות ב-Pub/Sub בקטע תפקיד.
  5. לוחצים על שמירה.

8d4016c37532503.png

עדכון פרויקט ב-Apps Script

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. צריך לעבור לתפריט 🏏 > IAM ו- אדמין > הגדרות.

  1. מעתיקים את מזהה הפרויקט.

82592fa0bd113469.png

בסביבה המקומית, מבצעים את הפעולות הבאות:

  1. משנים את הספרייה הנוכחית במסוף ל-issue-management/3-message-monitoring. היא מכילה את קוד המקור הנחוץ לך.
  2. מגדירים את קבוע המחרוזת בשם PROJECT_ID בקובץ Configuration.js עם מזהה הפרויקט שהועתק.
  3. צריך להגדיר את קבוע ה-JSON בשם CHAT_CREDENTIALS בקובץ Configuration.js לתוכן של קובץ המפתח הפרטי שהורדתם קודם.
  4. מעתיקים את הקובץ issue-management/2-app-home/.clasp.json לספרייה הנוכחית.
  5. מריצים את הפקודה הבאה:
clasp push

רוצים לנסות?

ב-Google Chat, מבצעים את הפעולות הבאות:

  1. שולחים לאפליקציה הודעה בצ'אט אישי באמצעות הפקודה /create. האפליקציה פותחת תיבת דו-שיח.
  2. מגדירים את שם כIssue Title 3.
  3. מגדירים את תיאור לגיליון Description 3.
  4. לוחצים על יצירה.
  5. במרחב המשותף החדש שיצרתם, שולחים כמה הודעות שעוסקות בבעיה.
  6. שולחים הודעה באמצעות פקודת הלוכסן /close ורזולוציה כמו Fixed.

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. צריך לעבור לתפריט 🏏 > Pub/Sub > מינויים.

  1. בוחרים במינוי workspace-events-sub.
  2. בוחרים בכרטיסייה הודעות.
  3. לוחצים על Pull. בטבלה מוצגות ההודעות שקשורות למה ששלחתם במרחב המשותף החדש.

82631c9792d83889.png

במסוף Apps Script, מבצעים את השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. בוחרים באפשרות עריכה.
  3. בוחרים את הקובץ WorkspaceEvent.gs.
  4. בוחרים באפשרות processSubscription בקטע הפעלה.
  5. לוחצים על Run.ביומן הביצוע אפשר לראות שההודעות עובדו.

c612e8fa2bd0a163.png

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. צריך לעבור לתפריט 🏏 > Pub/Sub > מינויים.

  1. בוחרים במינוי workspace-events-sub.
  2. בוחרים בכרטיסייה הודעות.
  3. לוחצים על Pull. לא יוצגו בטבלה יותר ההודעות שקשורות למה ששלחתם במרחב המשותף החדש.

e185454cac862a7b.png

  • ב-Google Chat, במרחב שמיועד לבעיה השלישית שיצרתם באמצעות הפקודה /create, שולחים עוד כמה הודעות בקשר לבעיה.

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. צריך לעבור לתפריט 🏏 > Pub/Sub > מינויים.

  1. בוחרים במינוי workspace-events-sub.
  2. בוחרים בכרטיסייה הודעות.
  3. לוחצים על Pull. ההודעות שקשורות למה ששלחתם במרחב המשותף החדש לא מוצגות בטבלה.

6. אופציונלי: אפליקציה 1: הוספת עזרה כדי לקבל את האחר

לסקור מושגים

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

תהליכי בדיקה

עיבוד מינויים (עדכון)

780d0802f77dd180.png

בדיקת קוד המקור

עליך לערוך את פרויקט Apps Script.

WorkspaceEvent.js

// Edits the function to replace logging by an actual card message.

function processSubscription() {
  ...
  for (var messageIndex in messages) {
    ...
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      ...
      const inclusivityCheck = getInclusivityFeedback(chatMessage.text);
      if (inclusivityCheck !== "It's inclusive!") {
        createAppMessageUsingChatService({
          cardsV2: [{ cardId: "1", card: { header: {
              title: "Inclusivity",
              subtitle: `The following words are not inclusive: ${inclusivityCheck}`
          }}}]
        },
        chatMessage.space.name);
      }
      ...
    }
    ...
  }
  ...
}

VertexAi.js

/**
 * Gets feedback on inclusivity for a text with the Gemini Pro model using
 * Vertex AI API.
 * 
 * Returns "It's inclusive!" when it is otherwise a list of word(s) that might not
 * be optimal.
 *
 * @param {string} text the text
 * @return {string} the feedback
 */
function getInclusivityFeedback(text) {
  const url = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
    + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
    + "/publishers/google/models/gemini-1.0-pro:generateContent";
  const options =  {
    method: "POST",
    headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    contentType: "application/json",
    payload: JSON.stringify({
      contents: {
        role: "user",
        parts: {
          text: "Are there any words that obviously go against inclusivity "
            + "in this text:"
            + `\n\n----------\n${text}\n----------\n\n`
            + "If there are not, answer \"It's inclusive!\" "
            + "otherwise answer by listing them separated by commas. "
            + "Do not answer with any explanation."
        }
      },
      safetySettings: {
        category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        threshold: "BLOCK_LOW_AND_ABOVE"
      },
      generationConfig: {
        temperature: 0.2,
        topP: 0.8,
        topK: 40
      }
    })
  };

  return JSON.parse(UrlFetchApp.fetch(url, options).getContentText())
    .candidates[0].content.parts[0].text;
}

עדכון פרויקט ב-Apps Script

בסביבה המקומית, מבצעים את הפעולות הבאות:

  1. משנים את הספרייה הנוכחית במסוף ל-issue-management/4-inclusivity-help. היא מכילה את קוד המקור שדרוש לך.
  2. מעתיקים את הקובץ issue-management/3-message-monitoring/.clasp.json לספרייה הנוכחית.
  3. מעתיקים את הקובץ issue-management/3-message-monitoring/Configuration.js לספרייה הנוכחית כדי שיחליף את הקובץ הקיים.
  4. מריצים את הפקודה הבאה:
clasp push

רוצים לנסות?

ב-Google Chat, מבצעים את הפעולות הבאות:

  1. שולחים לאפליקציה הודעה בצ'אט אישי באמצעות הפקודה /create. האפליקציה פותחת תיבת דו-שיח.
  2. מגדירים את שם כIssue Title 4.
  3. מגדירים את תיאור לגיליון Description 4.
  4. לוחצים על יצירה.
  5. במרחב המשותף החדש שנוצר, שולחים את המילה It happened to me last week as well.

במסוף Apps Script, מבצעים את השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. בוחרים באפשרות עריכה.
  3. בוחרים את הקובץ WorkspaceEvent.gs.
  4. בוחרים באפשרות processSubscription בקטע הפעלה.
  5. לוחצים על Run. ביומן הביצוע אפשר לראות שההודעות עובדו.

ב-Google Chat, מבצעים את הפעולות הבאות:

  1. שימו לב שהאפליקציה לא שלחה עזרה לגבי קבלת האחר במרחב החדש שנוצר.
  2. במרחב המשותף החדש שנוצר, שולחים את ההודעה I had to add myself from the master to fix it.

במסוף Apps Script, מבצעים את השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. בוחרים באפשרות עריכה.
  3. בוחרים את הקובץ WorkspaceEvent.gs.
  4. בוחרים באפשרות processSubscription בקטע הפעלה.
  5. לוחצים על Run. ביומן הביצוע אפשר לראות שההודעות עובדו. ב-Google Chat, האפליקציה שלחה הודעת עזרה בנושא קבלת האחר במרחב החדש שנוצר.

7936342847acbe2d.png

7. אופציונלי: אפליקציה 1: הוספת העדפות

.

לסקור מושגים

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

eebe88238f6b13f.png

תהליכי בדיקה

השבתת העזרה לקבלת האחר

1bb7a8592ee6221e.png

בדיקת קוד המקור

עליך לערוך את פרויקט Apps Script.

ChatApp.js

// Edits the function to handle the inclusivity help disablement action for a
// given space.

function onCardClick(event) {
  ...
  if (event.action.actionMethodName === "disableInclusivityHelp") {
    disableInclusivityHelp(event.common.parameters.spaceId);
  }
}

Storage.js

// Edits the function to keep track of the inclusivity help setting.

function saveCreatedIssue(title, description, spaceId, subscriptionId) {
  appProperties.setProperty(spaceId, JSON.stringify({
    ...
    inclusivityHelp: true,
    ...
  }));
  ...
}
/**
 * Disables inclusivity help in a space.
 * 
 * @param {string} spaceId the ID of dedicated space of the issue
 */
function disableInclusivityHelp(spaceId) {
  var issue = JSON.parse(appProperties.getProperty(spaceId));
  issue.inclusivityHelp = false;
  appProperties.setProperty(spaceId, JSON.stringify(issue));
}
/**
 * Checks whether the app should help with inclusivity in a given space.
 * 
 * @param {string} spaceId the ID of dedicated space of the issue
 * @return whether the app should help with inclusivity
 */
function shouldHelpWithInclusivity(spaceId) {
  return JSON.parse(appProperties.getProperty(spaceId)).inclusivityHelp;
}

WorkspaceEvent.js

// Edits the function to display the accessory widget to the existing card message.

function processSubscription() {
  ...
  for (var messageIndex in messages) {
    ...
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      ...
      if (... && shouldHelpWithInclusivity(chatMessage.space.name)) {
        createAppMessageUsingChatService({
          ...
          accessoryWidgets: [{ buttonList: { buttons: [{
            altText: "Disable inclusivity help",
            icon: {
              iconUrl: "https://upload.wikimedia.org/.../Stop_hand_rugen.png"
            },
            onClick: { action: {
              function: "disableInclusivityHelp",
              parameters: [{
                key: "spaceId",
                value: chatMessage.space.name
              }]
            }}
          }]}}]
        }, ...);
        ...
      }
      ...
    }
    ...
  }
  ...
}

עדכון פרויקט ב-Apps Script

בסביבה המקומית, מבצעים את הפעולות הבאות:

  1. משנים את הספרייה הנוכחית במסוף ל-issue-management/5-disable-help. היא מכילה את קוד המקור הנחוץ לך.
  2. מעתיקים את הקובץ issue-management/4-inclusivity-help/.clasp.json לספרייה הנוכחית.
  3. מעתיקים את הקובץ issue-management/4-inclusivity-help/Configuration.js לספרייה הנוכחית כדי שיחליף את הקובץ הקיים.
  4. מריצים את הפקודה הבאה:
clasp push

רוצים לנסות?

השבתת העזרה

  • ב-Google Chat, במקום שמיועד לבעיה הרביעית שיצרתם באמצעות הפקודה /create, שולחים את ההודעה I had to add myself from the master to fix.

במסוף Apps Script, מבצעים את השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. בוחרים באפשרות עריכה.
  3. בוחרים את הקובץ WorkspaceEvent.gs.
  4. בוחרים באפשרות processSubscription בקטע הפעלה.
  5. לוחצים על Run. ביומן הביצוע אפשר לראות שההודעות עובדו.

ב-Google Chat, מבצעים את הפעולות הבאות:

  1. שימו לב שהאפליקציה שלחה הודעה שכוללת עזרה כדי לקבל מענה במקום שמיועד לבעיה בווידג'ט של האביזר.
  2. כדי להשבית את העזרה לקבלת האחר, לוחצים על הווידג'ט של האביזר.

de722cff1928dec9.png

בדיקת השבתה

  • ב-Google Chat, במקום שמיועד לבעיה הרביעית שיצרתם באמצעות הפקודה /create, שולחים את ההודעה I had to add myself from the master to fix.

במסוף Apps Script, מבצעים את השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. בוחרים באפשרות עריכה.
  3. בוחרים את הקובץ WorkspaceEvent.gs.
  4. בוחרים באפשרות processSubscription בקטע הפעלה.
  5. לוחצים על Run. ביומן הביצוע אפשר לראות שההודעות עובדו. ב-Google Chat, האפליקציה לא שלחה הודעה עם עזרה כדי לקבל גישה למרחב המשותף שעוסק בבעיה הזו, כי האפליקציה הושבתה.

347d659db53b73e9.png

8. אפליקציה 2: פיתוח פתרונות

סקירת המושגים

Gen AI grounding

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

שפה טבעית

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

Cloud Storage

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

מאגר הנתונים של Dialogflow CX

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

בדיקת הארכיטקטורה

9d3342d12f3b4dda.png

האפליקציה הזו של Google Chat מבוססת על Dialogflow CX והיא פועלת באופן הבא:

  1. משתמש שולח הודעה לאפליקציה בצ'אט אישי או במרחב משותף.
  2. ההודעה מעבדת את ההודעה על ידי האפליקציה, שהיא סוכנת של Dialogflow CX ומשויכת לפרויקט ב-Google Cloud.
  3. האפליקציה משתלבת עם מאגר נתונים שנמצא ב-Cloud Storage.
  4. האפליקציה שולחת תשובה מסונכרנת, בצ'אט ישיר או במרחב המקורי.

בדיקה של תהליכי הבדיקה

מענה על השאלה

aad9fb5a7ca48956.png

בדיקת קוד המקור

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

google-chat-overview.pdf

מכיל את המידע הלא מובנה של אפליקציות Google Chat – גרסה מודפסת של דף מהאתר למפתחים של Google Workspace.

e9b91c4587b1a3a0.png

עדכון פרויקט ב-Google Cloud

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. הפעלת ממשקי ה-API של Dialogflow ו-Cloud Storage.

  1. מפעילים את Vertex AI Agent Builder API.

  1. לוחצים על תפריט TODO > ממשקי API services > ממשקי API מופעלים Services ולאחר מכן לוודא שכל ממשקי ה-API מופעלים.

.

יצירת סוכן של מאגר הנתונים של Dialogflow CX

הפעלת נתוני ידע

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > Cloud Storage > קטגוריות.

4f15978ae9f1b687.png

  1. לוחצים על יצירה.
  2. מגדירים את name כ-gchat-knowledge.
  3. לוחצים על יצירה.

6b38c6d4d2c41bba.png

  1. בוחרים את הקטגוריה gchat-knowledge.
  2. לוחצים על Upload files.
  3. בוחרים את הקובץ knowledge-app/grounding/google-chat-overview.pdf מהסביבה המקומית.

df89acb22e1762af.png

יצירת אפליקציה

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > בונה הסוכנים > אפליקציות.

  1. לוחצים על אפליקציה חדשה.
  2. בוחרים את סוג הצ'אט.

44276003074bcf14.png

  1. מגדירים את Company name לשם החברה.
  2. מגדירים את Agent name לערך knowledge.
  3. לוחצים על המשך.

c4fedfd7556f723b.png

  1. לוחצים על יצירה של מאגר נתונים חדש.
  2. בוחרים ב-Cloud Storage כמקור הנתונים.

6e2440ecf0f8f9bd.png

  1. בוחרים באפשרות קובץ.
  2. לוחצים על מה מעניין אותך היום?
  3. בוחרים את הקובץ google-chat-overview.pdf.
  4. לוחצים על המשך.
  5. מגדירים את השם של מאגר הנתונים בתור gchat-knowledge-ds.
  6. לוחצים על יצירה.

a675df7490b83900.png

  1. בוחרים את מאגר הנתונים gchat-knowledge-ds בטבלה.
  2. לוחצים על יצירה.

f121d580771ed96.png

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

d929a7431dd84968.png

  1. לוחצים על תפריט TODO > בונה הסוכנים > מאגרי נתונים.

  1. לוחצים על מאגר הנתונים gchat-knowledge-ds. מספר המסמכים הוא 1, מה שמעיד על כך שהוא מוכן.

558319790a0accf2.png

השלמה ובדיקה של האפליקציה

במסוף של Dialogflow CX, מבצעים את הפעולות הבאות:

  1. בוחרים את הפרויקט ב-Google Cloud.
  2. בוחרים את נציג הידע.

ca9b2fb4be92e8e4.png

  1. בוחרים באפשרות הגדרות נציג > Generative AI > עוזר דיגיטלי גנרטיבי.
  2. משנים את המודל מ-Text Bison ל-Gemini Pro.
  3. לוחצים על שמירה.

68cc4713ec9b25a0.png

  1. לוחצים על סוכן בדיקה.
  2. שליחה של What is Google Chat?. הנציג עונה עם משהו משמעותי.

8e3a2cb02469041a.png

שילוב אפליקציית Google Chat

במסוף של Dialogflow CX, מבצעים את הפעולות הבאות:

  1. בוחרים את הפרויקט ב-Google Cloud.
  2. בשורה של סוכן המידע, לוחצים על 1e7ede7abae4aa3c.png > העתקת השם.

e19f61185158110d.png

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. כניסה להגדרות של Google Chat API.

  1. בקטע הגדרות חיבור, בוחרים באפשרות Dialogflow.
  2. בקטע הגדרות של Dialogflow, בוחרים באפשרות Dialogflow CX.
  3. בוחרים את Agent or Environment resource name (שם המשאב של הסוכן או הסביבה) כשם הנציג שהעתקת.
  4. מסירים את שתי הפקודות.

505ff39a50880904.png

  1. ב-Google Chat, אתם יכולים לשלוח את המספר What is Google Chat? בצ'אט אישי לאפליקציית Google Chat. הנציג עונה עם משהו משמעותי.

abda9e43b81fb0ea.png

9. אופציונלי: אפליקציה 2: הוספת מקורות

סקירת המושגים

תגובה לפעולה מאתר אחר (webhook) של Dialogflow CX

שירות שמארח לוגיקה עסקית או קורא לשירותים אחרים. במהלך סשן של Dialogflow CX, ה-webhooks יכולים להסתמך על הנתונים שנשלפו על ידי עיבוד שפה טבעית (NLP) כדי ליצור תשובות דינמיות, לאמת את הנתונים שנאספו או להפעיל פעולות בקצה העורפי.

Cloud Functions

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

בדיקה של תהליכי הבדיקה

מענה על שאלה (עדכון)

92767c07c7b252aa.png

בדיקת קוד המקור

קוד המקור היחיד שדרוש לכם הוא הפונקציה שמאפשרת להתאים את התשובות של נציגי התמיכה להודעות ב-Google Chat. הוא משמש כ-webhook.

package.json

// The function relies on the Cloud Functions framework to run.

{
  "name": "agent-response-adapter",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  },
  ...
}

index.js

/** 
 * Handles all incoming requests.
 *
 * It takes a Dialogflow CX agent response as input and returns a
 * valid Google Chat card message with both the text and source links
 */
functions.http('agent-response-adapter', (request, response) => {
  // Creates Google Chat buttons based on the data store agent response
  // grounding details.
  var linkTitles = [];
  var linkButtons = [];
  const grounding = request.body.messages[1].payload.richContent[0][0];
  if (grounding.type === "match_citations") {
    // Supports citation match type.
    grounding.citations.forEach((citation) => {
      // Avoid duplications.
      if (linkTitles.indexOf(citation.title) < 0) {
        linkButtons.push({
          text: citation.title,
          onClick: { openLink: {
            url: citation.actionLink
          }}
        });
        linkTitles.push(citation.title);
      }
    });
  } else if (grounding.type === "info") {
    // Supports info type.
    if (linkTitles.indexOf(grounding.title) < 0) {
      linkButtons.push({
        text: grounding.title,
        onClick: { openLink: {
          url: grounding.actionLink
        }}
      });
      linkTitles.push(grounding.title);
    }
  }

  // Sends the Dialogflow CX fulfillment response to replace the agent response
  // with the Chat message with text and source buttons.
  response.send({ fulfillment_response: {
    merge_behavior: "REPLACE",
    messages: [{ payload: {
      // Reuses the original data store agent response text.
      text: request.body.messages[0].text.text[0],
      cardsV2: [{
        cardId: "sourcesCard",
        card: { sections: [{
          header: "Sources",
          widgets: [{ buttonList: {
            buttons: linkButtons
          }}]
        }]}
      }]
    }}]
  }});
});

עדכון פרויקט Google Cloud

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. הפעלת ממשקי ה-API של Cloud Build, Cloud Functions, Cloud Logging, Artifact Registry ו-Cloud Run.

  1. לוחצים על תפריט TODO > ממשקי API services > ממשקי API מופעלים Services ולאחר מכן לוודא שממשקי ה-API מופעלים.

עדכון סוכן מאגר הנתונים של Dialogflow CX

צריך לפרוס פונקציה של Cloud Functions ולעדכן את ה-webhook webhook של Dialogflow כדי שהיא תפעיל אותה במספר מקורות כשהדבר אפשרי.

החזרה של מספר מקורות

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

במסוף של Dialogflow CX, מבצעים את הפעולות הבאות:

  1. בוחרים את הפרויקט ב-Google Cloud.
  2. בוחרים את נציג הידע.
  3. בוחרים באפשרות דף הפתיחה.
  4. בוחרים באפשרות עריכת מאגרי הנתונים.
  5. בקטע תגובות של נציגים, מגדירים את אפשרויות התגובה של מאגר הנתונים לערך 5.
  6. לוחצים על שמירה.

f5932d03057df645.png

הפעלת הפונקציה של Cloud Functions

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > Cloud Functions.

  1. לוחצים על Create function.
  2. בקטע בסיסי, מגדירים את שם ל-function-1.
  3. בקטע Authentication, בוחרים באפשרות Allow unauthenticated invocations (אישור הפעלות לא מאומתות).
  4. בקטע הגדרות זמן ריצה, build, חיבורים ואבטחה, מגדירים את מספר המכונות המקסימלי לערך 3.
  5. לוחצים על הבא.

bd3790a9285f9c07.png

  1. מגדירים את נקודת הכניסה לערך agent-response-adapter.
  2. מחליפים את תוכן ברירת המחדל בקבצים שנמצאים בספרייה knowledge-app/agent-response-adapter.
  3. לוחצים על Deploy (פריסה).

b379bb8ca0fc1079.png

  1. מעתיקים את כתובת ה-URL וממתינים כמה דקות לפריסת הפונקציה.

eaae08cf048b9b1c.png

הפעלת ה-webhook

צריך להגדיר שסוכן Dialogflow CX ישתמש ב-webhook שיפעיל את הפונקציה החדשה שנפרסה.

במסוף של Dialogflow CX, מבצעים את הפעולות הבאות:

  1. בוחרים את הפרויקט ב-Google Cloud.
  2. בוחרים את נציג הידע.
  3. בוחרים באפשרות ניהול > תגובות לפעולה מאתר אחר (webhook) > יצירה.
  4. מגדירים את השם המוצג ל-Google Chat Response Adapter.
  5. מגדירים את Webhook URL בתור כתובת ה-URL שהעתקתם קודם לכן.
  6. לוחצים על שמירה.

5f3c6804d52b87c1.png

  1. לוחצים על Build.
  2. בוחרים באפשרות דף הפתיחה.
  3. בוחרים באפשרות עריכת מאגרי הנתונים.
  4. בקטע הגדרות של תגובה לפעולה מאתר אחר (webhook), לוחצים על המתג הפעלת ה-webhook.
  5. בוחרים באפשרות מתאם התגובה של Google Chat ל-webhook.
  6. מגדירים את tag לערך arbitrary_tag.
  7. לוחצים על שמירה.

442fcaaec9b8f2e3.png

אפליקציית בדיקה

  • ב-Google Chat, אתם יכולים לשלוח את המספר What is Google Chat? בצ'אט אישי לאפליקציית Google Chat. הנציג יענה עם משהו משמעותי וכרטיס עם מקורות, אם יש כזה.

9468866bfe848bb8.png

10. אפליקציה 3: Build

סקירת המושגים

אינטראקציות בממשק שיחה

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

מפרט OpenAPI

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

נציג של Dialogflow CX

אבן הבניין הבסיסית של אפליקציות סוכנים. לאפליקציה סוכן יש בדרך כלל סוכנים רבים, כאשר כל סוכן מוגדר לטפל במשימות מסוימות. נתוני הסוכן מסופקים ל-LLM, כדי שיש לו את המידע הנדרש כדי לענות על שאלות ולבצע משימות. כל נציג יכול לספק מידע, לשלוח שאילתות לשירותים חיצוניים או לדחות את הטיפול בשיחה לתהליך CX של Dialogflow או לנציג אחר כדי לטפל במשימות משנה.

הכלי של Dialogflow CX

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

בדיקת הארכיטקטורה

9d3342d12f3b4dda.png

האפליקציה הזו של Google Chat מבוססת על Dialogflow CX והיא פועלת באופן הבא:

  1. משתמש שולח הודעה לאפליקציה בצ'אט אישי או במרחב משותף.
  2. ההודעה מעבדת את ההודעה על ידי האפליקציה, שהיא סוכנת של Dialogflow CX ומשויכת לפרויקט ב-Google Cloud.
  3. האפליקציה משתלבת עם נציג.
  4. האפליקציה שולחת תשובה מסונכרנת, בצ'אט ישיר או במרחב המקורי.

בדיקה של תהליכי הבדיקה

איסוף הביקורת

a67a5b8b513bfc2c.png

בדיקת קוד המקור

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

package.json

// The function relies on the Cloud Functions framework to run.

{
  "name": "feedback-app-backend",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  },
  ...
}

index.js

/** 
 * Handles all incoming requests.
 * 
 * It always returns OK in plain text.
 */
functions.http('feedback-app-backend', (request, response) => {
    response.send('OK');
});

service-openapi.yaml

// Defines the backend service structure and how to request it.

openapi: 3.1.0
info:
  title: Review Store
  license:
    name: Apache 2.0
    identifier: Apache-2.0
  version: 0.0.1
servers:
  - url: https://us-central1-project-0.cloudfunctions.net
paths:
  /store-review:
    post:
      operationId: storeReview
      summary: Store a new review
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                stars:
                  type: integer
                  format: int64
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string

הפעלת הדמיה של שירות לקצה העורפי

פורסים פונקציה של Cloud Functions כדי לדמות שירות לקצה העורפי שאפליקציית הסוכן Dialogflow CX צריכה לשלב ולהתקשר ככלי.

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > Cloud Functions.

  1. לוחצים על יצירת פונקציה.
  2. בקטע בסיסי, מגדירים את שם ל-function-2.
  3. בקטע Authentication, בוחרים את לחצן הבחירה Allow unauthenticated invocations.
  4. בקטע הגדרות זמן ריצה, build, חיבורים ואבטחה, מגדירים את מספר המכונות המקסימלי לערך 3.
  5. לוחצים על הבא.

e8cf0ee7441bf634.png

  1. מגדירים את נקודת הכניסה לערך feedback-app-backend.
  2. מחליפים את תוכן ברירת המחדל בקבצים שנמצאים בספרייה feedback-app.
  3. לוחצים על Deploy (פריסה).

bdb5cf9f503aa7f6.png

  1. מעתיקים את כתובת ה-URL וממתינים כמה דקות לפריסת הפונקציה.

איך יוצרים אפליקציית נציג של Dialogflow CX

יצירת אפליקציה

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > בונה הסוכנים > אפליקציות.

  1. לוחצים על אפליקציה חדשה.
  2. בוחרים באפשרות נציג.
  3. מגדירים את השם המוצג ל-Feedback App.
  4. לוחצים על יצירה.

7ef3dbacee96c5aa.png

הפעלת הכלי

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > בונה הסוכנים > אפליקציות.

  1. בוחרים את הסוכן משוב על אפליקציית המשוב.
  2. לוחצים על כלים > + Create.
  3. מגדירים את Name כ-review.
  4. בוחרים באפשרות OpenAPI.
  5. מגדירים את description לערך הבא:
The tool takes the number of stars as a parameter of the store review method and saves it in a database for later use.
  1. מחליפים את $URL בקובץ feedback-app/service-openapi.yaml בכתובת ה-URL שהעתקתם קודם לכן.
  2. מגדירים את YAML Schema לתוכן הערוך של הקובץ feedback-app/service-openapi.yaml.
  3. לוחצים על שמירה.

58085d6d56b603f7.png

הפעלת הנציג

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > בונה הסוכנים > אפליקציות.

  1. בוחרים את הסוכן משוב על אפליקציית המשוב.
  2. בוחרים באפשרות סוכנים > סוכן גנרטיבי שמוגדר כברירת מחדל
  3. מגדירים את שם הנציג בתור Feedback collector.
  4. מגדירים את goal לערך הבא:
You are an agent that collects reviews from Google Chat app developers.
A review may be between 0 and 5 stars. The more stars, the more positive the review.
  1. מגדירים את ההוראות לערך הבא:
If the developer didn't provide the number of stars, ask for the number of stars.
After the developer provides the number of stars of the review, confirm the number with the developer and use ${TOOL: review} to store the review with the number of stars.
If ${TOOL: review} fails, apologize and ask to try again later. Otherwise, thank the developer for the review.
  1. לוחצים על שמירה.

ebee7fdfa826b487.png

אפליקציית בדיקה

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > בונה הסוכנים > אפליקציות.

  1. בוחרים את הסוכן משוב על אפליקציית המשוב.
  2. נכנסים לקטע תצוגה מקדימה של הנציג.
  3. בקטע סוכן, בוחרים באפשרות אוסף משובים.
  4. בקטע Select generative model (בחירת מודל גנרטיבי), בוחרים באפשרות gemini-pro.
  5. כדי להתחיל, צריך לשלוח את ההודעה Hello!.

90ca8cb7b2c1cb4b.png

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > Cloud Functions.

  1. בוחרים באפשרות function-2 > יומנים. בחלק מהיומנים מוצג Google-Dialogflow בשיחה.

48bfdf1788004d18.png

משלבים את אפליקציית Google Chat

במסוף של Dialogflow CX, מבצעים את הפעולות הבאות:

  1. בוחרים את הפרויקט ב-Google Cloud.
  2. לוחצים על תפריט הפעולות של הנציג Feedback App.
  3. לוחצים על העתקת השם.

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. נכנסים להגדרות של Google Chat API.

  1. בוחרים את Agent or Environment resource name (שם המשאב של הסוכן או הסביבה) כשם הנציג שהעתקתם קודם.

df16619a1cb85cf8.png

  • כדי להתחיל שיחה ב-Google Chat, צריך לשלוח את Hello! בצ'אט אישי לאפליקציית Google Chat. התגובה של הנציג זהה לזו של הבדיקה ממסוף Dialogflow CX.

99a7a0295f122f31.png

11. הסרת המשאבים

מחיקת פרויקט ב-Google Cloud

כדי לא לצבור חיובים לחשבון Google Cloud על המשאבים שבהם השתמשתם ב-Codelab הזה, מומלץ למחוק את הפרויקט ב-Google Cloud.

במסוף Google Cloud מבצעים את השלבים הבאים:

  1. לוחצים על תפריט TODO > IAM ו- אדמין > הגדרות.

  1. לוחצים על כיבוי.
  2. מזינים את מזהה הפרויקט.
  3. לוחצים על כיבוי בכל זאת.

407699a4e03afea6.png

מחיקת פרויקט ב-Apps Script

מומלץ למחוק גם את פרויקט Apps Script.

במסוף Apps Script, מבצעים את השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. לוחצים על תפריט הפעולות.
  3. לוחצים על הסרה.

fa3a42d7d2201eb9.png

12. מזל טוב

מעולה! יצרת אפליקציות ל-Google Chat בעזרת Gemini!

מה השלב הבא?

ב-Codelab הזה הצגנו רק תרחישים לדוגמה פשוטים, אבל יש הרבה תחומי הרחבה שכדאי לשקול באפליקציות של Google Chat, למשל:

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

מידע נוסף