Большие языковые модели хорошо умеют писать код, объяснять технологии и анализировать ошибки, но их знания ограничены данными, использованными при обучении. Модель может не знать содержимое редкой технической книги, внутренней документации или нового руководства.
Эту проблему можно решить с помощью RAG — Retrieval-Augmented Generation, то есть генерации ответов с дополнением из внешней базы знаний.RAG позволяет загрузить технические книги, документацию, статьи и исходные коды в специальную базу, после чего нейросеть сможет находить в них нужные фрагменты и использовать их при формировании ответа.
В этой статье разберём:
- как устроен RAG;
- чем RAG отличается от обучения модели;
- как подготовить технические книги;
- зачем нужны OCR, чанки и embedding-модель;
- как создать базу знаний в Open WebUI;
- какие параметры использовать для локальной нейросети;
- как проверить качество поиска;
- почему модель иногда «не видит» загруженные книги.
Что такое RAG
RAG состоит из двух основных этапов:- Поиск информации в базе документов.
- Генерация ответа языковой моделью с использованием найденного текста.
Код:
Технические книги
↓
Извлечение текста
↓
Очистка и разбиение на фрагменты
↓
Преобразование фрагментов в векторы
↓
Сохранение в векторную базу
↓
Вопрос пользователя
↓
Поиск подходящих фрагментов
↓
Передача фрагментов языковой модели
↓
Ответ на основе найденных материалов
Система не передаёт модели все загруженные книги целиком. Вместо этого она:Какие поля содержит структура EPROCESS в Windows?
- преобразует вопрос в числовой вектор;
- ищет похожие по смыслу фрагменты;
- выбирает несколько наиболее подходящих отрывков;
- добавляет их в контекст нейросети;
- просит модель сформировать ответ.
RAG не обучает нейросеть
Важно понимать, что загрузка книг в RAG-базу не изменяет веса языковой модели.Книги не становятся частью Qwen, Llama, Mistral или другой модели. Они сохраняются отдельно и используются только во время обработки запроса.
Это принципиальное отличие от LoRA и полноценного дообучения.
| Технология | Что происходит |
|---|---|
| RAG | Модель получает найденные фрагменты документов во время запроса |
| LoRA | Создаётся дополнительный адаптер, изменяющий поведение модели |
| Fine-tuning | Изменяются веса или часть весов модели |
| Full Context | Документ целиком передаётся в контекст каждого запроса |
Преимущества RAG:
- книги можно добавлять без обучения модели;
- документы можно быстро удалить или заменить;
- не требуется мощная GPU для обучения;
- можно хранить данные локально;
- модель может указывать источники;
- одну базу можно использовать с разными нейросетями.
- качество зависит от извлечения текста;
- поиск может выбрать неправильные фрагменты;
- таблицы и схемы иногда распознаются плохо;
- слишком маленький контекст ограничивает объём передаваемой информации;
- модель всё равно может неправильно интерпретировать найденный материал.
Из каких компонентов состоит RAG
Для создания полноценной базы знаний потребуются следующие компоненты.1. Источники
Это могут быть:- PDF-книги;
- EPUB;
- DOCX;
- Markdown;
- HTML;
- текстовые файлы;
- документация проектов;
- исходный код;
- научные статьи;
- руководства производителей;
- внутренние инструкции.
2. Обработчик документов
Он извлекает текст, структуру, таблицы и заголовки.Популярные варианты:
- Docling;
- Apache Tika;
- PyMuPDF;
- Unstructured;
- OCRmyPDF;
- Tesseract OCR;
- специализированные OCR-сервисы.
3. Разделитель текста
Большая книга разбивается на небольшие фрагменты — чанки.4. Embedding-модель
Embedding-модель преобразует текст в набор чисел — вектор.5. Векторная база
В ней хранятся:- векторы;
- текстовые фрагменты;
- названия книг;
- номера страниц;
- главы;
- дополнительные метаданные.
6. Языковая модель
Например:- Qwen Coder;
- Qwen Instruct;
- Llama;
- Mistral;
- Kimi;
- GPT;
- Claude.
Этап 1. Подготовка библиотеки
Не стоит сразу загружать сотни гигабайт документов. Сначала лучше создать небольшую тематическую базу из нескольких качественных книг.Например:
Код:
Windows Internals/
├── Windows Internals. Part 1.pdf
├── Windows Internals. Part 2.pdf
├── Windows Kernel Programming.pdf
└── Windows Native API.pdf
Код:
Linux Kernel/
├── Linux Kernel Development.pdf
├── Linux Device Drivers.pdf
├── Understanding the Linux Kernel.pdf
└── Linux Kernel Documentation/
- Windows Internals;
- Linux Kernel;
- разработка драйверов;
- анализ вредоносного ПО;
- сетевые технологии;
- Docker и Kubernetes;
- реверс-инжиниринг;
- веб-безопасность;
- языки программирования.
Не смешивайте всё в одной базе
Если загрузить в одну коллекцию книги по Windows, PHP, Cisco, биологии и бухгалтерии, поиск всё равно будет работать, но качество может снизиться.Лучше использовать несколько тематических баз:
Код:
Windows Internals
Linux Kernel
Malware Analysis
Reverse Engineering
Network Security
Docker and Kubernetes
Python Development
C and C++ Development
Этап 2. Проверка PDF
PDF может содержать:- обычный текст;
- отсканированные страницы;
- текст поверх изображений;
- нестандартные шрифты;
- сложную многоколоночную разметку;
- таблицы;
- формулы;
- схемы;
- программный код.
Если текст выделяется и копируется правильно, документ, скорее всего, содержит текстовый слой.
Если страница представляет собой изображение, потребуется OCR.
Признаки проблемного PDF
После копирования текста могут появляться:
Код:
W i n d o w s K e r n e l
Код:
������� ���������
Код:
третья колонка
первая колонка
вторая колонка
Этап 3. Извлечение текста
Для технических PDF удобно использовать Docling. Он умеет обрабатывать структуру документа, заголовки, таблицы и сложную разметку.Общий процесс выглядит так:
Код:
PDF
↓
Docling
↓
Структурированный документ
↓
Markdown или JSON
↓
Разбиение на чанки
- многоуровневые заголовки;
- таблицы;
- подписи к изображениям;
- колонки;
- списки;
- программный код;
- сложная структура страниц.
Что проверить
Откройте предварительный просмотр документа и найдите:- название первой главы;
- несколько абзацев из середины книги;
- фрагмент программного кода;
- таблицу;
- текст на русском языке;
- текст на английском языке;
- последнюю главу.
- текст не пустой;
- символы отображаются правильно;
- строки идут в правильном порядке;
- код не превратился в набор отдельных символов;
- заголовки не потерялись;
- страницы не перепутаны;
- повторяющиеся колонтитулы не занимают большую часть текста.
Этап 4. Очистка документов
Перед индексацией желательно удалить лишние элементы:- повторяющиеся колонтитулы;
- номера страниц внутри текста;
- рекламные вставки;
- пустые страницы;
- повторяющееся оглавление;
- сведения издательства на каждой странице;
- повреждённые символы;
- дубликаты глав;
- текстовые водяные знаки.
Код:
Windows Internals — Seventh Edition
Page 523
Chapter 8
Процесс в Windows представлен объектом...
Windows Internals — Seventh Edition
Код:
# Chapter 8. Processes
Процесс в Windows представлен объектом...
Этап 5. Разбиение текста на чанки
Нельзя сохранять книгу как один огромный фрагмент. Документ необходимо разделить на небольшие части.Такой фрагмент называется chunk, или чанк.
Пример:
Код:
Книга: Windows Internals
Глава: Processes
Страница: 123
Текст: Каждый процесс Windows представлен исполнительным объектом процесса...
Почему размер чанка важен
Слишком маленькие чанки теряют смысл.Например:
Код:
Структура содержит следующие поля:
Слишком большой чанк тоже создаёт проблемы:
- поиск становится менее точным;
- в контекст попадает много лишнего текста;
- увеличивается расход токенов;
- снижается количество разных источников, которые можно передать модели.
Перекрытие чанков
Для сохранения связи между соседними фрагментами используется Chunk Overlap.Например:
Код:
Chunk 1:
A B C D E
Chunk 2:
D E F G H
D E присутствует в обоих чанках. Благодаря этому предложение или определение не теряется на границе разделения.Стартовые параметры
Для локальной модели с небольшим контекстом:Параметр Значение
Text Splitter token
Chunk Size 1000
Chunk Overlap 100
Top K 3–5
Markdown Header Splitting включить
Full Context выключить
Для модели с контекстом от 16 000 до 32 000 токенов:
Параметр Значение
Text Splitter token
Chunk Size 1200–1500
Chunk Overlap 150–200
Top K 5–10
Markdown Header Splitting включить
Для модели с контекстом от 32 000 токенов:
Параметр ЗначениеText Splitter token
Chunk Size 1500–2000
Chunk Overlap 200
Top K 10–20
Markdown Header Splitting включить
Это не универсальные значения. Их необходимо проверять на своей библиотеке и своей языковой модели.
Этап 6. Создание векторов
После разбиения каждый чанк передаётся embedding-модели.Embedding-модель превращает текст в массив чисел:
Код:
"Процесс Windows содержит объект EPROCESS"
Код:
[0.128, -0.442, 0.039, 0.771, ...]
Похожие по смыслу тексты получают близкие векторы.
Например:
Код:
Как устроен процесс Windows?
Код:
Структура ядра, представляющая процесс в Windows
Как выбрать embedding-модель
Embedding-модель влияет на качество поиска сильнее, чем многие предполагают.Для простого локального запуска можно использовать:
Код:
sentence-transformers/all-MiniLM-L6-v2
- небольшая;
- быстро работает;
- потребляет мало памяти;
- подходит для первоначального тестирования.
Код:
nomic-embed-text
mxbai-embed-large
BAAI/bge-m3
- поддержку русского языка (BAAI/bge-m3 поддерживает русский язык);
- поддержку английского языка;
- качество работы с техническими терминами;
- размер модели;
- потребление RAM или VRAM;
- скорость индексации;
- размер генерируемых векторов;
- максимальную длину входного текста.
Нельзя менять embedding-модель без переиндексации
Если документы были проиндексированы одной моделью, а пользовательские запросы преобразуются другой, поиск станет неправильным.После смены embedding-модели необходимо:
- удалить старые векторы;
- повторно обработать документы;
- создать новые embeddings;
- заново проверить контрольные вопросы.
Этап 7. Векторная база
Созданные векторы необходимо где-то хранить.Для этого применяются векторные базы данных:
- ChromaDB;
- Qdrant;
- Milvus;
- pgvector;
- Elasticsearch;
- OpenSearch.
Для крупной библиотеки, нескольких пользователей или отдельного RAG-сервиса можно использовать Qdrant или pgvector.
Один объект в векторной базе может выглядеть примерно так:
Код:
{
"id": "windows-internals-7-part1-page-123-chunk-4",
"vector": [0.128, -0.442, 0.039],
"text": "Каждый процесс Windows представлен исполнительным объектом...",
"metadata": {
"book": "Windows Internals",
"chapter": "Processes",
"page": 123,
"language": "en"
}
}
Код:
Источник: Windows Internals, глава Processes, страница 123
Создание базы знаний в Open WebUI
В разных версиях Open WebUI названия разделов могут немного отличаться, но общий порядок остаётся похожим.Шаг 1. Настройте обработку документов
Откройте административные настройки документов.Проверьте:
- выбранный Content Extraction Engine;
- адрес Docling или другого обработчика;
- embedding-модель;
- размер чанков;
- overlap;
- Top K;
- разрешённые расширения файлов;
- лимит размера загружаемых файлов.
Шаг 2. Выберите embedding-модель
Для первоначального теста можно оставить небольшую локальную модель.Для русскоязычной или смешанной библиотеки желательно протестировать несколько вариантов на одинаковом наборе вопросов.
Не оценивайте embedding-модель только по скорости. Главный критерий — находит ли она правильные главы и страницы.
Шаг 3. Создайте Knowledge Base
Откройте:
Код:
Workspace → Knowledge
Код:
Название: Windows Internals
Описание: Книги по внутреннему устройству Windows, ядру, процессам, памяти и драйверам.
Плохое описание:
Код:
Разные книги
Код:
Технические книги по внутреннему устройству Windows: процессы, потоки,
виртуальная память, Object Manager, I/O Manager, драйверы и механизмы безопасности.
Шаг 4. Сначала загрузите одну книгу
Не загружайте всю библиотеку сразу.Добавьте один PDF и дождитесь завершения обработки.
После этого:
- откройте извлечённый текст;
- убедитесь, что документ не пустой;
- проверьте несколько страниц;
- выполните тестовый поиск;
- задайте несколько вопросов модели.
Так проще определить источник проблемы.
Шаг 5. Дождитесь завершения индексации
Большая книга может обрабатываться продолжительное время, особенно если:- используется OCR;
- Docling работает на CPU;
- книга содержит сотни страниц;
- embedding-модель большая;
- сервер имеет мало оперативной памяти;
- загружается несколько файлов одновременно.
Шаг 6. Подключите базу к чату или модели
Базу знаний можно:- подключить к конкретному чату;
- выбрать через символ
#; - привязать к пользовательской модели;
- сделать доступной определённой группе пользователей.
Код:
Название: Zer0Kernel Windows Researcher
Базовая модель: Qwen Coder
Knowledge Base: Windows Internals
Focused Retrieval и Full Context
В Open WebUI могут использоваться два основных режима работы с документами.Focused Retrieval
Система ищет только наиболее подходящие чанки.Подходит для:
- больших книг;
- библиотек из десятков документов;
- технической документации;
- поиска конкретного определения;
- моделей с ограниченным контекстом.
- экономия контекста;
- высокая скорость;
- возможность работать с большой библиотекой.
- поиск может пропустить нужный раздел;
- ответ зависит от качества embeddings;
- модель не видит документ целиком.
Full Context
В контекст передаётся весь документ.Подходит для:
- коротких инструкций;
- небольших статей;
- конфигурационных файлов;
- документов, которые помещаются в контекст модели;
- задач, где важна последовательность всего текста.
Native Function Calling и базы знаний
В современных версиях Open WebUI модель может самостоятельно вызывать инструменты базы знаний.Это означает, что подключённая база не всегда автоматически добавляется к каждому запросу. Модель должна решить, что ей необходимо выполнить поиск.
Некоторые локальные модели вызывают инструменты не всегда надёжно.
Для улучшения поведения можно добавить системную инструкцию:
При вопросах, относящихся к технической документации, сначала выполни поиск
в подключённой базе знаний.
Используй найденные материалы как основной источник ответа.
Если в базе нет достаточной информации, прямо сообщи об этом.
Не придумывай отсутствующие факты.
По возможности указывай название документа, главу и страницу.
Для исследовательской модели можно использовать более строгий вариант:
Отвечай на вопросы по содержимому подключённой базы знаний.
Перед ответом обязательно выполни поиск по базе.
Сравни несколько найденных фрагментов, если вопрос затрагивает разные главы
или документы.
Отделяй сведения из источника от собственных выводов.
Если ответ не подтверждается документами, напиши:
"В подключённой базе знаний точная информация не найдена".
Если модель продолжает игнорировать документы:
- проверьте доступ пользователя к базе;
- убедитесь, что для модели включены инструменты Knowledge Base;
- подключите базу к чату вручную;
- проверьте системный промпт;
- протестируйте режим без Native Function Calling, если установленная версия это поддерживает;
- проверьте, работает ли поиск независимо от языковой модели.
Как правильно тестировать RAG
Нельзя оценивать качество базы одним вопросом.Подготовьте набор контрольных вопросов четырёх типов.
1. Точное совпадение
Вопрос содержит термин из книги:
Код:
Что такое EPROCESS?
2. Переформулированный вопрос
Вопрос не повторяет формулировку источника:
Код:
Каким объектом ядра Windows представлен пользовательский процесс?
3. Вопрос по нескольким разделам
Код:
Чем объект процесса отличается от объекта потока и как они связаны?
4. Вопрос, ответа на который нет
Код:
Как структура EPROCESS устроена в ещё не выпущенной версии Windows?
- найти правильный материал по точному вопросу;
- найти его при другой формулировке;
- объединить данные из нескольких чанков;
- признать отсутствие информации;
- не придумывать несуществующие цитаты и страницы.
Почему модель не видит книгу
Это одна из наиболее частых проблем.Причина 1. Из PDF не извлечён текст
Документ может быть сканом без OCR.Проверьте предварительный просмотр. Если текст пустой, проблема находится до этапа векторного поиска.
Причина 2. Извлечён повреждённый текст
Например:
Код:
P r o c e s s O b j e c t
Используйте другой обработчик документов или предварительно преобразуйте PDF.
Причина 3. Слишком маленькие чанки
Отдельные фрагменты не содержат достаточного контекста.Увеличьте:
Код:
Chunk Size
Chunk Min Size Target
Причина 4. Слишком большие чанки
Поиск получает большой раздел, в котором нужная информация занимает несколько строк.Уменьшите размер чанка или включите разбиение по Markdown-заголовкам.
Причина 5. Неподходящая embedding-модель
Маленькая англоязычная модель может хуже работать с русскими техническими текстами.Попробуйте многоязычную embedding-модель и выполните полную переиндексацию.
Причина 6. Слишком маленький Top K
ЕслиTop K = 1, модель получит только один найденный фрагмент.Для сложных вопросов может потребоваться несколько чанков из разных глав.
Причина 7. Слишком большой Top K
Если передать слишком много фрагментов, полезная информация может потеряться среди постороннего текста.Кроме того, контекст модели может переполниться.
Причина 8. База подключена, но модель не выполняет поиск
Это часто связано с Native Function Calling.Добавьте явную инструкцию использовать базу знаний или подключите её к чату вручную.
Причина 9. У пользователя нет доступа
Пользователь может иметь доступ к модели, но не иметь разрешения на чтение подключённой базы знаний.Проверьте права базы, группы и настройки модели.
Причина 10. Embedding-модель была изменена
Старые документы продолжают содержать векторы предыдущей модели.Запустите повторную индексацию всех документов.
Работа с программным кодом
Технические книги часто содержат примеры кода. Обычный разделитель текста может разорвать функцию посередине.Плохой результат:
Код:
if (process != NULL) {
initialize_process
Код:
(process);
}
При проверке извлечённого документа обратите внимание на:
- отступы;
- фигурные скобки;
- символы
*,&,<,>; - шаблоны C++;
- команды Bash;
- пути Windows;
- обратные слеши;
- Markdown-кодовые блоки.
Код:
C:\Windows\System32
Код:
\Device\HarddiskVolume1
Код:
char **argv
Код:
template<typename T>
Работа с таблицами и схемами
Таблицы могут извлекаться как:
Код:
Поле
Тип
Описание
PID
ULONG
Идентификатор
Лучше получить:
Код:
| Поле | Тип | Описание |
|---|---|---|
| PID | ULONG | Идентификатор процесса |
Возможные решения:
- использовать OCR;
- применять мультимодальную модель;
- вручную добавлять описание схем;
- извлекать подписи;
- сохранять номера рисунков;
- обрабатывать изображения отдельным пайплайном.
Как улучшить точность ответов
Используйте гибридный поиск
Векторный поиск хорошо находит смысл, но иногда плохо работает с точными идентификаторами:
Код:
EPROCESS
MmCopyVirtualMemory
IRP_MJ_DEVICE_CONTROL
CVE-2025-1234
0xC0000005
- векторный поиск;
- полнотекстовый поиск;
- BM25;
- reranker.
Добавляйте метаданные
Для каждого чанка желательно сохранять:
Код:
Название книги
Автор
Издание
Глава
Раздел
Страница
Язык
Дата публикации
Тип документа
Удаляйте дубликаты
Не стоит одновременно загружать:- оригинальный PDF;
- его копию с другим именем;
- Markdown, автоматически созданный из того же PDF;
- разные сканы одного издания.
Разделяйте разные издания
Сведения из разных изданий могут противоречить друг другу.Например:
Код:
Windows Internals, 6th Edition
Windows Internals, 7th Edition
Безопасность и конфиденциальность
При создании локальной RAG-базы необходимо учитывать, где обрабатываются документы.Если используются локальные:
- Open WebUI;
- Docling;
- embedding-модель;
- Qdrant;
- Qwen;
Однако данные могут покинуть сервер, если используются:
- облачная embedding-модель;
- внешний OCR;
- облачная языковая модель;
- сторонний API обработки PDF;
- удалённая векторная база.
Код:
Браузер
→ Open WebUI
→ обработчик документов
→ embedding-сервис
→ векторная база
→ языковая модель
Также необходимо соблюдать авторские права. Загружайте книги и документацию, которыми вы имеете право пользоваться. Не публикуйте содержимое закрытой библиотеки и не предоставляйте посторонним пользователям возможность выгружать полные тексты защищённых произведений.
Резервное копирование
Для восстановления RAG недостаточно сохранить только языковую модель.Необходимо резервировать:
Код:
Исходные PDF и документы
Данные Open WebUI
Базу метаданных
Векторную базу
Настройки embedding-модели
Настройки чанков
Системные промпты
Права пользователей
Docker Compose и конфигурации
Код:
backup/
├── documents/
├── open-webui/
├── vector-database/
├── configs/
├── prompts/
└── manifest.json
manifest.json можно сохранить:
Код:
{
"knowledge_base": "Windows Internals",
"embedding_model": "BAAI/bge-m3",
"chunk_size": 1500,
"chunk_overlap": 200,
"text_splitter": "token",
"created_at": "2026-07-29"
}
Обновление библиотеки
Рекомендуемый процесс добавления новых документов:- сохранить оригинал;
- проверить наличие текстового слоя;
- выполнить OCR при необходимости;
- извлечь текст;
- проверить несколько страниц;
- удалить явный мусор;
- добавить метаданные;
- проиндексировать документ;
- задать контрольные вопросы;
- сохранить результаты тестирования.
Рекомендуемая конфигурация для технических книг
Для локального сервера с Qwen Coder можно начать со следующего варианта:
Код:
Document Extractor: Docling
Text Splitter: token
Markdown Header Splitting: On
Chunk Size: 1500
Chunk Overlap: 200
Top K: 5–10
Embedding: многоязычная локальная модель
Retrieval: Focused Retrieval
Full Context: только для небольших документов
Reranking: включить после первоначальной проверки
После загрузки подготовьте не менее 20 контрольных вопросов и записывайте:
Код:
Вопрос
Ожидаемый источник
Найденный источник
Правильность ответа
Наличие выдуманных фактов
Время ответа
| Вопрос | Ожидаемый источник | Результат |
|---|---|---|
| Что такое EPROCESS? | Windows Internals, Processes | Найдено |
| Как работает working set? | Memory Management | Частично |
| Что такое task_struct? | В базе отсутствует | Модель признала отсутствие |
Заключение
RAG позволяет превратить коллекцию технических книг в локальную базу знаний, доступную языковой модели.При этом модель не запоминает книги и не изменяет свои веса. Система извлекает текст, делит его на фрагменты, создаёт векторы и во время запроса находит наиболее подходящие материалы.
Качество RAG зависит не только от языковой модели. Не менее важны:
- качество PDF;
- правильное извлечение текста;
- OCR;
- размер чанков;
- embedding-модель;
- настройки поиска;
- объём контекста;
- метаданные;
- системный промпт;
- контрольные тесты.
Даже самая мощная модель не сможет правильно ответить по книге, если нужная страница не была распознана, попала в неправильный чанк или не была найдена векторным поиском.Сначала проверьте качество извлечённого текста и поиска, и только потом оценивайте ответы нейросети.
Правильно настроенная RAG-база позволяет использовать локальную нейросеть как помощника по технической документации, программированию, внутреннему устройству операционных систем, анализу вредоносного ПО, серверному администрированию и информационной безопасности.
