Перестройка векторного индекса завершена
Полная перестройка индекса (краулинг → чанкинг → embeddings → upsert) может идти от минут до часов. Уходить проверять терминал каждые пять минут — не вариант, а тихий провал переиндексации означает, что RAG до утра отвечает по старым данным. Пингуем себя в момент завершения — успешного или нет.
1. Обёртка вокруг джобы переиндексации
Заголовок раздела «1. Обёртка вокруг джобы переиндексации»import os, time, requests
def reindex_all(source_docs): t0 = time.time() total = len(source_docs) indexed = 0 skipped = []
for doc in source_docs: try: chunks = chunk_and_embed(doc) # ваша логика upsert_to_vector_db(chunks) indexed += 1 except Exception as e: skipped.append((doc["id"], f"{type(e).__name__}: {e}"))
dur = int(time.time() - t0) ok = len(skipped) == 0
lines = "\n".join(f"• {i}: {err}" for i, err in skipped[:10]) notify( f"{'🟢' if ok else '🟡'} Переиндексация завершена", f"Документов: {indexed}/{total}\n" f"Пропущено: {len(skipped)}\n" f"Длительность: {dur // 60} мин {dur % 60} с\n" + (f"\nПервые ошибки:\n{lines}" if skipped else ""), priority=6 if ok else 8, ) return {"indexed": indexed, "skipped": len(skipped), "dur": dur}
def notify(title, message, priority): requests.post(f"{os.environ['NOTIFLY_URL']}/message", params={"token": os.environ["NOTIFLY_TOKEN"]}, json={"title": title, "message": message, "priority": priority}, timeout=5)Это частный случай общего шаблона завершения долгой задачи: мы дожидаемся конца работы и шлём один осмысленный push вместо того, чтобы дёргать логи.
2. Из shell-скрипта (cron)
Заголовок раздела «2. Из shell-скрипта (cron)»Если переиндексация — это reindex.sh, оберните её без единой строки Python:
#!/usr/bin/env bashset -a; source ~/.notifly.env; set +aSTART=$(date +%s)
if OUT=$(python -m rag.reindex 2>&1); then RC=0; ICON="🟢"else RC=$?; ICON="🟡"fiDUR=$(( $(date +%s) - START ))
curl -fsS "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ -d "$(jq -n --arg t "$ICON Переиндексация (rc=$RC)" \ --arg m "Длительность: ${DUR}s
$(echo "$OUT" | tail -c 800)" \ --argjson p $([ $RC -eq 0 ] && echo 6 || echo 8) \ '{title:$t, message:$m, priority:$p}')" >/dev/null3. Плюс heartbeat, если джоба по расписанию
Заголовок раздела «3. Плюс heartbeat, если джоба по расписанию»Push приходит, только когда джоба дошла до конца. Если процесс убили по OOM в середине — push не будет. Подстрахуйтесь heartbeat: пингуйте его в самом конце успешного прогона, и пропуск сам породит алёрт.
python -m rag.reindex && curl -fsS "$REINDEX_PING_URL" -o /dev/nullЧто положить в текст push
Заголовок раздела «Что положить в текст push»- документов проиндексировано / всего;
- сколько пропущено и почему (первые несколько ошибок);
- длительность;
- размер коллекции до/после (см. drift чанков).
Связанные рецепты
Заголовок раздела «Связанные рецепты»- Vector DB / RAG-инфраструктура — мониторинг самой БД.
- Провалы ингеста документов — детально про пропущенные документы.
- Устаревший индекс знаний — если переиндексация вообще не запускалась.