docs: сервер эмбеддингов переехал на .1.40 + честные итоги проверок
Прод переключён на новый сервер эмбеддингов (VM 210 «embedding-cpu», 192.168.1.40, хост pve2). Ключевое, чего не было в исходном плане переключения: OLLAMA_URL живёт в Infisical, и deploy.sh генерирует .env из него на каждом запуске — правка .env на сервере откатилась бы первым же деплоем. Совместимость векторов проверена прямым сравнением, а не на слово: косинус 0.9999997, расхождение 1e-4 (округление AVX2 против AVX-512) — переиндексация 93 тыс. векторов не понадобилась. Документация приведена в соответствие с фактами: - ARCHITECTURE/DIAGRAM/README/CREDENTIALS: новый сервер, старый помечен как выведенный; убрано упоминание CUDA — GPU в проекте нет; - DR-HA: эмбеддинги больше не висят на хосте .254, чьё падение 28.08 разом унесло брокер, прокси и секреты; - INGESTION: исправлено собственное враньё про КиберЛенинку — «48 часов на 100 тысяч» опровергнуто практикой, сайт блокирует выкачку после ~130 статей; снапшот OpenAlex вычеркнут как путь к миллионам (там только метаданные). bulk_ingest_pmc.py: снята пометка «не закончен» — бага не было, первый прогон упал уже после успешной вставки, а второй корректно пропустил дубли. Проверено: 100 статей, 183 090 отпечатков. Реальный темп 0.3 ст/с записан честно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,16 +1,27 @@
|
||||
# Наполнение корпуса — runbook
|
||||
|
||||
## Текущее состояние (на 2026-08-28)
|
||||
## Текущее состояние (на 2026-08-31)
|
||||
|
||||
- **177 147 документов**, русский большинство: `ru` 99 884, `en` 76 936,
|
||||
- **177 247 документов**, русский большинство: `ru` 99 884, `en` 77 036,
|
||||
остальные языки — единицы/десятки. Проблема «не с чем сравнивать русские
|
||||
работы» из более ранней версии этого документа закрыта.
|
||||
- По источникам: CyberLeninka 99 883, OpenAlex 49 276, PMC 14 910, arXiv 13 077,
|
||||
- По источникам: CyberLeninka 99 883, OpenAlex 49 276, PMC 15 010, arXiv 13 077,
|
||||
`user_submission` (проверенные пользователями работы, не источник для сравнения
|
||||
сами с собой — см. ARCHITECTURE.md §7) 1.
|
||||
- Повторный прогон по уже залитым источникам даёт почти одни дубли (типично
|
||||
1490 из 1500 на источник): прирост дают только новые публикации. Реальный
|
||||
рост корпуса — поднятый `limit` или новые темы, а не повторный запуск.
|
||||
- OpenAlex при массовом запуске упирается в лимит вежливого пула (10 req/s
|
||||
на mailto, общий для всех воркеров) — пауза между страницами поднята до 1с.
|
||||
- Добавлен 4-й парсер — **PMC** (PubMed Central, `scripts/parsers/pmc.py`),
|
||||
англоязычные научные статьи открытого доступа.
|
||||
- Массовое расширение по дисциплинам теперь двумя сидерами: `seed_ru_sources.py`
|
||||
(русскоязычные, CyberLeninka/OpenAlex `lang=ru`) и **`scripts/seed_broad_corpus.py`**
|
||||
(англоязычные — OpenAlex/arXiv/PMC по широкому списку дисциплин, добавлен позже
|
||||
первой волны).
|
||||
- Операционный риск массовой докачки (`consumer_timeout` RabbitMQ vs долгие таски)
|
||||
закрыт бюджетом времени прогона и `worker_prefetch_multiplier=1` — подробности
|
||||
и почему префетч тут главный, см. [DR-HA.md](DR-HA.md) §6.
|
||||
|
||||
### Глубина индексации — чем реально располагает детекция (замер 2026-08-28)
|
||||
|
||||
@@ -31,25 +42,35 @@
|
||||
найдёт, хотя сервис рассчитан именно на русских студентов. Причина не в
|
||||
алгоритме: search API отдаёт только аннотацию и OCR-фрагмент (~700 символов), а
|
||||
`url` ведёт на HTML-страницу — докачка по нему бесполезна (замер: 0 из 8).
|
||||
Лечится `scripts/ops/backfill_cyberleninka_pdf.py`: PDF доступен прямым адресом
|
||||
`{url}/pdf` (проверено: 44 из 50, в среднем 23 тыс. символов, глубина 30 → ~1450
|
||||
отпечатков). Полный прогон — около 48 часов при вежливом 1 req/s и порядка
|
||||
+220 млн строк в `fingerprints` (~22 ГБ; место на сервере БД проверять заранее).
|
||||
Частично лечится `scripts/ops/backfill_cyberleninka_pdf.py`: PDF доступен прямым
|
||||
адресом `{url}/pdf` (проверено: 44 из 50, в среднем 23 тыс. символов, глубина
|
||||
30 → ~1450 отпечатков).
|
||||
|
||||
Покрытие L3 на ту же дату — 93 053 вектора (52.5% корпуса); ещё 60 993 документа
|
||||
числились векторизованными ошибочно, отметки сброшены `faiss_reconcile.py`.
|
||||
- OpenAlex при массовом запуске упирается в лимит вежливого пула (10 req/s
|
||||
на mailto, общий для всех воркеров) — пауза между страницами поднята до 1с.
|
||||
- Добавлен 4-й парсер — **PMC** (PubMed Central, `scripts/parsers/pmc.py`),
|
||||
англоязычные научные статьи открытого доступа.
|
||||
- Массовое расширение по дисциплинам теперь двумя сидерами: `seed_ru_sources.py`
|
||||
(русскоязычные, CyberLeninka/OpenAlex `lang=ru`) и **`scripts/seed_broad_corpus.py`**
|
||||
(англоязычные — OpenAlex/arXiv/PMC по широкому списку дисциплин, добавлен позже
|
||||
первой волны).
|
||||
- Операционный риск массовой докачки (`consumer_timeout` RabbitMQ vs долгие таски)
|
||||
закрыт бюджетом времени прогона и `worker_prefetch_multiplier=1` — подробности
|
||||
и почему префетч тут главный, см. [DR-HA.md](DR-HA.md) §6.
|
||||
**Но массовый прогон упирается в защиту сайта.** Замер 2026-08-28: первые ~130
|
||||
статей скачались штатно, дальше КиберЛенинка перестала отдавать PDF и начала
|
||||
возвращать HTML-заглушку ~5.7 КБ — счётчик успехов замер на 122, скрипт работал
|
||||
вхолостую. Расчёт «48 часов на 100 тысяч при 1 req/s» этим опровергнут. Чтобы
|
||||
углубить русскую часть корпуса, нужен другой подход: заметно большие паузы,
|
||||
разные исходящие адреса или договорённость с источником.
|
||||
|
||||
Покрытие L3: 60 993 документа числились векторизованными ошибочно — отметки
|
||||
сброшены `faiss_reconcile.py`, после чего 31.08 запущен пересчёт всех 84 094
|
||||
документов без вектора. Считает новый сервер эмбеддингов (192.168.1.40,
|
||||
3.6 док/с против 2.2 у прежнего), полный проход занимает около 6.5 часов.
|
||||
|
||||
### Массовая заливка: bulk вместо API
|
||||
|
||||
Постраничные API дают 1-2 статьи в секунду и упираются в rate limit — миллионы
|
||||
так не залить. Для объёма есть `scripts/ops/bulk_ingest_pmc.py`: открытый бакет
|
||||
`pmc-oa-opendata` (ключ не нужен) отдаёт у каждой статьи готовый извлечённый
|
||||
текст. Проверено 31.08: 100 статей, 183 090 отпечатков — 1831 на статью, то есть
|
||||
настоящая глубина, а не аннотация.
|
||||
|
||||
Ограничение по темпу: 0.3 статьи/с, миллион в один поток — около 40 суток.
|
||||
Скачивание тут не узкое место (12 статей/с в 12 потоков), упирается в
|
||||
последовательную обработку документа; для миллионов её надо распараллелить по
|
||||
ядрам воркера. Планировать объём: 1 млн статей ≈ 2.5 млрд отпечатков ≈ 400 ГБ
|
||||
в базе с индексами (сейчас 113 млн строк занимают 12 ГБ).
|
||||
## Что подготовлено
|
||||
|
||||
- **Парсер CyberLeninka починен** (`scripts/parsers/cyberleninka.py`): раньше слал GET
|
||||
@@ -124,7 +145,10 @@ SELECT source, count(*) FROM documents WHERE source='cyberleninka'; -- > 0
|
||||
|
||||
- Больше тем + выше `--limit`; добавить OpenAlex `lang=ru` (качество ниже — англ.
|
||||
заголовки с меткой ru).
|
||||
- Для миллионов — **bulk** (снапшот OpenAlex на S3), а не постраничный API.
|
||||
- Для миллионов — **bulk**, а не постраничный API. Снапшот OpenAlex для этого не
|
||||
годится: там только метаданные, а миллионы аннотаций детекции не дают (см.
|
||||
провал КиберЛенинки выше). Рабочий источник полных текстов — бакет
|
||||
`pmc-oa-opendata`, см. «Массовая заливка» выше.
|
||||
- На масштабе обязателен `VECTOR_BACKEND=qdrant` (FAISS flat не тянет), а таблица
|
||||
`fingerprints` (уже ~113M строк на 177K доков — партиционирование стоит планировать
|
||||
заранее, не постфактум) потребует партиционирования. См.
|
||||
|
||||
Reference in New Issue
Block a user