galbendavids commited on
Commit
399fe06
·
1 Parent(s): 12a7c9c

כתיבה מחדש של ה-prompt להיות מצומצם, פשוט ומדויק עם כל השדות ודוגמאות

Browse files
Files changed (1) hide show
  1. app/sql_service.py +86 -196
app/sql_service.py CHANGED
@@ -131,144 +131,85 @@ class SQLFeedbackService:
131
  if self.df is None:
132
  return "No data available"
133
 
134
- # Build complete schema with all columns - be very specific about types, meanings, business context, and examples
135
  all_columns_info = ""
136
 
137
- # ID field
138
- all_columns_info += "- ID: מזהה ייחודי של כל משוב\n"
139
- all_columns_info += " * סוג: UUID/טקסט (מזהה ייחודי גלובלי)\n"
140
- all_columns_info += " * משמעות עסקית: מזהה ייחודי לכל משוב במערכת, מאפשר מעקב אחר משוב ספציפי, קישור בין משובים, ומניעת כפילויות\n"
141
- all_columns_info += " * דוגמאות: '71BE94CF-A408-47EC-9443-CA2385B6BFCF', '6E36E9B9-45D5-4143-AF24-216C2A889217'\n"
142
- all_columns_info += " * שימוש בשאילתות: WHERE ID = '...', COUNT(DISTINCT ID), GROUP BY ID\n\n"
143
-
144
- # ServiceName field
145
- all_columns_info += "- ServiceName: שם השירות הדיגיטלי\n"
146
- all_columns_info += " * סוג: טקסט (שם השירות)\n"
147
- all_columns_info += " * משמעות עסקית: מזהה את השירות הדיגיטלי הממשלתי שעליו ניתן המשוב. מאפשר ניתוח לפי שירות, השוואה בין שירותים, וזיהוי שירותים בעייתיים או מצטיינים\n"
148
- all_columns_info += " * דוגמאות: '1050_NifAvoda@btl.gov.il', '7112@btl.gov.il', 'שירות דיגיטלי אחר'\n"
149
- all_columns_info += " * שימוש בשאילתות: WHERE ServiceName = '...', GROUP BY ServiceName, COUNT(*) GROUP BY ServiceName\n\n"
150
-
151
- # Level field
152
- all_columns_info += "- Level: הציון שהמשתמש נתן לשירות\n"
153
- all_columns_info += " * סוג: מספר שלם (1-5)\n"
154
- all_columns_info += " * משמעות עסקית: מדד שביעות רצון המשתמש מהשירות. 1=גרוע מאוד, 2=גרוע, 3=בינוני, 4=טוב, 5=מעולה. מאפשר מדידת שביעות רצון, זיהוי בעיות, ומעקב אחר שיפורים\n"
155
- all_columns_info += " * דוגמאות: 1, 2, 3, 4, 5\n"
156
- all_columns_info += " * שימוש בשאילתות: WHERE Level >= 4 (משובים חיוביים), WHERE Level <= 2 (משובים שליליים), AVG(Level), GROUP BY Level\n\n"
157
-
158
- # Text field
159
- all_columns_info += "- Text: הטקסט החופשי שהמשתמש הזין כחלק מהפידבק\n"
160
- all_columns_info += " * סוג: טקסט (ארוך, יכול להכיל מספר משפטים)\n"
161
- all_columns_info += " * משמעות עסקית: התוכן המפורט של המשוב - ביקורות, הצעות לשיפור, תלונות, מחמאות. מאפשר ניתוח איכותי של המשובים, זיהוי נושאים חוזרים, וקבלת תובנות עסקיות מעמיקות\n"
162
- all_columns_info += " * דוגמאות: 'כי זה לא מנפיק את המספר', 'הכל מעולה!', 'במקרה של בעיה אין טלפון לבירורים...'\n"
163
- all_columns_info += " * שימוש בשאילתות: WHERE Text LIKE '%...%', WHERE Text LIKE '%בעיה%', LENGTH(Text), COUNT(*) WHERE Text IS NOT NULL\n\n"
164
-
165
- # Add optional columns if they exist
166
  if 'ReferenceNumber' in self.df.columns:
167
- all_columns_info += "- ReferenceNumber: מספר הפניה של המשוב\n"
168
- all_columns_info += " * סוג: מספר שלם (יכול להיות NULL)\n"
169
- all_columns_info += " * משמעות עסקית: מספר הפניה פנימי של המשוב במערכת. מאפשר קישור למסמכים או בקשות קשורות, מעקב אחר תהליכים, וניהול בקשות\n"
170
- all_columns_info += " * דוגמאות: 6928, 6938, NULL\n"
171
- all_columns_info += " * שימוש בשאילתות: WHERE ReferenceNumber = 6928, WHERE ReferenceNumber IS NOT NULL, COUNT(*) WHERE ReferenceNumber IS NULL\n\n"
172
 
 
173
  if 'RequestID' in self.df.columns:
174
- all_columns_info += "- RequestID: מזהה בקשה\n"
175
- all_columns_info += " * סוג: UUID/טקסט (יכול להיות NULL)\n"
176
- all_columns_info += " * משמעות עסקית: מזהה ייחודי של הבקשה המקורית שקשורה למשוב. מאפשר קישור בין בקשות למשובים, מעקב אחר תהליכים, וניתוח הקשר בין בקשה למשוב\n"
177
- all_columns_info += " * דוגמאות: 'D02E2BB5-079B-44AD-AC35-9D30A22715F9', '463B8D9A-C85B-474C-895D-D73CE067EF27', NULL\n"
178
- all_columns_info += " * שימוש בשאילתות: WHERE RequestID = '...', COUNT(DISTINCT RequestID), WHERE RequestID IS NOT NULL\n\n"
179
 
 
180
  if 'ProcessID' in self.df.columns:
181
- all_columns_info += "- ProcessID: מזהה תהליך\n"
182
- all_columns_info += " * סוג: UUID/טקסט (יכול להיות NULL)\n"
183
- all_columns_info += " * משמעות עסקית: מזהה ייחודי של התהליך העסקי שקשור למשוב. מאפשר ניתוח לפי תהליכים, זיהוי תהליכים בעייתיים, ומעקב אחר ביצועים של תהליכים ספציפיים\n"
184
- all_columns_info += " * דוגמאות: UUID או NULL\n"
185
- all_columns_info += " * שימוש בשאילתות: WHERE ProcessID = '...', COUNT(DISTINCT ProcessID), WHERE ProcessID IS NOT NULL\n\n"
186
-
187
- # Add info about date/time columns - these are PRE-CALCULATED and MUST be used for time-based queries
188
- date_columns = ['יום_בחודש', 'יום_בשבוע', 'שנה', 'חודש', 'שעה', 'יום_לילה']
189
- existing_date_columns = [col for col in date_columns if col in self.df.columns]
190
- date_columns_info = ""
191
- if existing_date_columns:
192
- date_columns_info = "\n\n⚠️⚠️⚠️ שדות תאריך/זמן מחושבים (כבר מולאו בנתונים - חובה להשתמש בהם לשאילתות זמן!):\n"
193
-
194
- if 'שנה' in existing_date_columns:
195
- # Get actual year range from data
196
- try:
197
- year_min = int(self.df['שנה'].min())
198
- year_max = int(self.df['שנה'].max())
199
- year_range = f"{year_min}-{year_max}"
200
- except:
201
- year_range = "למשל 2020"
202
-
203
- date_columns_info += "- שנה: שנה שבה ניתן המשוב\n"
204
- date_columns_info += " * סוג: מספר שלם\n"
205
- date_columns_info += f" * טווח: {year_range}\n"
206
- date_columns_info += " * משמעות עסקית: מאפשר ניתוח מגמות לאורך שנים, השוואה בין שנים, זיהוי שיפורים או הידרדרות, ותכנון אסטרטגי לטווח ארוך\n"
207
- date_columns_info += f" * דוגמאות: {year_min}, {year_max}\n"
208
- date_columns_info += " * שימוש בשאילתות: WHERE שנה = 2020, GROUP BY שנה, SELECT שנה, COUNT(*) GROUP BY שנה\n\n"
209
-
210
- if 'חודש' in existing_date_columns:
211
- date_columns_info += "- חודש: חודש בשנה שבו ניתן המשוב\n"
212
- date_columns_info += " * סוג: מספר שלם (1-12)\n"
213
- date_columns_info += " * משמעות: 1=ינואר, 2=פברואר, 3=מרץ, 4=אפריל, 5=מאי, 6=יוני, 7=יולי, 8=אוגוסט, 9=ספטמבר, 10=אוקטובר, 11=נובמבר, 12=דצמבר\n"
214
- date_columns_info += " * משמעות עסקית: מאפשר ניתוח עונתי, זיהוי חודשים בעייתיים או מצטיינים, תכנון משאבים לפי עונות, וזיהוי דפוסים חודשיים\n"
215
- date_columns_info += " * דוגמאות: 1 (ינואר), 6 (יוני), 12 (דצמבר)\n"
216
- date_columns_info += " * שימוש בשאילתות: WHERE חודש = 1, GROUP BY חודש, SELECT חודש, COUNT(*) GROUP BY חודש ORDER BY חודש\n\n"
217
-
218
- if 'יום_בחודש' in existing_date_columns:
219
- date_columns_info += "- יום_בחודש: יום בחודש שבו ניתן המשוב\n"
220
- date_columns_info += " * סוג: מספר שלם (1-31)\n"
221
- date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי ימים בחודש, זיהוי ימים בעייתיים (למשל סוף חודש), וניתוח דפוסים יומיים\n"
222
- date_columns_info += " * דוגמאות: 1, 15, 31\n"
223
- date_columns_info += " * שימוש בשאילתות: WHERE יום_בחודש = 1, GROUP BY יום_בחודש, SELECT יום_בחודש, COUNT(*) GROUP BY יום_בחודש\n\n"
224
-
225
- if 'יום_בשבוע' in existing_date_columns:
226
- date_columns_info += "- יום_בשבוע: יום בשבוע שבו ניתן המשוב\n"
227
- date_columns_info += " * סוג: טקסט (אנגלית)\n"
228
- date_columns_info += " * ערכים אפשריים: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday\n"
229
- date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי ימי השבוע, זיהוי ימים בעייתיים (למשל ראשון), תכנון כוח אדם, וזיהוי דפוסים שבועיים\n"
230
- date_columns_info += " * דוגמאות: 'Monday', 'Wednesday', 'Friday'\n"
231
- date_columns_info += " * שימוש בשאילתות: WHERE יום_בשבוע = 'Monday', GROUP BY יום_בשבוע, SELECT יום_בשבוע, COUNT(*) GROUP BY יום_בשבוע\n\n"
232
-
233
- if 'שעה' in existing_date_columns:
234
- date_columns_info += "- שעה: שעה ביום שבה ניתן המשוב\n"
235
- date_columns_info += " * סוג: מספר שלם (0-23)\n"
236
- date_columns_info += " * משמעות: 0=חצות (00:00), 12=צהריים (12:00), 23=23:00\n"
237
- date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי שעות היום, זיהוי שעות שיא, תכנון זמינות שירות, וזיהוי דפוסים יומיים (למשל שעות בוקר מול ערב)\n"
238
- date_columns_info += " * דוגמאות: 0 (חצות), 9 (9 בבוקר), 14 (2 בצהריים), 18 (6 בערב), 23 (11 בלילה)\n"
239
- date_columns_info += " * שימוש בשאילתות: WHERE שעה >= 9 AND שעה <= 17 (שעות עבודה), GROUP BY שעה, SELECT שעה, COUNT(*) GROUP BY שעה ORDER BY שעה\n\n"
240
-
241
- if 'יום_לילה' in existing_date_columns:
242
- date_columns_info += "- יום_לילה: האם המשוב ניתן בשעות היום או הלילה\n"
243
- date_columns_info += " * סוג: טקסט\n"
244
- date_columns_info += " * ערכים אפשריים: 'יום' או 'לילה'\n"
245
- date_columns_info += " * הגדרה: יום=6:00-18:00, לילה=18:00-6:00\n"
246
- date_columns_info += " * משמעות עסקית: מאפשר ניתוח לפי שעות פעילות, זיהוי הבדלים בין יום ללילה, תכנון זמינות שירות, וזיהוי בעיות בשעות מסוימות\n"
247
- date_columns_info += " * דוגמאות: 'יום', 'לילה'\n"
248
- date_columns_info += " * שימוש בשאילתות: WHERE יום_לילה = 'יום', GROUP BY יום_לילה, SELECT יום_לילה, COUNT(*) GROUP BY יום_לילה\n\n"
249
-
250
- schema_info = f"""
251
- ⚠️⚠️⚠️ שם הטבלה: 'Feedback_transformed' (עם אות גדולה F ו-underscore) - זה הקובץ feedback_transformed.csv
252
-
253
- טבלת Feedback_transformed מכילה את השדות הבאים:
254
- {all_columns_info}{date_columns_info}
255
-
256
- ⚠️⚠️⚠️ קריטי: שם הטבלה ב-SQL הוא 'Feedback_transformed' (עם אות גדולה F ו-underscore).
257
- כל שאילתה חייבת להתחיל ב-SELECT ולהשתמש ב-FROM Feedback_transformed.
258
- אסור להשתמש בשמות אחרים!
259
-
260
- 🚫🚫🚫 אזהרה חשובה מאוד:
261
- - השדה CreationDate לא קיים בטבלה! הוא נמחק!
262
- - אסור להשתמש ב-CreationDate בשום שאילתה!
263
- - אסור להשתמש ב-strftime() או DATE() על CreationDate - השדה לא קיים!
264
- - כל המידע על תאריכים נמצא בשדות המחושבים: שנה, חודש, יום_בשבוע, שעה, יום_לילה, יום_בחודש
265
- - אם אתה רואה CreationDate ב-schema - זה שגיאה! השתמש רק בשדות המחושבים!
266
-
267
- סטטיסטיקות כלליות:
268
- - סך הכל משובים: {len(self.df)}
269
- - מספר שירותים ייחודיים: {self.df['ServiceName'].nunique()}
270
- - חלוקת דירוגים: {dict(self.df['Level'].value_counts().sort_index())}
271
- - דירוג ממוצע: {self.df['Level'].mean():.2f}
272
  """
273
  return schema_info
274
 
@@ -347,77 +288,26 @@ class SQLFeedbackService:
347
 
348
  schema_info = self._get_schema_info()
349
 
350
- prompt = f"""אתה אנליסט נתונים מומחה. המשתמש שאל שאלה על משובי משתמשים.
351
 
352
- 🚫🚫🚫 אזהרה קריטית - קרא היטב:
353
- - השדה CreationDate לא קיים בטבלה! הוא נמחק לחלוטין!
354
- - אסור להשתמש ב-CreationDate בשום שאילתה!
355
- - אסור להשתמש ב-strftime() או DATE() על CreationDate - השדה לא קיים!
356
- - כל המידע על תאריכים נמצא בשדות המחושבים: שנה, חודש, יום_בשבוע, שעה, יום_לילה, יום_בחודש
357
- - אם השאלה מתייחסת לתאריכים/זמן - השתמש רק בשדות המחושבים האלה!
358
 
359
- שאלת המשתמש: {query}
360
-
361
- מידע על הטבלה:
362
  {schema_info}
363
 
364
- המשימה שלך: צור 1 עד 3 שאילתות SQL ממוקדות שיעזרו לענות על השאלה.
365
-
366
- ⚠️ חשוב מאוד:
367
- - לא חייב להריץ כמה שאילתות - לפעמים מספיקה שאילתה אחת!
368
- - שאילתות צריכות להיות ממוקדות ולא מפוזרות
369
- - כל שאילתה צריכה להיות שימושית ונחוצה לענות על השאלה
370
- - אם השאלה פשוטה, מספיקה שאילתה אחת
371
- - אם השאלה מורכבת, אפשר 2-3 שאילתות ממוקדות
372
-
373
- כללים חשובים:
374
- 1. ⚠️⚠️⚠️ שם הטבלה הוא 'Feedback_transformed' (עם אות גדולה F ו-underscore) - זה קריטי!
375
- - כל שאילתה חייבת להתחיל ב-SELECT ולהשתמש ב-FROM Feedback_transformed
376
- - אסור להשתמש בשמות אחרים כמו 'feedback', 'Feedback', 'feedback_transformed' (עם אות קטנה)
377
- - רק 'Feedback_transformed' (עם אות גדולה F) הוא הנכון!
378
- - דוגמה נכונה: SELECT * FROM Feedback_transformed
379
- - דוגמה שגויה: SELECT * FROM feedback (זה לא יעבוד!)
380
- - דוגמה שגויה: SELECT * FROM Feedback (זה לא יעבוד!)
381
- 2. השתמש בשמות השדות המדויקים: ID, ServiceName, Level, Text, ReferenceNumber, RequestID, ProcessID, שנה, חודש, יום_בשבוע, שעה, יום_לילה, יום_בחודש
382
- 3. Level הוא מספר שלם מ-1 עד 5 (1=גרוע, 5=מעולה)
383
- 4. ServiceName הוא טקסט
384
- 5. Text הוא הטקסט החופשי של המשוב
385
- 6. ⚠️⚠️⚠️ שאילתות מבוססות זמן - קריטי:
386
- - השדה CreationDate לא קיים! הוא נמחק! אל תשתמש בו!
387
- - השדות שנה, חודש, יום_בשבוע, שעה, יום_לילה, יום_בחודש כבר מחושבים ומולאו בנתונים!
388
- - תמיד השתמש ישירות בשדות המחושבים - הם כבר מוכנים לשימוש!
389
- - אם השאלה מתייחסת לתאריכים/זמן - השתמש רק בשדות: שנה, חודש, יום_בשבוע, שעה, יום_לילה, יום_בחודש
390
- - דוגמה לשאילתה לפי שנה: SELECT שנה, COUNT(*) as count FROM Feedback_transformed GROUP BY שנה ORDER BY שנה
391
- - דוגמה לשאילתה לפי חודש: SELECT חודש, COUNT(*) as count FROM Feedback_transformed GROUP BY חודש ORDER BY חודש
392
- - דוגמה לשאילתה לפי יום בשבוע: SELECT יום_בשבוע, COUNT(*) as count FROM Feedback_transformed GROUP BY יום_בשבוע
393
- - דוגמה לשאילתה לפי שעה: SELECT שעה, COUNT(*) as count FROM Feedback_transformed GROUP BY שעה ORDER BY שעה
394
- - דוגמה לשאילתה לפי יום/לילה: SELECT יום_לילה, COUNT(*) as count FROM Feedback_transformed GROUP BY יום_לילה
395
- - דוגמה לשאילתה לפי יום בחודש: SELECT יום_בחודש, COUNT(*) as count FROM Feedback_transformed GROUP BY יום_בחודש ORDER BY יום_בחודש
396
- - דוגמה לשאילתה משולבת (שנה וחודש): SELECT שנה, חודש, COUNT(*) as count FROM Feedback_transformed GROUP BY שנה, חודש ORDER BY שנה, חודש
397
- 7. שדות תאריך/זמן: יום_בחודש, יום_בשבוע, שנה, חודש, שעה, יום_לילה - כל השדות האלה כבר מחושבים ומוכנים לשימוש ישיר!
398
- 8. כל שאילתה צריכה להיות תקפה SQLite
399
- 9. השתמש בפונקציות SQL סטנדרטיות: COUNT, AVG, GROUP BY, WHERE, LIKE, etc.
400
- 10. 🚫🚫🚫 אל תשתמש ב-CreationDate, DATE(), או strftime() - השדה CreationDate לא קיים! השדות המחושבים כבר מוכנים!
401
- 11. אם השאלה מתייחסת לטקסט, השתמש ב-LIKE או INSTR לחיפוש
402
- 12. אם השאלה מתייחסת לדירוגים, השתמש ב-Level עם תנאים מתאימים
403
- 13. אם השאלה מתייחסת לשירותים, השתמש ב-ServiceName
404
- 14. דוגמה לשאילתה נכונה: SELECT COUNT(*) FROM Feedback_transformed WHERE Level >= 4
405
- 15. ⚠️⚠️⚠️ זכור: כל שאילתה חייבת להתחיל ב-SELECT ולהשתמש ב-FROM Feedback_transformed (עם אות גדולה F ו-underscore)!
406
- 16. ⚠️⚠️⚠️ לפני שאתה שולח את השאילתה, ודא שהיא מכילה: FROM Feedback_transformed (עם אות גדולה F!)
407
- 17. 🚫🚫🚫 לפני שאתה שולח את השאילתה, ודא שאין שימוש ב-CreationDate, strftime(), או DATE() - השדה CreationDate לא קיים!
408
 
409
- פורמט התשובה - JSON בלבד:
410
- {{
411
- "queries": [
412
- "SELECT ...",
413
- "SELECT ...",
414
- ...
415
- ]
416
- }}
417
-
418
- ⚠️ זכור: לא חייב להריץ כמה שאילתות! אם השאלה פשוטה, מספיקה שאילתה אחת ממוקדת.
419
 
420
- תן רק את ה-JSON, ללא טקסט נוסף."""
421
 
422
  # Try Gemini first
423
  if settings.gemini_api_key and genai is not None:
 
131
  if self.df is None:
132
  return "No data available"
133
 
134
+ # Build compact schema info with all fields, examples, and usage
135
  all_columns_info = ""
136
 
137
+ # Get sample values for each column
138
+ def get_sample_values(col_name, n=3):
139
+ try:
140
+ samples = self.df[col_name].dropna().head(n).tolist()
141
+ return [str(s) for s in samples]
142
+ except:
143
+ return []
144
+
145
+ # ID
146
+ samples = get_sample_values('ID', 2)
147
+ all_columns_info += f" ID (UUID): מזהה ייחודי. דוגמאות: {', '.join(samples[:2])}\n"
148
+
149
+ # ServiceName
150
+ samples = get_sample_values('ServiceName', 3)
151
+ unique_services = self.df['ServiceName'].nunique() if 'ServiceName' in self.df.columns else 0
152
+ all_columns_info += f" ServiceName (טקסט): שם השירות. דוגמאות: {', '.join(samples[:2])}. יש {unique_services} שירותים ייחודיים\n"
153
+
154
+ # Level
155
+ all_columns_info += " Level (מספר 1-5): דירוג שביעות רצון. 1=גרוע מאוד, 5=מעולה. דוגמאות: 1, 2, 3, 4, 5\n"
156
+
157
+ # Text
158
+ samples = get_sample_values('Text', 1)
159
+ if samples:
160
+ sample_text = samples[0][:50] + "..." if len(samples[0]) > 50 else samples[0]
161
+ all_columns_info += f" Text (טקסט ארוך): תוכן המשוב. דוגמה: '{sample_text}'\n"
162
+ else:
163
+ all_columns_info += " Text (טקסט ארוך): תוכן המשוב - ביקורות, תלונות, מחמאות\n"
164
+
165
+ # ReferenceNumber
166
  if 'ReferenceNumber' in self.df.columns:
167
+ samples = get_sample_values('ReferenceNumber', 3)
168
+ all_columns_info += f" ReferenceNumber (מספר, יכול להיות NULL): מספר הפניה. דוגמאות: {', '.join([str(s) for s in samples[:2]])}\n"
 
 
 
169
 
170
+ # RequestID
171
  if 'RequestID' in self.df.columns:
172
+ samples = get_sample_values('RequestID', 2)
173
+ all_columns_info += f" RequestID (UUID, יכול להיות NULL): מזהה בקשה. דוגמאות: {samples[0][:20]}...\n"
 
 
 
174
 
175
+ # ProcessID
176
  if 'ProcessID' in self.df.columns:
177
+ all_columns_info += " ProcessID (UUID, יכול להיות NULL): מזהה תהליך\n"
178
+
179
+ # Date/Time fields - PRE-CALCULATED, use these for time queries
180
+ all_columns_info += "\nשדות תאריך/זמן מחושבים (מוכנים לשימוש - השתמש בהם לשאילתות זמן!):\n"
181
+
182
+ if 'שנה' in self.df.columns:
183
+ try:
184
+ year_min = int(self.df['שנה'].min())
185
+ year_max = int(self.df['שנה'].max())
186
+ all_columns_info += f"• שנה (מספר): שנה. טווח: {year_min}-{year_max}. דוגמאות: {year_min}, {year_max}\n"
187
+ except:
188
+ all_columns_info += " שנה (מספר): שנה. דוגמאות: 2020, 2021\n"
189
+
190
+ if 'חודש' in self.df.columns:
191
+ all_columns_info += "• חודש (מספר 1-12): חודש. 1=ינואר, 12=דצמבר. דוגמאות: 1, 6, 12\n"
192
+
193
+ if 'יום_בחודש' in self.df.columns:
194
+ all_columns_info += "• יום_בחודש (מספר 1-31): יום בחודש. דוגמאות: 1, 15, 31\n"
195
+
196
+ if 'יום_בשבוע' in self.df.columns:
197
+ samples = get_sample_values('יום_בשבוע', 3)
198
+ all_columns_info += f"• יום_בשבוע (טקסט): יום בשבוע באנגלית. ערכים: Monday-Sunday. דוגמאות: {', '.join(samples[:3])}\n"
199
+
200
+ if 'שעה' in self.df.columns:
201
+ all_columns_info += " שעה (מספר 0-23): שעה ביום. 0=חצות, 12=צהריים, 23=23:00. דוגמאות: 0, 9, 14, 18, 23\n"
202
+
203
+ if 'יום_לילה' in self.df.columns:
204
+ samples = get_sample_values('יום_לילה', 2)
205
+ all_columns_info += f"• יום_לילה (טקסט): 'יום' או 'לילה'. יום=6:00-18:00, לילה=18:00-6:00. דוגמאות: {', '.join(samples[:2])}\n"
206
+
207
+ schema_info = f"""שם הטבלה: Feedback_transformed (עם אות גדולה F)
208
+
209
+ שדות בטבלה:
210
+ {all_columns_info}
211
+
212
+ סטטיסטיקות: {len(self.df)} משובים, {self.df['ServiceName'].nunique()} שירותים, דירוג ממוצע: {self.df['Level'].mean():.2f}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
  """
214
  return schema_info
215
 
 
288
 
289
  schema_info = self._get_schema_info()
290
 
291
+ prompt = f"""צור שאילתות SQL לשאלה: {query}
292
 
293
+ טבלה: Feedback_transformed (חובה להשתמש בשם זה!)
 
 
 
 
 
294
 
 
 
 
295
  {schema_info}
296
 
297
+ כללים:
298
+ 1. שם הטבלה: Feedback_transformed (עם אות גדולה F) - חובה!
299
+ 2. שאילתות זמן: השתמש בשדות המחושבים (שנה, חודש, יום_בשבוע, שעה, יום_לילה, יום_בחודש) - אל תשתמש ב-CreationDate!
300
+ 3. Level: 1-5 (1=גרוע, 5=מעולה)
301
+ 4. Text: חיפוש עם LIKE '%מילה%'
302
+ 5. ServiceName: שם השירות
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
303
 
304
+ דוגמאות:
305
+ - SELECT שנה, COUNT(*) FROM Feedback_transformed GROUP BY שנה
306
+ - SELECT ServiceName, AVG(Level) FROM Feedback_transformed GROUP BY ServiceName
307
+ - SELECT COUNT(*) FROM Feedback_transformed WHERE Level >= 4
308
+ - SELECT יום_בשבוע, COUNT(*) FROM Feedback_transformed GROUP BY יום_בשבוע
 
 
 
 
 
309
 
310
+ פורמט: JSON בלבד עם "queries": ["SELECT ...", ...]"""
311
 
312
  # Try Gemini first
313
  if settings.gemini_api_key and genai is not None: