1
00:00:00,039 --> 00:00:00,879
למי זה לא קרה?

2
00:00:01,000 --> 00:00:01,360
נכנסת ל-KSP,

3
00:00:02,029 --> 00:00:04,800
הקלדת שם של מוצר וקיבלת תוצאות גרועות,

4
00:00:04,960 --> 00:00:06,230
לא רלוונטיות או

5
00:00:06,519 --> 00:00:07,239
חלקיות.

6
00:00:07,519 --> 00:00:09,140
ואז, דילגת לגוגל,

7
00:00:09,279 --> 00:00:10,869
הקלדת את אותה שאילתה בדיוק,

8
00:00:11,199 --> 00:00:14,909
וגוגל החזירה לך את דף המוצר המדויק לאותו אתר בדיוק.

9
00:00:15,449 --> 00:00:18,040
המוצר קיים, KSP מכירה אותו, אבל

10
00:00:18,270 --> 00:00:19,860
מנוע החיפוש שלה פשוט

11
00:00:20,149 --> 00:00:20,750
לא עובד.

12
00:00:21,149 --> 00:00:21,389
טוב

13
00:00:21,670 --> 00:00:22,340
לא חוכמה,

14
00:00:22,350 --> 00:00:25,420
גוגל השקיעה בחיפוש יותר כסף, דאטה

15
00:00:25,629 --> 00:00:28,670
וכוח מחשוב מכל חברה מסחרית בעולם,

16
00:00:29,030 --> 00:00:30,379
אבל איך אפשר לבנות

17
00:00:30,590 --> 00:00:32,590
חיפוש טוב לאתר בעצמנו?

18
00:00:33,069 --> 00:00:37,860
רוב האתרים מתייחסים לחיפוש כפעולה על טקסט: המשתמש כתב מילים?

19
00:00:37,869 --> 00:00:39,220
בוא נחפש את

20
00:00:39,459 --> 00:00:40,889
המילים בתוך רשומות.

21
00:00:41,529 --> 00:00:45,619
גוגל מתייחסת לחיפוש כניסיון לצמצם אי-ודאות:

22
00:00:46,259 --> 00:00:48,049
אדם מסוים, בהקשר מסוים,

23
00:00:48,619 --> 00:00:49,060
רוצה משהו,

24
00:00:49,139 --> 00:00:53,900
אבל כל מה שיש לנו ממנו הוא כמה מחרוזות קצרות, לעיתים לא מדויקות.

25
00:00:54,419 --> 00:00:56,569
מנוע החיפוש צריך לקחת את

26
00:00:56,840 --> 00:00:57,580
הרמזים האלה,

27
00:00:57,659 --> 00:00:58,259
להבין

28
00:00:58,380 --> 00:00:59,860
למה המשתמש התכוון,

29
00:01:00,259 --> 00:01:02,659
למצוא קבוצה רחבה מספיק של אפשרויות,

30
00:01:03,139 --> 00:01:03,860
לצמצם אותה,

31
00:01:04,099 --> 00:01:05,010
לסדר אותה

32
00:01:05,220 --> 00:01:06,339
וללמוד מהתגובה.

33
00:01:06,779 --> 00:01:09,779
וזה בדיוק מה שנלמד בפרק הזה:

34
00:01:10,180 --> 00:01:13,139
חיפוש טוב הוא לא רק אלגוריתם שמוצא תוצאה.

35
00:01:13,180 --> 00:01:16,129
הוא שרשרת של מערכות שכל אחת מהן

36
00:01:17,599 --> 00:01:18,980
מקלפת סוג אחר של אי-ודאות.

37
00:01:19,449 --> 00:01:23,099
יש במערכת הזו AI, כמובן, אבל אי אפשר להחליף את

38
00:01:23,389 --> 00:01:25,449
כולה ב-AI ולסגור עניין.

39
00:01:25,790 --> 00:01:26,190
בכל

40
00:01:26,389 --> 00:01:32,300
שלב בשרשרת משהו אובד (בא׳), משהו משתפר ונוצרת בעיה חדשה

41
00:01:32,620 --> 00:01:36,699
ששלב נוסף צריך לפתור. אם נבין את השרשרת הזאת,

42
00:01:37,069 --> 00:01:40,500
נבין למה מנוע חיפוש באתרים כל כך גרוע,

43
00:01:40,830 --> 00:01:44,620
ואיך אפשר לדמות אותו לגוגל, בלי התקציב של גוגל.

44
00:01:45,779 --> 00:01:48,059
אי-הוודאות הראשונה היא השפה.

45
00:01:48,139 --> 00:01:51,300
משתמשים לרוב לא דוברים את שפת הקטלוג.

46
00:01:51,660 --> 00:01:56,099
הקטלוג מכיל את השורה "קרם לחות היפואלרגני ללא בישום",

47
00:01:56,099 --> 00:02:00,419
והמשתמש, מחפש "קרם פנים שלא יעשה לי אדום".

48
00:02:01,339 --> 00:02:02,970
הקטלוג מכיל את השורה

49
00:02:04,449 --> 00:02:06,510
"תיק נסיעות 40 ליטר", והמשתמש, מחפש

50
00:02:06,860 --> 00:02:08,538
"טרולי שאפשר להעלות לאל על".

51
00:02:09,220 --> 00:02:10,130
בהרבה מקרים,

52
00:02:10,258 --> 00:02:14,539
קטלוג מתאר תכונות, בעוד משתמש מתאר שימוש,

53
00:02:14,619 --> 00:02:14,979
כאב,

54
00:02:15,020 --> 00:02:15,809
מגבלה

55
00:02:16,139 --> 00:02:17,300
או תוצאה רצויה.

56
00:02:18,160 --> 00:02:21,960
אם כל המשתמשים היו יודעים להקליד "Nike Air Force

57
00:02:22,000 --> 00:02:22,479
לבנות

58
00:02:22,559 --> 00:02:23,250
מידה

59
00:02:24,240 --> 00:02:24,259
39",

60
00:02:24,919 --> 00:02:27,039
כנראה שלא היינו צריכים את הפרק הזה.

61
00:02:27,119 --> 00:02:29,630
זו שאילתה קלה שיש בה מותג,

62
00:02:29,639 --> 00:02:31,080
דגם צבע ומידה.

63
00:02:31,759 --> 00:02:34,949
"נעליים נוחות לטיול בקיץ" היא שאילתה

64
00:02:35,479 --> 00:02:37,389
הרבה יותר קשה, ולא מכילה אפילו

65
00:02:37,639 --> 00:02:38,630
מילה אחת

66
00:02:38,800 --> 00:02:39,679
משם המוצר.

67
00:02:40,240 --> 00:02:43,440
מנוע החיפוש לא יכול רק לאתר טקסט.

68
00:02:43,479 --> 00:02:44,619
הוא צריך לתרגם

69
00:02:44,880 --> 00:02:47,559
בין שני תיאורים שונים של המציאות.

70
00:02:48,460 --> 00:02:50,369
התרגום הזה מתחיל עוד

71
00:02:50,660 --> 00:02:52,339
לפני שהגיעה השאילתה הראשונה.

72
00:02:52,660 --> 00:02:55,529
אם אתן ליעל מחר משימה לבנות

73
00:02:55,779 --> 00:02:57,539
חיפוש עבור מיליון מוצרים,

74
00:02:58,220 --> 00:03:01,740
הצעד הראשון שלה לא יהיה אלגוריתם או מודל ספציפי,

75
00:03:02,020 --> 00:03:02,779
הוא יהיה schema -

76
00:03:03,100 --> 00:03:05,009
איך ליצור מבנה טבלאי

77
00:03:05,300 --> 00:03:10,020
ששומר על הקטלוג המקורי, אבל מוסיף לצידו כותרת נקיה,

78
00:03:10,300 --> 00:03:11,139
תיאור נקי,

79
00:03:11,380 --> 00:03:12,580
מאפיינים מסודרים.

80
00:03:13,289 --> 00:03:13,869
מותג,

81
00:03:13,949 --> 00:03:14,309
צבע,

82
00:03:14,350 --> 00:03:14,750
חומר,

83
00:03:14,830 --> 00:03:16,500
נפח וקטגוריה

84
00:03:16,869 --> 00:03:19,130
לא יכולים להמשיך להתחבא בתוך

85
00:03:19,389 --> 00:03:21,429
פסקת תיאור מפי היבואן,

86
00:03:21,789 --> 00:03:23,750
צריך לחלץ אותם מהטקסט,

87
00:03:23,830 --> 00:03:24,570
לייבא אותם,

88
00:03:24,910 --> 00:03:25,750
להעשיר אותם.

89
00:03:26,720 --> 00:03:31,059
זה החלק שבו מודל שפה גדול שימושי מאוד, דווקא כי הוא

90
00:03:31,270 --> 00:03:33,729
לא פוגש את המשתמש בזמן אמת.

91
00:03:34,070 --> 00:03:38,470
פשוט מריצים העשרה (enrichment) אופליין, בבאצ׳ים זולים,

92
00:03:38,899 --> 00:03:41,699
ומבקשים מהמודל לנרמל כותרת,

93
00:03:41,779 --> 00:03:42,369
להשלים

94
00:03:42,660 --> 00:03:44,330
תיאור חסר ולחלץ

95
00:03:45,880 --> 00:03:47,539
attributes לתוך סכמת JSON קשיחה.

96
00:03:48,020 --> 00:03:51,899
זה יאפשר לו להבין ש-100 מיליליטר ו-0.1 ליטר

97
00:03:52,259 --> 00:03:53,059
מייצגים

98
00:03:53,380 --> 00:03:55,100
אותו נפח, ושקרם,

99
00:03:55,460 --> 00:03:57,089
שנהב ו-off-white

100
00:03:57,419 --> 00:04:00,740
קרובים מספיק כדי להיכנס לאותה פלטת צבעים.

101
00:04:01,669 --> 00:04:03,809
LLM יכול גם להמציא,

102
00:04:03,820 --> 00:04:08,059
אז ממש לא כדאי לקבל כל תוצאה שלו כתורה מסיני.

103
00:04:08,139 --> 00:04:08,690
נפח

104
00:04:08,940 --> 00:04:10,419
חייב להיות ביחידות הנכונות,

105
00:04:10,740 --> 00:04:13,089
מותג חייב להגיע מרשימה סגורה

106
00:04:13,500 --> 00:04:15,690
ופלט שאינו עומד ב-schema

107
00:04:15,990 --> 00:04:16,459
נדחה.

108
00:04:16,980 --> 00:04:18,690
לפני שתריצו מיליון מוצרים,

109
00:04:18,700 --> 00:04:20,608
בואו תריצו אלף

110
00:04:20,829 --> 00:04:22,140
ותבדקו אותם אקראית,

111
00:04:22,820 --> 00:04:26,260
אחר כך תוסיפו דגל שעוקב מתי מוצר עבר enrichment.

112
00:04:26,850 --> 00:04:28,459
זה לא סתם בירוקרטיה,

113
00:04:28,540 --> 00:04:31,970
זו הדרך שלכם למנוע ממודל שפה להזות,

114
00:04:32,420 --> 00:04:34,809
ולהעשיר את הקטלוג במידע

115
00:04:35,339 --> 00:04:36,739
שלא היה בו מעולם.

116
00:04:37,850 --> 00:04:42,390
לאחר שלב העשרה, מתבצע שלב הטבעה או embedding.

117
00:04:42,750 --> 00:04:46,869
כל המידע עובר במודל וקטורי שממקם את המוצר ב-500, אלף או 1500

118
00:04:49,429 --> 00:04:50,899
נקודות במרחב.

119
00:04:51,149 --> 00:04:52,640
התוצאה של המודל הזה,

120
00:04:52,670 --> 00:04:54,540
והיא בעיקר מספרים לא מובנים,

121
00:04:55,079 --> 00:04:56,239
צריכה להישמר

122
00:04:56,410 --> 00:04:57,839
בדאטהבייס לצד

123
00:04:58,000 --> 00:05:00,040
המוצר יחד עם גירסת

124
00:05:00,250 --> 00:05:01,769
המודל שהטביעה אותו.

125
00:05:02,130 --> 00:05:07,000
אם בחרתם מודל מקומי של 512 ממדים כדי לחסוך זיכרון,

126
00:05:07,369 --> 00:05:09,890
ומישהו עם משקפיים הציע לעבור ל-1,536 של OpenAI,

127
00:05:12,410 --> 00:05:14,320
זה אומר להטביע מחדש

128
00:05:14,690 --> 00:05:15,410
כל מוצר.

129
00:05:15,970 --> 00:05:16,399
אגב,

130
00:05:16,480 --> 00:05:20,149
עבור קטלוג של מיליון מוצרים, ה-Postgres שלכם

131
00:05:20,399 --> 00:05:23,679
מספיק בהחלט. לא צריך Elastic Search או Vector Database.

132
00:05:23,880 --> 00:05:24,760
לא צריך Kafka,

133
00:05:25,040 --> 00:05:27,429
צריך רק להחליט מאיפה לצרוך את

134
00:05:27,720 --> 00:05:28,950
מודל ה-embedding,

135
00:05:29,200 --> 00:05:29,880
וממי.

136
00:05:30,440 --> 00:05:32,670
בשלב ראשון אפשר לקנות אותם כ-API.

137
00:05:34,630 --> 00:05:36,350
סיימנו את שלב ההכנות הבסיסי,

138
00:05:36,690 --> 00:05:38,350
יש לנו דאטהבייס של מיליון מוצרים,

139
00:05:38,510 --> 00:05:40,790
עם שדות חפישים ווקטורים לצידם.

140
00:05:41,149 --> 00:05:46,350
גזרנו את הסרט והשאילתה הראשונה מגיעה אלינו דרך האתר.

141
00:05:47,220 --> 00:05:50,630
לפני שהיא תגיע לאינדקסים היא זקוקה לניקוי קצר:

142
00:05:51,029 --> 00:05:51,829
lowercase,

143
00:05:51,910 --> 00:05:53,429
הסרת רווחים כפולים,

144
00:05:53,829 --> 00:05:56,190
סימני פיסוק ותיקון שגיאות.

145
00:05:56,750 --> 00:05:59,790
שגיאת כתיב יכולה לקלקל את כל השרשרת.

146
00:05:59,829 --> 00:06:00,220
זה

147
00:06:00,670 --> 00:06:04,200
נכון שמשתמש שכתב אדידדס עם 3 דלת

148
00:06:04,390 --> 00:06:05,350
יקבל משהו,

149
00:06:05,709 --> 00:06:07,420
אבל אם אפשר לנקות

150
00:06:07,589 --> 00:06:09,440
ולתקן את השאילתה פעם אחת,

151
00:06:09,709 --> 00:06:10,609
היא תישלח

152
00:06:10,910 --> 00:06:12,459
נכון לכל המנגנונים,

153
00:06:12,750 --> 00:06:14,540
מבלי שיצטרכו להמציא

154
00:06:14,750 --> 00:06:15,829
פרשנות נפרדת.

155
00:06:16,190 --> 00:06:16,579
שימו לב,

156
00:06:16,670 --> 00:06:18,980
אנחנו לא מחליפים למשתמש

157
00:06:19,190 --> 00:06:20,429
את השאילתה המקורית,

158
00:06:20,510 --> 00:06:21,309
זה יהיה מוזר.

159
00:06:21,829 --> 00:06:23,549
אנחנו משתמשים במתוקנת,

160
00:06:23,670 --> 00:06:23,940
אבל

161
00:06:24,190 --> 00:06:26,579
שומרים את שתיהן כדי לדעת בהמשך

162
00:06:26,790 --> 00:06:28,089
אילו תיקונים עזרו

163
00:06:28,390 --> 00:06:30,929
ומה הפך שאילתה טובה

164
00:06:31,390 --> 00:06:32,350
למשהו אחר.

165
00:06:33,320 --> 00:06:37,480
אבל איך מתקנים שאילתה? הפתרון הנאיבי

166
00:06:37,769 --> 00:06:40,359
הוא לעבור על כל המילים במילון ולחשב את

167
00:06:40,559 --> 00:06:42,160
המרחק עריכה בינן

168
00:06:42,290 --> 00:06:44,239
לבין המילה שהמשתמש כתב.

169
00:06:44,450 --> 00:06:46,679
מרחק עריכה, בדרך כלל Levenshtein,

170
00:06:47,049 --> 00:06:51,320
סופר כמה הכנסות, מחיקות, החלפת אותיות או שיכול אותיות

171
00:06:51,649 --> 00:06:54,200
נדרשו כדי להפוך מילה אחת

172
00:06:54,489 --> 00:06:55,200
לאחרת.

173
00:06:55,410 --> 00:06:59,839
במילון קטן זה עובד, במנוע חיפוש שמקבל כמה מאות שאילתות לשניה,

174
00:07:00,350 --> 00:07:01,950
זה מתחיל להיות יקר.

175
00:07:02,549 --> 00:07:06,109
הפתרון המפורסם של Peter Norvig מייצר בזמן

176
00:07:06,109 --> 00:07:10,220
השאילתה את כל המילים האפשרויות במרחק עריכה נתון,

177
00:07:10,589 --> 00:07:14,549
ובודק אילו מהן קיימות במילון.

178
00:07:15,230 --> 00:07:18,359
יעיל, אבל למילה של 9 אותיות ומרחק 2,

179
00:07:19,390 --> 00:07:22,470
אפשר להגיע ל-114 אלף מועמדים.

180
00:07:23,250 --> 00:07:30,399
אלגוריתמים יעילים יותר מייצרים מחיקות גם מהמילה השגויה, ומצמצמים, את אותן 9 אותיות,

181
00:07:31,790 --> 00:07:32,529
ל-36 מועמדים

182
00:07:32,820 --> 00:07:33,260
בלבד.

183
00:07:33,339 --> 00:07:34,649
הם גם עושים את זה

184
00:07:34,899 --> 00:07:37,500
טרום שאילתה ובעיבוד מוקדם -

185
00:07:38,019 --> 00:07:40,579
בדיוק המקום שאנחנו מעדיפים לשלם בו.

186
00:07:41,649 --> 00:07:43,260
אבל איך יוצרים מילון?

187
00:07:44,000 --> 00:07:47,230
לוקחים אחד קיים ומעבים אותנו בעצמנו,

188
00:07:47,640 --> 00:07:49,480
מתוך כל המופעים של כל המילים

189
00:07:49,559 --> 00:07:50,589
מכל המוצרים,

190
00:07:50,880 --> 00:07:52,480
מסודרים לפי שכיחות.

191
00:07:53,190 --> 00:07:53,739
אנחנו

192
00:07:54,109 --> 00:07:57,260
סוף סוף מבצעים חיפוש לשוני ראשון,

193
00:07:57,309 --> 00:07:58,480
פעם TF-IDF, היום BM25 -

194
00:08:00,190 --> 00:08:03,410
אלגוריתמים שמעניקים חשיבות למילים

195
00:08:03,549 --> 00:08:05,609
לפי התדירות שלהן במסמך,

196
00:08:06,630 --> 00:08:07,619
אבל גם בכלל האוסף.

197
00:08:07,989 --> 00:08:11,140
כרית פלוצים שווה יותר מכרית שינה,

198
00:08:11,429 --> 00:08:15,950
והתאמה בכותרת יכולה לקבל משקל גבוה יותר מהתאמה בתיאור.

199
00:08:16,709 --> 00:08:17,359
BM25 לא מבין כוונה,

200
00:08:17,369 --> 00:08:17,529
אבל הוא מצטיין בדברים שחיפוש סמנטי

201
00:08:22,049 --> 00:08:23,239
נוטה לטשטש:

202
00:08:23,519 --> 00:08:23,850
שם

203
00:08:23,890 --> 00:08:24,329
מותג,

204
00:08:24,369 --> 00:08:24,649
דגם,

205
00:08:24,690 --> 00:08:26,970
מק"ט ומינוחים מדויקים.

206
00:08:27,649 --> 00:08:29,609
אם המשתמש כתב iPhone 17 Pro,

207
00:08:30,649 --> 00:08:35,210
הוא כנראה רוצה אפל מאוד ספציפי, ולא "טלפון למקצוענים".

208
00:08:36,409 --> 00:08:38,659
חיפוש שני יהיה סמנטי.

209
00:08:38,820 --> 00:08:44,140
השאילתה הנקיה עוברת וקטוריזציה בעצמה, עם אותו מודל וקטורי שהפעלנו על המוצרים.

210
00:08:47,650 --> 00:08:49,159
התוצאה היא שוב 500, אלף או 1500 ממדים שאפשר למצוא להם

211
00:08:49,419 --> 00:08:50,219
שכנים קרובים.

212
00:08:50,299 --> 00:08:53,330
אם חיפשתי "נעליים לעמוד איתן כל היום",

213
00:08:53,859 --> 00:08:56,020
אז מוצרים שיש בהם תיאור של "תמיכה",

214
00:08:56,380 --> 00:08:56,859
"ריפוד",

215
00:08:56,940 --> 00:08:57,760
"נעלי עבודה"

216
00:08:57,979 --> 00:08:59,059
יחזרו קודם.

217
00:08:59,659 --> 00:09:00,650
חיפוש סמנטי

218
00:09:00,820 --> 00:09:03,820
לא זקוק לחפיפה מילולית מושלמת,

219
00:09:04,359 --> 00:09:04,799
כי הוא

220
00:09:04,900 --> 00:09:06,320
משווה ייצוגים של

221
00:09:06,530 --> 00:09:08,919
משמעויות או קירובים של מונחים

222
00:09:09,130 --> 00:09:09,770
במרחב,

223
00:09:09,890 --> 00:09:10,200
אבל

224
00:09:10,479 --> 00:09:12,090
זו גם החולשה שלו.

225
00:09:12,489 --> 00:09:14,250
קרבה סמנטית בין כבל,

226
00:09:14,530 --> 00:09:15,210
מטען,

227
00:09:15,739 --> 00:09:16,330
מפצל

228
00:09:16,700 --> 00:09:17,210
ומתאם

229
00:09:17,289 --> 00:09:17,960
אינה

230
00:09:18,090 --> 00:09:21,049
אומרת שהמוצרים תחליפיים.

231
00:09:21,609 --> 00:09:24,130
חיפוש סמנטי יודע להחליק הבדלים,

232
00:09:24,250 --> 00:09:24,520
אבל

233
00:09:24,849 --> 00:09:28,559
ההחלקה הזו לפעמים מגליצ׳ה משתמשים

234
00:09:28,690 --> 00:09:29,770
אל מחוץ לאתר.

235
00:09:31,020 --> 00:09:32,830
חיפוש שלישי הוא בתוך ביקורות.

236
00:09:32,909 --> 00:09:33,150
תיאור המוצר

237
00:09:33,469 --> 00:09:37,619
נכתב כדי למכור. ביקורת נכתבת אחרי

238
00:09:37,830 --> 00:09:38,419
שימוש,

239
00:09:38,429 --> 00:09:38,979
ולכן

240
00:09:39,390 --> 00:09:41,030
מכילה מידע מסוג אחר.

241
00:09:41,549 --> 00:09:44,150
היצרן יכתוב "סוליה ארגונומית",

242
00:09:44,590 --> 00:09:45,590
המשתמש יוסיף

243
00:09:46,030 --> 00:09:49,349
"חרשתי איתה את ליסבון בכיף במשך שלושה ימים".

244
00:09:50,270 --> 00:09:52,830
היצרן יכתוב "ניחוח עדין",

245
00:09:53,429 --> 00:09:54,419
המשתמש יוסיף

246
00:09:54,429 --> 00:09:57,260
"אין סיכוי לשבת עם הבושם הזה

247
00:09:57,510 --> 00:09:58,549
בקרון סגור".

248
00:10:00,010 --> 00:10:02,150
בשאילתות שעוסקות בחוויה

249
00:10:02,440 --> 00:10:05,880
ולא במפרט, ביקורות הן מקור מעולה.

250
00:10:06,679 --> 00:10:10,669
לא מצרפים את כל הביקורות לטקסט אחד ענק ועושים embedding,

251
00:10:11,039 --> 00:10:13,270
גם כי אי אפשר במגבלות האורך,

252
00:10:13,599 --> 00:10:17,070
וגם כי אנחנו רוצים לשמור לכל ביקורת שני משקלים -

253
00:10:17,280 --> 00:10:18,150
ה-sentiment

254
00:10:18,159 --> 00:10:19,669
(כמה היא חיובית או שלילית)

255
00:10:20,010 --> 00:10:22,190
וה-source (האם היא מגולש אנונימי,

256
00:10:22,200 --> 00:10:23,190
רוכש מאומת

257
00:10:23,400 --> 00:10:24,830
או אתר שלישי)

258
00:10:25,159 --> 00:10:26,799
ולנקד אותם בהתאם.

259
00:10:27,429 --> 00:10:28,590
שלושת החיפושים האלה

260
00:10:28,669 --> 00:10:29,150
(לשוני,

261
00:10:29,309 --> 00:10:34,219
סמנטי וביקורות) יכולים לרוץ במקביל ולהחזיר, למשל,

262
00:10:34,510 --> 00:10:35,950
חמישים תוצאות כל אחד.

263
00:10:36,510 --> 00:10:41,710
בשלב הזה יש ערבוב של מוצרים וביקורות, לעיתים של אותו מוצר.

264
00:10:42,390 --> 00:10:44,650
מכל מוצר אנחנו רוצים לשמור את

265
00:10:44,830 --> 00:10:46,500
ההתאמה הטובה ביותר,

266
00:10:46,669 --> 00:10:49,150
וציון משוקלל של הביקורות שלו.

267
00:10:49,729 --> 00:10:49,739
אבל

268
00:10:50,400 --> 00:10:52,000
עוד משהו מעורבב, כל

269
00:10:52,229 --> 00:10:54,059
חיפוש חזר עם

270
00:10:54,200 --> 00:10:55,640
סולם ציונים אחר.

271
00:10:57,380 --> 00:10:58,510
ציון BM25 אינו בר השוואה

272
00:10:59,080 --> 00:10:59,950
ל-cosine similarity,

273
00:11:00,239 --> 00:11:00,750
ואם

274
00:11:01,679 --> 00:11:04,669
ביקורות השתמשו במודל embedding אחר,

275
00:11:04,960 --> 00:11:07,039
הם יחזרו בהתפלגות שונה.

276
00:11:08,070 --> 00:11:09,960
אפשר להחליט על משקל ידני,

277
00:11:10,960 --> 00:11:11,479
למשל 40 אחוז ללשוני,

278
00:11:12,289 --> 00:11:14,000
50 אחוז וקטור ו-10 אחוז ביקורות,

279
00:11:14,080 --> 00:11:14,349
אבל

280
00:11:14,750 --> 00:11:17,200
זה מצריך כיול מחדש בכל פעם.

281
00:11:17,880 --> 00:11:22,640
Reciprocal Rank Fusion, או RRF, נמנע מההשוואה הזאת.

282
00:11:22,679 --> 00:11:25,750
הוא מתעלם מהציון הגולמי ומסתכל על

283
00:11:25,940 --> 00:11:27,789
המיקום היחסי של המוצר

284
00:11:28,119 --> 00:11:29,039
בכל אחת

285
00:11:29,200 --> 00:11:30,039
מהרשימות.

286
00:11:30,640 --> 00:11:35,549
מוצר שמדורג שני בשתי רשימות יכול לעקוף מוצר שמדורג ראשון

287
00:11:35,900 --> 00:11:37,099
ברשימה אחת בלבד.

288
00:11:37,500 --> 00:11:39,929
הסכמה בין מנגנונים שונים

289
00:11:40,179 --> 00:11:41,690
נחשבת חזקה יותר

290
00:11:41,820 --> 00:11:43,210
מביטחון קיצוני

291
00:11:43,580 --> 00:11:44,619
של מנגנון בודד.

292
00:11:45,530 --> 00:11:49,330
התוצאה של RRF עדיין אינה דף תוצאות.

293
00:11:49,369 --> 00:11:50,409
היא דף מועמדים,

294
00:11:50,650 --> 00:11:51,200
נניח

295
00:11:51,789 --> 00:11:52,450
מאה מוצרים,

296
00:11:52,849 --> 00:11:57,190
והיא הבחנה חשובה בין retrieval (שליפה) ל-ranking

297
00:11:57,530 --> 00:11:58,010
(מיון).

298
00:12:00,119 --> 00:12:00,880
בשליפה אנחנו רוצים recall גבוה -

299
00:12:00,890 --> 00:12:03,039
לוודא שהמוצרים הנכונים

300
00:12:03,289 --> 00:12:04,809
נמצאים איתנו בחדר.

301
00:12:08,909 --> 00:12:09,020
במיון אנחנו רוצים precision גבוה -

302
00:12:09,119 --> 00:12:10,849
להחליט מי יישב בשורה הראשונה.

303
00:12:11,409 --> 00:12:14,520
אבל אם המוצר הנכון לא נכנס ל-100 המועמדים,

304
00:12:14,849 --> 00:12:15,719
שום מיון

305
00:12:15,849 --> 00:12:16,609
לא יעזור.

306
00:12:17,450 --> 00:12:17,960
אנחנו

307
00:12:18,130 --> 00:12:19,640
בשלושת רבעי הדרך.

308
00:12:19,729 --> 00:12:22,450
המשתמש שאל משהו לפני פחות משניה,

309
00:12:22,929 --> 00:12:24,640
יש לנו את השאילתה שלו

310
00:12:25,419 --> 00:12:26,770
ומאה מועמדים פוטנציאליים.

311
00:12:27,320 --> 00:12:31,809
זה הזמן להפעיל מודל reranker יקר ומדויק יותר.

312
00:12:32,340 --> 00:12:37,539
בניגוד לחיפוש וקטורי, שבו השאילתה והמוצר עברו הטבעה בנפרד,

313
00:12:38,299 --> 00:12:40,919
ה-cross-encoder קורא אותם יחד.

314
00:12:41,099 --> 00:12:42,760
הוא ממקם את השאילתה

315
00:12:42,940 --> 00:12:45,010
לצד 100 תקצירי מוצר

316
00:12:45,260 --> 00:12:47,460
ומחזיר ציון התאמה נוסף.

317
00:12:48,669 --> 00:12:51,750
ה-reranker, לכל ה-100

318
00:12:51,919 --> 00:12:54,049
מופעל בקריאת API אחת.

319
00:12:54,479 --> 00:12:56,349
קובעים גם timeout, נניח

320
00:12:57,159 --> 00:12:57,820
800 מילישניות.

321
00:12:58,159 --> 00:12:58,359
אם

322
00:12:58,799 --> 00:13:00,770
ה-API לא ענה, לא מחזירים שגיאה,

323
00:13:00,799 --> 00:13:02,239
חוזרים אחורה ל-RRF.

324
00:13:02,760 --> 00:13:04,219
אם ה-embedding נפל,

325
00:13:04,679 --> 00:13:05,440
חוזרים אחורה

326
00:13:06,260 --> 00:13:06,280
ל-BM25.

327
00:13:06,880 --> 00:13:10,679
מערכת חיפוש טובה לא צריכה לעבוד בבריאות מלאה,

328
00:13:10,719 --> 00:13:12,299
היא צריכה להישאר שימושית

329
00:13:12,599 --> 00:13:14,599
גם שחלקים ממנה חולים.

330
00:13:16,000 --> 00:13:19,719
הרלוונטיות שה-reranker מחזיר אינה כליל השלמות.

331
00:13:19,799 --> 00:13:22,739
מוצר יכול להתאים כמו כפפה לשאילתה אבל

332
00:13:23,000 --> 00:13:24,719
המשתמש כבר הזמין אותו.

333
00:13:25,200 --> 00:13:25,590
הוא

334
00:13:25,760 --> 00:13:27,109
יכול להיראות נפלא בטקסט,

335
00:13:27,119 --> 00:13:27,390
אבל

336
00:13:27,559 --> 00:13:30,179
לסבול מהחזרות ע"י רבע מהלקוחות.

337
00:13:30,960 --> 00:13:31,270
הוא

338
00:13:31,440 --> 00:13:32,789
יכול להיראות קצת פחות נפלא,

339
00:13:32,799 --> 00:13:34,890
אבל עם דירוג ואחוז המרה מעולה.

340
00:13:35,159 --> 00:13:36,869
זה בדיוק השלב שבו עוברים

341
00:13:37,080 --> 00:13:37,950
מ-relevance

342
00:13:38,080 --> 00:13:39,320
חזרה ל-ranking,

343
00:13:39,760 --> 00:13:40,469
אבל הפעם -

344
00:13:40,760 --> 00:13:43,950
מיון שלומד ומשתפר בעצמו.

345
00:13:44,960 --> 00:13:49,710
בגרסה הראשונה אין עדיין דאטה שמצדיק מודל למידה.

346
00:13:49,909 --> 00:13:50,820
אפשר לייצר איזה

347
00:13:51,150 --> 00:13:53,909
blend ידני שלוקח דירוג ממוצע,

348
00:13:53,989 --> 00:13:55,229
מכפיל אותו ב-sentiment,

349
00:13:55,270 --> 00:13:56,669
מעלה בריבוע פופולריות

350
00:13:57,070 --> 00:13:58,450
ומחלק בשורש החזרות,

351
00:13:58,469 --> 00:13:58,780
אבל

352
00:13:59,190 --> 00:14:00,750
זה יהיה blend שמנחש.

353
00:14:01,429 --> 00:14:02,270
למידה

354
00:14:02,590 --> 00:14:04,739
מתחילה רק כאשר המערכת

355
00:14:05,030 --> 00:14:07,830
שומרת את התוצאות ומנטרת אותן.

356
00:14:08,460 --> 00:14:10,640
בשביל זה צריך להצמיד לכל חיפוש

357
00:14:10,940 --> 00:14:11,859
מזהה ייחודי,

358
00:14:11,979 --> 00:14:12,760
search ID

359
00:14:13,059 --> 00:14:15,739
ולחלחל אותו לכל פעולה -

360
00:14:16,520 --> 00:14:17,039
click,

361
00:14:17,049 --> 00:14:17,609
add to cart,

362
00:14:17,729 --> 00:14:18,090
checkout,

363
00:14:18,169 --> 00:14:18,609
thumbs up,

364
00:14:18,690 --> 00:14:19,179
thumbs down,

365
00:14:19,330 --> 00:14:19,729
החזרה כולם,

366
00:14:20,010 --> 00:14:22,760
ברמת המוצר הבודד,

367
00:14:24,400 --> 00:14:24,849
ישמרו יחד עם

368
00:14:25,169 --> 00:14:25,489
ה-search ID.

369
00:14:26,570 --> 00:14:33,719
טכני ומייגע, אני יודע, אבל זה מה שיקבע אם יש לכם סתם analytics או training data.

370
00:14:34,049 --> 00:14:37,590
אם מוצר נמכר, אתם יודעים משהו על המוצר.

371
00:14:37,849 --> 00:14:42,719
אם מוצר שהוצג במקום השישי עבור "קרם פנים שלא שורף",

372
00:14:42,969 --> 00:14:45,719
נלחץ ונקנה בתוך חצי שעה, אתם יודעים משהו

373
00:14:46,049 --> 00:14:47,250
על החלטת החיפוש.

374
00:14:48,559 --> 00:14:50,840
לאחר כמה שבועות של לוגים,

375
00:14:51,400 --> 00:14:53,200
אפשר להתחיל לאמן מודל XGBoost.

376
00:14:53,280 --> 00:14:55,039
כל אירוע מקבל משקל

377
00:14:55,640 --> 00:14:56,320
(thumbs down

378
00:14:56,359 --> 00:14:57,880
למשל הוא שלילי חזק,

379
00:14:57,919 --> 00:14:58,719
גם החזרה,

380
00:14:59,239 --> 00:15:00,280
click הוא חיובי,

381
00:15:00,679 --> 00:15:00,849
ו-add

382
00:15:01,039 --> 00:15:01,719
to cart או purchase

383
00:15:02,080 --> 00:15:03,000
חיוביים חזק).

384
00:15:03,359 --> 00:15:04,950
כשהמודל מוכן,

385
00:15:04,960 --> 00:15:07,080
וזה משהו שאפשר לאמן כל לילה תוך דקות,

386
00:15:09,000 --> 00:15:13,789
אפשר להריץ עליו כל מועמד ולקבל ציון שלומד ומתעדכן

387
00:15:14,000 --> 00:15:15,359
עם כל מידע חדש.

388
00:15:16,809 --> 00:15:18,020
המנוע מוכן,

389
00:15:18,169 --> 00:15:20,369
אפשר לשים אותו מאחורי feature flag ולהציג אותו

390
00:15:20,369 --> 00:15:23,799
לעובדים, שיבדקו side-by-side מול המנוע הישן.

391
00:15:24,330 --> 00:15:24,729
זה

392
00:15:24,840 --> 00:15:27,280
שם אתכם כנראה במאיון

393
00:15:27,489 --> 00:15:29,119
של מנועי החיפוש לאתרים

394
00:15:29,409 --> 00:15:30,130
בעולם.

395
00:15:30,570 --> 00:15:32,640
אם תרצו להגיע לאלפיון,

396
00:15:33,090 --> 00:15:34,159
תצטרכו להוסיף

397
00:15:34,330 --> 00:15:35,260
עוד כמה דברים:

398
00:15:35,690 --> 00:15:36,390
קאשינג -

399
00:15:36,770 --> 00:15:38,250
לשמור את התוצאה במטמון,

400
00:15:39,369 --> 00:15:40,450
למשל ב-Redis.

401
00:15:41,390 --> 00:15:42,929
זה חוסך retrieval,

402
00:15:42,969 --> 00:15:43,650
embedding

403
00:15:43,729 --> 00:15:44,520
ו-reranking

404
00:15:44,530 --> 00:15:45,570
אבל לא פוטר אתכם

405
00:15:45,969 --> 00:15:47,140
מאיסוף הדאטה.

406
00:15:48,219 --> 00:15:56,130
ניטור שיהוי - עם יעד ל-95% מהשאילתות בפחות מ-500 מילישניות מהמטמון, או 1500 מילישניות

407
00:15:56,419 --> 00:15:57,260
לחיפוש קר.

408
00:15:57,859 --> 00:15:58,500
שימו לב

409
00:15:58,580 --> 00:16:01,369
ליצור היסטוגרמה נפרדת לכל שלב

410
00:16:01,580 --> 00:16:02,260
בתהליך.

411
00:16:03,090 --> 00:16:07,130
ניצול מול גילוי או מיצוי מול חיפוש - אם נציג תמיד את אותן 20 תוצאות,

412
00:16:09,330 --> 00:16:11,320
מוצרים בזנב הארוך או

413
00:16:11,570 --> 00:16:13,250
שמעולם לא דורגו גבוה,

414
00:16:13,609 --> 00:16:17,849
ימשיכו לנבול, וייראו חלשים גם באימון הבא.

415
00:16:18,289 --> 00:16:21,049
exploration פותר את בעיית הקיפאון.

416
00:16:21,530 --> 00:16:23,440
אפשר ב-5% מהמקרים

417
00:16:23,650 --> 00:16:28,330
להקפיץ תוצאות מהמקומות הנמוכים כדי לתת הזדמנות לאחרים.

418
00:16:30,299 --> 00:16:32,520
Fine-tuning ל-embedding model -

419
00:16:32,559 --> 00:16:34,390
וזה רק אם המדידה

420
00:16:34,599 --> 00:16:36,559
מראה כשל ב-retrieval.

421
00:16:37,219 --> 00:16:40,849
אפשר לבדוק למשל, אם עגלת קניות שהושלמה

422
00:16:41,099 --> 00:16:44,419
כללה מוצר שלא היה ב-100 המועמדים.

423
00:16:44,859 --> 00:16:46,450
אם המוצר נעדר

424
00:16:46,729 --> 00:16:47,630
שוב ושוב,

425
00:16:47,820 --> 00:16:49,169
הייצוג הסמנטי

426
00:16:49,299 --> 00:16:51,070
לא מספיק לדומיין שלכם

427
00:16:51,380 --> 00:16:53,650
ואפשר לשקול מודל הטבעה

428
00:16:53,820 --> 00:16:54,419
מותאם.

429
00:16:54,700 --> 00:16:57,570
זה שינוי יקר יותר מאימון XGBoost

430
00:16:57,900 --> 00:16:59,289
כי הוא מחייב להפיק מחדש

431
00:16:59,539 --> 00:17:02,469
את כל הוקטורים

432
00:17:02,780 --> 00:17:03,419
בקטלוג.

433
00:17:04,519 --> 00:17:05,078
נסכם.

434
00:17:05,479 --> 00:17:10,667
הוספנו רכיבים כי זה שקדם להם לא מסוגל לפתור סוג מסוים

435
00:17:10,878 --> 00:17:11,638
של אי-ודאות.

436
00:17:11,979 --> 00:17:14,958
enrichment מסדר את המציאות לפני שמחפשים בה.

437
00:17:15,279 --> 00:17:17,838
תיקון שגיאות מסדר את כוונת המשתמש.

438
00:17:18,279 --> 00:17:20,479
חיפוש לשוני שומר על פרטים מילוליים מדויקים.

439
00:17:21,159 --> 00:17:23,878
חיפוש סמנטי מחבר בין ניסוחים שונים של אותו צורך.

440
00:17:24,438 --> 00:17:26,638
ביקורות מוסיפות ניסיון אנושי שאין בקטלוג.

441
00:17:27,150 --> 00:17:30,030
RRF מאחד ציונים בלתי ניתנים להשוואה.

442
00:17:30,510 --> 00:17:32,829
Retrieval רחב מגן על ה-Reranker.

443
00:17:33,189 --> 00:17:35,650
מודל XGBoost מחבר רלוונטיות למציאות עסקית.

444
00:17:37,910 --> 00:17:40,900
Logging הופך דאטה לבית אימון

445
00:17:41,229 --> 00:17:42,430
ו-Exploration

446
00:17:42,670 --> 00:17:44,869
מונע ממך לקבע הטיות.

447
00:17:45,430 --> 00:17:45,670
עכשיו

448
00:17:46,030 --> 00:17:48,609
זה גם ברור למה גוגל טובה כל כך.

449
00:17:48,750 --> 00:17:51,420
לא בגלל שיש לה אלגוריתם סודי אחד,

450
00:17:51,430 --> 00:17:52,349
אלא כי היא בנתה

451
00:17:52,739 --> 00:17:54,050
במשך עשורים

452
00:17:54,540 --> 00:17:56,780
שרשרת שמצמצמת אי-ודאות,

453
00:17:56,900 --> 00:17:58,250
מודדת את עצמה

454
00:17:58,500 --> 00:17:59,969
ולומדת מהאופן

455
00:18:00,180 --> 00:18:02,099
שבו אנשים מגיבים.

456
00:18:02,839 --> 00:18:06,170
רוב האתרים פשוט שמו שורת חיפוש כמו בגוגל,

457
00:18:06,449 --> 00:18:11,209
דחסו אותה לאינדקס אחד, ואז הופתעו שהחיפוש יצא גרוע.

458
00:18:12,569 --> 00:18:16,849
אתר עם מיליון מוצרים לא צריך להישען על חיפוש בגוגל.

459
00:18:16,890 --> 00:18:19,319
הוא צריך להתייחס לחיפוש כאל מוצר.

460
00:18:19,530 --> 00:18:20,439
עם סכמה

461
00:18:20,660 --> 00:18:21,569
ופייפליין,

462
00:18:21,890 --> 00:18:22,609
גרסאות,

463
00:18:22,770 --> 00:18:23,209
שיהוי,

464
00:18:23,290 --> 00:18:23,760
fallback,

465
00:18:23,770 --> 00:18:24,400
ניסויים

466
00:18:24,689 --> 00:18:26,119
ומדדי איכות.

467
00:18:26,650 --> 00:18:27,280
במשך

468
00:18:28,189 --> 00:18:30,079
שנים חיפוש היה דרך שבה

469
00:18:31,150 --> 00:18:34,400
המשתמש למד את המבנה שהאתר כפה עליו.

470
00:18:34,489 --> 00:18:36,729
הוא היה צריך להכיר את שם הקטגוריה,

471
00:18:37,089 --> 00:18:38,209
את המונח המקצועי,

472
00:18:38,250 --> 00:18:39,050
את הפילטר הנכון

473
00:18:39,089 --> 00:18:41,160
ואת האיות שבו בחר היבואן.

474
00:18:41,489 --> 00:18:42,130
במדויק.

475
00:18:42,800 --> 00:18:44,709
מערכת חיפוש חדשה

476
00:18:44,959 --> 00:18:46,670
הופכת את היחסים האלה.

477
00:18:47,119 --> 00:18:47,709
המשתמש

478
00:18:47,839 --> 00:18:50,040
לא צריך ללמוד את השפה של הקטלוג.

479
00:18:50,520 --> 00:18:53,069
הקטלוג צריך ללמוד איך המשתמש שלו חושב,

480
00:18:54,319 --> 00:18:55,359
ולהסתגל אליו,

481
00:18:55,640 --> 00:18:57,030
אל הרצונות שלו,

482
00:18:57,680 --> 00:18:58,140
מדי

483
00:18:58,280 --> 00:18:58,599
יום.

484
00:19:00,040 --> 00:19:01,060
עד הפעם הבאה,

485
00:19:01,199 --> 00:19:01,880
תהיו טובים,

486
00:19:02,119 --> 00:19:03,599
ותמשיכו להיות סקרנים.

487
00:19:03,959 --> 00:19:04,229
יאללה

488
00:19:04,239 --> 00:19:04,400
ביי.
