neuler_sprint2_plan
Neuler Sprint 2 Plan
Создано: 2026-03-10 (Феанор, worker ночь)
Sprint 1 статус: ✅ scout.py — OpenAlex API, depth S/M/L, 0.9s demo-ready
Sprint 2 цель: Превратить Literature Scout из standalone скрипта в полноценный модуль с памятью и анализом пробелов
Контекст и ограничения
Известно (из проектного файла + agenda 09.03):
- Scout.py работает, demo-ready, OpenAlex API
- SDR инфраструктура (OpenAlex, Semantic Scholar) готова к переиспользованию
- Модель для production: 70b (не 8b — галлюцинации)
- Следующие модули по плану: librarian.py, formatter.py, gap_finder.py
НЕ известно (итоги встречи 09.03 не получены от Даниила):
- Финальные архитектурные решения по repo structure
- Кто из команды (Альберт/Шерки) берёт модули
- Решение про standalone vs pipeline
⚠️ Этот план — предложение. Даниил должен подтвердить после знакомства с итогами встречи.
Sprint 2 Scope (2 недели: 10–24 марта)
Модуль 1: librarian.py — локальная библиотека статей
Цель: хранить, дедуплицировать, индексировать статьи между запусками scout.py
Функциональность:
- LibraryDB — SQLite-хранилище (paper_id, title, abstract, year, cited_by, source, vector)
- Добавление батча из scout output → дедупликация по DOI/OpenAlex ID
- Семантический поиск по TF-IDF (без LLM) или простой keyword search
- Экспорт в BibTeX / Markdown / JSON форматы
CLI:
neuler librarian add --scout-output report.md # добавить из scout отчёта
neuler librarian search --query "ISTA proximal" --top 10
neuler librarian export --format bibtex > refs.bib
neuler librarian stats # сколько статей, по темам
Зависимости: sqlite3 (stdlib), scikit-learn (TF-IDF), уже в requirements
Оценка: M (10–15 часов разработки)
Модуль 2: gap_finder.py — поиск пробелов в литературе
Цель: сравнить корпус статей из library с формулировкой исследования → найти незакрытые вопросы
Алгоритм:
1. Читает research_statement.md (пользователь описывает свой вклад в 3–5 предложений)
2. Получает топ-N статей из library по релевантности
3. LLM-запрос (Groq 70b / Claude Haiku): “что заявлено в этих статьях?” → краткое резюме каждой
4. Второй LLM-запрос: “что НЕ покрыто в корпусе, если учесть research_statement?” → список пробелов
5. Форматирует вывод: список пробелов + цитаты + релевантные статьи
CLI:
neuler gap-finder \
--statement research_statement.md \
--topic "operator splitting machine learning" \
--depth M \
--model groq/llama-3.3-70b-versatile
Оценка: L (20–30 часов, включая prompt engineering)
Модуль 3: formatter.py — унификация форматов вывода
Цель: разделить логику форматирования от scout/librarian, поддержать форматы:
- markdown (текущий scout output)
- json (для programmatic use)
- bibtex (для LaTeX/Zotero)
- obsidian (Markdown с backlinks для Obsidian vault)
- latex-tabular (таблица статей для включения в диссертацию/статью)
Оценка: S (3–5 часов)
Интеграция: scout v2
Цель: обновить scout.py для автоматической записи результатов в library
neuler scout \
--topic "operator splitting SGD" \
--depth M \
--save # автоматически добавить в library
--output report.md # и сохранить отчёт
Оценка: S (2–3 часа, + обновление README)
Timeline
| Неделя | Задача | Исполнитель | Критерий готовности |
|---|---|---|---|
| 10–14 мар | formatter.py | — | 5 форматов, unit tests |
| 10–14 мар | scout v2 (–save flag) | — | Scout сохраняет в library |
| 15–19 мар | librarian.py MVP | — | add/search/export работают |
| 20–24 мар | gap_finder.py v1 | — | E2E на реальном topic |
| 24 мар | Sprint 2 demo | Все | Полный pipeline: scout→library→gap |
Demo Sprint 2
# 1. Scout + save
neuler scout --topic "ISTA proximal gradient LASSO" --depth M --save
# 2. Добавить ещё одну тему
neuler scout --topic "operator splitting stochastic SGD" --depth M --save
# 3. Поиск по library (25+ статей)
neuler librarian search --query "convergence rate" --top 5
# 4. Найти пробелы (задаём research statement)
echo "We analyze Strang splitting for L1/L2 regularization and prove O(h^2) improvement over Lie-Trotter." > /tmp/stmt.md
neuler gap-finder --statement /tmp/stmt.md --topic "operator splitting" --depth M
# Output: "Not found in corpus: systematic comparison with ADMM for ill-conditioned problems;
# stochastic extensions of Strang-ISTA; connection to symplectic integrators"
Технические решения (рекомендации)
| Вопрос | Рекомендация | Обоснование |
|---|---|---|
| Storage | SQLite (файл ~/.neuler/library.db) |
Простота, portable, no server |
| Search | TF-IDF (scikit-learn) | Без LLM, быстро, достаточно для MVP |
| LLM для gap_finder | Groq llama-3.3-70b бесплатно / Claude Haiku | SDR уже использует оба |
| Repo structure | neuler/ flat (scout.py, librarian.py, gap_finder.py, formatter.py) |
Простота, CLAUDE.md может добавить |
| Tests | pytest + mock OpenAlex responses | Офлайн тесты, воспроизводимо |
AstaBench: метрики для Literature Scout
Метрики для оценки качества модуля (к обсуждению на Sprint 2 review):
| Метрика | Описание | Как мерить |
|---|---|---|
| Precision@10 | % релевантных статей в топ-10 | Ручная оценка (Даниил) |
| Recall vs manual | % статей из ручного обзора Даниила, найденных автоматически | 1 эксперимент |
| Gap hit rate | % реальных пробелов, найденных gap_finder | Валидация на известном корпусе |
| Latency | Время до первого результата | time neuler scout --depth S |
| Consistency | Стабильность между запусками (тот же topic → те же топ-5?) | 3 прогона |
Блокеры и риски
| Риск | Митигация |
|---|---|
| Итоги встречи 09.03 не учтены | ⚠️ Даниил подтверждает plan или корректирует |
| OpenAlex rate limits (500k/день) | Librarian cache снижает повторные запросы |
| LLM качество gap_finder | Начать с простых keyword-gap metrics без LLM |
| Нет GPU для тяжёлых моделей | Groq free tier (100K TPD) + Claude Haiku |
Феанор, 2026-03-10 04:15 MSK (auto, worker ночь)
СТАТУС: PROPOSE — ожидает подтверждения Даниила (итоги встречи 09.03)