doc: развязка LLM-саги, extractor, differ, текущий статус
This commit is contained in:
@@ -343,3 +343,72 @@ Python-библиотеки (`requests`, `httpx`) не держат HTTP/2 из
|
||||
- `cc3203a` — `test_routes`: action `debug` для просмотра env vars
|
||||
- `0d0ba18` — debug показывает длину ключа
|
||||
- `b457de4` — debug показывает `h2_available` и `httpx_version`
|
||||
|
||||
---
|
||||
|
||||
## Развязка саги с LLM: опечатка в ключе
|
||||
|
||||
После 2 часов попыток (HTTP/2, h2, curl, httpx) причина оказалась простой:
|
||||
**в переменной `LLM_API_KEY` в платформе была опечатка**.
|
||||
|
||||
Сравнение хешей:
|
||||
- Правильный ключ: `sk-ucI5YvOticoOQ9Kuj5K9mQ` → hash `5fad79ba`
|
||||
- Ключ в облаке: `sk-ucI5YvOticoOQK9ujK5m9Q` → hash `c772c3e5` (ошибка 401)
|
||||
|
||||
Перепутаны местами `9K` → `K9` и `5K` → `K5`.
|
||||
|
||||
**Урок:** всегда первым делом проверять входные данные, а не гнаться за архитектурными гипотезами.
|
||||
|
||||
### Финальное решение LLM
|
||||
`httpx` + `h2` (отдельно в requirements) + `http2=True`. Работает.
|
||||
Модель: `gpt-oss-120b` (120B, reasoning).
|
||||
|
||||
---
|
||||
|
||||
## Extractor (extractor.py) — 14.06.2026
|
||||
|
||||
LLM-извлечение строк спецификации из распарсенного текста.
|
||||
|
||||
**Поток:** `parsed_text → промпт → LLM → JSON → [{row_num, name, price, qty, sum, date}]`
|
||||
|
||||
**Результат на реальном документе:** 14 строк из двух таблиц спецификации.
|
||||
LLM корректно определила изменение цены (213 905 → 250 000) и разные даты (01.04 → 25.04).
|
||||
|
||||
Промпт: строгий формат JSON, поддержка `unresolved` для нераспознанных значений.
|
||||
|
||||
---
|
||||
|
||||
## Differ (differ.py) — 14.06.2026
|
||||
|
||||
Сравнение строк спецификаций между допниками. Чистая функция без зависимостей.
|
||||
|
||||
**Вход:** `rows_old`, `rows_new` (списки dict)
|
||||
**Выход:** `{changes: [{row_num, change_type, old_values, new_values, changed_fields}], summary}`
|
||||
|
||||
**change_type:** `added` | `deleted` | `changed` | `unchanged`
|
||||
|
||||
**Тест:** row 1 (changed: price, date), row 2 (unchanged), row 3 (added) ✅
|
||||
|
||||
---
|
||||
|
||||
## Текущий статус (14.06.2026 08:15)
|
||||
|
||||
### Готовые слои (11 файлов)
|
||||
```
|
||||
site/
|
||||
├── app.py — сборка (ensure_schema + Blueprints)
|
||||
├── db.py — транспорт БД (connect, query, execute, query_one)
|
||||
├── schema.py — DDL 5 таблиц
|
||||
├── parser.py — bytes → elements (docx/pdf/doc/zip)
|
||||
├── textify.py — elements → текст
|
||||
├── upload.py — POST /upload (file → parse → textify → DB)
|
||||
├── llm_client.py — HTTP/2 к aillm.ru (httpx+h2)
|
||||
├── extractor.py — текст → LLM → строки спецификации
|
||||
├── differ.py — сравнение строк между версиями
|
||||
├── test_routes.py — /test (status, tables, sql, exec, llm, extract, debug, createdb)
|
||||
└── templates/
|
||||
```
|
||||
|
||||
### Осталось
|
||||
- `api.py` — Blueprint для договоров/допников/истории
|
||||
- Интеграция цепочки: upload → extract → save spec_rows → diff → spec_history
|
||||
|
||||
Reference in New Issue
Block a user