galbendavids commited on
Commit
5c6f353
·
1 Parent(s): bc76b13

שיפורים משמעותיים: מודל embedding משופר, טמפרטורה 0.9, תשובות ארוכות יותר (600-800 מילים), 100 רשומות ל-RAG

Browse files
Files changed (4) hide show
  1. .query_history.json +18 -0
  2. app/config.py +1 -1
  3. app/rag_service.py +43 -38
  4. 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-MiniLM-L12-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")
 
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 < 150:
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 < 250:
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 < 200:
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 < 200:
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 < 300:
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 < 200:
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 < 200:
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. תשובה קוהרנטית, מפורטת ומקיפה בפסקאות מלאות (לפחות 5-7 פסקאות, לפחות 400-500 מילים)\n"
275
  f"2. אל תכתוב רשימת נקודות או רשימת משפטים קצרים - כתוב תשובה קוהרנטית בפסקאות מלאות\n"
276
- f"3. כל פסקה צריכה להיות לפחות 4-5 משפטים ארוכים ומפורטים\n"
277
  f"4. תשובה שמראה הבנה רחבה ומקיפה של כל הנתונים - לא רק רשימת משובים בודדים\n"
 
278
  f"{feelings_instruction}"
279
- f"5. מבוססת אך ורק על הנתונים הסטטיסטיים הבאים:\n{aggregates_str}\n"
280
- f"6. עונה ישירות על השאלה: {query}\n"
281
- f"7. כוללת מספרים מדויקים מהנתונים (כמה משתמשים, אחוזים, ממוצעים, וכו')\n"
282
- f"8. מראה הבנה של דפוסים ונושאים מרכזיים - לא רק דוגמאות בודדות\n"
283
- f"9. תשובה קוהרנטית ומקצועית - ניתוח מעמיק, לא רק חיבור של משובים\n"
284
- f"10. כוללת תובנות עסקיות מעמיקות והמלצות מעשיות\n"
285
- f"11. הגיונית, לוגית, וקשורה לשאלה - לא שטויות או גיבוב מילים\n"
286
- f"12. כתובה בעברית מקצועית וקולחת\n\n"
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 = 300, level_filter: Optional[tuple] = None) -> Optional[str]:
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. תשובה מפורטת (5-7 פסקאות, 400-500 מילים)\n"
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
- "- כל פסקה 3-4 משפטים ארוכים\n"
444
  "- כששואלים על רגשות: התחל בסיכום כללי, המשך בניתוח מרוצים, המשך בניתוח לא מרוצים, סיים בהמלצות\n"
445
- "- כלול מספרים מדויקים ודוגמאות קונקרטיות\n"
446
  "- כתוב בצורה טבעית וקולחת - כאילו אתה מסביר למנהל\n"
 
 
447
  "\n"
448
  "בדיקה אחרונה לפני שליחת התשובה - חובה לבדוק:\n"
449
- "1. האם התשובה ארוכה ומקיפה מספיק (לפחות 400-500 מילים)?\n"
450
  "2. האם התשובה קוהרנטית ומראה הבנה של כל הנתונים (לא רק רשימת משובים)?\n"
451
  "3. אם השאלה מתייחסת לרגשות/תחושות/דעות - האם התשובה כוללת ניתוח של שני הצדדים (מרוצים ולא מרוצים)?\n"
452
  "4. האם התשובה מראה הבנה עסקית מעמיקה (משמעות, השפעה, המלצות)?\n"
453
- "5. האם כל המספרים מדויקים מהנתונים?\n"
454
- "6. האם כל השירותים קיימים בנתונים?\n"
455
- "7. האם התשובה הגיונית ולוגית (לא ש��ויות)?\n"
456
- "8. האם התשובה קשורה לשאלה שנשאלה?\n"
457
- "9. האם התשובה מפורטת ומקצועית?\n"
458
- "10. האם התשובה כוללת תובנות עסקיות והמלצות מעשיות?\n"
 
459
  "\n"
460
  "אם התשובה לא עומדת בכל הקריטריונים לעיל, כתוב תשובה חדשה שעומדת בכל הקריטריונים.\n"
461
  )
@@ -607,7 +612,7 @@ class RAGService:
607
  f" - ציין שירותים ספציפיים מהניתוח\n"
608
  f" - השתמש בדוגמאות הקונקרטיות מהמשובים - צטט או תאר משובים ספציפיים\n"
609
  f" - כתוב בעברית מקצועית וקולחת\n"
610
- f" - תן תשובה מפורטת ומקיפה (לפחות 500-700 מילים בסך הכל)\n"
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" - תן תשובה מפורטת ומקיפה (לפחות 400-500 מילים)\n"
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"- תן תשובה מפורטת (5-7 פסקאות, לפחות 400-500 מילים) המנתחת את הנתונים לעומק\n"
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.85, # Higher temperature for more creative and comprehensive responses
800
  "top_p": 0.95,
801
  "top_k": 40,
802
- "max_output_tokens": 4000, # Increased for longer, more comprehensive responses
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.85, # Higher temperature for more creative and comprehensive responses
822
- max_tokens=3000, # Increased for longer, more comprehensive responses
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, 300) # Increased from 40 to 300 for comprehensive analysis
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: 300 }; // Use large top_k for comprehensive analysis
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');