davidtran999's picture
Upload backend/scripts/report_metrics.py with huggingface_hub
b0efede verified
raw
history blame
3.29 kB
import argparse
import os
import sys
from datetime import datetime, date
from pathlib import Path
import django
ROOT_DIR = Path(__file__).resolve().parents[2]
BACKEND_DIR = ROOT_DIR / "backend"
HUE_PORTAL_DIR = BACKEND_DIR / "hue_portal"
for path in (HUE_PORTAL_DIR, BACKEND_DIR, ROOT_DIR):
if str(path) not in sys.path:
sys.path.insert(0, str(path))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hue_portal.hue_portal.settings")
django.setup()
from django.db.models import Avg, Count, Q
from hue_portal.core.models import AuditLog, MLMetrics
def parse_args():
parser = argparse.ArgumentParser(description="Tổng hợp metrics ML hàng ngày")
parser.add_argument("--date", help="Ngày cần tổng hợp (YYYY-MM-DD), mặc định hôm nay")
return parser.parse_args()
def target_date(arg: str) -> date:
if not arg:
return date.today()
return datetime.strptime(arg, "%Y-%m-%d").date()
def compute_metrics(day: date) -> dict:
logs = AuditLog.objects.filter(created_at__date=day)
total = logs.count()
if total == 0:
return {
"date": day.isoformat(),
"total_requests": 0,
"intent_accuracy": None,
"average_latency_ms": None,
"error_rate": None,
"intent_breakdown": {},
}
latency_avg = logs.exclude(latency_ms__isnull=True).aggregate(avg=Avg("latency_ms"))["avg"]
errors = logs.filter(status__gte=400).count()
intents_with_conf = logs.filter(~Q(intent=""), status__lt=400)
intent_accuracy = None
if intents_with_conf.exists():
confident = intents_with_conf.filter(Q(confidence__gte=0.6) | Q(confidence__isnull=True)).count()
intent_accuracy = confident / intents_with_conf.count()
breakdown = (
logs.exclude(intent="")
.values("intent")
.annotate(count=Count("id"))
.order_by("intent")
)
breakdown_dict = {row["intent"]: row["count"] for row in breakdown}
return {
"date": day.isoformat(),
"total_requests": total,
"intent_accuracy": intent_accuracy,
"average_latency_ms": latency_avg,
"error_rate": errors / total,
"intent_breakdown": breakdown_dict,
}
def save_metrics(day: date, metrics: dict) -> MLMetrics:
obj, _ = MLMetrics.objects.update_or_create(
date=day,
defaults={
"total_requests": metrics["total_requests"],
"intent_accuracy": metrics["intent_accuracy"],
"average_latency_ms": metrics["average_latency_ms"],
"error_rate": metrics["error_rate"],
"intent_breakdown": metrics["intent_breakdown"],
},
)
return obj
def main():
args = parse_args()
day = target_date(args.date)
metrics = compute_metrics(day)
save_metrics(day, metrics)
print("=== ML Metrics ===")
print(f"Ngày: {metrics['date']}")
print(f"Tổng request: {metrics['total_requests']}")
print(f"Độ chính xác (ước tính): {metrics['intent_accuracy']}")
print(f"Latency trung bình (ms): {metrics['average_latency_ms']}")
print(f"Tỉ lệ lỗi: {metrics['error_rate']}")
print(f"Phân bổ intent: {metrics['intent_breakdown']}")
if __name__ == "__main__":
main()