|
|
"""
|
|
|
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
|
|
|
)
|
|
|
|
|
|
|
|
|
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"
|
|
|
}
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
chat_score = 0
|
|
|
for keyword in self.chat_keywords:
|
|
|
if keyword in query_lower:
|
|
|
chat_score += 0.15
|
|
|
|
|
|
|
|
|
for topic in self.general_topics:
|
|
|
if topic in query_lower:
|
|
|
chat_score += 0.1
|
|
|
|
|
|
|
|
|
if "?" in query or "nedir" in query_lower or "nasıl" in query_lower:
|
|
|
chat_score += 0.2
|
|
|
|
|
|
|
|
|
if any(word in query_lower for word in ["açıkla", "anlat", "detay", "neden"]):
|
|
|
chat_score += 0.25
|
|
|
|
|
|
|
|
|
if len(query.split()) <= 10:
|
|
|
chat_score += 0.1
|
|
|
|
|
|
|
|
|
return min(chat_score, 1.0)
|
|
|
|
|
|
async def process(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
"""Sohbet işlemi"""
|
|
|
try:
|
|
|
|
|
|
prompt = self._build_chat_prompt(query, context)
|
|
|
|
|
|
|
|
|
response = await self.generate_response(
|
|
|
prompt,
|
|
|
max_tokens=self.config.get("max_tokens", 1024),
|
|
|
temperature=0.7
|
|
|
)
|
|
|
|
|
|
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"""
|
|
|
|
|
|
|
|
|
history = context.get("history", [])
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
if history:
|
|
|
prompt += "Önceki konuşma:\n"
|
|
|
for i, msg in enumerate(history[-3:]):
|
|
|
prompt += f"{'Kullanıcı' if i % 2 == 0 else 'Asistan'}: {msg}\n"
|
|
|
prompt += "\n"
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
if any(word in query_lower for word in ["merhaba", "selam", "günaydın"]):
|
|
|
return "greeting"
|
|
|
|
|
|
|
|
|
if "?" in query or any(word in query_lower for word in ["nedir", "nasıl", "neden"]):
|
|
|
return "question"
|
|
|
|
|
|
|
|
|
if any(word in query_lower for word in ["üzgün", "mutlu", "kızgın", "heyecanlı"]):
|
|
|
return "emotional"
|
|
|
|
|
|
|
|
|
if any(word in query_lower for word in ["açıkla", "anlat", "öğren", "bilgi"]):
|
|
|
return "information"
|
|
|
|
|
|
|
|
|
return "general" |