中文翻译暂不可用,显示俄语原文。

Как бы вы спроектировали 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 или pypdfunstructured лучше для сложных PDF (таблицы, колонки), pypdf — для простыхunstructured — библиотека для извлечения текста с сохранением структуры (заголовки, списки, таблицы)
PDF (с таблицами/формуламиDocling (рекомендуюСохраняет таблицы в Markdown, формулы в LaTeX, понимает layoutDocling — open-source парсер от IBM Research. Использует TableFormer для таблиц и DocLayNet для анализа layout
Wordpython-docxЧитает .docx, сохраняет заголовки, списки, таблицыБиблиотека для работы с Microsoft Word файлами
Сканы (JPG/PNGTesseract OCR (Docling имеет встроенный)Извлекает текст из изображенийOCR (Optical Character Recognition — технология распознавания текста на картинках
HTMLBeautifulSoupПарсит веб-страницы, удаляет HTML-тегиБиблиотека для извлечения данных из HTML/XML
ExcelpandasЧитает .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-m3Open-source, мультиязычный (русский отлично), до 8192 токеновТяжелый, нужен GPU
intfloat/multilingual-e5Хороший русский, open-sourceМедленнее bge-m3
text-embedding-3-small (OpenAI)Качество, простотаAPI-зависимость, платно
cohere/embed-multilingual-v3Сжатие представленийДорого
  1. Что такое 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 млн документов
PineconeManaged (не нужно администрировать)Если нет DevOPS ресурсов
ChromaПростая, легкаяТолько для прототипов
  1. Что такое 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 (двухступенчатый ретривал

  1. Векторная БД (bi-encoder) быстро находит top-100 документов
  2. Cross-encoder переранжирует эти 100, оставляет top-5-10
  3. Эти 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)

Шаги

  1. Установить: pip install docling langchain qdrant-client sentence-transformers ollama
  2. Запустить Qdrant: docker run -p 6333:6333 qdrant/qdrant
  3. Собрать 20 PDF, 20 DOCX, 20 сканов, 20 HTML, 20 Excel
  4. Написать пайплайн с Docling (единый парсер для всех форматов)
  5. Нарезать на чанки (overlap 128)
  6. Индексировать в Qdrant
  7. Реализовать гибридный поиск + cross-encoder
  8. Задать 10 вопросов, оценить качество

Ожидаемый результат RAG-система, которая отвечает на вопросы по документам, показывает источники (с какой страницы, из какого файла) и корректно работает с таблицами и формулами.


Связь с другими вопросами (из списка 736)

ВопросТема
3Стратегии chunking (детали)
4Выбор векторной БД (сравнение Qdrant, Weaviate, Milvus, Pinecone)
5Оценка качества retrieval (hit rate, MRR, recall@k)
6Гибридный поиск (BM25, RRF, веса)
13Загрузка 1000+ документов (масштабирование, очереди)
15Выбор embedding модели
41LangChain vs LlamaIndex vs Haystack
111-120Мультимодальный RAG (изображения, таблицы, видео)


Навигация