Цель: дополнить draft-level layer-1 benchmark (eval/layer1/) проверкой того, что реально попало в Neo4j после полного пайплайна (science-graphrag ingest).
| Уровень | Что измеряет |
|---|---|
| Draft | WorkDraft / AuthorshipDraft / ReferenceDraft из extract_stages_llm_first |
| Graph | Узлы/рёбра после dedup, OpenAlex, правил CITES, upsert в Neo4j |
Расхождения возможны из-за фильтрации ссылок без идентификаторов, политики merge Work, ошибок записи.
- Код:
eval/graph_v1/(metrics.py,runner.py,__main__.py) - CLI:
science-graphrag-graph-benchmark tests/fixtures/benchmarks/layer1/yolov1python -m eval.graph_v1 tests/fixtures/benchmarks/layer1/yolov1
- Результаты можно писать в
eval/results/иdocs/benchmarks/.
Раннер:
- Читает
article.mdиgold.jsonиз fixture. - Делает временную копию markdown с именем
<case_id>.md, чтобы ingest шёл через production path. - Запускает полный
ingest_document(...). - Снимает snapshot из Neo4j по
work_id. - Сравнивает snapshot с
graph_expectationsизgold.json.
Опциональный блок в gold.json:
min_cites,max_citesmin_authorships,max_authorshipsmin_institutions,max_institutionsexpected_cited_arxiv_ids[]max_duplicate_work_fingerprintsmax_work_dedup_violations— лимит на нарушенияNeo4jGraphStore.find_work_dedup_violations()(глобальный аудит дублей поopenalex_id/doi/arxiv_id;0= строгое окно)min_related_version_edges,max_related_version_edges— ожидаемое число рёберRELATED_VERSION_OF, инцидентных к ingestedWork
Текущие метрики:
- диапазоны по
CITES, authorships, institutions - P/R/F1 по
expected_cited_arxiv_ids - число дублирующихся
Work.fingerprintв БД - глобальный счётчик
Work-дедуп нарушений и локальный счётчикRELATED_VERSION_OFу целевогоWork
graph_expectationsдобавлены вtests/fixtures/benchmarks/layer1/yolov1/gold.json- smoke/unit тесты:
tests/test_graph_eval.py - живой прогон подтверждён для
YOLOv1:23CITES,4authorships,2institutions, полный recall по sample arXiv ids
- Phase 4: graph-level eval как шаг к exit criteria «регрессии ловятся автоматически».
- См. roadmap §4.3.
| Прогон | Рекомендуемый состав |
|---|---|
| Merge / PR | pytest без -m integration (unit + smoke), при необходимости один быстрый layer-1 кейс с выключенным LLM. |
| Nightly / manual | pytest -m integration (нужны Neo4j + Qdrant), полный science-graphrag-layer1-benchmark tests/fixtures/benchmarks/layer1 --suite, при необходимости science-graphrag-graph-benchmark … --suite с живым OpenAlex. |
CI (ручной/еженедельный прогон на GitHub Actions): .github/workflows/integration-nightly.yml — сервисы Postgres, Neo4j и Qdrant в job, затем pytest tests -m integration, затем эвристический science-graphrag-layer1-benchmark … --suite и graph-бенчмарки yolov1 + retinanet_focal_realpdf (real-pdf lane, без LLM); опционально layer-2 nightly_semantic при наличии секрета MAIN_LLM_API_KEY (проброс в SCIENCE_GRAPHRAG_EXTRACTION_LLM_API_KEY). Артефакты eval/results/ci-*.json и benchmark-metrics-summary.json прикладываются к workflow.
Интеграционные тесты в tests/integration/test_full_ingest_integration.py сами пропускаются, если сервисы недоступны локально.
- Дозаполнять gold у real-pdf и наращивать graph expectations по мере стабильности OpenAlex.
- При необходимости добавить отдельный nightly job с LLM-секретами (не в merge-gate).