בתרגול זה נבנה את התשתית לסוכן שירות לקוחות דיגיטלי עבור מלון. במקום ללמד את הסוכן להשיב תשובות קבועות, אנו "נאכיל" אותו במסד ידע (Knowledge Base) – במקרה שלנו, מסמך שאלות ותשובות (FAQ) – וניתן לו להשתמש בידע זה כדי לענות באופן דינמי לפניות של לקוחות.
היתרון בגישה זו הוא הגמישות. כאשר מדיניות המלון משתנה (למשל, שעות ארוחת הבוקר, פעילות שבועית), כל שעלינו לעשות הוא לעדכן את בסיס הידע והסוכן יתחיל מיד לתת תשובות מעודכנות, ללא צורך בכל שינוי בסוכן עצמו.
כדי להשיג זאת, אנו נשתמש ב-Vector Store (במקרה זה Pinecone) כדי לאחסן את הידע, ובמודל Embedding (של OpenAI) כדי להפוך את הטקסטים לייצוג מספרי שהמודל מבין. תרגול זה מתמקד בחלק הראשון: אינדוקס הידע.
בהצלחה!
אינדוקס הידע ל-Pinecone
בשלב זה ניקח מסמך PDF (ה-FAQ של המלון), נעלה אותו למערכת, נפצל אותו לחתיכות קטנות (Chunks), ניצור לכל חתיכה ייצוג וקטורי (Embedding), ונטען את הכל לתוך מסד הנתונים הוקטורי שלנו ב-Pinecone.
הכנה:
- הכנסו לחשבון שלכם ב Pinecone.io. אם עדיין לא יצרתם אחד כזה, והגדרתם API Key ואינדקס – פנו להוראות ההכנה הנדרשת כאן.
- ודאו שיש לכם OpenAI API Key זמין. אם אין – עליכם לפתוח חשבון מפתח וליצור API Key לפי ההוראות כאן.
-
לצורך המשימה שלנו – נשתמש בקובץ FAQ של שירותי המלון. כל קובץ המכיל טקסט פשוט וברור יהיה מתאים למשימה, אבל אנחנו נעבוד עם קובץ קיים. הורידו אותו מכאן ושמרו במחשב.
לחילופין ניתן ליצור קובץ PDF פשוט המשמש כ-FAQ. לדוגמה, הכניסו בו טקסט כמו:
- "מהן שעות ארוחת הבוקר? ארוחת הבוקר מוגשת בין 7:00 ל-10:00 בבוקר."
- "האם יש חניה במלון? כן, אנו מציעים חניה תת-קרקעית לאורחי המלון בעלות של 20 דולר ליום."
- "מה שעת הצ'ק-אאוט? שעת הצ'ק-אאוט היא 11:00 בבוקר."
-
העלאת קבצים בממשק הצ'אט:
- צרו Workflow חדש של n8n, והוסיפו טריגר Chat.
- בהגדרות הצ׳אט, תחת Options, לחצו על Add Field ובחרו Allow File Uploads. יופיע מתג המאפשר העלאת קבצים לממשק השיחה – הפעילו אותו.
-
לחצו שוב על Add Field והוסיפו את האפשרות Allowed File Mime Types. בשדה שהופיע הכניסו את הערך
application/pdf. אפשרות זו מגבילה את סוג הקבצים שהצ׳אט יסכים לקלוט. -
שמרו את ההגדרות. כעת אמור להופיע אייקון של אטב או העלאת קובץ בתיבת הצ'אט.
-
בדיקה: לחצו על האטב ובחרו בקובץ ה PDF שהורדתם. הוסיפו מילה בחלון הצ׳אט ושלחו את ההודעה (הצ׳אט של n8n לא אוהב לקבל קבצים ללא הודעת טקסט).
בדקו בחלון ה Output של הגדרות הצ׳אט את הקובץ שהתקבל.
-
חיבור ל-Pinecone:
- צאו מהגדרות הטריגר, והוסיפו אחריו בלוק חדש מסוג Pinecone Vector Store ובחרו בפעולה Add documents to vector store.
- בבלוק, צרו חשבון חדש (New Credential) והזינו את ה-API Key ששמרתם.
-
בשדה Pinecone Index, עבדו במוד
From listומתוך הרשימה הנפתחת – בחרו בשם האינדקס שיצרתם (agent-masterclassאם שם אחר שיוצג). -
חשוב מאוד: תחת options הוסיפו את האפשרות Pinecone Namespace. הזינו בשדה הזה שם ייחודי עבור הידע הזה, למשל
hotel-faq. זה מאפשר להחזיק סוגי ידע שונים באותו Index.
אם לא תוסיפו Namespace, כל הידע שתשמרו באינדקס, ייכנס ללא הפרדה, ל Namespace הדיפולטיבי.
-
הגדרת מודל Embedding:
כעת נגדיר באיזה מודל להשתמש כדי להפוך את קטעי הטקסט שנשמור (Chunks) למספרים (Embeddings), באופן שהסוכן יהיה יכול לחפש בהם מידע לפי נושא השאלה של המשתמש.
- ביציאת ה Embedding שמתחת לבלוק, הוסיפו מודל Embeddings OpenAI.
- חברו אליו את ה-OpenAI Credential שלכם.
-
בשדה Model, בחרו במודל
text-embedding-3-small. זהו מודל פופולרי, זול ויעיל, שמייצר וקטורים בגדלים שונים לפי ההגדרה שלנו. -
תחת Options, הוסיפו את השדה Dimensions ובחרו
512. זהו גודל וקטור המספרים שהמודל יצור לכל מקטע טקסט שנזין.
-
טעינה ופיצול הנתונים (Data Loader):
בשלב הזה נגדיר באיזה אופן אנו רוצים לטעון את המידע לשמירה. במקרה שלנו זהו קובץ PDF.
- ביציאת ה Document הוסיפו ״טוען״ מסוג Default Data Loader.
- בשדה Type of Data (סוג הדאטה), בחרו ב Binary. זה אומר ל״טוען״ מה סוג הנתונים שבקלט, ואיך לחלץ מהם את הטקסט.
- בתוך הגדרות ה-Loader, חפשו את האפשרות Text Splitter, וקבעו אותה ל Custom. שימו לב שנוספה יציאה חדשה בתחתית חלון הטוען – Text Splitter.
- הקליקו על היציאה החדשה שנוספה, ובחרו בסוג Recursive Character Text Splitter. זהו מפצל חכם שיודע לחתוך טקסטים ארוכים ליחידות קטנות (Chunks) תוך שמירה על משמעות (הוא מנסה לחתוך קודם בפסקאות, אז במשפטים וכו').
-
הגדירו Chunk Size ל-1000 (כ-1000 תווים לכל חתיכה) ו-Chunk Overlap ל-150 (כדי שתהיה חפיפה בין החתיכות, מה שעוזר לשמור על הקשר).
- סגרו את כל חלונות ההגדרה, וחזרו למשטח העבודה.
- לאחר שהכל מחובר, הפעילו את ה-Flow. בממשק הצ'אט, העלו את קובץ ה-PDF שלכם ושימו לב לתהליך פיצול הטקסט והעלאת המקטעים לאינדקס של Pinecone.
-
צפייה בתוצאות ב-Pinecone:
- היכנסו לממשק הניהול של Pinecone בדפדפן.
-
נווטו ל-Index שלכם, רעננו את התצוגה, ושימו לב למידע שנקלט. תוכלו להכנס לכל פריט מידע ולהתרשם מהשדות השונים שנשמרו: בכל פריט יש שדה
textהמחזיק את פיסת הטקסט שה splitter פיצל, וכל שדות נוספים של Metadata – המחזיקים מידע על המסמך המקורי ממנו הטקסט נלקח, מספר עמוד, מספר שורה ועוד. - תוכלו גם לראות את ה-Namespace שיצרתם ("hotel-faq") ואת כמות הוקטורים שהוא מכיל. זהו האישור שהמידע שלכם נטען בהצלחה!
הסבר: מה עשינו כאן?
בפועל, ביצענו תהליך ETL (Extract, Transform, Load) המותאם לעולם ה-AI:
- Extract (שליפה): ה-Data Loader קרא את קובץ ה-PDF וחילץ ממנו את הטקסט הגולמי.
-
Transform (שינוי):
- פיצול (Chunking): ה-Text Splitter פירק את הטקסט הארוך לחתיכות קטנות (Chunks) בנות 1000 תווים כל אחת. זה קריטי, כי למודלי Embedding יש מגבלת קלט.
- וקטוריזציה (Embedding): מודל ה-Embedding של OpenAI עבר על כל "Chunk" והפך אותו לוקטור – רשימה ארוכה של מספרים (בגודל 1536) המייצגת את המשמעות הסמנטית של אותה חתיכת טקסט.
- Load (טעינה): בלוק ה-Pinecone לקח את הוקטורים האלו, יחד עם הטקסט המקורי שלהם (כ-Metadata), וטען (Upsert) אותם למסד הנתונים הוקטורי.
כעת, הידע שמור ב-Pinecone ומוכן לכך שסוכן חכם ישאל אותו שאלות.