Files
say/elsawin-rag-plan.md
T

4.7 KiB

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