Перейти к содержимому

Всплеск галлюцинаций

«Галлюцинации» нельзя поймать единым правилом, но можно посчитать суррогатные сигналы:

  • доля ответов, которые не парсятся как ожидаемая JSON-схема;
  • логпробы / confidence_score ниже порога;
  • судья-LLM ставит 0 чаще, чем обычно;
  • регекс-санчек («модель назвала несуществующее поле БД»);
  • ссылки в ответе, которые отдают 404.
import os, json, time, requests, statistics
WIN = []
def observe(answer_dict):
score = 0
if not answer_dict.get("parsed"): score += 1
if answer_dict.get("logprob_mean", 0) < -2: score += 1
if answer_dict.get("judge", 1) == 0: score += 1
WIN.append(score)
if len(WIN) > 200: WIN.pop(0)
if len(WIN) >= 50:
rate = statistics.mean([1 if x else 0 for x in WIN])
if rate > 0.20:
push("👻 Hallucination spike",
f"Подозрительные ответы: {int(rate*100)}% за окно {len(WIN)}",
priority=8)
def push(t, m, p):
requests.post(f"{os.environ['NOTIFLY_URL']}/message",
params={"token": os.environ["NOTIFLY_TOKEN"]},
json={"title": t, "message": m, "priority": p}, timeout=5)

Положите этот счётчик в Redis — он переживёт рестарты и охватит все инстансы.