|
| 1 | +# Локальный запуск NL→SQL (full-source) |
| 2 | + |
| 3 | +Рекомендуемый способ **доставки и демо** — полный исходный checkout на |
| 4 | +локальной машине владельца, со **своими** ключами провайдера. UI, Streamlit-режим |
| 5 | +и продуктовый pipeline те же, что в приложении; Hugging Face не нужен для |
| 6 | +запуска. |
| 7 | + |
| 8 | +Launcher: [`scripts/run_local_demo.py`](scripts/run_local_demo.py) |
| 9 | + |
| 10 | +- все **12** SQLite-баз (полный registry); |
| 11 | +- полный Chroma-индекс (`schema_chunks` + few-shot); |
| 12 | +- штатный Streamlit UI на loopback `127.0.0.1` (порт по умолчанию `8501`); |
| 13 | +- генератор по умолчанию: `mistral` / `codestral-latest`; |
| 14 | +- ключ только из gitignored `.env` или из окружения процесса — **не** из CLI. |
| 15 | + |
| 16 | +HF publish/filter/upload/prune и `scripts/deploy_hf.py` — **опциональный |
| 17 | +исторический** tooling. Он не вызывается локальным launcher'ом и не является |
| 18 | +активным путём доставки. |
| 19 | + |
| 20 | +## Два уровня checkout |
| 21 | + |
| 22 | +| Уровень | Что в дереве | Когда хватает | |
| 23 | +|---|---|---| |
| 24 | +| **Clone-first** | **9** небольших SQLite DB + prebuilt `chroma_data/` | быстрый smoke UI (`streamlit run app/streamlit_app.py`) | |
| 25 | +| **Full-source local** | **все 12** SQLite DB + Chroma, покрывающий те же 12 id | `scripts/run_local_demo.py` (рекомендуемый full demo) | |
| 26 | + |
| 27 | +Чистый git-клон **не** равен full-source: три крупные BIRD-базы не едут в GitHub |
| 28 | +из-за лимита размера. На уже подготовленной машине (все 12 + полный индекс) |
| 29 | +шаги download/reindex повторять не нужно. |
| 30 | + |
| 31 | +## Требования |
| 32 | + |
| 33 | +- Windows PowerShell 5.1 или новее (команды ниже совместимы с 5.1); |
| 34 | +- Python 3.13; |
| 35 | +- `uv`; |
| 36 | +- собственный `MISTRAL_API_KEY` (embeddings всегда идут через Mistral). |
| 37 | + |
| 38 | +```powershell |
| 39 | +python --version |
| 40 | +uv --version |
| 41 | +``` |
| 42 | + |
| 43 | +## Быстрый запуск (full-source) |
| 44 | + |
| 45 | +### 1. Корень репозитория |
| 46 | + |
| 47 | +Выполняйте команды из **корня клона** (каталог, где лежат `app/`, `scripts/`, |
| 48 | +`pyproject.toml`). Конкретный путь зависит от вашей машины. |
| 49 | + |
| 50 | +```powershell |
| 51 | +# Пример (подставьте свой путь к клону): |
| 52 | +# Set-Location C:\path\to\NL_SQL |
| 53 | +``` |
| 54 | + |
| 55 | +### 2. Зависимости |
| 56 | + |
| 57 | +```powershell |
| 58 | +uv sync --extra dev --extra ui |
| 59 | +``` |
| 60 | + |
| 61 | +### 3. API-ключ владельца |
| 62 | + |
| 63 | +Создайте локальный `.env`, только если его ещё нет: |
| 64 | + |
| 65 | +```powershell |
| 66 | +if (-not (Test-Path -LiteralPath '.env')) { |
| 67 | + Copy-Item -LiteralPath '.env.example' -Destination '.env' |
| 68 | +} |
| 69 | +notepad .env |
| 70 | +``` |
| 71 | + |
| 72 | +В `.env` задайте (значение не показывайте в отчётах и скриншотах): |
| 73 | + |
| 74 | +```dotenv |
| 75 | +MISTRAL_API_KEY= |
| 76 | +``` |
| 77 | + |
| 78 | +Заполните ключ вручную. **Не** передавайте его параметром командной строки и |
| 79 | +**не** вставляйте секрет в однострочные env-присваивания в документации, |
| 80 | +скриптах, логах или скриншотах. `.env` в `.gitignore`; публиковать его нельзя. |
| 81 | + |
| 82 | +### 4. Preflight (без сети) |
| 83 | + |
| 84 | +```powershell |
| 85 | +uv run python scripts/run_local_demo.py --check |
| 86 | +``` |
| 87 | + |
| 88 | +При успехе launcher печатает строку preflight OK: full-source checkout с |
| 89 | +**12** SQLite DB + Chroma и подтверждение, что `MISTRAL_API_KEY` настроен |
| 90 | +(**значение ключа не печатается**). Пример формы (точная пунктуация может |
| 91 | +совпадать с текущим launcher'ом): |
| 92 | + |
| 93 | +```text |
| 94 | +[local-demo] preflight OK: full source checkout (12 SQLite DBs + Chroma); MISTRAL_API_KEY configured (value not printed). |
| 95 | +``` |
| 96 | + |
| 97 | +`--check` не ходит во внешний API и не тратит квоту. |
| 98 | + |
| 99 | +### 5. Запуск UI |
| 100 | + |
| 101 | +```powershell |
| 102 | +uv run python scripts/run_local_demo.py |
| 103 | +``` |
| 104 | + |
| 105 | +Откройте <http://127.0.0.1:8501>. |
| 106 | + |
| 107 | +Launcher копирует Chroma во **временный** каталог (`NL_SQL_CHROMA_DATA_DIR`), |
| 108 | +чтобы housekeeping Chroma не пачкал tracked `chroma_data/` в исходном дереве. |
| 109 | + |
| 110 | +## Первый запуск чистого клона → full-source |
| 111 | + |
| 112 | +Если preflight жалуется на неполный набор DB или индекс: |
| 113 | + |
| 114 | +```powershell |
| 115 | +uv run python scripts/download_data.py chinook |
| 116 | +uv run python scripts/download_data.py bird-mini-dev |
| 117 | +uv run python scripts/build_index.py --db all |
| 118 | +uv run python scripts/run_local_demo.py --check |
| 119 | +``` |
| 120 | + |
| 121 | +`build_index.py` вызывает Mistral embeddings и может расходовать квоту вашего |
| 122 | +ключа. На полностью подготовленной машине эти шаги не нужны. |
| 123 | + |
| 124 | +## Health-check работающего UI |
| 125 | + |
| 126 | +```powershell |
| 127 | +$response = Invoke-WebRequest ` |
| 128 | + -UseBasicParsing ` |
| 129 | + -Uri 'http://127.0.0.1:8501/_stcore/health' ` |
| 130 | + -TimeoutSec 15 |
| 131 | +$response.StatusCode |
| 132 | +$response.Content |
| 133 | +``` |
| 134 | + |
| 135 | +Ожидается: |
| 136 | + |
| 137 | +```text |
| 138 | +200 |
| 139 | +ok |
| 140 | +``` |
| 141 | + |
| 142 | +Smoke в UI (расходует квоту SQL/embed провайдера — только осознанно): |
| 143 | + |
| 144 | +1. База `chinook`, режим `Fast`. |
| 145 | +2. Вопрос: `How many albums are in the store?` |
| 146 | +3. Ожидание: ответ `347`, SQL `SELECT COUNT(*) FROM Album`. |
| 147 | + |
| 148 | +## Остановка |
| 149 | + |
| 150 | +В терминале launcher'а: `Ctrl+C`. |
| 151 | + |
| 152 | +## Другой порт |
| 153 | + |
| 154 | +```powershell |
| 155 | +uv run python scripts/run_local_demo.py --port 8502 |
| 156 | +``` |
| 157 | + |
| 158 | +Затем <http://127.0.0.1:8502>. |
| 159 | + |
| 160 | +## SQL-генератор (продуктовое подмножество) |
| 161 | + |
| 162 | +Документированный набор для доставки: |
| 163 | + |
| 164 | +| `NL_SQL_DEFAULT_PROVIDER` | Ключ / условие | |
| 165 | +|---|---| |
| 166 | +| `mistral` (default) | `MISTRAL_API_KEY` | |
| 167 | +| `github_models` | `GITHUB_TOKEN` | |
| 168 | +| `groq` | `GROQ_API_KEY` | |
| 169 | +| `ollama` | локальный Ollama + `NL_SQL_OLLAMA_GEN_MODEL` | |
| 170 | + |
| 171 | +Пример в `.env`: |
| 172 | + |
| 173 | +```dotenv |
| 174 | +NL_SQL_DEFAULT_PROVIDER=mistral |
| 175 | +``` |
| 176 | + |
| 177 | +Research/internal имена провайдеров в коде (CLI-мосты, browser bridges и т.п.) |
| 178 | +**не** рекомендуются как путь доставки. |
| 179 | + |
| 180 | +**Embeddings** всегда требуют `MISTRAL_API_KEY` (`mistral-embed`), в том числе |
| 181 | +когда SQL генерирует Ollama. |
| 182 | + |
| 183 | +## Типовые ошибки |
| 184 | + |
| 185 | +### `MISTRAL_API_KEY is not configured` |
| 186 | + |
| 187 | +Проверьте, что `.env` лежит в **корне репозитория** и значение ключа непустое. |
| 188 | +Ключ не должен попадать в argv. |
| 189 | + |
| 190 | +### `Full-source database set is incomplete` |
| 191 | + |
| 192 | +Скачайте данные (раздел «Первый запуск чистого клона»). |
| 193 | + |
| 194 | +### `Chroma index is missing` / incomplete index |
| 195 | + |
| 196 | +```powershell |
| 197 | +uv run python scripts/build_index.py --db all |
| 198 | +``` |
| 199 | + |
| 200 | +### Порт занят |
| 201 | + |
| 202 | +Откройте уже запущенный <http://127.0.0.1:8501> или укажите `--port`. |
| 203 | + |
| 204 | +## Связанные файлы |
| 205 | + |
| 206 | +- Docstring / `--help`: [`scripts/run_local_demo.py`](scripts/run_local_demo.py) |
| 207 | +- Обзор в README: раздел **Quick start** → full-source local demo |
| 208 | +- Опциональный HF tooling (не runtime-зависимость): [`DEPLOY.md`](DEPLOY.md) |
0 commit comments