Files
say/elsawin-rag-plan.md
T

5.2 KiB

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 дня.