Перейти к основному содержимому

WARC-GPT — LLM-интерфейс к веб-архивам

WARC-GPT — open-source инструмент от Harvard Library Innovation Lab для анализа коллекций WARC с помощью LLM (Retrieval-Augmented Generation, RAG). Создан в 2025 году как ответ на вопрос «как помочь исследователям работать с большими коллекциями веб-архивов через обычные вопросы?»

Главное: вы загружаете WARC-коллекцию, задаёте вопрос на естественном языке — инструмент находит релевантные страницы, извлекает их и просит LLM дать ответ со ссылками на первоисточник.

Зачем нужно​

Исторически работа с большими веб-архивами требовала:

  • Знания SQL или Python.
  • Чтения тысяч страниц глазами.
  • Понимания структуры конкретного сайта.

WARC-GPT снижает этот порог: можно спросить «Какие темы освещал сайт X в 2020 году?» и получить ответ с цитатами.

Архитектура​

┌──────────────────┐    ┌──────────────┐    ┌──────────────┐
│ WARC-коллекция │ -> │ Индексация │ -> │ Чанки + │
│ (WARC/WACZ) │ │ через │ │ embeddings │
└──────────────────┘ │ библиотеки │ └──────┬───────┘
└──────────────┘ │
v
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Ответ с │ <- │ LLM API │ <- │ Поиск │
│ цитатами │ │ (OpenAI, │ │ ближайших │
└──────────────┘ │ Anthropic, │ │ чанков │
│ локальная) │ └──────────────┘
└──────────────┘

Этапы​

  1. Извлечение текста — из каждой HTML-страницы достаётся чистый текст (trafilatura).
  2. Чанкинг — текст разбивается на куски ~500–2000 символов с перекрытием.
  3. Embeddings — каждый чанк превращается в вектор через embedding-модель (OpenAI text-embedding-3-large, локальная модель и т. д.).
  4. Хранение — векторы в ChromaDB или LanceDB.
  5. Запрос — вопрос пользователя → embedding → поиск ближайших чанков → LLM генерирует ответ.
  6. Цитирование — каждая часть ответа ссылается на конкретный чанк с URL и timestamp.

Установка​

git clone https://github.com/harvard-lil/warc-gpt
cd warc-gpt
pip install -r requirements.txt

Требования:

  • Python 3.10+.
  • API-ключ OpenAI (или совместимого сервиса).
  • ~10 ГБ RAM на 100 ГБ WARC-коллекцию (для индексации).
  • GPU опционально (для локальных embedding-моделей).

Быстрый старт​

1. Подготовьте WARC-коллекцию​

# Структура каталога
warc-collections/
├── collection-1/
│ └── archive.wacz
├── collection-2/
│ └── archive.wacz
└── metadata.json # опционально

2. Запустите индексацию​

python -m warc_gpt index \
--input warc-collections/ \
--output ./warc-gpt-index/ \
--embedding-model text-embedding-3-large \
--chunk-size 1000 \
--chunk-overlap 200

Время индексации: ~5–30 минут на 1 ГБ WARC, в зависимости от длины страниц.

3. Задайте вопрос​

python -m warc_gpt query \
--index ./warc-gpt-index/ \
--question "Какие темы освещались в 2024 году?" \
--top-k 10 \
--llm-model gpt-4o

4. Интерактивный режим​

python -m warc_gpt chat --index ./warc-gpt-index/
> Какие статьи упоминают выборы?
> Покажи первые 5 с цитатами
> Сравни публикации 2023 и 2024 годов

Пример вывода​

> Где упоминался кризис 2020 года?

Found 7 relevant passages in 4 URLs.

Ответ:
Кризис 2020 года был упомянут в нескольких статьях на сайте example.com.
На странице от 12 марта 2020 подробно описаны первые меры (URL: https://...,
timestamp: 20200312), включая...

Цитаты:
- "В связи с эпидемиологической ситуацией принято решение..." (URL, timestamp)
- "По данным на 15 марта зафиксировано..." (URL, timestamp)

Источники:
1. https://example.com/news/2020-03-12 (3 цитаты)
2. https://example.com/news/2020-03-15 (2 цитаты)
3. https://example.com/analysis (1 цитата)

Конфигурация​

config.yaml​

indexer:
input_dir: "./warc-collections/"
output_dir: "./warc-gpt-index/"
embedding:
provider: "openai" # openai | cohere | local
model: "text-embedding-3-large"
batch_size: 100
extraction:
method: "trafilatura" # trafilatura | readability | html2text
min_text_length: 100
chunking:
size: 1000
overlap: 200
strategy: "by_sentence"

query:
llm:
provider: "openai"
model: "gpt-4o"
temperature: 0.1
max_tokens: 2000
retrieval:
top_k: 10
rerank: true
prompt_template: "default_with_citations"

Архитектурные детали​

Embedding-провайдеры​

ПровайдерМодельСтоимостьЛокально
OpenAItext-embedding-3-large$0.13/1M токенов❌
OpenAItext-embedding-3-small$0.02/1M токенов❌
Cohereembed-english-v3$0.10/1M токенов❌
Local (HuggingFace)all-MiniLM-L6-v2бесплатно✅
Local (sentence-transformers)intfloat/e5-large-v2бесплатно✅

Для приватных коллекций (персональные данные, юридические) — только локальные модели.

LLM-провайдеры​

ПровайдерМодельКонтекстПримечание
OpenAIgpt-4o / gpt-4o-mini128KДёшево, качественно
Anthropicclaude-3.5-sonnet200KЛучше для русского текста
LocalLlama-3 70B / Qwen 2.5128K+Нужно железо или Ollama
LocalMistral / Gemma8K-32KМалые VRAM

Рекомендация для российских проектов: Claude или локальная модель, обученная на русском (Saiga, Yandex YaLM).

Векторное хранилище​

БДКогдаРазмер
ChromaDBStandalone, простая< 100K чанков
LanceDBEmbedded, in-process< 1M чанков
QdrantProduction self-hosted> 1M чанков
Pinecone / Weaviate CloudSaaSmillions+

Когда использовать​

✅ Подходит:

  • Исследовательские вопросы к большой коллекции без SQL.
  • Преподавание — студенты задают вопросы на естественном языке.
  • OSINT-расследования — быстро проверить гипотезу по архиву.
  • Генерация обзоров литературы или прессы.
  • Мультимодальный поиск — через multimodal-embeddings (для изображений).

❌ Не подходит:

  • Точные подсчёты — LLM могут ошибаться в числах.
  • Юридические доказательства — нужен прямой доступ к странице.
  • Закрытые конфиденциальные данные с OpenAI API — утечка данных при отправке embedding.
  • Real-time — индексация не моментальная.
  • Галлюцинации — LLM может «выдумывать» цитаты; всегда проверяйте по ссылке.
  • Извлечение таблиц и графиков — слабая сторона большинства embedding-моделей.

Ограничения и риски​

Галлюцинации​

LLM может сгенерировать ответ, не опирающийся на источники, или «подделать» цитату. Защита:

  • Всегда включеная функция cite_sources.
  • Проверка по ссылкам.
  • Использование groundedness-метрик (RAGAS).

Стоимость​

Embedding 1 ГБ текста через OpenAI = ~$1–3. Для больших коллекций — десятки долларов на индексацию.

Качество чанкинга​

Границы чанков сильно влияют на качество. По умолчанию by_sentence с overlap 200 — хорошее начало.

Язык​

Embedding-модели обучены преимущественно на английском. Для русского языка используйте intfloat/multilingual-e5-large или OpenAI (multilingual).

Извлечение текста​

JavaScript-rendering (SPA) страницы могут не иметь текста после извлечения. WARC-GPT работает с HTML — для тяжёлого JS нужен предварительный WACZ с Browsertrix.

Альтернативы​

ИнструментПодходКогда
Perplexity AIWeb search + LLMОнлайн-источники, не WARC
VectaraSaaS RAG для бизнесаProduction
AnythingLLMSelf-hosted RAG-UIDesktop-использование
PrivateGPT100% local RAGМаксимальная приватность
metawarc-mcpMCP-сервер для LLM-агентовИнтеграция с Cursor, Claude Desktop

Ruarxive и WARC-GPT​

В Ruarxive metawarc уже индексирует коллекции для AI-агентов. Прямая интеграция с WARC-GPT — на стадии исследования:

  • metawarc-stored DuckDB-каталог + embeddings = расширенный поиск.
  • MCP-сервер вместо custom UI — интеграция с любыми LLM-агентами.

Подробности: metawarc MCP.

Ресурсы​

Связанные материалы​