Novaai / modules /reason_module.py
veteroner's picture
CRANE AI sistemi yüklendi
25e927f verified
"""
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
)
# Mantık yürütme anahtar kelimeleri
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"
}
# Analiz türleri
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()
# Mantık yürütme anahtar kelimelerini kontrol et
reasoning_score = 0
for keyword in self.reasoning_keywords:
if keyword in query_lower:
reasoning_score += 0.12
# Soru türlerini kontrol et
if "neden" in query_lower or "çünkü" in query_lower:
reasoning_score += 0.25
# Karşılaştırma ifadeleri
if any(word in query_lower for word in ["karşılaştır", "fark", "benzer", "hangisi"]):
reasoning_score += 0.2
# Analiz gerektiren ifadeler
if any(word in query_lower for word in ["analiz", "değerlendir", "incele", "araştır"]):
reasoning_score += 0.2
# Problem çözme ifadeleri
if any(word in query_lower for word in ["problem", "sorun", "çözüm", "nasıl"]):
reasoning_score += 0.15
# Uzun ve karmaşık sorular
if len(query.split()) > 15:
reasoning_score += 0.1
# Maksimum 1.0 skor
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:
# Analiz türünü belirle
analysis_type = self._detect_analysis_type(query)
# Mantık yürütme için özel prompt
prompt = self._build_reasoning_prompt(query, context, analysis_type)
# Yanıt üretimi
response = await self.generate_response(
prompt,
max_tokens=self.config.get("max_tokens", 1024),
temperature=0.3 # Mantık yürütme için düşük temperature
)
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"""
# Analiz türüne göre özel prompt
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."""
# Temel prompt
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}
"""
# Bağlam varsa ekle
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()
# Problem çözme
if any(word in query_lower for word in ["problem", "sorun", "çöz", "nasıl"]):
return "problem_solving"
# Karşılaştırma
if any(word in query_lower for word in ["karşılaştır", "fark", "hangisi", "seç"]):
return "comparison"
# Değerlendirme
if any(word in query_lower for word in ["değerlendir", "incele", "analiz"]):
return "evaluation"
# Sebep-sonuç
if any(word in query_lower for word in ["neden", "çünkü", "sebep", "sonuç"]):
return "cause_effect"
# Strateji
if any(word in query_lower for word in ["strateji", "plan", "yaklaşım"]):
return "strategy"
# Avantaj-dezavantaj
if any(word in query_lower for word in ["avantaj", "dezavantaj", "artı", "eksi"]):
return "pros_cons"
# Varsayılan
return "general_reasoning"
def _extract_reasoning_steps(self, response: str) -> list:
"""Yanıttan mantık yürütme adımlarını çıkarır"""
steps = []
# Numaralı adımları bul
import re
numbered_steps = re.findall(r'(\d+[\.\)])\s*([^\n]+)', response)
for num, step in numbered_steps:
steps.append({
"step": num,
"description": step.strip()
})
# Anahtar kelimelerle adımları bul
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: # Çok kısa olanları atla
steps.append({
"step": "auto",
"description": sentence
})
return steps[:10] # Maksimum 10 adım