המלצה | חיפוש הלכתי חכם (AI)
-
היי חברים,
אני רוצה לשתף אתכם בנסיונות ליצור חיפוש תורני חכם מבוסס בינה מלאכותית.
אז לפני כמה חודשים הדגמתי חיפוש חכם בשולחן ערוך, וזה היה מבוסס על מודל שידע לסווג משפטים לסעיפים הנכונים בשולחן ערוך. אך זה היה כרוך באימון של המודל, מה שגרם לזה להיות מורכב.
הפעם השתמשתי בשיטה אחרת, היתרון שלה הוא שהיא ניתנת להרחבה בקלות גם למאגרים גדולים (אוצריא?) וגם לא הייתי צריך לאמן שום מודל, השתמשתי במודל קיים (עם זאת, יתכן שאימון כן יכול לעזור לו, במיוחד במושגים תורניים שהוא לא מכיר).
העקרון הוא כזה: יש מודל שיודע לתת לכל משפט ייצוג מספרי מתאים, שזה בעצם סדרה של מספרים, שאפשר להתייחס אליה כמציינת את המיקום של המשפט במרחב המשפטים. לדוגמה שני מספרים יכולים לשמש ציון של מיקום על ציר הX והY במרחב דו מימדי. אבל כאן משתמשים בהרבה מספרים, וזה בעצם מיקום במרחב רב מימדי. לוקחים את כל המשפטים שרוצים לחפש בהם, ונותנים להם את המספרים הללו. אחר כך לוקחים את השאילתה שהמשתמש רוצה, וגם לה נותנים ייצוג באותה שיטה, ומחפשים את הנקודה הקרובה ביותר במרחב.
תמונה להמחשה:
איך בעצם מייצרים את המספרים הללו? למעשה מדובר במודל שפה מתוחכם עם הרבה למידת מכונה, שהתאמן על משפטים דומים ושונים. אבל לסבר את האוזן נוכל להראות איך ניצור כאלו מספרים פשוט ממספר המילים שחוזרות על עצמן בכל קטע.
נניח שיש לנו שני קטעי מתכונים ושני קטעים מספר על טיולים, ואנ ורוצים לתת לכל קטע ייצוג, אז נספור את מספר הפעמים שמופיעים המילים "חלב" "ביצים" "ירושלים" "כביש", בכל אחד מהקטעים הללו, ונגלה שבעצם הייצוג של שני קטעי המתכונים די דומה (נניח שאחד מהם הוא 2,3,0,0 והשני הוא 1,2,0,0 - כלומר המילה חלב מופיעה פעם אחת, ביצים פעמיים וכביש וירושלים בכלל לא.) אבל קטעי הטיולים דווקא כן דומים למדי (0,0,3,5 ו1,0,2,6).
אז זה השלב הראשון.
לפעמים זה לא מספיק, אז בשביל זה יש את השלב השני. שולחים את התוצאות (נניח 10 התוצאות הראשונות) למודל שפה גדול (נניח GPT 3.5) ונותנים לו למיין את התוצאות לפי הרלוונטיות שלהם. זה אמור לשפר מאד את התוצאות, כי מודל השפה אמור להבין איזו תשובה הכי רלוונטית לשאלה.
השתמשתי להדגמה בספר "ילקוט יוסף - קיצושו"ע אורח חיים" של מרן הראשל"צ משום שהוא כתוב בשפה קלה, שגם מודלי שפה יכולים להבין. אבל די בקלות אפשר להרחיב אותו לכל ספר שהוא.
יאללה מספיק דיבורים, תביא את הלינק וגמרנו:
https://huggingface.co/spaces/sivan22/Halacha-semantic-searchשימו לב שכדי להשתמש במודל שפה (שלב ב) צריך לספק לו מפתח API של openAI, ניתן להשיג אותו (בתשלום) באתר של openAI. אבל החיפוש הרגיל עובד לכולם.
-
@sivan22 כתב בהמלצה | חיפוש הלכתי חכם (AI):
היי חברים,
אני רוצה לשתף אתכם בנסיונות ליצור חיפוש תורני חכם מבוסס בינה מלאכותית.
אז לפני כמה חודשים הדגמתי חיפוש חכם בשולחן ערוך, וזה היה מבוסס על מודל שידע לסווג משפטים לסעיפים הנכונים בשולחן ערוך. אך זה היה כרוך באימון של המודל, מה שגרם לזה להיות מורכב.
הפעם השתמשתי בשיטה אחרת, היתרון שלה הוא שהיא ניתנת להרחבה בקלות גם למאגרים גדולים (אוצריא?) וגם לא הייתי צריך לאמן שום מודל, השתמשתי במודל קיים (עם זאת, יתכן שאימון כן יכול לעזור לו, במיוחד במושגים תורניים שהוא לא מכיר).
העקרון הוא כזה: יש מודל שיודע לתת לכל משפט ייצוג מספרי מתאים, שזה בעצם סדרה של מספרים, שאפשר להתייחס אליה כמציינת את המיקום של המשפט במרחב המשפטים. לדוגמה שני מספרים יכולים לשמש ציון של מיקום על ציר הX והY במרחב דו מימדי. אבל כאן משתמשים בהרבה מספרים, וזה בעצם מיקום במרחב רב מימדי. לוקחים את כל המשפטים שרוצים לחפש בהם, ונותנים להם את המספרים הללו. אחר כך לוקחים את השאילתה שהמשתמש רוצה, וגם לה נותנים ייצוג באותה שיטה, ומחפשים את הנקודה הקרובה ביותר במרחב.
תמונה להמחשה:
איך בעצם מייצרים את המספרים הללו? למעשה מדובר במודל שפה מתוחכם עם הרבה למידת מכונה, שהתאמן על משפטים דומים ושונים. אבל לסבר את האוזן נוכל להראות איך ניצור כאלו מספרים פשוט ממספר המילים שחוזרות על עצמן בכל קטע.
נניח שיש לנו שני קטעי מתכונים ושני קטעים מספר על טיולים, ואנ ורוצים לתת לכל קטע ייצוג, אז נספור את מספר הפעמים שמופיעים המילים "חלב" "ביצים" "ירושלים" "כביש", בכל אחד מהקטעים הללו, ונגלה שבעצם הייצוג של שני קטעי המתכונים די דומה (נניח שאחד מהם הוא 2,3,0,0 והשני הוא 1,2,0,0 - כלומר המילה חלב מופיעה פעם אחת, ביצים פעמיים וכביש וירושלים בכלל לא.) אבל קטעי הטיולים דווקא כן דומים למדי (0,0,3,5 ו1,0,2,6).
אז זה השלב הראשון.
לפעמים זה לא מספיק, אז בשביל זה יש את השלב השני. שולחים את התוצאות (נניח 10 התוצאות הראשונות) למודל שפה גדול (נניח GPT 3.5) ונותנים לו למיין את התוצאות לפי הרלוונטיות שלהם. זה אמור לשפר מאד את התוצאות, כי מודל השפה אמור להבין איזו תשובה הכי רלוונטית לשאלה.
השתמשתי להדגמה בספר "ילקוט יוסף - קיצושו"ע אורח חיים" של מרן הראשל"צ משום שהוא כתוב בשפה קלה, שגם מודלי שפה יכולים להבין. אבל די בקלות אפשר להרחיב אותו לכל ספר שהוא.
יאללה מספיק דיבורים, תביא את הלינק וגמרנו:
https://huggingface.co/spaces/sivan22/Halacha-semantic-searchשימו לב שכדי להשתמש במודל שפה (שלב ב) צריך לספק לו מפתח API של openAI, ניתן להשיג אותו (בתשלום) באתר של openAI. אבל החיפוש הרגיל עובד לכולם.
קודם כל מגניב אבל הוא קצת מבולבל
-
אני מנסה להבין,
האם זה עובד כמו 'חיפוש חופשי' בתוכנת 'בר אילן', או יותר משוכלל?
כי גם שם אפשר לשאול שאלה כמו: "האם יש חיוב לתרום כליה לחולה מסוכן?" -
@יהודי-צעיר כתב בהמלצה | חיפוש הלכתי חכם (AI):
אני מנסה להבין,
האם זה עובד כמו 'חיפוש חופשי' בתוכנת 'בר אילן', או יותר משוכלל?
כי גם שם אפשר לשאול שאלה כמו: "האם יש חיוב לתרום כליה לחולה מסוכן?"זה בודאי יותר מתקדם (הטכנולוגיה התקדמה הרבה מאז).
השתמשתי לא מעט בחיפוש חופשי של בר אילן והוא לא מפגין יכולות הבנה בכלל. לעומת זאת בחיפוש הזה חיפשתי "למה אוכלים עוגת גבינה בחג השבועות" והוא מצא את הקטע הנכון למרות שלא מופיעה שם לא המילה עוגה ולא המילה גבינה.
-
@sivan22 כתב בהמלצה | חיפוש הלכתי חכם (AI):
חיפשתי "למה אוכלים עוגת גבינה בחג השבועות" והוא מצא את הקטע הנכון למרות שלא מופיעה שם לא המילה עוגה ולא המילה גבינה.
במקרה ממש זה לא ראיה כי חיפשתי כמוך רק הורדתי את העוגת גבינה,
למה אוכלים בחג השבועות
וקיבלתי את אותה תשובה.
נוהגים לאכול מאכלי חלב בחג השבועות, וכן יש נוהגים לאכול דבש וחלב, לרמוז על מתן ....
אכן אתה צודק שהוא הבין ש"אוכלים" זה כמו "לאכול", מה שאני סבור באמת שבר אילן לא ידע לפחות פעם.
כלומר הוא מזהה מילים מאותו שורש ומילים נרדפות.
אשמח לשמוע אם הוא מבין שציצית זה טלית וארבע כנפות, וכדומה. -
בתור מי שמתענין בתחום, אבל לא ממש בקי בו,
אני תוהה האם אין דרך טובה יותר, בצורה הבאה:
לקחת מודל מתקדם, למשל GPT4o, ולהפעיל עליו מה שנקרא Fine-tuning,
על ידי חשיפתו לדרך הנכונה שצריך לענות, למשל לתת לו אלפי שאלות ותשובות של מבחני הרבנות הראשית בהלכה,
כך שיבין איך הוא אמור לענות.וכמובן להוסיף לו גם הוראות מתאמות אישית על מה לענות ועל מה לא ואיך לענות, ושתמיד יביא את המקור לתשובה שלו, ואולי אפשר לחבר זאת למשהו כמו ספריא/אוצריה שתמיד יביא לך את הציטוט המדוייק, וכדו'
אשמח לשמוע את דעתך על כיוון המחשבה שלי.
תודה
-
@יוסף3 כתב בהמלצה | חיפוש הלכתי חכם (AI):
בתור מי שמתענין בתחום, אבל לא ממש בקי בו,
אני תוהה האם אין דרך טובה יותר, בצורה הבאה:
לקחת מודל מתקדם, למשל GPT4o, ולהפעיל עליו מה שנקרא Fine-tuning,
בתור מי שמתעניין בתחום אבל לא ממש בקי בו, יש דרך לכוונן בכלל את GPT?
-
@יוסף3 כתב בהמלצה | חיפוש הלכתי חכם (AI):
בתור מי שמתענין בתחום, אבל לא ממש בקי בו,
אני תוהה האם אין דרך טובה יותר, בצורה הבאה:
לקחת מודל מתקדם, למשל GPT4o, ולהפעיל עליו מה שנקרא Fine-tuning,
על ידי חשיפתו לדרך הנכונה שצריך לענות, למשל לתת לו אלפי שאלות ותשובות של מבחני הרבנות הראשית בהלכה,
כך שיבין איך הוא אמור לענות.וכמובן להוסיף לו גם הוראות מתאמות אישית על מה לענות ועל מה לא ואיך לענות, ושתמיד יביא את המקור לתשובה שלו, ואולי אפשר לחבר זאת למשהו כמו ספריא/אוצריה שתמיד יביא לך את הציטוט המדוייק, וכדו'
אשמח לשמוע את דעתך על כיוון המחשבה שלי.
תודה
ברור שבעקרון זה יהיה יותר מוצלח, אבל מדובר בסדר גודל אחר לגמרי של פרוייקט, לא בתקציב של מפתח בודד, וכנראה גם לא של חברה קטנה או בינונית. כמו כן כמות הנתונים הנדרשת היא הרבה יותר גדולה ממה שתיארת, ואלפי שאלות זה לא ממש מספיק, צריך עשרות אלפי שאלות.
לכן פרוייקט שמשתמש במודל כמות שהוא ורק מביא לו את הנתונים ומצווה עליו להיצמד אליהם, הרבה יותר רלווונטי. (זה נקרא בשפה מקצועית RAG) -
@sivan22 כתב בהמלצה | חיפוש הלכתי חכם (AI):
שימו לב שכדי להשתמש במודל שפה (שלב ב) צריך לספק לו מפתח API של openAI, ניתן להשיג אותו (בתשלום) באתר של openAI. אבל החיפוש הרגיל עובד לכולם.
יש להבנתי מודלים שנותנים API חינם, זה אפשרי להשתמש איתם או שזה מיועד רק עבור GPT?
-
@aiib כתב בהמלצה | חיפוש הלכתי חכם (AI):
@sivan22 זה דבר שכל אחד יכול לעשות? [מבחינת ידע ואמצעים?] א"כ יש אפשרות שתתן הדרכה איך אני יכול לעשות כזה דבר על ספר משלי?
אשמח!
תודה רבהיחסית זה פשוט, והרבה יותר קל מלאמן מודל.
צריך קצת ידע בפייתון, ובפרט בספריית pandas כדי להפוך את הספר לטבלה שכל רשומה היא שורה (או קטע) בספר. אלא אם כן אתה רוצה לעשות את זה ידנית....
ואז הקוד הוא די פשוט, שוב פייתון, משהו כזה (בהנחה שיש לך קובץ אקסל שכל שורה היא קטע מהספר):
import pandas ad pd df = pd.read_excel('הקובץ שלך'.xlsx) from langchain_huggingface.embeddings import HuggingFaceEmbeddings model_name = "intfloat/multilingual-e5-large" model_kwargs = {'device': 'cpu'} # or 'cuda' encode_kwargs = {'normalize_embeddings': False} embeddings_model = HuggingFaceEmbeddings( model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs ) df['embeddings'] =embeddings_model.embed_documents(df['text'].apply (lambda x: 'passage: ' + x ).to_list()) query = "בשבת ערב ראש חודש האם אומרים רצה או יעלה ויבוא" queryEmbedd = embeddings_model.embed_query('query: '+query) from sentence_transformers import util df['similarity'] = df['embeddings'].apply(lambda x: util.cos_sim(x, queryEmbedd)) results = df.sort_values(by='similarity', ascending=False) results
זהו. ב21 שורות סיימנו (כולל שורות ריקות).
קצת הסברים:
שורה 2 אנו לוקחים את הנתונים מהקובץ.
שורות 4-10 אנו מורידים מודל.
שורה 13 יוצרים את הייצוג המספרי עבור הנתונים.
שורות 15-16 יוצרים את הייצוג המספרי עבור השאילתה.
שורות 19-20 ממייינים את הנתונים לפי רמת הדימיון לשאילתה.
זהו. מציגים את התוצאה בשורה האחרונה. -
@sivan22 כתב בהמלצה | חיפוש הלכתי חכם (AI):
צריך קצת ידע בפייתון, ובפרט בספריית pandas כדי להפוך את הספר לטבלה שכל רשומה היא שורה (או קטע) בספר. אלא אם כן אתה רוצה לעשות את זה ידנית....
מה הכוונה שורה? שורה ממש? שורה שהיא חלק ממשפט אחד? כמות מילים?
זהו. מציגים את התוצאה בשורה האחרונה.
ואיך עושים שזה יהיה יפה כמו אצלך באתר מסודר ומעוצב?
-
@aiib אתה יכול להחליט לבד מה נקרא שורה, בספר עם סעיפים מתבקש שזה סעיף, אם זה ספר עם קטעים ארוכים אתה יכול להחליט שכל 20 מילים לדוגמה הם שורה.
בשביל שזה ייראה יפה צריך עוד קצת קוד פייתון, תוכל לראות את הקוד כאן: https://huggingface.co/spaces/sivan22/Halacha-semantic-search/blob/main/app.py