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

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

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

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

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

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

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

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

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

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

מה תפתחו

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

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

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

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

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

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

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

22efdecff4601417.png

2d127c63518673b2.png

9aea694937f2f3ed.png

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

הטכנולוגיות העיקריות שבהן נעשה שימוש הן סוכן מאגר נתונים של Dialogflow CX,‏ webhook של Dialogflow CX,‏ 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 console, פועלים לפי השלבים הבאים:

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

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 מתקדם

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

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

8c9c7b7328a69ea6.png

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

  1. משתמש שולח הודעה לאפליקציה, בצ'אט ישיר או במרחב.
  2. האפליקציה, שמיושמת בפרויקט Apps Script ומשויכת לפרויקט בענן של Google, מעבדת את ההודעה.
  3. האפליקציה משולבת עם ממשקי ה-API של Google Docs ו-Google Chat.
  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. לוחצים על Menu ☰ > APIs & Services (תפריט > ממשקי API ושירותים) > Enabled APIs & Services (ממשקי API ושירותים מופעלים) ומוודאים שממשקי ה-API מופעלים.

Initiate service account

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

  1. לוחצים על תפריט ☰ > IAM & Admin > Service Accounts > + Create service account (תפריט ☰ > IAM ואדמין > חשבונות שירות > + יצירת חשבון שירות).

74cf57426419f39.png

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

ca0468f1f93990f9.png

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

9f7e6ea020978ab0.png

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

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

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

  1. מוסיפים פקודה דרך שורת הפקודות.
  2. מגדירים את Name לערך /create.
  3. מגדירים את מזהה הפקודה לערך 1.
  4. מגדירים את Description לערך Create a new issue.
  5. מסמנים את התיבה פתיחת תיבת דו-שיח.
  6. מוסיפים עוד פקודה דרך שורת הפקודות.
  7. מגדירים את Name לערך /close.
  8. מגדירים את מזהה הפקודה לערך 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, לוחצים על תפריט ☰ > IAM & Admin > Settings (תפריט ☰ > IAM ומנהל מערכת > הגדרות).

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

82592fa0bd113469.png

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

383cee561130ceba.png

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

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

  1. ב-Apps Script console, בוחרים את הפרויקט.
  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. בתיבת הדו-שיח, מגדירים את הכותרת ל-Issue Title 1.
  2. מגדירים את Description (תיאור) ל-Issue 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: הוספת דף הבית של האפליקציה

מושגים שכדאי להכיר

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

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. מגדירים את Title לערך Issue Title 2.
  3. מגדירים את Description (תיאור) ל-Issue Description 2 (בעיה).
  4. לוחצים על יצירה.

3b2a8690e758f965.png

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

ed8e32da0e6f2ac6.png

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

בדיקת מושגים

Pub/Sub

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

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

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

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

אירועים ב-Google Workspace

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

7816e477b112bfb6.png

כך Google Workspace Events 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 Events ואת PubSub.

  1. לוחצים על תפריט ☰ > ממשקי API ושירותים > ממשקי API ושירותים מופעלים ומוודאים ששניהם מופעלים.

הפעלת מינוי

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

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

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

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

b39f9a0aec7c9939.png

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

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

8d4016c37532503.png

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

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

  1. עוברים אל תפריט ☰ > IAM & Admin > Settings (ניהול הרשאות גישה ואדמין > הגדרות).

  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. מגדירים את Title לערך Issue Title 3.
  3. מגדירים את Description (תיאור) ל-Issue Description 3 (בעיה).
  4. לוחצים על יצירה.
  5. במרחב החדש שנוצר, שולחים כמה הודעות שבהן דנים בבעיה.
  6. שולחים הודעה עם פקודה דרך שורת הפקודות /close ורזולוציה כמו Fixed.

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

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

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

82631c9792d83889.png

ב-Apps Script console, פועלים לפי השלבים הבאים:

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

c612e8fa2bd0a163.png

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

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

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

e185454cac862a7b.png

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

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

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

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

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

בדיקת מושגים

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

בדיקת תהליכי עבודה

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

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. מגדירים את Title לערך Issue Title 4.
  3. מגדירים את Description (תיאור) ל-Issue Description 4 (בעיה).
  4. לוחצים על יצירה.
  5. במרחב החדש שנוצר, שולחים את ההודעה It happened to me last week as well.

ב-Apps Script console, פועלים לפי השלבים הבאים:

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

ב-Google Chat, פועלים לפי השלבים הבאים:

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

ב-Apps Script console, פועלים לפי השלבים הבאים:

  1. בוחרים את הפרויקט הרצוי.
  2. לוחצים על עריכה.
  3. בוחרים את הקובץ WorkspaceEvent.gs.
  4. בקטע Run, בוחרים באפשרות 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 console, פועלים לפי השלבים הבאים:

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

ב-Google Chat, פועלים לפי השלבים הבאים:

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

de722cff1928dec9.png

בדיקת השבתה

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

ב-Apps Script console, פועלים לפי השלבים הבאים:

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

347d659db53b73e9.png

8. אפליקציה 2: Build

מושגים שכדאי להכיר

הארקה של AI גנרטיבי

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

שפה טבעית

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

Cloud Storage

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

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

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

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

9d3342d12f3b4dda.png

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

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

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

הוספת תשובה לשאלה

aad9fb5a7ca48956.png

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

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

google-chat-overview.pdf

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

e9b91c4587b1a3a0.png

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

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

  1. מפעילים את Dialogflow API ואת Cloud Storage API.

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

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

.

יצירת סוכן מאגר נתונים ב-Dialogflow CX

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

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

  1. לוחצים על תפריט ☰ > Cloud Storage > Buckets.

4f15978ae9f1b687.png

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

6b38c6d4d2c41bba.png

  1. בוחרים בדלי gchat-knowledge.
  2. לוחצים על Upload files.
  3. מורידים את הקובץ 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. אחרי כמה דקות, לוחצים על תפריט ☰ > הכלי ליצירת סוכנים > אפליקציות ורואים שהאפליקציה מופיעה.

d929a7431dd84968.png

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

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

558319790a0accf2.png

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

ב-Dialogflow CX console, פועלים לפי השלבים הבאים:

  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 console, פועלים לפי השלבים הבאים:

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

e19f61185158110d.png

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

  1. עוברים להגדרות של Google Chat API.

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

505ff39a50880904.png

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

abda9e43b81fb0ea.png

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

מושגים שכדאי להכיר

Dialogflow CX webhook

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

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. מפעילים את Cloud Build API,‏ Cloud Functions API,‏ Cloud Logging API,‏ Artifact Registry API ו-Cloud Run API.

  1. לוחצים על Menu ☰ > APIs & services > Enabled APIs & services ומוודאים שממשקי ה-API מופעלים.

עדכון סוכן מאגר נתונים ב-Dialogflow CX

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

החזרת כמה מקורות

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

ב-Dialogflow CX console, פועלים לפי השלבים הבאים:

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

f5932d03057df645.png

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

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

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

  1. לוחצים על יצירת פונקציה.
  2. בקטע Basics, מגדירים את name לערך function-1.
  3. בקטע אימות, בוחרים בלחצן האפשרויות התרת הפעלות לא מאומתות.
  4. בקטע Runtime, build, connections and security settings (הגדרות של זמן ריצה, build, חיבורים ואבטחה), מגדירים את Maximum number of instances (מספר המופעים המקסימלי) ל-3.
  5. לוחצים על הבא.

bd3790a9285f9c07.png

  1. מגדירים את Entry point ל-agent-response-adapter.
  2. מחליפים את תוכן ברירת המחדל בקבצים package.json ו-index.js.
  3. לוחצים על פריסה.

b379bb8ca0fc1079.png

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

eaae08cf048b9b1c.png

הפעלת webhook

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

ב-Dialogflow CX console, פועלים לפי השלבים הבאים:

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

5f3c6804d52b87c1.png

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

442fcaaec9b8f2e3.png

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

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

9468866bfe848bb8.png

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

מושגים שכדאי להכיר

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

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

מפרט OpenAPI

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

סוכן Dialogflow CX

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

הכלי Dialogflow CX

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

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

9d3342d12f3b4dda.png

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

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

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

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

a67a5b8b513bfc2c.png

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

קוד המקור היחיד שצריך הוא הפונקציה לחיקוי שירות לקצה העורפי שה-Agent משתמש בו ככלי.

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. לוחצים על תפריט ☰ > Cloud Functions.

  1. לוחצים על יצירת פונקציה.
  2. בקטע Basics, מגדירים את name לערך function-2.
  3. בקטע אימות, בוחרים בלחצן האפשרויות הפעלת קריאות לא מאומתות.
  4. בקטע Runtime, build, connections and security settings (הגדרות של זמן ריצה, build, חיבורים ואבטחה), מגדירים את Maximum number of instances (מספר המופעים המקסימלי) ל-3.
  5. לוחצים על הבא.

e8cf0ee7441bf634.png

  1. מגדירים את Entry point ל-feedback-app-backend.
  2. מחליפים את תוכן ברירת המחדל בקבצים package.json ו-index.js.
  3. לוחצים על פריסה.

bdb5cf9f503aa7f6.png

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

יצירת אפליקציית סוכן של Dialogflow CX

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

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

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

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

7ef3dbacee96c5aa.png

הפעלת כלי

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

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

  1. בוחרים את הסוכן אפליקציית משוב.
  2. לוחצים על כלים > + יצירה.
  3. מגדירים את Name לערך review.
  4. בוחרים באפשרות OpenAPI.
  5. מגדירים את הערך הבא לתיאור:
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 ומחליפים אותו בקובץ service-openapi.yaml בכתובת ה-URL שהעתקתם קודם.
  2. מגדירים את YAML Schema לתוכן הערוך של הקובץ service-openapi.yaml.
  3. לוחצים על שמירה.

58085d6d56b603f7.png

Initiate agent

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

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

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

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

90ca8cb7b2c1cb4b.png

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

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

  1. בוחרים באפשרות function-2 > Logs (פונקציה 2 > יומנים). בחלק מהיומנים, Google-Dialogflow מופיע כמתקשר.

48bfdf1788004d18.png

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

ב-Dialogflow CX console, פועלים לפי השלבים הבאים:

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

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

  1. עוברים להגדרות של Google Chat API.

  1. מגדירים את שם המשאב של הסוכן או הסביבה לשם הסוכן שהעתקתם קודם.

df16619a1cb85cf8.png

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

99a7a0295f122f31.png

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

מחיקת פרויקט בענן של Google

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

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

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

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

407699a4e03afea6.png

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

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

ב-Apps Script console, פועלים לפי השלבים הבאים:

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

fa3a42d7d2201eb9.png

12. מזל טוב

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

מה השלב הבא?

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

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

מידע נוסף