import numpy as np import joblib from sklearn.linear_model import LogisticRegression from app.models.feedback_model import Feedback from app.db.database import SessionLocal from pathlib import Path from app.ai.model_loader import model_loader from app.core.config import settings def get_model_path(): return Path(settings.MODEL_DIR) / model_loader.get_latest_model_version() def retrain_from_feedback(): db = SessionLocal() data = db.query(Feedback).all() if len(data) < 10: print("Not enough feedback to retrain") db.close() return X = [] y = [] batch = data[:10] for row in batch: X.append([row.freq_score, row.cnn_score]) y.append(1 if row.label == "ai" else 0) X = np.array(X) y = np.array(y) model = LogisticRegression() model.fit(X, y) joblib.dump(model, get_model_path()) print("Model retrained on real feedback data") for row in batch: db.delete(row) db.commit() db.close() def train_meta_model(): X = np.array([ [0.6, 0.5], [0.7, 0.6], [0.8, 0.7], [0.9, 0.8], [1.0, 0.9], [1.1, 1.0], [1.2, 1.1], [1.3, 1.2], [1.4, 1.3], [1.5, 1.4], ]) y = np.array([ 0,0,0,0,0, 1,1,1,1,1 ]) model = LogisticRegression() model.fit(X, y) joblib.dump(model, get_model_path()) def load_model(): model_path = get_model_path() if not model_path.exists(): train_meta_model() return joblib.load(model_path) def predict_ai(freq_score: float, cnn_score: float): model = load_model() X = np.array([[freq_score, cnn_score]]) prob = model.predict_proba(X)[0][1] if prob > 0.75: label = "Likely AI Generated" elif prob > 0.45: label = "Suspicious" else: label = "Likely Real" return label, float(prob)