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

Перестройка векторного индекса завершена

Полная перестройка индекса (краулинг → чанкинг → embeddings → upsert) может идти от минут до часов. Уходить проверять терминал каждые пять минут — не вариант, а тихий провал переиндексации означает, что RAG до утра отвечает по старым данным. Пингуем себя в момент завершения — успешного или нет.

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 вместо того, чтобы дёргать логи.

Если переиндексация — это reindex.sh, оберните её без единой строки Python:

#!/usr/bin/env bash
set -a; source ~/.notifly.env; set +a
START=$(date +%s)
if OUT=$(python -m rag.reindex 2>&1); then
RC=0; ICON="🟢"
else
RC=$?; ICON="🟡"
fi
DUR=$(( $(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/null

Push приходит, только когда джоба дошла до конца. Если процесс убили по OOM в середине — push не будет. Подстрахуйтесь heartbeat: пингуйте его в самом конце успешного прогона, и пропуск сам породит алёрт.

Окно терминала
python -m rag.reindex && curl -fsS "$REINDEX_PING_URL" -o /dev/null
  • документов проиндексировано / всего;
  • сколько пропущено и почему (первые несколько ошибок);
  • длительность;
  • размер коллекции до/после (см. drift чанков).