Commit ·
5c6f353
1
Parent(s): bc76b13
שיפורים משמעותיים: מודל embedding משופר, טמפרטורה 0.9, תשובות ארוכות יותר (600-800 מילים), 100 רשומות ל-RAG
Browse files- .query_history.json +18 -0
- app/config.py +1 -1
- app/rag_service.py +43 -38
- app/static/app.js +1 -1
.query_history.json
CHANGED
|
@@ -64,5 +64,23 @@
|
|
| 64 |
"response": {
|
| 65 |
"summary": "את הנוחות של המשתמש נוחות השירות והאינטואיטיביות של הממשק שירות לקוחות על הפנים מענה זמין יותר בשירות לקוחות שירות קל וידידותי למשתמש "
|
| 66 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
}
|
| 68 |
]
|
|
|
|
| 64 |
"response": {
|
| 65 |
"summary": "את הנוחות של המשתמש נוחות השירות והאינטואיטיביות של הממשק שירות לקוחות על הפנים מענה זמין יותר בשירות לקוחות שירות קל וידידותי למשתמש "
|
| 66 |
}
|
| 67 |
+
},
|
| 68 |
+
{
|
| 69 |
+
"query": "מה הנושא שהפריע להכי הרבה משתמשים?",
|
| 70 |
+
"response": {
|
| 71 |
+
"summary": "האתר סיבך את העניין את הנוחות של המשתמש חווית משתמש ממש לא טובה! מסורבל ולא נעים למשתמש אלופים. אחלה חווית משתמש"
|
| 72 |
+
}
|
| 73 |
+
},
|
| 74 |
+
{
|
| 75 |
+
"query": "חוויית משתמש",
|
| 76 |
+
"response": {
|
| 77 |
+
"summary": "נוחות משתמש חווית משתמש טובה וקלות תפעול את הנוחות של המשתמש מאוד חוויתי למשתמש חווית משתמש מעולה!"
|
| 78 |
+
}
|
| 79 |
+
},
|
| 80 |
+
{
|
| 81 |
+
"query": "מה המשתמשים אהבו במיוחד?",
|
| 82 |
+
"response": {
|
| 83 |
+
"summary": "חווית משתמש מעולה! מאוד חוויתי למשתמש כי זה היה ידידותי למשתמש.\nומובן.\nתודה רבה תמשיכו כך את הנוחות של המשתמש חווית משתמש מצויינת! עשיתם עבודה מעוררת השראה צוות הפרודקט"
|
| 84 |
+
}
|
| 85 |
}
|
| 86 |
]
|
app/config.py
CHANGED
|
@@ -13,7 +13,7 @@ class Settings:
|
|
| 13 |
gemini_api_key: str | None = os.getenv("GEMINI_API_KEY")
|
| 14 |
embedding_model_name: str = os.getenv(
|
| 15 |
"EMBEDDING_MODEL",
|
| 16 |
-
"sentence-transformers/paraphrase-multilingual-
|
| 17 |
)
|
| 18 |
vector_index_path: str = os.getenv("VECTOR_INDEX_PATH", ".vector_index/faiss.index")
|
| 19 |
vector_metadata_path: str = os.getenv("VECTOR_METADATA_PATH", ".vector_index/meta.parquet")
|
|
|
|
| 13 |
gemini_api_key: str | None = os.getenv("GEMINI_API_KEY")
|
| 14 |
embedding_model_name: str = os.getenv(
|
| 15 |
"EMBEDDING_MODEL",
|
| 16 |
+
"sentence-transformers/paraphrase-multilingual-mpnet-base-v2",
|
| 17 |
)
|
| 18 |
vector_index_path: str = os.getenv("VECTOR_INDEX_PATH", ".vector_index/faiss.index")
|
| 19 |
vector_metadata_path: str = os.getenv("VECTOR_METADATA_PATH", ".vector_index/meta.parquet")
|
app/rag_service.py
CHANGED
|
@@ -151,8 +151,8 @@ class RAGService:
|
|
| 151 |
|
| 152 |
# Check if response is too short (relaxed threshold - allow shorter responses if they're good)
|
| 153 |
word_count = len(response.split())
|
| 154 |
-
if word_count <
|
| 155 |
-
# Response is very short, try to get more detail
|
| 156 |
return self._request_fix(response, query, aggregates_str)
|
| 157 |
|
| 158 |
# Check if response seems too generic or just a list of examples (doesn't contain analysis)
|
|
@@ -203,28 +203,28 @@ class RAGService:
|
|
| 203 |
"לא מרוצה", "שונא", "שלילי", "רע", "גרוע", "דירוג נמוך", "דירוג 1", "דירוג 2",
|
| 204 |
"unsatisfied", "negative", "bad", "poor", "low rating", "rating 1", "rating 2"
|
| 205 |
])
|
| 206 |
-
if not (has_positive_terms and has_negative_terms) and word_count <
|
| 207 |
# Response doesn't cover both sides and is short, try to improve
|
| 208 |
return self._request_fix(response, query, aggregates_str)
|
| 209 |
|
| 210 |
-
# Relaxed validation - only fix if really problematic
|
| 211 |
-
if (not has_numbers or not has_analysis_terms) and word_count <
|
| 212 |
# Response seems too generic or lacks analysis, try to improve
|
| 213 |
return self._request_fix(response, query, aggregates_str)
|
| 214 |
|
| 215 |
-
if is_mostly_list and word_count <
|
| 216 |
# Response is mostly a list and very short, try to improve
|
| 217 |
return self._request_fix(response, query, aggregates_str)
|
| 218 |
|
| 219 |
-
if not has_business_terms and word_count <
|
| 220 |
# Response lacks business understanding and is short, try to improve
|
| 221 |
return self._request_fix(response, query, aggregates_str)
|
| 222 |
|
| 223 |
-
if is_fragmented and word_count <
|
| 224 |
# Response is too fragmented and short, try to improve
|
| 225 |
return self._request_fix(response, query, aggregates_str)
|
| 226 |
|
| 227 |
-
if not has_enough_paragraphs and word_count <
|
| 228 |
# Response doesn't have enough structure and is short, try to improve
|
| 229 |
return self._request_fix(response, query, aggregates_str)
|
| 230 |
|
|
@@ -271,19 +271,20 @@ class RAGService:
|
|
| 271 |
fix_prompt = (
|
| 272 |
f"התשובה הבאה לא מספקת - היא קצרה מדי, לא קוהרנטית, או רק רשימת נקודות קצרות. אנא כתוב תשובה חדשה ומתוקנת:\n\n"
|
| 273 |
f"דרישות לתשובה המתוקנת (חובה!):\n"
|
| 274 |
-
f"1. תשובה קוהרנטית, מפורטת ומקיפה בפסקאות מלאות (לפחות
|
| 275 |
f"2. אל תכתוב רשימת נקודות או רשימת משפטים קצרים - כתוב תשובה קוהרנטית בפסקאות מלאות\n"
|
| 276 |
-
f"3. כל פסקה צריכה להיות לפחות 4-
|
| 277 |
f"4. תשובה שמראה הבנה רחבה ומקיפה של כל הנתונים - לא רק רשימת משובים בודדים\n"
|
|
|
|
| 278 |
f"{feelings_instruction}"
|
| 279 |
-
f"
|
| 280 |
-
f"
|
| 281 |
-
f"
|
| 282 |
-
f"
|
| 283 |
-
f"
|
| 284 |
-
f"
|
| 285 |
-
f"
|
| 286 |
-
f"
|
| 287 |
f"התשובה המקורית (לא מספקת - אל תשתמש בה, רק כתוב תשובה חדשה):\n{original_response}\n\n"
|
| 288 |
f"אנא כתוב תשובה חדשה ומתוקנת שעומדת בכל הדרישות לעיל - תשובה קוהרנטית ומקיפה בפסקאות מלאות שמראה הבנה של כל הנתונים:"
|
| 289 |
)
|
|
@@ -325,7 +326,7 @@ class RAGService:
|
|
| 325 |
# If fix failed, return original with note
|
| 326 |
return f"{original_response}\n\n[הערה: התשובה עשויה להיות לא מלאה. אנא נסה שאילתה יותר ספציפית.]"
|
| 327 |
|
| 328 |
-
def synthesize(self, query: str, results: List[SearchResult], contexts: List[str], max_contexts: int =
|
| 329 |
"""Produce a free-form, analyst-style answer that synthesizes the retrieved contexts.
|
| 330 |
|
| 331 |
This method asks the LLM to act as an experienced data analyst for digital business
|
|
@@ -429,7 +430,7 @@ class RAGService:
|
|
| 429 |
"1. תשובותיך מבוססות רק על הנתונים שסופקו - אל תמציא\n"
|
| 430 |
"2. תן תשובה קוהרנטית ומקיפה שמראה הבנה של כל הנתונים\n"
|
| 431 |
"3. כל מספר חייב להיות מדויק מהנתונים\n"
|
| 432 |
-
"4. תשובה מפורטת (
|
| 433 |
"\n"
|
| 434 |
"איך לנתח:\n"
|
| 435 |
"- השתמש בסטטיסטיקות להבנת התמונה הגדולה\n"
|
|
@@ -437,25 +438,29 @@ class RAGService:
|
|
| 437 |
"- תמיד נתח שני צדדים: מרוצים (דירוג 4-5) ולא מרוצים (דירוג 1-2)\n"
|
| 438 |
"- השווה בין קבוצות משתמשים ושירותים\n"
|
| 439 |
"- השתמש בדוגמאות קונקרטיות להמחשה\n"
|
|
|
|
| 440 |
"\n"
|
| 441 |
"פורמט תשובה:\n"
|
| 442 |
"- תשובה קוהרנטית בפסקאות מלאות (לא רשימת נקודות)\n"
|
| 443 |
-
"- כל פסקה
|
| 444 |
"- כששואלים על רגשות: התחל בסיכום כללי, המשך בניתוח מרוצים, המשך בניתוח לא מרוצים, סיים בהמלצות\n"
|
| 445 |
-
"- כלול מספרים מדויקים ודוגמאות קונקרטיות\n"
|
| 446 |
"- כתוב בצורה טבעית וקולחת - כאילו אתה מסביר למנהל\n"
|
|
|
|
|
|
|
| 447 |
"\n"
|
| 448 |
"בדיקה אחרונה לפני שליחת התשובה - חובה לבדוק:\n"
|
| 449 |
-
"1. האם התשובה ארוכה ומקיפה מספיק (לפחות
|
| 450 |
"2. האם התשובה קוהרנטית ומראה הבנה של כל הנתונים (לא רק רשימת משובים)?\n"
|
| 451 |
"3. אם השאלה מתייחסת לרגשות/תחושות/דעות - האם התשובה כוללת ניתוח של שני הצדדים (מרוצים ולא מרוצים)?\n"
|
| 452 |
"4. האם התשובה מראה הבנה עסקית מעמיקה (משמעות, השפעה, המלצות)?\n"
|
| 453 |
-
"5. האם כל ה
|
| 454 |
-
"6. האם כל ה
|
| 455 |
-
"7. האם
|
| 456 |
-
"8. האם התשובה
|
| 457 |
-
"9. האם התשובה
|
| 458 |
-
"10. האם התשובה
|
|
|
|
| 459 |
"\n"
|
| 460 |
"אם התשובה לא עומדת בכל הקריטריונים לעיל, כתוב תשובה חדשה שעומדת בכל הקריטריונים.\n"
|
| 461 |
)
|
|
@@ -607,7 +612,7 @@ class RAGService:
|
|
| 607 |
f" - ציין שירותים ספציפיים מהניתוח\n"
|
| 608 |
f" - השתמש בדוגמאות הקונקרטיות מהמשובים - צטט או תאר משובים ספציפיים\n"
|
| 609 |
f" - כתוב בעברית מקצועית וקולחת\n"
|
| 610 |
-
f" - תן תשובה מפורטת ומקיפה (לפחות
|
| 611 |
f" - כל נושא צריך לקבל טיפול שווה ומפורט\n"
|
| 612 |
)
|
| 613 |
except Exception as e:
|
|
@@ -729,7 +734,7 @@ class RAGService:
|
|
| 729 |
f" - ציין שירותים ספציפיים מהניתוח\n"
|
| 730 |
f" - השתמש בדוגמאות הקונקרטיות מהמשובים - צטט או תאר משובים ספציפיים\n"
|
| 731 |
f" - כתוב בעברית מקצועית וקולחת\n"
|
| 732 |
-
f" - תן תשובה מפורטת ומקיפה (לפחות
|
| 733 |
f" - התמקד בנושא המרכזי/הדומיננטי ביותר, לא בכל הנושאים\n"
|
| 734 |
)
|
| 735 |
except Exception as e:
|
|
@@ -781,7 +786,7 @@ class RAGService:
|
|
| 781 |
f" * סיים עם סיכום והמלצות\n"
|
| 782 |
f"- השווה בין קבוצות משתמשים (מרוצים vs לא מרוצים) ושירותים שונים - מה המשמעות?\n"
|
| 783 |
f"- ציין שירותים ספציפיים ומספרים מדויקים מהנתונים\n"
|
| 784 |
-
f"- תן תשובה מפורטת (
|
| 785 |
f"- כלול תובנות עסקיות מעמיקות: מה המשמעות של הממצאים? מה ההשפעה על השירות?\n"
|
| 786 |
f"- כלול המלצות מעשיות וקונקרטיות - מה צריך לעשות?\n"
|
| 787 |
f"- כתוב בעברית מקצועית וקולחת - כאילו אתה אנליסט שמסביר את הממצאים למנהל\n"
|
|
@@ -796,10 +801,10 @@ class RAGService:
|
|
| 796 |
# Use generation config for longer, more detailed and creative responses
|
| 797 |
# Higher temperature for more creative, comprehensive analysis that covers both sides
|
| 798 |
generation_config = {
|
| 799 |
-
"temperature": 0.
|
| 800 |
"top_p": 0.95,
|
| 801 |
"top_k": 40,
|
| 802 |
-
"max_output_tokens":
|
| 803 |
}
|
| 804 |
resp = model.generate_content(prompt, generation_config=generation_config)
|
| 805 |
text = getattr(resp, "text", None)
|
|
@@ -818,8 +823,8 @@ class RAGService:
|
|
| 818 |
resp = client.chat.completions.create(
|
| 819 |
model="gpt-4o-mini",
|
| 820 |
messages=[{"role": "user", "content": prompt}],
|
| 821 |
-
temperature=0.
|
| 822 |
-
max_tokens=
|
| 823 |
)
|
| 824 |
response_text = resp.choices[0].message.content
|
| 825 |
if response_text:
|
|
@@ -866,7 +871,7 @@ class RAGService:
|
|
| 866 |
|
| 867 |
# Use a very large retrieval to get comprehensive understanding of the data
|
| 868 |
# This ensures the model sees a broad representation of all feedback
|
| 869 |
-
adjusted_k = max(top_k,
|
| 870 |
results = self.retrieve(query, top_k=adjusted_k, level_filter=level_filter)
|
| 871 |
contexts = [r.row[settings.text_column] for r in results]
|
| 872 |
# Use comprehensive synthesis that analyzes the full dataset, not just retrieved items
|
|
|
|
| 151 |
|
| 152 |
# Check if response is too short (relaxed threshold - allow shorter responses if they're good)
|
| 153 |
word_count = len(response.split())
|
| 154 |
+
if word_count < 400:
|
| 155 |
+
# Response is very short, try to get more detail (target is 600-800 words)
|
| 156 |
return self._request_fix(response, query, aggregates_str)
|
| 157 |
|
| 158 |
# Check if response seems too generic or just a list of examples (doesn't contain analysis)
|
|
|
|
| 203 |
"לא מרוצה", "שונא", "שלילי", "רע", "גרוע", "דירוג נמוך", "דירוג 1", "דירוג 2",
|
| 204 |
"unsatisfied", "negative", "bad", "poor", "low rating", "rating 1", "rating 2"
|
| 205 |
])
|
| 206 |
+
if not (has_positive_terms and has_negative_terms) and word_count < 500:
|
| 207 |
# Response doesn't cover both sides and is short, try to improve
|
| 208 |
return self._request_fix(response, query, aggregates_str)
|
| 209 |
|
| 210 |
+
# Relaxed validation - only fix if really problematic (target is 600-800 words)
|
| 211 |
+
if (not has_numbers or not has_analysis_terms) and word_count < 400:
|
| 212 |
# Response seems too generic or lacks analysis, try to improve
|
| 213 |
return self._request_fix(response, query, aggregates_str)
|
| 214 |
|
| 215 |
+
if is_mostly_list and word_count < 400:
|
| 216 |
# Response is mostly a list and very short, try to improve
|
| 217 |
return self._request_fix(response, query, aggregates_str)
|
| 218 |
|
| 219 |
+
if not has_business_terms and word_count < 500:
|
| 220 |
# Response lacks business understanding and is short, try to improve
|
| 221 |
return self._request_fix(response, query, aggregates_str)
|
| 222 |
|
| 223 |
+
if is_fragmented and word_count < 400:
|
| 224 |
# Response is too fragmented and short, try to improve
|
| 225 |
return self._request_fix(response, query, aggregates_str)
|
| 226 |
|
| 227 |
+
if not has_enough_paragraphs and word_count < 400:
|
| 228 |
# Response doesn't have enough structure and is short, try to improve
|
| 229 |
return self._request_fix(response, query, aggregates_str)
|
| 230 |
|
|
|
|
| 271 |
fix_prompt = (
|
| 272 |
f"התשובה הבאה לא מספקת - היא קצרה מדי, לא קוהרנטית, או רק רשימת נקודות קצרות. אנא כתוב תשובה חדשה ומתוקנת:\n\n"
|
| 273 |
f"דרישות לתשובה המתוקנת (חובה!):\n"
|
| 274 |
+
f"1. תשובה קוהרנטית, מפורטת מאוד ומקיפה בפסקאות מלאות (לפחות 7-10 פסקאות, לפחות 600-800 מילים)\n"
|
| 275 |
f"2. אל תכתוב רשימת נקודות או רשימת משפטים קצרים - כתוב תשובה קוהרנטית בפסקאות מלאות\n"
|
| 276 |
+
f"3. כל פסקה צריכה להיות לפחות 4-6 משפטים ארוכים ומפורטים\n"
|
| 277 |
f"4. תשובה שמראה הבנה רחבה ומקיפה של כל הנתונים - לא רק רשימת משובים בודדים\n"
|
| 278 |
+
f"5. הרחב על כל נקודה - תן הסברים מפורטים, דוגמאות מרובות, והשוואות מעמיקות\n"
|
| 279 |
f"{feelings_instruction}"
|
| 280 |
+
f"6. מבוססת אך ורק על הנתונים הסטטיסטיים הבאי��:\n{aggregates_str}\n"
|
| 281 |
+
f"7. עונה ישירות על השאלה: {query}\n"
|
| 282 |
+
f"8. כוללת מספרים מדויקים מהנתונים (כמה משתמשים, אחוזים, ממוצעים, וכו')\n"
|
| 283 |
+
f"9. מראה הבנה של דפוסים ונושאים מרכזיים - לא רק דוגמאות בודדות\n"
|
| 284 |
+
f"10. תשובה קוהרנטית ומקצועית - ניתוח מעמיק, לא רק חיבור של משובים\n"
|
| 285 |
+
f"11. כוללת תובנות עסקיות מעמיקות והמלצות מעשיות\n"
|
| 286 |
+
f"12. הגיונית, לוגית, וקשורה לשאלה - לא שטויות או גיבוב מילים\n"
|
| 287 |
+
f"13. כתובה בעברית מקצועית וקולחת\n\n"
|
| 288 |
f"התשובה המקורית (לא מספקת - אל תשתמש בה, רק כתוב תשובה חדשה):\n{original_response}\n\n"
|
| 289 |
f"אנא כתוב תשובה חדשה ומתוקנת שעומדת בכל הדרישות לעיל - תשובה קוהרנטית ומקיפה בפסקאות מלאות שמראה הבנה של כל הנתונים:"
|
| 290 |
)
|
|
|
|
| 326 |
# If fix failed, return original with note
|
| 327 |
return f"{original_response}\n\n[הערה: התשובה עשויה להיות לא מלאה. אנא נסה שאילתה יותר ספציפית.]"
|
| 328 |
|
| 329 |
+
def synthesize(self, query: str, results: List[SearchResult], contexts: List[str], max_contexts: int = 100, level_filter: Optional[tuple] = None) -> Optional[str]:
|
| 330 |
"""Produce a free-form, analyst-style answer that synthesizes the retrieved contexts.
|
| 331 |
|
| 332 |
This method asks the LLM to act as an experienced data analyst for digital business
|
|
|
|
| 430 |
"1. תשובותיך מבוססות רק על הנתונים שסופקו - אל תמציא\n"
|
| 431 |
"2. תן תשובה קוהרנטית ומקיפה שמראה הבנה של כל הנתונים\n"
|
| 432 |
"3. כל מספר חייב להיות מדויק מהנתונים\n"
|
| 433 |
+
"4. תשובה מפורטת מאוד וארוכה (7-10 פסקאות, 600-800 מילים לפחות)\n"
|
| 434 |
"\n"
|
| 435 |
"איך לנתח:\n"
|
| 436 |
"- השתמש בסטטיסטיקות להבנת התמונה הגדולה\n"
|
|
|
|
| 438 |
"- תמיד נתח שני צדדים: מרוצים (דירוג 4-5) ולא מרוצים (דירוג 1-2)\n"
|
| 439 |
"- השווה בין קבוצות משתמשים ושירותים\n"
|
| 440 |
"- השתמש בדוגמאות קונקרטיות להמחשה\n"
|
| 441 |
+
"- תן ניתוח מעמיק ומפורט - אל תחסך במילים\n"
|
| 442 |
"\n"
|
| 443 |
"פורמט תשובה:\n"
|
| 444 |
"- תשובה קוהרנטית בפסקאות מלאות (לא רשימת נקודות)\n"
|
| 445 |
+
"- כל פסקה 4-6 משפטים ארוכים ומפורטים\n"
|
| 446 |
"- כששואלים על רגשות: התחל בסיכום כללי, המשך בניתוח מרוצים, המשך בניתוח לא מרוצים, סיים בהמלצות\n"
|
| 447 |
+
"- כלול מספרים מדויקים ודוגמאות קונקרטיות רבות\n"
|
| 448 |
"- כתוב בצורה טבעית וקולחת - כאילו אתה מסביר למנהל\n"
|
| 449 |
+
"- תן תשובה ארוכה ומקיפה - לפחות 600-800 מילים, 7-10 פסקאות\n"
|
| 450 |
+
"- הרחב על כל נקודה - תן הסברים מפורטים, דוגמאות מרובות, והשוואות מעמיקות\n"
|
| 451 |
"\n"
|
| 452 |
"בדיקה אחרונה לפני שליחת התשובה - חובה לבדוק:\n"
|
| 453 |
+
"1. האם התשובה ארוכה ומקיפה מספיק (לפחות 600-800 מילים, 7-10 פסקאות)?\n"
|
| 454 |
"2. האם התשובה קוהרנטית ומראה הבנה של כל הנתונים (לא רק רשימת משובים)?\n"
|
| 455 |
"3. אם השאלה מתייחסת לרגשות/תחושות/דעות - האם התשובה כוללת ניתוח של שני הצדדים (מרוצים ולא מרוצים)?\n"
|
| 456 |
"4. האם התשובה מראה הבנה עסקית מעמיקה (משמעות, השפעה, המלצות)?\n"
|
| 457 |
+
"5. האם הרחבת על כל נקודה עם הסברים מפורטים ודוגמאות מרובות?\n"
|
| 458 |
+
"6. האם כל המספרים מדויקים מהנתונים?\n"
|
| 459 |
+
"7. האם כל השירותים קיימים בנתונים?\n"
|
| 460 |
+
"8. האם התשובה הגיונית ולוגית (לא שטויות)?\n"
|
| 461 |
+
"9. האם התשובה קשורה לשאלה שנשאלה?\n"
|
| 462 |
+
"10. האם התשובה מפורטת ומקצועית?\n"
|
| 463 |
+
"11. האם התשובה כוללת תובנות עסקיות והמלצות מעשיות?\n"
|
| 464 |
"\n"
|
| 465 |
"אם התשובה לא עומדת בכל הקריטריונים לעיל, כתוב תשובה חדשה שעומדת בכל הקריטריונים.\n"
|
| 466 |
)
|
|
|
|
| 612 |
f" - ציין שירותים ספציפיים מהניתוח\n"
|
| 613 |
f" - השתמש בדוגמאות הקונקרטיות מהמשובים - צטט או תאר משובים ספציפיים\n"
|
| 614 |
f" - כתוב בעברית מקצועית וקולחת\n"
|
| 615 |
+
f" - תן תשובה מפורטת מאוד ומקיפה (לפחות 700-900 מילים בסך הכל, 8-12 פסקאות)\n"
|
| 616 |
f" - כל נושא צריך לקבל טיפול שווה ומפורט\n"
|
| 617 |
)
|
| 618 |
except Exception as e:
|
|
|
|
| 734 |
f" - ציין שירותים ספציפיים מהניתוח\n"
|
| 735 |
f" - השתמש בדוגמאות הקונקרטיות מהמשובים - צטט או תאר משובים ספציפיים\n"
|
| 736 |
f" - כתוב בעברית מקצועית וקולחת\n"
|
| 737 |
+
f" - תן תשובה מפורטת מאוד ומקיפה (לפחות 600-800 מילים, 7-10 פסקאות)\n"
|
| 738 |
f" - התמקד בנושא המרכזי/הדומיננטי ביותר, לא בכל הנושאים\n"
|
| 739 |
)
|
| 740 |
except Exception as e:
|
|
|
|
| 786 |
f" * סיים עם סיכום והמלצות\n"
|
| 787 |
f"- השווה בין קבוצות משתמשים (מרוצים vs לא מרוצים) ושירותים שונים - מה המשמעות?\n"
|
| 788 |
f"- ציין שירותים ספציפיים ומספרים מדויקים מהנתונים\n"
|
| 789 |
+
f"- תן תשובה מפורטת מאוד (7-10 פסקאות, לפחות 600-800 מילים) המנתחת את הנתונים לעומק\n"
|
| 790 |
f"- כלול תובנות עסקיות מעמיקות: מה המשמעות של הממצאים? מה ההשפעה על השירות?\n"
|
| 791 |
f"- כלול המלצות מעשיות וקונקרטיות - מה צריך לעשות?\n"
|
| 792 |
f"- כתוב בעברית מקצועית וקולחת - כאילו אתה אנליסט שמסביר את הממצאים למנהל\n"
|
|
|
|
| 801 |
# Use generation config for longer, more detailed and creative responses
|
| 802 |
# Higher temperature for more creative, comprehensive analysis that covers both sides
|
| 803 |
generation_config = {
|
| 804 |
+
"temperature": 0.9, # Higher temperature for more creative and comprehensive responses
|
| 805 |
"top_p": 0.95,
|
| 806 |
"top_k": 40,
|
| 807 |
+
"max_output_tokens": 5000, # Increased for longer, more comprehensive responses
|
| 808 |
}
|
| 809 |
resp = model.generate_content(prompt, generation_config=generation_config)
|
| 810 |
text = getattr(resp, "text", None)
|
|
|
|
| 823 |
resp = client.chat.completions.create(
|
| 824 |
model="gpt-4o-mini",
|
| 825 |
messages=[{"role": "user", "content": prompt}],
|
| 826 |
+
temperature=0.9, # Higher temperature for more creative and comprehensive responses
|
| 827 |
+
max_tokens=4000, # Increased for longer, more comprehensive responses
|
| 828 |
)
|
| 829 |
response_text = resp.choices[0].message.content
|
| 830 |
if response_text:
|
|
|
|
| 871 |
|
| 872 |
# Use a very large retrieval to get comprehensive understanding of the data
|
| 873 |
# This ensures the model sees a broad representation of all feedback
|
| 874 |
+
adjusted_k = max(top_k, 100) # Use 100 records for comprehensive RAG-based analysis
|
| 875 |
results = self.retrieve(query, top_k=adjusted_k, level_filter=level_filter)
|
| 876 |
contexts = [r.row[settings.text_column] for r in results]
|
| 877 |
# Use comprehensive synthesis that analyzes the full dataset, not just retrieved items
|
app/static/app.js
CHANGED
|
@@ -60,7 +60,7 @@ async function sendQuery() {
|
|
| 60 |
return;
|
| 61 |
}
|
| 62 |
|
| 63 |
-
const body = { query: q, top_k:
|
| 64 |
|
| 65 |
// Show loading state
|
| 66 |
const sendBtn = document.getElementById('send');
|
|
|
|
| 60 |
return;
|
| 61 |
}
|
| 62 |
|
| 63 |
+
const body = { query: q, top_k: 100 }; // Use 100 records for comprehensive RAG-based analysis
|
| 64 |
|
| 65 |
// Show loading state
|
| 66 |
const sendBtn = document.getElementById('send');
|