חיפוש עבודה בעזרת סוכנים חכמים – חלק 3

בחלקים הקודמים (חלק 1, חלק 2) נתקל סוכן המשרות החכם שלנו בבעיה של כמות הטוקנים הגדולה בפרומפט, בגלל גודלו של קובץ המשרות.

בחלק הזה ננסה למצוא דרך לעזור לסוכן החכם לאתר קרבה סמנטית של המשרה(ות) לפרומפט המבוקש. אחת הדרכים הנפוצות בדוגמאות רבות של RAG ומערכות סוכנים חכמים היא השימוש בהטמעות (embeddings) בכדי לאתר קרבה סמנטית. התהליך כולל בדרך כלל ייצור וקטורי הטמעות למסמכי החיפוש ולפרומפט (אני מסרב להשתמש במילה העברית מנחה) ומציאת הקרבה ביניהם. הסבר על התיאוריה וכל נושא ההטמעות הוא מעבר למתוכנן עבור פוסט זה – אבל ניתן למצוא מידע רב ברשת. יש כאלו הטוענים לחסרונות בשיטה זו (למשל: The Insanity of Relying on Vector Embeddings: Why RAG Fails) אבל לצורך הדוגמה שלנו זו כנראה שיטה לגיטימית לבדוק האם היא תניב תוצאות קבילות.

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

לצורך בדיקה, נשתמש בשתי משרות לדוגמה. האחת מתאימה מאוד לפרומפט של "Cloud Architect" , והאחרת פחות.

job-1.json
משרה זו מתאימה – job-1.json
job-2.json
משרה זו אינה מתאימה – job-2.json

נריץ את הקוד הזה למציאת מידת הקרבה לפרומפט:

כשמריצים מתקבלת התוצאה הבאה:

Cosine similarity to job1: 0.5836322943367188
Cosine similarity to job2: 0.5218661225791285
    

Cosine similarity to job1 title: 0.7767796108694911
Cosine similarity to job2 title: 0.46854531550568995

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

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

תמונת השער יוצרה באמצעות AI באתר tensor.art

חיפוש עבודה בעזרת סוכנים חכמים – חלק 2

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

בחלק הזה נגייס את הסוכן הראשון לצוות שלנו – סוכן החיפוש. נשתמש בספריית CrewAI לצורך כך.

יצירת הסוכן + בדיקה התחלתית פשטנית

מבנה הקבצים לחלק הזה הינו:

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

אלו הגדרות הסוכן והמשימה:

וזה מה שנריץ:

ואלו התוצאות. הפרומפט שביקשנו בהרצה היה Cloud Architect:

זה עובד, בערך…

יש כמה בעיות שניתן לציין ביישום הזה:

  1. הקוד רץ על קובץ משרות לדוגמה שכלל מספר קטן של משרות שחוברו לקובץ json יחיד. אנחנו רוצים לעבור על כל המשרות שכל אחת מהן נמצאת בקובץ משלה.
  2. הפרומפט שבחרנו נבחר כך שיניב תוצאות לעבודת הסוכן. פרומפטים אחרים או מורכבים יותר לא מצאו תוצאות בחיפוש.
  3. אם נסתכל על הלוגים של ollama נבחין באזהרה מטרידה:

זה עשוי לרמז על בעייה בהפעלת ה-LLM שכן יתכן והפרומפט שלנו לא יובן במלואו.

שימוש בכל המשרות

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

ןהפרומפט "Cloud Architect" שמצא משרות בקובץ הבדיקה, לא מחזיר תוצאות רלוונטיות – אלא משרות מפתח iOS. ??? כנראה שהסוכן לא נחשף לכל המשרות, בגלל הבעייה הנ"ל.

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

תמונת השער יוצרה באמצעות AI באתר tensor.art

האם ה-LLM שלי יודע שנאסראללה חוסל?

מבוא קצר לשימוש בכלים עבור RAG

נסיונות לשאול את מודל ה LLM שלכם שאלות על מידע שהוא לא אומן עליו, יסתיימו בד"כ בתשובות "אינני יודע" למיניהן.

לדוגמה הקוד הזה:

אם נריץ את הקוד הזה נקבל תשובות כגון:

"I'm unable to tell you what the IDF (Israel Defense Forces) did on September 28, 2024."
"I cannot provide real-time information or specifics regarding future events. Is there anything else I can help you with?"

כדי לאפשר למודל ה LLM שלנו (llama3.1 בדוגמה שלנו) לענות על השאלה בהצלחה, ניתן להוסיף כלים – כגון כלי שאילתה וחיפוש באינטרנט, שה RAG יוכל להשתמש בהם.

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

pip install duckduckgo-search

והקוד שמגדיר את כלי החיפוש:

ואם נריץ את זה נקבל:

Smoke rises from the rubble of a building that was levelled in overnight Israeli strike on Beirut's southern suburbs, on September 28, 2024. (Photo by ANWAR AMRO / AFP) The Times of Israel is … His death marks a devastating blow to Hezbollah as it reels from Israeli attacks. It is also a huge blow to Iran. … [1/17] Beirut's southern suburbs, Lebanon September 28, 2024. Smoke rises from Israeli airstrikes in Beirut's southern suburbs, on Saturday, September 28. Hassan Ammar/AP The Israel Defense Forces is currently striking buildings in Beirut that it alleges are … Hezbollah has confirmed the death of its leader Hassan Nasrallah, after Israel said he was killed in an airstrike in Beirut, Lebanon on Friday. Retired Colonel Cedric Leighton joins CNN to discuss. A man stands near damaged buildings in the aftermath of Israeli air strikes on Beirut's southern suburbs, Lebanon September 28, 2024. REUTERS/Ali Alloush Purchase Licensing Rights, opens new tab

נגדיר עוד כלי שיספק את התשובה הסופית, ונריץ הכל יחדיו:

בשורה 51 אנו מייצרים את הפרומפט שמורה למודל להשתמש בכלים:

You can use the following tools:
1. `tool_browser`: Search on DuckDuckGo browser by passing the input `q`
2. `final_answer`: Returns a natural language response to the user by passing the input `text`.
    You should provide as much context as possible and specify the source of the information.

משורה 54 מריצים שיחה עם המודל שמתחילה ב"הלו" ומסתיימת באותה שאלה ששאלנו בתחילת הפוסט.

התשובה:

According to the provided information, on September 28, 2024, the Israeli army (IDF) carried out an airstrike on Hezbollah's central command in southern Beirut, killing Hassan Nasrallah, the longtime leader of Hezbollah, along with approximately 300 people, including other members of the group.