Провайдер сменил версию embeddings
Embedding-модели у провайдеров регулярно подменяются под старым именем
(text-embedding-3-small обновляется без анонса). Старые векторы в Qdrant
становятся несовместимы с новыми запросами — поиск молча возвращает
мусор.
Простой канарейный тест: фиксированный набор (query, expected_top_id)
прогоняем раз в час, алёртим, если top-1 поменялся.
import os, json, requestsfrom openai import OpenAI
oai = OpenAI()PAIRS = json.load(open("embed-canaries.json")) # [{q, expected_id}, ...]STATE = "/tmp/embed-canaries.json"
def handler(event, context): drift = [] for c in PAIRS: v = oai.embeddings.create(model="text-embedding-3-small", input=c["q"]).data[0].embedding top = qdrant_search(v, top_k=1)[0] if top.id != c["expected_id"]: drift.append((c["q"], c["expected_id"], top.id))
prev = json.load(open(STATE)) if os.path.exists(STATE) else [] if drift and drift != prev: body = "\n".join(f"• {q[:50]} → ожидался {a}, стал {b}" for q, a, b in drift) push("🧭 Embeddings drift", f"Top-1 изменился на {len(drift)} канарейках:\n{body}", priority=9) json.dump(drift, open(STATE, "w")) return {"statusCode": 200}
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)Связанные рецепты
Заголовок раздела «Связанные рецепты»- Vector DB / RAG — куда складываются эти векторы.
- Просадка eval / качества — итоговая регрессия.