galbendavids commited on
Commit
0ca72c8
·
1 Parent(s): b987a23

תיקון ממוקד: schema מדויק, שאילתות זמן עם שדות מחושבים, prompt קצר ומדויק, תיקון שמירת היסטוריה עם NaN handling

Browse files
Files changed (2) hide show
  1. app/api.py +41 -18
  2. app/sql_service.py +76 -80
app/api.py CHANGED
@@ -52,14 +52,30 @@ def save_history() -> None:
52
  global history
53
  try:
54
  # Ensure we're saving the current history
 
55
  with history_file.open("w", encoding="utf-8") as f:
56
- json.dump(history, f, ensure_ascii=False, indent=2)
57
  print(f"History saved successfully to {history_file.absolute()}: {len(history)} entries", flush=True)
58
  except Exception as e:
59
  # Log error but don't break main flow
60
  import traceback
61
- print(f"Warning: Could not save history to {history_file}: {e}", flush=True)
62
  traceback.print_exc()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
 
65
  class QueryRequest(BaseModel):
@@ -146,12 +162,18 @@ def query_sql(req: QueryRequest) -> SQLQueryResponse:
146
  Convert numpy types to native Python types for JSON serialization.
147
 
148
  FastAPI/Pydantic can't serialize numpy types directly, so we need
149
- to convert them. This function handles integers, floats, and arrays.
150
  """
151
  import numpy as np
 
 
 
 
152
  if isinstance(val, (np.integer, np.int64, np.int32)):
153
  return int(val)
154
  elif isinstance(val, (np.floating, np.float64, np.float32)):
 
 
155
  return float(val)
156
  elif isinstance(val, np.ndarray):
157
  return val.tolist()
@@ -176,27 +198,28 @@ def query_sql(req: QueryRequest) -> SQLQueryResponse:
176
  # Save to history - ensure it's always saved BEFORE returning response
177
  # Use the already-converted query_results (which are JSON-serializable)
178
  global history
179
- history_entry = {
180
- "query": result.user_query,
181
- "response": {
182
- "summary": result.summary,
183
- "sql_queries": result.sql_queries,
184
- "query_results": query_results, # Already converted to JSON-serializable format above
185
- "visualizations": result.visualizations
186
- },
187
- "timestamp": __import__("datetime").datetime.now().isoformat()
188
- }
189
- history.append(history_entry)
190
- print(f"History entry added to memory: {len(history)} entries. Query: {result.user_query[:50]}...", flush=True)
191
-
192
- # Save to disk immediately
193
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  save_history()
195
  print(f"History saved to disk: {history_file.absolute()}", flush=True)
196
  except Exception as e:
197
- print(f"Error saving history to disk: {e}", flush=True)
198
  import traceback
199
  traceback.print_exc()
 
200
 
201
  response = SQLQueryResponse(
202
  query=result.user_query,
 
52
  global history
53
  try:
54
  # Ensure we're saving the current history
55
+ # Use default=str to handle any non-serializable types
56
  with history_file.open("w", encoding="utf-8") as f:
57
+ json.dump(history, f, ensure_ascii=False, indent=2, default=str)
58
  print(f"History saved successfully to {history_file.absolute()}: {len(history)} entries", flush=True)
59
  except Exception as e:
60
  # Log error but don't break main flow
61
  import traceback
62
+ print(f"CRITICAL ERROR: Could not save history to {history_file}: {e}", flush=True)
63
  traceback.print_exc()
64
+ # Try to save a simplified version
65
+ try:
66
+ simplified_history = []
67
+ for entry in history:
68
+ simplified_entry = {
69
+ "query": entry.get("query", ""),
70
+ "summary": entry.get("response", {}).get("summary", ""),
71
+ "timestamp": entry.get("timestamp", "")
72
+ }
73
+ simplified_history.append(simplified_entry)
74
+ with history_file.open("w", encoding="utf-8") as f:
75
+ json.dump(simplified_history, f, ensure_ascii=False, indent=2)
76
+ print(f"Saved simplified history: {len(simplified_history)} entries", flush=True)
77
+ except Exception as e2:
78
+ print(f"Failed to save even simplified history: {e2}", flush=True)
79
 
80
 
81
  class QueryRequest(BaseModel):
 
162
  Convert numpy types to native Python types for JSON serialization.
163
 
164
  FastAPI/Pydantic can't serialize numpy types directly, so we need
165
+ to convert them. This function handles integers, floats, arrays, and NaN.
166
  """
167
  import numpy as np
168
+ import math
169
+ # Handle NaN and None
170
+ if val is None or (isinstance(val, float) and math.isnan(val)):
171
+ return None
172
  if isinstance(val, (np.integer, np.int64, np.int32)):
173
  return int(val)
174
  elif isinstance(val, (np.floating, np.float64, np.float32)):
175
+ if math.isnan(val):
176
+ return None
177
  return float(val)
178
  elif isinstance(val, np.ndarray):
179
  return val.tolist()
 
198
  # Save to history - ensure it's always saved BEFORE returning response
199
  # Use the already-converted query_results (which are JSON-serializable)
200
  global history
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  try:
202
+ history_entry = {
203
+ "query": result.user_query,
204
+ "response": {
205
+ "summary": result.summary,
206
+ "sql_queries": result.sql_queries,
207
+ "query_results": query_results, # Already converted to JSON-serializable format above
208
+ "visualizations": result.visualizations
209
+ },
210
+ "timestamp": __import__("datetime").datetime.now().isoformat()
211
+ }
212
+ history.append(history_entry)
213
+ print(f"History entry added to memory: {len(history)} entries. Query: {result.user_query[:50]}...", flush=True)
214
+
215
+ # Save to disk immediately - use force save
216
  save_history()
217
  print(f"History saved to disk: {history_file.absolute()}", flush=True)
218
  except Exception as e:
219
+ print(f"CRITICAL: Error saving history: {e}", flush=True)
220
  import traceback
221
  traceback.print_exc()
222
+ # Don't fail the request, but log the error
223
 
224
  response = SQLQueryResponse(
225
  query=result.user_query,
app/sql_service.py CHANGED
@@ -152,37 +152,43 @@ class SQLFeedbackService:
152
  # If date parsing fails, still include the column info
153
  date_info = "\n- CreationDate: תאריך וזמן הזנת הפידבק (תאריך/זמן)"
154
 
155
- # Add info about date/time columns if they exist
156
  date_columns = ['יום_בחודש', 'יום_בשבוע', 'שנה', 'חודש', 'שעה', 'יום_לילה']
157
  existing_date_columns = [col for col in date_columns if col in self.df.columns]
158
  if existing_date_columns:
159
- date_columns_info = "\n\nשדות תאריך/זמן נוספים (מחושבים מ-CreationDate):"
160
  if 'יום_בחודש' in existing_date_columns:
161
- date_columns_info += "\n- יום_בחודש: יום בחודש (1-31, מספר שלם)"
162
  if 'יום_בשבוע' in existing_date_columns:
163
- date_columns_info += "\n- יום_בשבוע: יום בשבוע (טקסט: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)"
164
  if 'שנה' in existing_date_columns:
165
- date_columns_info += "\n- שנה: שנה (מספר שלם, למשל 2020)"
 
 
 
 
 
 
166
  if 'חודש' in existing_date_columns:
167
- date_columns_info += "\n- חודש: חודש (1-12, מספר שלם, 1=ינואר, 12=דצמבר)"
168
  if 'שעה' in existing_date_columns:
169
- date_columns_info += "\n- שעה: שעה ביום (0-23, מספר שלם, 0=חצות, 23=23:00)"
170
  if 'יום_לילה' in existing_date_columns:
171
- date_columns_info += "\n- יום_לילה: האם זה יום או לילה (טקסט: 'יום' או 'לילה', יום=6:00-18:00, לילה=18:00-6:00)"
172
 
173
- # Build complete schema with all columns
174
- all_columns_info = "- ID: מזהה ייחודי של כל משוב (מספר שלם)\n"
175
- all_columns_info += "- ServiceName: שם השירות הדיגיטלי (טקסט)\n"
176
- all_columns_info += "- Level: הציון שהמשתמש נתן לשירות (מספר שלם מ-1 עד 5, כאשר 1=גרוע, 5=מעולה)\n"
177
- all_columns_info += "- Text: הטקסט החופשי שהמשתמש הזין כחלק מהפידבק (טקסט)\n"
178
 
179
  # Add optional columns if they exist
180
  if 'ReferenceNumber' in self.df.columns:
181
- all_columns_info += "- ReferenceNumber: מספר הפניה של המשוב (טקסט, יכול להיות NULL)\n"
182
  if 'RequestID' in self.df.columns:
183
- all_columns_info += "- RequestID: מזהה בקשה (טקסט, יכול להיות NULL)\n"
184
  if 'ProcessID' in self.df.columns:
185
- all_columns_info += "- ProcessID: מזהה תהליך (טקסט, יכול להיות NULL)\n"
186
 
187
  all_columns_info += date_info
188
 
@@ -299,12 +305,15 @@ class SQLFeedbackService:
299
  5. Text הוא הטקסט החופשי של המשוב
300
  6. CreationDate הוא תאריך וזמן בפורמט ISO (YYYY-MM-DD HH:MM:SS) - ניתן להשתמש בו לשאילתות על תאריכים, תקופות זמן, מגמות לאורך זמן
301
  7. ⚠️ שאילתות מבוססות זמן - חשוב מאוד:
302
- - CreationDate הוא TEXT ב-SQLite, לא DATE - צריך להשתמש ב-strftime() או DATE() לפורמט
303
- - דוגמה לשאילתה לפי שנה: SELECT שנה, COUNT(*) FROM Feedback_transformed GROUP BY שנה
304
- - דוגמה לשאילתה לפי חודש: SELECT חודש, COUNT(*) FROM Feedback_transformed GROUP BY חודש
305
- - דוגמה לשאילתה לפי יום בשבוע: SELECT יום_בשבוע, COUNT(*) FROM Feedback_transformed GROUP BY יום_בשבוע
306
- - דוגמה לשאילתה לפי CreationDate (טווח תאריכים): SELECT DATE(CreationDate) as date, COUNT(*) FROM Feedback_transformed WHERE CreationDate >= '2024-01-01' GROUP BY DATE(CreationDate)
307
- - עדיף להשתמש בשדות המחושבים (שנה, חודש, יום_בשבוע, שעה) במקום CreationDate לשאילתות פשוטות
 
 
 
308
  8. שדות תאריך/זמן נוספים (אם קיימים): יום_בחודש, יום_בשבוע, שנה, חודש, שעה, יום_לילה - ניתן להשתמש בהם ישירות לשאילתות על תאריכים, שעות, ימים בשבוע, חודשים, וכו'
309
  9. כל שאילתה צריכה להיות תקפה SQLite
310
  10. השתמש בפונקציות SQL סטנדרטיות: COUNT, AVG, GROUP BY, WHERE, LIKE, DATE(), strftime(), etc.
@@ -613,35 +622,30 @@ class SQLFeedbackService:
613
  results_text += qr.result.to_string(index=False)
614
  results_text += "\n\n"
615
 
616
- prompt = f"""אתה אנליסט נתונים מקצועי. המשתמש שאל שאלה על משובי משתמשים.
617
 
618
  שאלת המשתמש: {query}
619
 
620
- כדי לענות על השאלה, נוצרו ובוצעו השאילתות הבאות:
621
-
622
  {results_text}
623
 
624
- המשימה שלך: כתוב תשובה מדויקת, מסודרת וברורה שמבוססת ישירות על התוצאות.
625
 
626
- ⚠️ כללים חשובים לתשובה:
627
- 1. תשובה מדויקת וממוקדת - ענה ישירות על השאלה שנשאלה
628
- 2. תשובה מסודרת - השתמש בפסקאות קצרות וברורות
629
- 3. כלול מספרים מדויקים מהתוצאות - צטט את הנתונים מהטבלאות
630
- 4. הסבר קצר וממוקד - לא צריך להיות עמוק מדי, רק להסביר את הממצאים
631
- 5. אם השאלה מבקשת סיווג/חלוקה - הצג את הנתונים לפי הקטגוריות הנדרשות
632
- 6. כתוב בעברית ברורה ופשוטה - לא צריך מונחים מקצועיים מורכבים
633
 
634
- מבנה התשובה:
635
- 1. תשובה ישירה לשאלה (2-3 משפטים) - מה הממצאים העיקריים
636
- 2. פירוט הנתונים (2-3 פסקאות קצרות):
637
- - הצג את המספרים והנתונים מהתוצאות
638
- - אם יש סיווג - הצג כל קטגוריה בנפרד
639
- - הסבר קצר על המשמעות
640
- 3. סיכום (1-2 משפטים) - המסקנה העיקרית
641
 
642
- ⚠️ חשוב: התשובה חייבת להיות ממוקדת, מדויקת ומסודרת. לא צריך להיות עמוק מדי או פילוסופי - רק להציג את הנתונים ולהסביר אותם בפשטות.
643
 
644
- אם יש שגיאות בשאילתות, ציין זאת בתשובה."""
645
 
646
  # Try Gemini first
647
  if settings.gemini_api_key and genai is not None:
@@ -676,25 +680,21 @@ class SQLFeedbackService:
676
  תוצאות השאילתות:
677
  {results_text}
678
 
679
- כתוב תשובה משופרת שמתמקדת ישירות בשאלה, מבוססת על הנתונים, ומסודרת.
680
-
681
- ⚠️ כללים חשובים לתשובה:
682
- 1. תשובה מדויקת וממוקדת - ענה ישירות על השאלה שנשאלה
683
- 2. תשובה מסודרת - השתמש בפסקאות קצרות וברורות
684
- 3. כלול מספרים מדויקים מהתוצאות - צטט את הנתונים מהטבלאות
685
- 4. הסבר קצר וממוקד - לא צריך להיות עמוק מדי, רק להסביר את הממצאים
686
- 5. אם השאלה מבקשת סיווג/חלוקה - הצג את הנתונים לפי הקטגוריות הנדרשות
687
- 6. כתוב בעברית ברורה ופשוטה - לא צריך מונחים מקצועיים מורכבים
688
-
689
- מבנה התשובה:
690
- 1. תשובה ישירה לשאלה (2-3 משפטים) - מה הממצאים העיקריים
691
- 2. פירוט הנתונים (2-3 פסקאות קצרות):
692
- - הצג את המספרים והנתונים מהתוצאות
693
- - אם יש סיווג - הצג כל קטגוריה בנפרד
694
- - הסבר קצר על המשמעות
695
- 3. סיכום (1-2 משפטים) - המסקנה העיקרית
696
-
697
- ⚠️ חשוב: התשובה חייבת להיות ממוקדת, מדויקת ומסודרת. לא צריך להיות עמוק מדי או פילוסופי - רק להציג את הנתונים ולהסביר אותם בפשטות."""
698
 
699
  try:
700
  response = model.generate_content(improvement_prompt, generation_config=generation_config)
@@ -743,25 +743,21 @@ class SQLFeedbackService:
743
  תוצאות השאילתות:
744
  {results_text}
745
 
746
- כתוב תשובה משופרת שמתמקדת ישירות בשאלה, מבוססת על הנתונים, ומסודרת.
747
-
748
- ⚠️ כללים חשובים לתשובה:
749
- 1. תשובה מדויקת וממוקדת - ענה ישירות על השאלה שנשאלה
750
- 2. תשובה מסודרת - השתמש בפסקאות קצרות וברורות
751
- 3. כלול מספרים מדויקים מהתוצאות - צטט את הנתונים מהטבלאות
752
- 4. הסבר קצר וממוקד - לא צריך להיות עמוק מדי, רק להסביר את הממצאים
753
- 5. אם השאלה מבקשת סיווג/חלוקה - הצג את הנתונים לפי הקטגוריות הנדרשות
754
- 6. כתוב בעברית ברורה ופשוטה - לא צריך מונחים מקצועיים מו��כבים
755
-
756
- מבנה התשובה:
757
- 1. תשובה ישירה לשאלה (2-3 משפטים) - מה הממצאים העיקריים
758
- 2. פירוט הנתונים (2-3 פסקאות קצרות):
759
- - הצג את המספרים והנתונים מהתוצאות
760
- - אם יש סיווג - הצג כל קטגוריה בנפרד
761
- - הסבר קצר על המשמעות
762
- 3. סיכום (1-2 משפטים) - המסקנה העיקרית
763
-
764
- ⚠️ חשוב: התשובה חייבת להיות ממוקדת, מדויקת ומסודרת. לא צריך להיות עמוק מדי או פילוסופי - רק להציג את הנתונים ולהסביר אותם בפשטות."""
765
 
766
  try:
767
  response = client.chat.completions.create(
 
152
  # If date parsing fails, still include the column info
153
  date_info = "\n- CreationDate: תאריך וזמן הזנת הפידבק (תאריך/זמן)"
154
 
155
+ # Add info about date/time columns if they exist - these are PRE-CALCULATED and always available
156
  date_columns = ['יום_בחודש', 'יום_בשבוע', 'שנה', 'חודש', 'שעה', 'יום_לילה']
157
  existing_date_columns = [col for col in date_columns if col in self.df.columns]
158
  if existing_date_columns:
159
+ date_columns_info = "\n\n⚠️ שדות תאריך/זמן מחושבים (כבר מולאו בנתונים - לא צריך לחשב!):"
160
  if 'יום_בחודש' in existing_date_columns:
161
+ date_columns_info += "\n- יום_בחודש: יום בחודש (1-31, מספר שלם) - מוכן לשימוש!"
162
  if 'יום_בשבוע' in existing_date_columns:
163
+ date_columns_info += "\n- יום_בשבוע: יום בשבוע (טקסט: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) - מוכן לשימוש!"
164
  if 'שנה' in existing_date_columns:
165
+ # Get actual year range from data
166
+ try:
167
+ year_min = int(self.df['שנה'].min())
168
+ year_max = int(self.df['שנה'].max())
169
+ date_columns_info += f"\n- שנה: שנה (מספר שלם, טווח: {year_min}-{year_max}) - מוכן לשימוש!"
170
+ except:
171
+ date_columns_info += "\n- שנה: שנה (מספר שלם, למשל 2020) - מוכן לשימוש!"
172
  if 'חודש' in existing_date_columns:
173
+ date_columns_info += "\n- חודש: חודש (1-12, מספר שלם, 1=ינואר, 12=דצמבר) - מוכן לשימוש!"
174
  if 'שעה' in existing_date_columns:
175
+ date_columns_info += "\n- שעה: שעה ביום (0-23, מספר שלם, 0=חצות, 23=23:00) - מוכן לשימוש!"
176
  if 'יום_לילה' in existing_date_columns:
177
+ date_columns_info += "\n- יום_לילה: האם זה יום או לילה (טקסט: 'יום' או 'לילה', יום=6:00-18:00, לילה=18:00-6:00) - מוכן לשימוש!"
178
 
179
+ # Build complete schema with all columns - be very specific about types and meanings
180
+ all_columns_info = "- ID: מזהה ייחודי של כל משוב (UUID/טקסט, למשל: 71BE94CF-A408-47EC-9443-CA2385B6BFCF)\n"
181
+ all_columns_info += "- ServiceName: שם השירות הדיגיטלי (טקסט, למשל: 1050_NifAvoda@btl.gov.il)\n"
182
+ all_columns_info += "- Level: הציון שהמשתמש נתן לשירות (מספר שלם מ-1 עד 5, כאשר 1=גרוע מאוד, 5=מעולה)\n"
183
+ all_columns_info += "- Text: הטקסט החופשי שהמשתמש הזין כחלק מהפידבק (טקסט, יכול להיות ארוך)\n"
184
 
185
  # Add optional columns if they exist
186
  if 'ReferenceNumber' in self.df.columns:
187
+ all_columns_info += "- ReferenceNumber: מספר הפניה של המשוב (מספר שלם, יכול להיות NULL)\n"
188
  if 'RequestID' in self.df.columns:
189
+ all_columns_info += "- RequestID: מזהה בקשה (UUID/טקסט, יכול להיות NULL)\n"
190
  if 'ProcessID' in self.df.columns:
191
+ all_columns_info += "- ProcessID: מזהה תהליך (UUID/טקסט, יכול להיות NULL)\n"
192
 
193
  all_columns_info += date_info
194
 
 
305
  5. Text הוא הטקסט החופשי של המשוב
306
  6. CreationDate הוא תאריך וזמן בפורמט ISO (YYYY-MM-DD HH:MM:SS) - ניתן להשתמש בו לשאילתות על תאריכים, תקופות זמן, מגמות לאורך זמן
307
  7. ⚠️ שאילתות מבוססות זמן - חשוב מאוד:
308
+ - השדות שנה, חודש, יום_בשבוע, שעה, יום_לילה כבר מחושבים ומולאו בנתונים - אין צורך לחשב אותם!
309
+ - תמיד השתמש בשדות המחושבים האלה - הם מהירים ומדויקים
310
+ - דוגמה לשאילתה לפי שנה: SELECT שנה, COUNT(*) as count FROM Feedback_transformed GROUP BY שנה ORDER BY שנה
311
+ - דוגמה לשאילתה לפי חודש: SELECT חודש, COUNT(*) as count FROM Feedback_transformed GROUP BY חודש ORDER BY חודש
312
+ - דוגמה לשאילתה לפי יום בשבוע: SELECT יום_בשבוע, COUNT(*) as count FROM Feedback_transformed GROUP BY יום_בשבוע
313
+ - דוגמה לשאילתה לפי שעה: SELECT שעה, COUNT(*) as count FROM Feedback_transformed GROUP BY שעה ORDER BY שעה
314
+ - דוגמה לשאילתה לפי יום/לילה: SELECT יום_לילה, COUNT(*) as count FROM Feedback_transformed GROUP BY יום_לילה
315
+ - דוגמה לשאילתה משולבת (שנה וחודש): SELECT שנה, חודש, COUNT(*) as count FROM Feedback_transformed GROUP BY שנה, חודש ORDER BY שנה, חודש
316
+ - CreationDate הוא TEXT - רק אם צריך טווח תאריכים ספציפי, אחרת תמיד השתמש בשדות המחושבים!
317
  8. שדות תאריך/זמן נוספים (אם קיימים): יום_בחודש, יום_בשבוע, שנה, חודש, שעה, יום_לילה - ניתן להשתמש בהם ישירות לשאילתות על תאריכים, שעות, ימים בשבוע, חודשים, וכו'
318
  9. כל שאילתה צריכה להיות תקפה SQLite
319
  10. השתמש בפונקציות SQL סטנדרטיות: COUNT, AVG, GROUP BY, WHERE, LIKE, DATE(), strftime(), etc.
 
622
  results_text += qr.result.to_string(index=False)
623
  results_text += "\n\n"
624
 
625
+ prompt = f"""אתה אנליסט נתונים. המשתמש שאל שאלה על משובי משתמשים.
626
 
627
  שאלת המשתמש: {query}
628
 
629
+ תוצאות השאילתות:
 
630
  {results_text}
631
 
632
+ כתוב תשובה קצרה, מדויקת ומסודרת שמבוססת ישירות על התוצאות.
633
 
634
+ ⚠️ כללים:
635
+ 1. ענה ישירות על השאלה - לא יותר, לא פחות
636
+ 2. השתמש במספרים המדויקים מהתוצאות
637
+ 3. פסקאות קצרות (2-3 משפטים כל אחת)
638
+ 4. אם יש סיווג - רשום כל קטגוריה עם המספר שלה
639
+ 5. עברית פשוטה וברורה
 
640
 
641
+ מבנה:
642
+ - פסקה ראשונה: תשובה ישירה לשאלה עם המספרים העיקריים
643
+ - פסקאות נוספות: פירוט לפי הצורך (אם יש סיווג - כל קטגוריה בנפרד)
644
+ - משפט סיכום: המסקנה העיקרית
 
 
 
645
 
646
+ ⚠️ חשוב: תשובה קצרה ומדויקת. לא פילוסופיה, לא הסברים ארוכים - רק הנתונים והמסקנות.
647
 
648
+ אם יש שגיאות בשאילתות, ציין זאת בקצרה."""
649
 
650
  # Try Gemini first
651
  if settings.gemini_api_key and genai is not None:
 
680
  תוצאות השאילתות:
681
  {results_text}
682
 
683
+ כתוב תשובה משופרת - קצרה, מדויקת ומסודרת.
684
+
685
+ ⚠️ כללים:
686
+ 1. ענה ישירות על השאלה - לא יותר, לא פחות
687
+ 2. השתמש במספרים המדויקים מהתוצאות
688
+ 3. פסקאות קצרות (2-3 משפטים כל אחת)
689
+ 4. אם יש סיווג - רשום כל קטגוריה עם המספר שלה
690
+ 5. עברית פשוטה וברורה
691
+
692
+ מבנה:
693
+ - פסקה ראשונה: תשובה ישירה לשאלה עם המספרים העיקריים
694
+ - פסקאות נוספות: פירוט לפי הצורך (אם יש סיווג - כל קטגוריה בנפרד)
695
+ - משפט סיכום: המסקנה העיקרית
696
+
697
+ ⚠️ חשוב: תשובה קצרה ומדויקת. לא פילוסופיה, לא הסברים ארוכים - רק הנתונים והמסקנות."""
 
 
 
 
698
 
699
  try:
700
  response = model.generate_content(improvement_prompt, generation_config=generation_config)
 
743
  תוצאות השאילתות:
744
  {results_text}
745
 
746
+ כתוב תשובה משופרת - קצרה, מדויקת ומסודרת.
747
+
748
+ ⚠️ כללים:
749
+ 1. ענה ישירות על השאלה - לא יותר, לא פחות
750
+ 2. השתמש במספרים המדויקים מהתוצאות
751
+ 3. פסקאות קצרות (2-3 משפטים כל אחת)
752
+ 4. אם יש סיווג - רשום כל קטגוריה עם המספר שלה
753
+ 5. עברית פשוטה וברורה
754
+
755
+ מבנה:
756
+ - פסקה ראשונה: תשובה ישירה לשאלה עם המספרים העיקריים
757
+ - פסקאות נוספות: פירוט לפי הצורך (אם יש סיווג - כל קטגוריה בנפרד)
758
+ - משפט סיכום: המסקנה העיקרית
759
+
760
+ ⚠️ חשוב: תשובה קצרה ומדויקת. לא פילוסופיה, לא הסברים ארוכים - רק הנתונים והמסקנות."""
 
 
 
 
761
 
762
  try:
763
  response = client.chat.completions.create(