Commit ·
0ca72c8
1
Parent(s): b987a23
תיקון ממוקד: schema מדויק, שאילתות זמן עם שדות מחושבים, prompt קצר ומדויק, תיקון שמירת היסטוריה עם NaN handling
Browse files- app/api.py +41 -18
- 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"
|
| 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
|
| 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
|
| 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שדות תאריך/זמן
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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: מזהה ייחודי של כל משוב (
|
| 175 |
-
all_columns_info += "- ServiceName: שם השירות הדיגיטלי (
|
| 176 |
-
all_columns_info += "- Level: הציון שהמשתמש נתן לשירות (מספר שלם מ-1 עד 5, כאשר 1
|
| 177 |
-
all_columns_info += "- Text: הטקסט החופשי שהמשתמש הזין כחלק מהפידבק (
|
| 178 |
|
| 179 |
# Add optional columns if they exist
|
| 180 |
if 'ReferenceNumber' in self.df.columns:
|
| 181 |
-
all_columns_info += "- ReferenceNumber: מספר הפניה של המשוב (
|
| 182 |
if 'RequestID' in self.df.columns:
|
| 183 |
-
all_columns_info += "- RequestID: מזהה בקשה (
|
| 184 |
if 'ProcessID' in self.df.columns:
|
| 185 |
-
all_columns_info += "- ProcessID: מזהה תהליך (
|
| 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 |
-
-
|
| 303 |
-
-
|
| 304 |
-
- דוגמה לשאילתה לפי
|
| 305 |
-
- דוגמה לשאילתה לפי
|
| 306 |
-
- דוגמה לשאילתה לפי
|
| 307 |
-
-
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 636 |
-
|
| 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 |
-
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
|
| 691 |
-
|
| 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 |
-
|
| 755 |
-
|
| 756 |
-
|
| 757 |
-
|
| 758 |
-
|
| 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(
|