Как бы вы спроектировали RAG-систему для 10 000 документов с разной структурой (PDF, Word, сканы, HTML, Excel)?
Краткий тезис
Проектирование RAG-системы для гетерогенных документов требует модульного пайплайна, где каждый тип документа обрабатывается своим парсером, а все данные унифицируются в единую схему перед индексацией. Ключевые решения: выбор стратегии chunking, векторной БД, гибридного поиска и ранжирования. Современные инструменты вроде Docling значительно упрощают эту задачу, объединяя парсинг всех форматов в единый интерфейс и сохраняя структуру (таблицы, формулы, заголовки) в Markdown.
1. Pipeline этапов (общая архитектура)
Ingestion → Chunking → Embedding → Indexing → Retrieval → Reranking → Generation
| Этап | Что делает | Инструменты |
|---|---|---|
| Ingestion | Загрузка и парсинг документов разных форматов | Docling, Unstructured, PyPDF2, Tesseract, BeautifulSoup, pandas |
| Chunking | Разбиение на семантически целостные куски | RecursiveCharacterTextSplitter, Semantic Chunking |
| Embedding | Превращение текста в векторы | BAAI/bge-m3, intfloat/multilingual-e5, OpenAI text-embedding-3 |
| Indexing | Хранение векторов + метаданных | Qdrant, Weaviate, Milvus, Pinecone |
| Retrieval | Поиск релевантных чанков | Hybrid search (vector + BM25), RRF |
| Reranking | Уточнение релевантности | Cross-encoder (Cohere Rerank, BGE-reranker) |
| Generation | Формирование ответа на основе контекста | LLM (Llama-3, GPT-4, Claude, YandexGPT) |
2. Парсеры для разных форматов (с пояснением терминов)
| Формат | Инструмент | Почему именно он | Что такое |
|---|---|---|---|
| PDF (текстовый | unstructured или pypdf | unstructured лучше для сложных PDF (таблицы, колонки), pypdf — для простых | unstructured — библиотека для извлечения текста с сохранением структуры (заголовки, списки, таблицы) |
| PDF (с таблицами/формулами | Docling (рекомендую | Сохраняет таблицы в Markdown, формулы в LaTeX, понимает layout | Docling — open-source парсер от IBM Research. Использует TableFormer для таблиц и DocLayNet для анализа layout |
| Word | python-docx | Читает .docx, сохраняет заголовки, списки, таблицы | Библиотека для работы с Microsoft Word файлами |
| Сканы (JPG/PNG | Tesseract OCR (Docling имеет встроенный) | Извлекает текст из изображений | OCR (Optical Character Recognition — технология распознавания текста на картинках |
| HTML | BeautifulSoup | Парсит веб-страницы, удаляет HTML-теги | Библиотека для извлечения данных из HTML/XML |
| Excel | pandas | Читает .xlsx, превращает таблицы в текст | Библиотека для работы с табличными данными |
Важное примечание про Docling
Docling решает проблему "разных форматов" в едином интерфейсе. Вместо того чтобы писать 5 разных парсеров:
from docling.document_converter import DocumentConverter
converter = DocumentConverter()
result = converter.convert("any_document.pdf") # или .docx, .xlsx, .html, .jpg
markdown_text = result.document.export_to_markdown()
Он автоматически:
- Распознает тип документа
- Применяет нужный парсер
- Сохраняет таблицы, формулы, заголовки, порядок чтения в много колонных PDF
- Выгружает всё в единый Markdown
Бенчмарки (OpenDataLoader 2025 Docling — лидер по точности таблиц (97.9%) и заголовков.
3. Унификация метаданных
Что такое метаданные Данные о данных. Не сам текст документа, а информация о нем.
Схема (пример
{
"text": "Содержимое документа после парсинга...",
"source": "s3://bucket/policy.pdf",
"doc_type": "pdf",
"page_num": 5,
"timestamp": "2025-01-01T12:00:00",
"author": "legal_department",
"version": "2.0",
"chunk_id": 3
}
Зачем
- Фильтрация при поиске ("только документы за 2025 год")
- Отображение источников в ответе ("на странице 5 сказано...")
- Аудит и отладка
4. Стратегия chunking (разбиение на чанки)
Что такое chunking Разбиение длинного документа на маленькие куски, потому что LLM имеет ограниченное контекстное окно (обычно 4k-128k токенов).
| Стратегия | Как работает | Когда использовать |
|---|---|---|
| Fixed-size | Режем каждые N токенов | Очень однородные данные (логи, JSON) |
| RecursiveCharacterTextSplitter | Режем по абзацам → предложениям → словам | Дефолтный выбор для большинства текстов |
| Semantic chunking | Модель определяет смысловые границы (смена темы) | Научные статьи, новости, где важна целостность темы |
| Document-based | Режем по заголовкам (H1, H2, H3) | Юридические, технические документы |
| Sliding window | Чанки перекрываются (overlap) | Когда важно не потерять контекст на границах |
Рекомендация RecursiveCharacterTextSplitter + overlap 10-20% (последние 10-20% чанка повторяются в начале следующего).
Почему overlap Если важная фраза оказалась ровно на границе разбиения, она не потеряется.
5. Embedding (превращение текста в вектор)
Что такое embedding Вектор (список чисел) фиксированной длины, который представляет смысл текста. Похожие тексты имеют близкие векторы.
Пример:
"кошка спит на диване" → embedding-модель → [0.12, -0.45, 0.78, ..., 0.03] (768 чисел)
| Модель | Плюсы | Минусы |
|---|---|---|
| BAAI/bge-m3 | Open-source, мультиязычный (русский отлично), до 8192 токенов | Тяжелый, нужен GPU |
| intfloat/multilingual-e5 | Хороший русский, open-source | Медленнее bge-m3 |
| text-embedding-3-small (OpenAI) | Качество, простота | API-зависимость, платно |
| cohere/embed-multilingual-v3 | Сжатие представлений | Дорого |
- Что такое Self-RAG и когда его использовать|10]]. Что такое Self-RAG и когда его использовать|10]]. Что такое Self-RAG и когда его использовать|10]] 000 документов, русский+английский|Для вашего случая (10 000 документов, русский+английский]] рекомендую BAAI/bge-m3 self-hosted.
6. Векторная БД (Vector Database)
Что такое векторная БД Специализированная база данных для хранения и поиска эмбеддингов с поддержкой ANN (Approximate Nearest Neighbors).
| БД | Сильные стороны | Когда выбрать |
|---|---|---|
| Qdrant | Гибридный поиск (vector + BM25), фильтрация по метаданным, self-hosted, gRPC | Лучший выбор для production |
| Weaviate | Мультимодальный (текст + изображения) | Если нужна работа с изображениями |
| Milvus | Экстремальная масштабируемость (>100 млн векторов) | Если >10 млн документов |
| Pinecone | Managed (не нужно администрировать) | Если нет DevOPS ресурсов |
| Chroma | Простая, легкая | Только для прототипов |
- Что такое Self-RAG и когда его использовать|10]]. Что такое Self-RAG и когда его использовать|10]]. Что такое Self-RAG и когда его использовать|10]] 000 документов|Для 10 000 документов]] Qdrant (self-hosted в Docker) — оптимален.
7. Retrieval стратегия (гибридный поиск)
Почему не достаточно только векторного поиска
- Векторный поиск находит по смыслу, но может пропустить точное слово
- Пример: запрос "заказ №A-123-45". Векторный поиск найдет документы про "заказы", но может пропустить точный номер.
Что такое BM25 Классический алгоритм текстового поиска (как в Elasticsearch). Ищет по точным словам, учитывая частоту термина и длину документа.
Гибридный подход
Финальный_score = w × vector_score + (1-w) × BM25_score
где w — вес (обычно 0.5, настраивается по валидации).
RRF (Reciprocal Rank Fusion Альтернативный способ комбинации, не требующий настройки весов.
# RRF формула
score(d) = Σ 1 / (k + rank_i(d))
# где k=60 (константа), rank_i(d) — позиция документа в i-м списке
Auto-merging retrieval Если найдены несколько маленьких чанков из одного документа, возвращаем родительский документ целиком, чтобы LLM видела полный контекст.
8. Ранжирование (Cross-encoder Reranking)
Что такое cross-encoder Модель, которая принимает пару (запрос, документ) и выдает число — насколько документ релевантен запросу.
| Тип | Как работает | Скорость | Точность |
|---|---|---|---|
| Bi-encoder | Эмбеддинги запроса и документа отдельно → косинусное расстояние | Быстро | Средне |
| Cross-encoder | Запрос и документ обрабатываются вместе одним трансформером | Медленно | Высокая |
Применение в RAG (двухступенчатый ретривал
- Векторная БД (bi-encoder) быстро находит top-100 документов
- Cross-encoder переранжирует эти 100, оставляет top-5-10
- Эти 5-10 идут в LLM
Популярные cross-encoder модели
- BAAI/bge-reranker-v2-m3 (open-source, русский поддерживает)
- Cohere Rerank (API, платно)
cross-encoder/ms-marco-MiniLM-L-6-v2(легкий, английский)
9. Полная архитектура в коде (с Docling)
from docling.document_converter import DocumentConverter
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Qdrant
from langchain_core.prompts import PromptTemplate
from langchain_community.llms import Ollama
# 1. Ingestion + парсинг (Docling)
converter = DocumentConverter()
result = converter.convert("document.pdf")
markdown_text = result.document.export_to_markdown()
# 2. Chunking
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
)
chunks = text_splitter.split_text(markdown_text)
# 3. Embedding
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-m3")
# 4. Indexing (Qdrant)
vectorstore = Qdrant.from_texts(
chunks,
embeddings,
url="http://localhost:6333",
collection_name="my_docs"
)
# 5. Retrieval + Reranking (гибридный поиск)
retriever = vectorstore.as_retriever(
search_type="hybrid", # vector + BM25
search_kwargs={"k": 20} # возьмем 20, потом переранжируем
)
# (cross-encoder reranking добавляется отдельно)
# 6. Generation
prompt = PromptTemplate.from_template("""
Ты — ассистент. Отвечай на основе контекста.
Контекст: {context}
Вопрос: {question}
Ответ:
""")
llm = Ollama(model="llama3.2")
rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm
response = rag_chain.invoke("Какая политика возврата?")
10. Пет-проект для закрепления
Задача Собрать RAG для 100 документов разных типов с использованием Docling.
Инструменты Python, Docling, LangChain, Qdrant (Docker), BAAI/bge-m3, Ollama (Llama-3)
Шаги
- Установить: pip install docling langchain qdrant-client sentence-transformers ollama
- Запустить Qdrant: docker run -p 6333:6333 qdrant/qdrant
- Собрать 20 PDF, 20 DOCX, 20 сканов, 20 HTML, 20 Excel
- Написать пайплайн с Docling (единый парсер для всех форматов)
- Нарезать на чанки (overlap 128)
- Индексировать в Qdrant
- Реализовать гибридный поиск + cross-encoder
- Задать 10 вопросов, оценить качество
Ожидаемый результат RAG-система, которая отвечает на вопросы по документам, показывает источники (с какой страницы, из какого файла) и корректно работает с таблицами и формулами.
Связь с другими вопросами (из списка 736)
| Вопрос | Тема |
|---|---|
| 3 | Стратегии chunking (детали) |
| 4 | Выбор векторной БД (сравнение Qdrant, Weaviate, Milvus, Pinecone) |
| 5 | Оценка качества retrieval (hit rate, MRR, recall@k) |
| 6 | Гибридный поиск (BM25, RRF, веса) |
| 13 | Загрузка 1000+ документов (масштабирование, очереди) |
| 15 | Выбор embedding модели |
| 41 | LangChain vs LlamaIndex vs Haystack |
| 111-120 | Мультимодальный RAG (изображения, таблицы, видео) |
Навигация
- Предыдущий: —
- Следующий: 2
- Индекс: 00. Индекс разборов