134 lines
5.2 KiB
Markdown
134 lines
5.2 KiB
Markdown
# ElsaWin → RAG: план
|
|
|
|
---
|
|
|
|
## 1. Источник данных
|
|
|
|
### .wi файлы (основной контент)
|
|
| Язык | Кол-во .wi | Размер на диске |
|
|
|---|---|---|
|
|
| **en-GB** | **1,716** | **706 MB** |
|
|
| de-DE | 1,588 | 688 MB |
|
|
| ru-RU | 956 | 588 MB |
|
|
|
|
Каждый `.wi` — OLE2-контейнер, внутри XML-файлы (от 1 до ~1500 на .wi).
|
|
|
|
### Графика
|
|
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 файлы** (на диске) | **~706 MB** |
|
|
| XML-потоки внутри (распаковано) | ~10-15 GB |
|
|
| Чистый текст после парсинга | ~3-5 GB |
|
|
| Чанки (текст) | ~2-3 GB |
|
|
| **Векторная БД (ChromaDB)** | **~10-15 GB** |
|
|
| **Итого на диске** | **~15-20 GB** |
|
|
|
|
### Расходы
|
|
|
|
| Статья | Бесплатно (локально) | Через API |
|
|
|---|---|---|
|
|
| Embedding | **$0** (bge-m3 на 3060) | ~$30 (OpenAI) |
|
|
| LLM для ответов | **$0** (Ollama) | ~$7 / 10K запросов |
|
|
| Векторная БД | **$0** (ChromaDB) | — |
|
|
| **Итого** | **$0** (+ электричество) | ~$30 + операционка |
|
|
|
|
### Время на RTX 3060 12GB
|
|
|
|
| Этап | Время |
|
|
|---|---|
|
|
| Парсинг + чанкинг (1.5 млн XML) | ~1-2 часа |
|
|
| Embedding (bge-m3, 2 млн чанков) | ~3-5 часов |
|
|
| Запись в БД | ~30 мин |
|
|
| **Итого en-GB** | **~5-7 часов** |
|
|
|
|
---
|
|
|
|
## 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 дня.
|