File size: 4,976 Bytes
25e927f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
"""
CRANE AI - Sohbet Modülü
"""
from typing import Dict, Any
from core.base_module import BaseMicroModule
import logging
logger = logging.getLogger(__name__)
class ChatModule(BaseMicroModule):
"""Genel sohbet için özelleşmiş modül"""
def __init__(self, config: Dict[str, Any]):
super().__init__(
model_id="Qwen/Qwen2.5-1.5B-Instruct",
config=config
)
# Sohbet anahtar kelimeleri
self.chat_keywords = {
"merhaba", "selam", "nasılsın", "naber", "günaydın",
"iyi akşamlar", "hoş geldin", "sohbet", "konuş",
"anlat", "düşün", "fikir", "görüş", "yardım",
"açıkla", "izah", "detay", "örnek", "hikaye"
}
# Genel konular
self.general_topics = {
"hava", "spor", "müzik", "film", "kitap", "yemek",
"seyahat", "hobiler", "oyun", "teknoloji", "tarih",
"kültür", "sanat", "bilim", "doğa", "eğitim"
}
def can_handle(self, query: str, context: Dict[str, Any]) -> float:
"""Sohbet sorguları için uygunluk skoru"""
query_lower = query.lower()
# Sohbet anahtar kelimelerini kontrol et
chat_score = 0
for keyword in self.chat_keywords:
if keyword in query_lower:
chat_score += 0.15
# Genel konuları kontrol et
for topic in self.general_topics:
if topic in query_lower:
chat_score += 0.1
# Soru işaretleri ve konuşma ifadeleri
if "?" in query or "nedir" in query_lower or "nasıl" in query_lower:
chat_score += 0.2
# Uzun açıklama gerektiren sorular
if any(word in query_lower for word in ["açıkla", "anlat", "detay", "neden"]):
chat_score += 0.25
# Kısa ve basit sorular için yüksek skor
if len(query.split()) <= 10:
chat_score += 0.1
# Maksimum 1.0 skor
return min(chat_score, 1.0)
async def process(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
"""Sohbet işlemi"""
try:
# Sohbet için özel prompt
prompt = self._build_chat_prompt(query, context)
# Yanıt üretimi
response = await self.generate_response(
prompt,
max_tokens=self.config.get("max_tokens", 1024),
temperature=0.7 # Sohbet için orta temperature
)
return {
"response": response,
"module": "chat_module",
"confidence": self.can_handle(query, context),
"conversation_type": self._detect_conversation_type(query)
}
except Exception as e:
logger.error(f"Chat processing error: {str(e)}")
return {
"error": str(e),
"module": "chat_module"
}
def _build_chat_prompt(self, query: str, context: Dict[str, Any]) -> str:
"""Sohbet için prompt hazırlar"""
# Konuşma geçmişi
history = context.get("history", [])
# Temel prompt
prompt = f"""Sen yardımsever, dostane ve zeki bir asistansın. Kullanıcılarla doğal bir şekilde sohbet ediyorsun.
Özellikler:
- Türkçe konuşuyorsun
- Samimi ve dostane bir ton kullanıyorsun
- Bilgilendirici ama sıkıcı olmayan yanıtlar veriyorsun
- Kullanıcının duygusal durumunu anlıyorsun
"""
# Konuşma geçmişi varsa ekle
if history:
prompt += "Önceki konuşma:\n"
for i, msg in enumerate(history[-3:]): # Son 3 mesajı al
prompt += f"{'Kullanıcı' if i % 2 == 0 else 'Asistan'}: {msg}\n"
prompt += "\n"
# Mevcut soru
prompt += f"Kullanıcı: {query}\nAsistan:"
return prompt
def _detect_conversation_type(self, query: str) -> str:
"""Konuşma türünü tespit eder"""
query_lower = query.lower()
# Selamlama
if any(word in query_lower for word in ["merhaba", "selam", "günaydın"]):
return "greeting"
# Soru
if "?" in query or any(word in query_lower for word in ["nedir", "nasıl", "neden"]):
return "question"
# Duygusal
if any(word in query_lower for word in ["üzgün", "mutlu", "kızgın", "heyecanlı"]):
return "emotional"
# Bilgi arama
if any(word in query_lower for word in ["açıkla", "anlat", "öğren", "bilgi"]):
return "information"
# Varsayılan
return "general" |