שלום לכולם,
אני יודע שקצת הפוסטים שלי ירד. זה בעיקר בגלל המצב והמלחמה.
אני מקווה בעתיד לחזור לכתוב בצורה יותר מסודרת.
מעבר לזה, אני מעדכן בצורה יותר תדירה בערוץ הטלגרם של הבלוג.
העדכונים שם הם בנושאים אחרים, בעיקר על תוכן אחר שאני מוצא שמעניין ואותי וקצת חדשות
מוזמנים
הקדמה
כמתכנת בחברת Tufin, יצא לי לאחרונה להשתתף בהאקתון שהתמקד בפתרונות בינה מלכותית (AI) בחברה שלנו. הצוות שלי החליט ליצור צ'אטבוט אשר יאסוף מידע מכמה מערכות של החברה – סלאק, סיילספורס, וג'ירה – ולספק מקום יחיד עבור העובדים לאסוף מידע ממנו.
המטרה הראשית שלנו הייתה לפשט את תהליך איסוף המידע. למשל, אם איש תמיכה צריך לקבל את כל ההיסטוריה של לקוח לפני שהוא עולה לשיחה איתו, כולל כל האסקלציות שהיו להם וכל הנושאים הפתוחים שעדיין יש להם, הם יוכלו לתשאל את הצ'אטבוט.
דוגמה נוספת היא להימנע אופציית חיפוש טובה יותר בסלאק שלנו על היסטוריה של שיחות ופתרונות שהוצעו שם.
ארכיטקטורת מערכת
המערכת שלנו הייתה בנויה משלושה מרכיבים עיקריים:
ממשק משתמש מבוסס Chainlit
אנחנו השתמשנו בספריית פייתון קוד פתוח שנקראת Chainlitאשר מקלה על יצירת אפליקציות רשת עבור ML וDS (data science).
הממשק משתמש הוא המקום בו המשתמשים שלנו (עובדי תופין) היו יכולים לשלוח את השאילתות שלהם למערכת שלנו. ושם הם היו רואים את התשובות.
בסיס נתונים
על מנת להביא את כל המידע למערכת שלנו היינו צריכים לאסוף אותו בצורה מסודרת, ולהמיר אותו לבסיס נתונים וקטורי כדי שהמודל שלנו יוכל להשתמש בו.
אנחנו בחרנו להשתמש ב Chroma DB.
העיקרון הוא שפעם בלילה, אוספי הנתונים שלנו היו אוספים את כל המידע החדש שנוצר באותו יום ומכניסים אותו ל-DB על מנת שנוכל לקבל תשובות רלוונטיות.
מכונת GPU עם מודל
אנחנו השתמשנו ב-Ollamaשרצה על מכונת GPU עם מודל open source של מיסטרל על מנת לייצר את התשובות שלנו על בסיס המידע בבסיס הנתונים
אז איך זה עובד?
הסברתי קצת איך עשינו את העבודה של לאסוף אל המידע. בחלק הבא (של הסבר הטכנולוגיה) ניכנס לזה לעומק, אבל כרגע בשביל ההבנה הכללית יצרנו אוספי נתונים אשר היו מביאים את המידע ל-DB שלנו.
כאשר משתמש היה שואל שאלה בממשק המשתמש שלנו, זה היה מגיע אל ה-LLM שלנו, ואז ה-Ollama היה מנסה לאסוף לפי הקונטקסט של השאלה לאסוף את כל הוקטורים הרלוונטיים לשאילתא, ואז מכין את התשובה ומחזיר את זה למשתמש.
טכנולוגיות
אז אחרי שהסברתי את זרימת המידע העיקרית בוא ניכנס קצת יותר לעומק של הטכנולוגית שבחרנו לעבוד איתם.
חשוב להבין שלא עשינו סקר שוק מאוד מעמיק על מה עדיף, בהאקתון חיפשנו פתרונות מהירים לבנייה של הפתרון שלנו, ובהחלט יש מצב שיש דרכים טובות יותר לעשות את זה.
ממשק המשתמש – Chainlit
כמו שכתבתי מקודם Chainlit זו ספריית קוד פתוח מבוססת פייתון אשר מאפשר למפתחים ליצור בצורה אינטרקטיבית אפלקיציות שהפוקוס שלהן הן ניהול מידע (כמו למשל chatbot).
הבחירה בכיוון הזה היא שרוב המשתמשים הפוטנציאליים שלנו מכירים את ChatGpt ודומיו ולכן החלטנו ללכת על ממשק דומה.
הספרייה משתמש בתכנות ריאקטיבי, כלומר זה מעדכן את ה-UI בצורה אוטומטית כאשר הדאטה משתנה.
בפרוייקט שלנו, הצלחנו להרים chatbot בצורה מאוד מהירה כדי שנוכל לבדוק את המערכת שלנו.
בסיס נתונים – Chroma DB
הבסיס נתונים Chroma DB הוא בסיס נתונים מבוסס מסמכים (Document based DB) ששם אנחנו שמרנו את כל המידע שלנו. הוא קצת דומה בגישה שלו ל-Mongo.
ההבדל העיקרי ביניהם הוא ש-Chroma הוא בסיס נתונים וקטורי, כלומר הוא שומר את המידע בצורה של וקטור ולא במסמך רגיל.
יש הסבר מעולה לזה כאן
מושכי המידע
את הקוד הזה כתבנו בפייתון על מנת למשוך מידע מסלאק, סיילספורס וג'ירה. הסקריפטים הללו רצו באיטרוולים קבועים כדי לאסוף כל מידע חדש שנוצר באותו אינטרוול, להמיר אותו לפורט שמתאים ל-DB שלנו.
בסקריפטים האלו השתמשנו בספריית Langchainשזו ספרייה מאוד שימושית לנהל מידע מבוסס שפה (למרות שלאחרונה מתפרסמים מאמרים שזה פוגע בתוצאות):
- עבור סלאק – השתמשנו ב-
SlackDirectoryLoader
מודול. הוא עוצב לטעון ולעבד מידע מסלאק. הוא קורא את המידע ישירות מה-API של סלאק. - בשביל ג'ירה וסיילספורס השתמשנו ב
CSVLoader
מודול. בעצם אנחנו משכנו את המידע ידנית מהאתרים הללו והמרנו אותו לקבצי CSV. ואז טענו את הקבצים הללו לסקריפט והשתמשנו במודול הזה כדי לעבד אותם. - אחרי שאספנו ועיבדנו את המידע השתמשנו ב-
GPT4AllEmbeddings
. זה מודל שאומן מראש על ידי Langchain כדי שהוא יוכל לייצג אותם בצורה וקטורית - אחרי שאספנו את הכל רצינו לקבץ את הוקטורים כי אחרת זה יצר לנו בעיית ביצועים. בשביל זה השתמשנו ב
RecursiveCharacterTextSplitter
.
מכונת ה-GPU
כדי להריץ את המודל שלנו היינו צריכים מכונת GPU, ושם הרצנו Ollama Server שזה מאפשר להריץ בקלות LLM מבוססי קוד פתוח.
השרת שלנו תקשר עם הבסיס נתונים, שלף ממנו את המידע הרלוונטי לשאילתא ואז הריץ את הכל בתוך ה-LLM כדי לייצר תשובה
מודל השפה – LLM
במקרה זה בחרנו במודל הקוד פתוח של Mistral. הוא מבוסס ארכיטקטורת transformer, שזה נחשב יחסית טוב עבור משימות מבוססות עיבוד שפה.
סיכום
ההאקתון הזה הייתה הזדמנות אדירה בשבילי להתלכלך קצת בעולמות ה-AI שכולם מדברים עליהם. יצא לי ללמוד המון מזה. אני ממליץ בחום.
מבחינת הלקחים שלי, הדבר המשמעותי ביותר שאני שמתי לב הוא שהדבר החשוב ביותר ששיפר משמעותית את התשובות של המודל היה הצורה בה עיבדנו את המידע. לא סתם אומרים ש Data is King.