feat: Express + Whisper + 3 LLM + UI с микрофоном

This commit is contained in:
2026-06-01 22:06:28 +03:00
parent 098c697973
commit 1945f8868c
791 changed files with 84270 additions and 18 deletions
+117
View File
@@ -0,0 +1,117 @@
# ElsaWin → RAG: план
---
## 1. Источник данных
### .wi файлы (основной контент)
| Язык | Кол-во .wi | Статей (XML-потоков) |
|---|---|---|
| en-GB | 1,716 | ~**1M+** (в среднем 500-700 XML на .wi) |
| ru-RU | 956 | ~**500K+** |
Каждый `.wi` — OLE2-контейнер, внутри от 1 до ~1500 XML-файлов.
Общий объём сырого XML — **десятки GB**.
### Графика
SVG/PNG/JPG — ~400K файлов. Технически можно привязать как multimodal, но сложно.
---
## 2. Пайплайн извлечения
```
.wi (OLE2) → olefile → XML-потоки → парсинг SGML → чистый текст → чанки → векторная БД
```
### Этапы:
1. **Извлечение**: `olefile` — обкатано, работает
2. **Парсинг**: SGML → text (кастомный парсер на Python, т.к. разметка своя: `<h-kap>`, `<titel>`, `<tabelle>`, `<aufzaehlg>`, etc.)
3. **Чистка**: удалить мусор (якоря `<qv-anker>`, `<g>`-теги, служебные атрибуты)
4. **Чанкинг**:
- По `<titel>` (заголовкам) — иерархические чанки
- Размер: ~500-1000 токенов
- Перекрытие: ~100 токенов
5. **Embedding**: `text-embedding-3-small` (OpenAI) или `bge-m3` (локально)
6. **Векторная БД**: ChromaDB (проще всего) или Qdrant (для прода)
---
## 3. Объёмы (оценка en-GB)
| Параметр | Оценка |
|---|---|
| .wi файлов | ~1,716 |
| Всего XML-статей | ~**1,000,000 - 1,500,000** |
| Средний размер статьи | ~30-70 KB XML |
| Сырой XML (en-GB) | ~**30-50 GB** |
| Чистый текст после парсинга | ~**5-10 GB** |
| Чанков по ~750 токенов | ~**2,000,000 - 4,000,000** |
| Векторное хранилище (dim 1536) | ~**15-30 GB** |
| Время обработки (один поток) | ~**10-30 часов** |
---
## 4. Архитектура RAG
```
User → Query → Embedding → Поиск по векторной БД → Топ-K чанков
→ LLM (с контекстом) → Ответ
```
### Варианты LLM:
| Вариант | Плюсы | Минусы |
|---|---|---|
| **OpenAI GPT-4o** | Качество, скорость | Дорого, нужен API-ключ |
| **Ollama (локально)** | Бесплатно, privacy | Нужна GPU, медленнее |
| **Claude API** | Большой контекст | Дорого |
### Стратегия поиска:
- **Гибридный**: векторный + keyword (BM25) — лучше для технических терминов
- **reranking** по `cross-encoder` для топ-50 результатов
---
## 5. Варианты реализации
### A) Minimal Viable
- Только en-GB
- ChromaDB на диске
- Ollama + llama3 локально
- CLI или простой веб-интерфейс (Streamlit/Gradio)
### B) Полноценный
- en-GB + ru-RU (билингва)
- Qdrant с гибридным поиском
- FastAPI бэкенд + React фронтенд
- Автообновление при изменении данных
### C) Multimodal
- Всё из B
- + привязка SVG/PNG иллюстраций к чанкам
- Поддержка вопросов с картинками
---
## 6. Риски
| Риск | Решение |
|---|---|
| SGML-парсинг сложнее чем кажется | Написать итеративно, тестировать на разных .wi |
| Объём данных больше оценки | Сначала пилот на одном разделе (igg/) |
| Качество Russian перевода низкое | Использовать en-GB как primary, ru-RU как fallback |
| Производительность поиска на больших данных | Индексация + гибридный поиск |
| Юридические ограничения (VW/Audi data) | Использовать только локально |
---
## 7. Первый шаг (пилот)
1. Взять **один .wi файл** (`rl/N.en-GB.000528929.wi`)
2. Извлечь XML → спарсить → зачанковать
3. Залить в ChromaDB
4. Проверить качество ответов через Ollama
5. Если ОК — масштабировать на все en-GB файлы
**Оценка времени пилота:** ~2-4 часа на извлечение + парсинг + тест.
**Полный пайплайн (en-GB):** ~1-3 дня.