|
|
"""
|
|
|
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] |