SamiKoen commited on
Commit
1c9ebba
·
verified ·
1 Parent(s): 95bc64a

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +65 -15
  2. enhanced_features.py +178 -7
app.py CHANGED
@@ -6,6 +6,8 @@ import xml.etree.ElementTree as ET
6
  import schedule
7
  import time
8
  import threading
 
 
9
  from huggingface_hub import HfApi, create_repo, hf_hub_download
10
  import warnings
11
  import pandas as pd
@@ -25,7 +27,8 @@ from prompts import get_prompt_content_only
25
  # Enhanced features import et
26
  from enhanced_features import (
27
  initialize_enhanced_features, process_image_message,
28
- handle_comparison_request, get_user_recommendations, profile_manager
 
29
  )
30
  from image_renderer import extract_product_info_for_gallery, format_message_with_images
31
 
@@ -330,17 +333,17 @@ def chatbot_fn(user_message, history, image=None):
330
  return
331
 
332
  # Enhanced features - Kişisel öneriler
333
- user_id = "default_user" # Gerçek uygulamada session ID kullanılır
 
 
 
 
 
 
 
334
  recommendation_result = get_user_recommendations(user_id, user_message)
335
  if recommendation_result:
336
- # Kullanıcı etkileşimini kaydet
337
- try:
338
- profile_manager.add_interaction(user_id, "recommendation_request", {
339
- "message": user_message,
340
- "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
341
- })
342
- except Exception as e:
343
- print(f"Profile save error: {e}")
344
  yield recommendation_result
345
  return
346
 
@@ -362,6 +365,30 @@ def chatbot_fn(user_message, history, image=None):
362
  # Döküman verilerini sistem mesajlarına ekle
363
  if document_content:
364
  system_messages.append({"role": "system", "content": f"Dökümanlardan gelen bilgiler: {document_content}"})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
 
366
  # Kullanıcı mesajında ürün ismi geçiyorsa ekle
367
  input_words = user_message.lower().split()
@@ -805,10 +832,22 @@ with gr.Blocks(css=custom_css, theme="soft", title="Trek Asistanı") as demo:
805
  elem_id="msg-input"
806
  )
807
 
808
- def respond(message, chat_history):
 
 
 
809
  if not message.strip():
810
- return "", chat_history
811
 
 
 
 
 
 
 
 
 
 
812
  # Chat history'yi chatbot_fn için uygun formata çevir
813
  formatted_history = []
814
  if chat_history:
@@ -829,7 +868,18 @@ with gr.Blocks(css=custom_css, theme="soft", title="Trek Asistanı") as demo:
829
  if chat_history is None:
830
  chat_history = []
831
  chat_history.append((message, response))
832
- return "", chat_history
 
 
 
 
 
 
 
 
 
 
 
833
 
834
  except Exception as e:
835
  error_msg = f"Üzgünüm, bir hata oluştu: {str(e)}"
@@ -837,9 +887,9 @@ with gr.Blocks(css=custom_css, theme="soft", title="Trek Asistanı") as demo:
837
  if chat_history is None:
838
  chat_history = []
839
  chat_history.append((message, error_msg))
840
- return "", chat_history
841
 
842
- msg.submit(respond, [msg, chatbot], [msg, chatbot])
843
 
844
  if __name__ == "__main__":
845
  demo.launch(debug=True)
 
6
  import schedule
7
  import time
8
  import threading
9
+ import uuid
10
+ import hashlib
11
  from huggingface_hub import HfApi, create_repo, hf_hub_download
12
  import warnings
13
  import pandas as pd
 
27
  # Enhanced features import et
28
  from enhanced_features import (
29
  initialize_enhanced_features, process_image_message,
30
+ handle_comparison_request, get_user_recommendations, profile_manager,
31
+ get_user_profile_summary, get_user_chat_context
32
  )
33
  from image_renderer import extract_product_info_for_gallery, format_message_with_images
34
 
 
333
  return
334
 
335
  # Enhanced features - Kişisel öneriler
336
+ user_id = getattr(chatbot_fn, '_current_session_id', 'default_user')
337
+
338
+ # Profil sorguları kontrol et
339
+ if any(keyword in user_message.lower() for keyword in ["profil", "tercih", "geçmiş", "hatırla", "kaydet"]):
340
+ profile_summary = get_user_profile_summary(user_id)
341
+ yield profile_summary
342
+ return
343
+
344
  recommendation_result = get_user_recommendations(user_id, user_message)
345
  if recommendation_result:
346
+ # Kullanıcı etkileşimini kaydet (artık get_user_recommendations içinde)
 
 
 
 
 
 
 
347
  yield recommendation_result
348
  return
349
 
 
365
  # Döküman verilerini sistem mesajlarına ekle
366
  if document_content:
367
  system_messages.append({"role": "system", "content": f"Dökümanlardan gelen bilgiler: {document_content}"})
368
+
369
+ # Kullanıcı profil bilgilerini ve geçmiş kontekstini ekle
370
+ try:
371
+ user_id = getattr(chatbot_fn, '_current_session_id', 'default_user')
372
+ profile = profile_manager.get_or_create_profile(user_id)
373
+ preferences = profile.get("preferences", {})
374
+
375
+ # Kullanıcı tercihlerini sistem mesajı olarak ekle
376
+ if any(preferences.values()):
377
+ pref_info = []
378
+ if preferences.get("bike_category"):
379
+ pref_info.append(f"Kategori: {preferences['bike_category']}")
380
+ if preferences.get("budget_range"):
381
+ pref_info.append(f"Bütçe: {preferences['budget_range'][0]:,.0f}-{preferences['budget_range'][1]:,.0f} TL")
382
+ if preferences.get("usage_purpose"):
383
+ pref_info.append(f"Kullanım amacı: {preferences['usage_purpose']}")
384
+
385
+ if pref_info:
386
+ system_messages.append({
387
+ "role": "system",
388
+ "content": f"KULLANICI TERÇİHLERİ: {', '.join(pref_info)}. Bu bilgileri dikkate alarak daha kişiselleştirilmiş öneriler sun."
389
+ })
390
+ except Exception as e:
391
+ print(f"Profile context error: {e}")
392
 
393
  # Kullanıcı mesajında ürün ismi geçiyorsa ekle
394
  input_words = user_message.lower().split()
 
832
  elem_id="msg-input"
833
  )
834
 
835
+ # Session state için gizli bileşen
836
+ session_state = gr.State({})
837
+
838
+ def respond(message, chat_history, session_state):
839
  if not message.strip():
840
+ return "", chat_history, session_state
841
 
842
+ # Session ID oluştur veya mevcut olanı kullan
843
+ if not session_state or 'session_id' not in session_state:
844
+ # Browser fingerprint benzeri benzersiz ID oluştur
845
+ session_id = str(uuid.uuid4())[:8] + hashlib.md5(str(time.time()).encode()).hexdigest()[:8]
846
+ session_state = {'session_id': session_id}
847
+
848
+ # Session ID'yi chatbot_fn'e geç
849
+ chatbot_fn._current_session_id = session_state['session_id']
850
+
851
  # Chat history'yi chatbot_fn için uygun formata çevir
852
  formatted_history = []
853
  if chat_history:
 
868
  if chat_history is None:
869
  chat_history = []
870
  chat_history.append((message, response))
871
+
872
+ # Kullanıcı profiline sohbet geçmişini kaydet
873
+ try:
874
+ profile_manager.add_interaction(session_state['session_id'], "chat_message", {
875
+ "user_message": message,
876
+ "bot_response": response,
877
+ "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
878
+ })
879
+ except Exception as e:
880
+ print(f"Profile chat save error: {e}")
881
+
882
+ return "", chat_history, session_state
883
 
884
  except Exception as e:
885
  error_msg = f"Üzgünüm, bir hata oluştu: {str(e)}"
 
887
  if chat_history is None:
888
  chat_history = []
889
  chat_history.append((message, error_msg))
890
+ return "", chat_history, session_state
891
 
892
+ msg.submit(respond, [msg, chatbot, session_state], [msg, chatbot, session_state])
893
 
894
  if __name__ == "__main__":
895
  demo.launch(debug=True)
enhanced_features.py CHANGED
@@ -70,7 +70,76 @@ class UserProfileManager:
70
  profile["interaction_history"].append(interaction)
71
  # Son 50 etkileşimi tut
72
  profile["interaction_history"] = profile["interaction_history"][-50:]
 
 
 
 
73
  self.save_profiles()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
 
75
  class VisualAI:
76
  """Görsel AI işlemleri"""
@@ -356,9 +425,79 @@ def handle_comparison_request(user_message):
356
  print(f"Comparison error: {e}")
357
  return None
358
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
359
  def get_user_recommendations(user_id, user_message):
360
  """Kullanıcıya özel öneriler al"""
361
  try:
 
 
 
 
 
 
362
  # Bütçe sorgusu varsa
363
  if "bütçe" in user_message.lower() or "budget" in user_message.lower():
364
  # Rakamları çıkarmaya çalış
@@ -376,15 +515,47 @@ def get_user_recommendations(user_id, user_message):
376
  for product in recommendations[:3]:
377
  rec_text += f"• {product[2]} - {product[1][1]} TL\n"
378
  return rec_text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
 
380
- # Genel kişisel öneriler
381
  if personalized_recommendations:
382
- suggestions = personalized_recommendations.get_personalized_suggestions(user_id)
383
- if suggestions:
384
- sug_text = "Size özel önerilerimiz:\n\n"
385
- for product in suggestions:
386
- sug_text += f"• {product[2]} - {product[1][1]} TL\n"
387
- return sug_text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
388
 
389
  return None
390
  except Exception as e:
 
70
  profile["interaction_history"].append(interaction)
71
  # Son 50 etkileşimi tut
72
  profile["interaction_history"] = profile["interaction_history"][-50:]
73
+
74
+ # Otomatik tercih çıkarımı
75
+ self._extract_preferences_from_interaction(user_id, interaction_type, data)
76
+
77
  self.save_profiles()
78
+
79
+ def _extract_preferences_from_interaction(self, user_id, interaction_type, data):
80
+ """Etkileşimden otomatik tercih çıkarımı"""
81
+ profile = self.get_or_create_profile(user_id)
82
+
83
+ if interaction_type == "chat_message":
84
+ user_message = data.get("user_message", "").lower()
85
+
86
+ # Bütçe tespiti
87
+ import re
88
+ if "bütçe" in user_message or "budget" in user_message:
89
+ numbers = re.findall(r'\d+', user_message)
90
+ if len(numbers) >= 1:
91
+ try:
92
+ budget_value = int(numbers[0]) * 1000 # K TL formatı için
93
+ if budget_value > 10000: # Makul bütçe aralığı
94
+ current_budget = profile["preferences"].get("budget_range")
95
+ if not current_budget:
96
+ # Bütçe aralığını tahmin et
97
+ budget_max = budget_value * 1.5
98
+ profile["preferences"]["budget_range"] = [budget_value, budget_max]
99
+ except ValueError:
100
+ pass
101
+
102
+ # Bisiklet kategorisi tespiti
103
+ bike_categories = {
104
+ "dağ": "dağ bisikleti",
105
+ "mountain": "dağ bisikleti",
106
+ "mtb": "dağ bisikleti",
107
+ "yol": "yol bisikleti",
108
+ "road": "yol bisikleti",
109
+ "şehir": "şehir bisikleti",
110
+ "city": "şehir bisikleti",
111
+ "urban": "şehir bisikleti",
112
+ "elektrikli": "elektrikli bisiklet",
113
+ "electric": "elektrikli bisiklet",
114
+ "e-bike": "elektrikli bisiklet",
115
+ "gravel": "gravel bisiklet"
116
+ }
117
+
118
+ for keyword, category in bike_categories.items():
119
+ if keyword in user_message:
120
+ profile["preferences"]["bike_category"] = category
121
+ break
122
+
123
+ # Kullanım amacı tespiti
124
+ usage_purposes = {
125
+ "işe": "günlük ulaşım",
126
+ "work": "günlük ulaşım",
127
+ "spor": "spor ve egzersiz",
128
+ "sport": "spor ve egzersiz",
129
+ "egzersiz": "spor ve egzersiz",
130
+ "fitness": "spor ve egzersiz",
131
+ "tur": "tur ve gezi",
132
+ "tour": "tur ve gezi",
133
+ "gezi": "tur ve gezi",
134
+ "yarış": "yarış ve performans",
135
+ "race": "yarış ve performans",
136
+ "performance": "yarış ve performans"
137
+ }
138
+
139
+ for keyword, purpose in usage_purposes.items():
140
+ if keyword in user_message:
141
+ profile["preferences"]["usage_purpose"] = purpose
142
+ break
143
 
144
  class VisualAI:
145
  """Görsel AI işlemleri"""
 
425
  print(f"Comparison error: {e}")
426
  return None
427
 
428
+ def get_user_chat_context(user_id, limit=5):
429
+ """Son sohbet geçmişini kontekst için al"""
430
+ try:
431
+ profile = profile_manager.get_or_create_profile(user_id)
432
+ interactions = profile.get("interaction_history", [])
433
+
434
+ # Son chat mesajlarını al
435
+ chat_messages = []
436
+ for interaction in reversed(interactions):
437
+ if interaction['type'] == 'chat_message' and len(chat_messages) < limit:
438
+ data = interaction['data']
439
+ chat_messages.append({
440
+ "user": data.get('user_message', ''),
441
+ "assistant": data.get('bot_response', ''),
442
+ "timestamp": data.get('timestamp', '')
443
+ })
444
+
445
+ return list(reversed(chat_messages)) # Kronolojik sıra
446
+
447
+ except Exception as e:
448
+ print(f"Chat context error: {e}")
449
+ return []
450
+
451
+ def get_user_profile_summary(user_id):
452
+ """Kullanıcı profil özetini döndür"""
453
+ try:
454
+ profile = profile_manager.get_or_create_profile(user_id)
455
+ preferences = profile.get("preferences", {})
456
+
457
+ if not any(preferences.values()):
458
+ return "Henüz tercihleriniz kaydedilmemiş. Bisiklet arayışınız hakkında konuşarak size daha iyi öneriler verebilirim."
459
+
460
+ summary = "🔄 **Kaydedilen Tercihleriniz:**\n\n"
461
+
462
+ if preferences.get("bike_category"):
463
+ summary += f"🚲 **Bisiklet Kategorisi:** {preferences['bike_category']}\n"
464
+
465
+ if preferences.get("budget_range"):
466
+ budget_min, budget_max = preferences['budget_range']
467
+ summary += f"💰 **Bütçe Aralığı:** {budget_min:,.0f} - {budget_max:,.0f} TL\n"
468
+
469
+ if preferences.get("usage_purpose"):
470
+ summary += f"🎯 **Kullanım Amacı:** {preferences['usage_purpose']}\n"
471
+
472
+ if preferences.get("size"):
473
+ summary += f"📏 **Boyut:** {preferences['size']}\n"
474
+
475
+ # Son etkileşimler
476
+ interactions = profile.get("interaction_history", [])
477
+ if interactions:
478
+ recent_chats = [i for i in interactions[-5:] if i['type'] == 'chat_message']
479
+ if recent_chats:
480
+ summary += f"\n📝 **Son {len(recent_chats)} Sohbet:**\n"
481
+ for chat in recent_chats:
482
+ timestamp = chat['data'].get('timestamp', 'Bilinmiyor')
483
+ summary += f"• {timestamp}: Sohbet\n"
484
+
485
+ summary += "\n*Bu tercihler sohbetlerimizden otomatik olarak çıkarıldı.*"
486
+ return summary
487
+
488
+ except Exception as e:
489
+ print(f"Profile summary error: {e}")
490
+ return "Profil bilgilerine şu anda erişilemiyor."
491
+
492
  def get_user_recommendations(user_id, user_message):
493
  """Kullanıcıya özel öneriler al"""
494
  try:
495
+ # Kullanıcı etkileşimini kaydet (tercih çıkarımı için)
496
+ profile_manager.add_interaction(user_id, "recommendation_query", {
497
+ "message": user_message,
498
+ "timestamp": datetime.now().isoformat()
499
+ })
500
+
501
  # Bütçe sorgusu varsa
502
  if "bütçe" in user_message.lower() or "budget" in user_message.lower():
503
  # Rakamları çıkarmaya çalış
 
515
  for product in recommendations[:3]:
516
  rec_text += f"• {product[2]} - {product[1][1]} TL\n"
517
  return rec_text
518
+ elif len(numbers) >= 1 and personalized_recommendations:
519
+ # Tek sayı varsa aralık oluştur
520
+ budget_center = int(numbers[0]) * 1000
521
+ budget_min = int(budget_center * 0.8)
522
+ budget_max = int(budget_center * 1.2)
523
+ recommendations = personalized_recommendations.get_budget_recommendations(
524
+ user_id, budget_min, budget_max
525
+ )
526
+
527
+ if recommendations:
528
+ rec_text = f"{numbers[0]}K TL bütçenize uygun öneriler:\n\n"
529
+ for product in recommendations[:3]:
530
+ rec_text += f"• {product[2]} - {product[1][1]} TL\n"
531
+ return rec_text
532
 
533
+ # Kullanıcı profili tercihleri varsa öneri ver
534
  if personalized_recommendations:
535
+ profile = profile_manager.get_or_create_profile(user_id)
536
+ preferences = profile.get("preferences", {})
537
+
538
+ # Eğer kullanıcının kaydedilmiş tercihleri varsa
539
+ if any(preferences.values()):
540
+ suggestions = personalized_recommendations.get_personalized_suggestions(user_id)
541
+ if suggestions:
542
+ sug_text = "Tercihlerinize göre önerilerimiz:\n\n"
543
+ for product in suggestions[:3]:
544
+ sug_text += f"• {product[2]} - {product[1][1]} TL\n"
545
+
546
+ # Tercih özetini ekle
547
+ pref_summary = []
548
+ if preferences.get("bike_category"):
549
+ pref_summary.append(f"Kategori: {preferences['bike_category']}")
550
+ if preferences.get("budget_range"):
551
+ pref_summary.append(f"Bütçe: {preferences['budget_range'][0]:,.0f}-{preferences['budget_range'][1]:,.0f} TL")
552
+ if preferences.get("usage_purpose"):
553
+ pref_summary.append(f"Kullanım: {preferences['usage_purpose']}")
554
+
555
+ if pref_summary:
556
+ sug_text += f"\n*Kaydedilen tercihleriniz: {', '.join(pref_summary)}*"
557
+
558
+ return sug_text
559
 
560
  return None
561
  except Exception as e: