| """
|
| CRANE AI - Reasoning Modülü
|
| """
|
|
|
| from typing import Dict, Any
|
| from core.base_module import BaseMicroModule
|
| import logging
|
|
|
| logger = logging.getLogger(__name__)
|
|
|
| class ReasonModule(BaseMicroModule):
|
| """Mantık yürütme için özelleşmiş modül"""
|
|
|
| def __init__(self, config: Dict[str, Any]):
|
| super().__init__(
|
| model_id="microsoft/Phi-3-mini-4k-instruct",
|
| config=config
|
| )
|
|
|
|
|
| self.reasoning_keywords = {
|
| "çünkü", "neden", "sebep", "niye", "nasıl", "analiz",
|
| "karşılaştır", "değerlendir", "açıkla", "kanıtla",
|
| "sonuç", "çıkarım", "mantık", "düşünce", "fikir",
|
| "strateji", "plan", "çözüm", "problem", "sorun",
|
| "avantaj", "dezavantaj", "fark", "benzerlik"
|
| }
|
|
|
|
|
| self.analysis_types = {
|
| "problem_solving", "comparison", "evaluation",
|
| "cause_effect", "strategy", "pros_cons"
|
| }
|
|
|
| def can_handle(self, query: str, context: Dict[str, Any]) -> float:
|
| """Mantık yürütme sorguları için uygunluk skoru"""
|
| query_lower = query.lower()
|
|
|
|
|
| reasoning_score = 0
|
| for keyword in self.reasoning_keywords:
|
| if keyword in query_lower:
|
| reasoning_score += 0.12
|
|
|
|
|
| if "neden" in query_lower or "çünkü" in query_lower:
|
| reasoning_score += 0.25
|
|
|
|
|
| if any(word in query_lower for word in ["karşılaştır", "fark", "benzer", "hangisi"]):
|
| reasoning_score += 0.2
|
|
|
|
|
| if any(word in query_lower for word in ["analiz", "değerlendir", "incele", "araştır"]):
|
| reasoning_score += 0.2
|
|
|
|
|
| if any(word in query_lower for word in ["problem", "sorun", "çözüm", "nasıl"]):
|
| reasoning_score += 0.15
|
|
|
|
|
| if len(query.split()) > 15:
|
| reasoning_score += 0.1
|
|
|
|
|
| return min(reasoning_score, 1.0)
|
|
|
| async def process(self, query: str, context: Dict[str, Any]) -> Dict[str, Any]:
|
| """Mantık yürütme işlemi"""
|
| try:
|
|
|
| analysis_type = self._detect_analysis_type(query)
|
|
|
|
|
| prompt = self._build_reasoning_prompt(query, context, analysis_type)
|
|
|
|
|
| response = await self.generate_response(
|
| prompt,
|
| max_tokens=self.config.get("max_tokens", 1024),
|
| temperature=0.3
|
| )
|
|
|
| return {
|
| "response": response,
|
| "module": "reason_module",
|
| "confidence": self.can_handle(query, context),
|
| "analysis_type": analysis_type,
|
| "reasoning_steps": self._extract_reasoning_steps(response)
|
| }
|
|
|
| except Exception as e:
|
| logger.error(f"Reasoning processing error: {str(e)}")
|
| return {
|
| "error": str(e),
|
| "module": "reason_module"
|
| }
|
|
|
| def _build_reasoning_prompt(self, query: str, context: Dict[str, Any], analysis_type: str) -> str:
|
| """Mantık yürütme için prompt hazırlar"""
|
|
|
|
|
| if analysis_type == "problem_solving":
|
| system_prompt = """Sen bir problem çözme uzmanısın. Sorunları adım adım analiz edip mantıklı çözümler üretiyorsun."""
|
| elif analysis_type == "comparison":
|
| system_prompt = """Sen bir karşılaştırma uzmanısın. Farklı seçenekleri objektif bir şekilde karşılaştırıyorsun."""
|
| elif analysis_type == "evaluation":
|
| system_prompt = """Sen bir değerlendirme uzmanısın. Durumları kapsamlı bir şekilde analiz ediyorsun."""
|
| elif analysis_type == "cause_effect":
|
| system_prompt = """Sen bir sebep-sonuç analizi uzmanısın. Olaylar arasındaki ilişkileri açıklıyorsun."""
|
| else:
|
| system_prompt = """Sen bir mantık yürütme uzmanısın. Karmaşık konuları açık ve anlaşılır şekilde analiz ediyorsun."""
|
|
|
|
|
| prompt = f"""{system_prompt}
|
|
|
| Kullanıcı sorusu: {query}
|
|
|
| Lütfen:
|
| 1. Konuyu kapsamlı analiz et
|
| 2. Mantık zincirini açıkla
|
| 3. Somut örnekler ver
|
| 4. Sonuçları net bir şekilde özetle
|
|
|
| Analiz türü: {analysis_type}
|
| """
|
|
|
|
|
| if context.get("history"):
|
| prompt += f"\nÖnceki konuşma: {context['history'][-1]}\n"
|
|
|
| return prompt
|
|
|
| def _detect_analysis_type(self, query: str) -> str:
|
| """Sorgudan analiz türünü tespit eder"""
|
| query_lower = query.lower()
|
|
|
|
|
| if any(word in query_lower for word in ["problem", "sorun", "çöz", "nasıl"]):
|
| return "problem_solving"
|
|
|
|
|
| if any(word in query_lower for word in ["karşılaştır", "fark", "hangisi", "seç"]):
|
| return "comparison"
|
|
|
|
|
| if any(word in query_lower for word in ["değerlendir", "incele", "analiz"]):
|
| return "evaluation"
|
|
|
|
|
| if any(word in query_lower for word in ["neden", "çünkü", "sebep", "sonuç"]):
|
| return "cause_effect"
|
|
|
|
|
| if any(word in query_lower for word in ["strateji", "plan", "yaklaşım"]):
|
| return "strategy"
|
|
|
|
|
| if any(word in query_lower for word in ["avantaj", "dezavantaj", "artı", "eksi"]):
|
| return "pros_cons"
|
|
|
|
|
| return "general_reasoning"
|
|
|
| def _extract_reasoning_steps(self, response: str) -> list:
|
| """Yanıttan mantık yürütme adımlarını çıkarır"""
|
| steps = []
|
|
|
|
|
| import re
|
| numbered_steps = re.findall(r'(\d+[\.\)])\s*([^\n]+)', response)
|
|
|
| for num, step in numbered_steps:
|
| steps.append({
|
| "step": num,
|
| "description": step.strip()
|
| })
|
|
|
|
|
| key_phrases = [
|
| "ilk olarak", "öncelikle", "birincisi",
|
| "ikincisi", "üçüncüsü", "son olarak",
|
| "sonuç olarak", "özetle", "bu nedenle"
|
| ]
|
|
|
| sentences = response.split('.')
|
| for sentence in sentences:
|
| sentence = sentence.strip()
|
| if any(phrase in sentence.lower() for phrase in key_phrases):
|
| if len(sentence) > 10:
|
| steps.append({
|
| "step": "auto",
|
| "description": sentence
|
| })
|
|
|
| return steps[:10] |