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

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

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

באפליקציות של Google Chat עם Gemini:

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

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

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

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

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

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

מה מפתחים

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

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

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

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

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

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

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

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. לוחצים על סמל התפריט {} > ממשקי 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. היא עוזרת לאנשים למנף את הפוטנציאל האנושי כדי להרחיב את הדמיון, להרחיב את הסקרנות שלהם ולשפר את הפרודוקטיביות.

שירות צ'אט מתקדם

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

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

8c9c7b7328a69ea6.png

אפליקציית Google Chat הזו נוצרה באמצעות Apps Script. הוא פועל כך:

  1. משתמש שולח הודעה לאפליקציה, בצ'אט אישי או במרחב משותף.
  2. האפליקציה מעבדת את ההודעה, שמוטמעת בפרויקט Apps Script ומשויכת לפרויקט ב-Google Cloud.
  3. אפשר לשלב את האפליקציה עם Google Docs וממשקי API של Google Chat.
  4. האפליקציה משתמשת ב-Properties Service כדי לשמור נתונים במאפייני הסקריפט.
  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. לוחצים על תפריט BILLING > APIs & Services > Enabled APIs & Services ומאשרים שממשקי ה-API מופעלים.

.

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

  1. לוחצים על סמל התפריט {} > IAM ואדמין > חשבונות שירות > + יצירת חשבון שירות.

74cf57426419f39.png

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

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. מגדירים את התיאור ל-Create a new issue.
  5. מסמנים את התיבה פתיחה של תיבת דו-שיח.
  6. מוסיפים עוד פקודה דרך שורת הפקודות.
  7. מגדירים את Name (שם) ל-/close.
  8. מגדירים את Command ID כ-2.
  9. מגדירים את התיאור ל-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, לוחצים על תפריט סמל החשבון Chromecast > 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! בצ'אט אישי לאפליקציה. האפליקציה לא מגיבה, אבל מופיעה הודעה עם בקשה להגדרה.

4c1fc68121dcffed.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. בקטע תכונות אינטראקטיביות, מסמנים את תיבת הסימון דף הבית של אפליקציית התמיכה.

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

.

הפעלת המינוי

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

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

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

b39f9a0aec7c9939.png

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

  1. בוחרים את הנושא מהרשימה.
  2. לוחצים על הכרטיסייה Permissions.
  3. מוסיפים את chat-api-push@system.gserviceaccount.com לחשבונות משתמש חדשים.
  4. בוחרים באפשרות פרסום ב-Pub/Sub בקטע Role.
  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. עוברים אל תפריט סמל החשבון Chromecast > 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. עוברים אל תפריט סמל החשבון Chromecast > Pub/Sub > מינויים.

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

e185454cac862a7b.png

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

  1. עוברים אל תפריט סמל החשבון Chromecast > 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: פיתוח

עיון במושגים

תשתית של בינה מלאכותית גנרטיבית

המטרה שלו היא לשפר את העובדות והאמינות של מודלים של 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

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

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

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. לוחצים על תפריט BILLING > ממשקי API ושירותים > ממשקי API ושירותים מופעלים ומוודאים שכל ה-APIS מופעלים.

.

.

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

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

  1. לוחצים על סמל התפריט BILLING > 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. לוחצים על סמל התפריט {} > הכלי ליצירת סוכנים > אפליקציות.

  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. מחכים כמה דקות ואז לוחצים על תפריט ⌥ > Agent builder > אפליקציות ושמים לב שהאפליקציה זמינה.

d929a7431dd84968.png

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

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

558319790a0accf2.png

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

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

  1. בוחרים את הפרויקט הרלוונטי ב-Google Cloud.
  2. בוחרים את סוכן הידע.

ca9b2fb4be92e8e4.png

  1. בוחרים באפשרות הגדרות סוכן > 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. נכנסים להגדרת ה-API של Google Chat.

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

505ff39a50880904.png

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

abda9e43b81fb0ea.png

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

עיון במושגים

webhook webhook CX

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

Cloud Functions

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

תהליכי בדיקה

הוספת תשובה לשאלה (עדכון)

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. לוחצים על סמל התפריט BILLING > ממשקי API ושירותים > ממשקי API ושירותים מופעלים ומוודאים שממשקי ה-API מופעלים.

.

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

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

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

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

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

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

f5932d03057df645.png

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

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

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

bd3790a9285f9c07.png

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

b379bb8ca0fc1079.png

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

eaae08cf048b9b1c.png

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

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

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

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

5f3c6804d52b87c1.png

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

442fcaaec9b8f2e3.png

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

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

9468866bfe848bb8.png

10. אפליקציה 3: פיתוח

עיון במושגים

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

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

מפרט OpenAPI

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

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

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

e8cf0ee7441bf634.png

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

bdb5cf9f503aa7f6.png

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

איך יוצרים אפליקציה של סוכן CX ב-Dialogflow

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

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

  1. לוחצים על אפליקציה חדשה.
  2. בוחרים באפשרות סוכן.
  3. הגדרה של Display name כ-Feedback App.
  4. לוחצים על יצירה.

7ef3dbacee96c5aa.png

הפעלת הכלי

במסוף Google Cloud, פועלים לפי השלבים הבאים:

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

  1. בוחרים את הסוכן Feedback App.
  2. לוחצים על כלים > + יצירה.
  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. לוחצים על סמל התפריט {} > הכלי ליצירת סוכנים > אפליקציות.

  1. בוחרים את הסוכן Feedback App.
  2. בוחרים באפשרות Agents > Default Generative Agent.
  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. מגדירים את instructions לערך הבא:
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. לוחצים על סמל התפריט {} > הכלי ליצירת סוכנים > אפליקציות.

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

90ca8cb7b2c1cb4b.png

במסוף Google Cloud, פועלים לפי השלבים הבאים:

  1. לוחצים על תפריט Chromecast > 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. מגדירים את שם המשאב של הסוכן או הסביבה לשם של הנציג שהעתקתם קודם.

df16619a1cb85cf8.png

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

99a7a0295f122f31.png

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

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

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

במסוף Google Cloud, פועלים לפי השלבים הבאים:

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

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

407699a4e03afea6.png

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

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

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

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

fa3a42d7d2201eb9.png

12. מזל טוב

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

מה השלב הבא?

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

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

מידע נוסף