Помню тот момент, когда я в очередной раз пытался вытащить конкретную спецификацию из стопки PDF‑отчетов. «Вот бы ИИ мог сам в этом покопаться», — подумал я. Это чувство знакомо многим, кто работает с большими массивами текстовой информации.
Тогда я и решил, что хватит это терпеть. Последующий день превратился в марафон по установке и настройке RAG (генерация с дополнением извлеченной информацией). Это был путь проб и ошибок, который в итоге увенчался успехом. И теперь я хочу поделиться этим опытом с вами.
В этом материале мы:
Пошагово установим rag_api в уже развёрнутый LibreChat;
Воспользуемся Python 3.12, PostgreSQL 17;
В командной строке соберём PostgreSQL‑аддон pg_vector через x64 Native Tools Command Prompt for VS 2022;
Протестируем RAG‑систему 20 вопросами к вымышленной документации, сгенерированной в Gemini 2.5 Pro;
Узнаем, во сколько раз медленнее запускать через CPU, чем через GPU.
Приятного прочтения!
Эта статья — продолжение предыдущей, и если вы уже ставили LibreChat, то сейчас самое время прокачать его.
Прикрепление текстов и документов (.txt, .csv, .tsv, исходный код, .pdf, .docx, .xlsx, .pptx и др.). Из коробки LibreChat этого не умеет — только изображения.
Поддержка RAG (retrieval‑augmented generation) — режима, в котором модель способна использовать вашу собственную базу знаний.
Если хотите меньше танцев с бубном — попробуйте Open WebUI. Он устанавливается легче и из коробки поддерживает больше форматов файлов.
RAG — это retrieval‑augmented generation, или, по‑русски, «генерация, дополненная извлечённой информацией». Представьте, что у модели есть возможность подсмотреть в конспект перед ответом. Именно этим RAG и занимается — добавляет к её внутренним знаниям свежие данные из ваших документов, PDF‑файлов, статей, баз данных, иногда даже из новостей.
Если отбросить мистику, всё довольно логично. Процесс делится на четыре ключевых этапа:
1. Документы индексируются, примерно как в поисковике. (Да, и это еще один повод сравнить RAG с мини поисковой системой.)
Как часто это происходит? Возможны варианты:
Если RAG существует в виде «неизменной» базы данных, индексацию делают изредка — при создании базы или обновлении её файлов.
Если же вы каждый раз прикрепляете к диалогу с чат‑ботом новые файлы в режиме RAG, они будут индексироваться прямо на месте, пока эмбеддинг‑модель работает в фоне. Именно этот способ мы применим в сегодняшней статье.
2. Когда пользователь задает вопрос, система не сразу отправляет его в языковую модель. Вместо этого она сначала прогоняет запрос через этап извлечения. Специальный алгоритм векторного поиска молниеносно ищет в вашей базе знаний фрагменты текста, наиболее релевантные вопросу. Похоже на то, как искать нужную цитату в книге по ключевым словам.
3. Этап дополнения. Найденные фрагменты подшиваются к исходному запросу — и получается расширенный промпт.
Примерно так:
ВОТ ВОПРОС ПОЛЬЗОВАТЕЛЯ:
[вопрос]ЭТО ВЫДЕРЖКИ ИЗ НАШЕЙ БАЗЫ ЗНАНИЙ:
[контекст]ОТВЕТЬ, ИСПОЛЬЗУЯ ЭТУ ВСПОМОГАТЕЛЬНУЮ ИНФОРМАЦИЮ.
(Чаще используют не капслок, а XML‑теги — модели обрабатывают этот формат стабильнее.)
4. Финальный этап — генерация. Весь собранный промпт отправляется в конечную модель. Её задача — синтезировать связный, аргументированный ответ, как будто это делал эксперт, знающий контекст изнутри. В результате вы получаете аргументированный ответ, основанный на реальных документах.
Пункты 1–2 (индексация и извлечение) можно выполнять как через CPU, так и через GPU. GPU даёт фору — иначе скорость падает в 5–100 раз (зависит от размера документа, модели поиска и скорости оборудования).
И ещё приятная деталь: всё это может работать не только локально, но и в облаке.
В итоге RAG — это мощная надстройка, благодаря которой можно обходиться без переобучения модели под каждые новые данные. Он превращает универсального собеседника в узкопрофильного специалиста, который в курсе последних событий и ваших внутренних правил.
И теперь попробуем разобраться, как подключить всё это к программе LibreChat.
Для этой части вам понадобятся следующие инструменты (пока не устанавливайте — просто ознакомьтесь с набором):
Python версии 3.8+.
PostgreSQL — скачиваем отсюда: https://www.postgresql.org/download/.
Расширение для PostgreSQL pg_vector: https://github.com/pgvector/pgvector.git.
Проект rag_api: https://github.com/danny‑avila/rag_api.
x64 Native Tools Command Prompt for VS 2022 — можно установить или обновить по ссылке: https://visualstudio.microsoft.com/downloads/#build‑tools‑for‑visual‑studio-2022.
Локации, в которые будет происходить установка:
Виртуальное окружение: C:\rag_env\
;
RAG‑сервер: D:\rag_api\
;
pgvector: D:\pgvector\
;
PostgreSQL: C:\Program Files\PostgreSQL\
;
Python 3.12: C:\Python312\
.
1. Устанавливаем PostgreSQL отсюда: https://www.postgresql.org/download/.
2. В процессе установки нужно будет придумать пароль суперпользователя.
3. Установите или обновите Build Tools for Visual Studio. Эти инструменты нужны, чтобы собрать расширение pg_vector.
4. Битва с командной строкой стартует здесь.
Клонируйте проект pgvector: git clone https://github.com/pgvector/pgvector.git D:\pgvector
.
5. Через «Пуск» запустите x64 Native Tools Command Prompt for VS 2022 — специальную консольную среду, которая активирует нужные переменные. (Этот ярлык откроет .bat‑файл: %comspec% /k "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
.)
Кроме того, есть вариант запустить через новую вкладку:
6. В открывшейся среде собираем pg_vector:
set "PGROOT=C:\Program Files\PostgreSQL\17" && cd /d D:\pgvector && nmake /F Makefile.win && nmake /F Makefile.win install
После успешного запуска появятся свежесобранные файлы расширений в этих папках:
C:\Program Files\PostgreSQL\17\share\extension\
C:\Program Files\PostgreSQL\17\include\server\extension\vector\
7. Откройте консольный PosgreSQL (psql) от имени суперпользователя postgres
:
"c:\Program Files\PostgreSQL\17\bin\psql.exe" -U postgres -h localhost -p 5432
Если запросит, вводим ранее заданный пароль и жмём Enter. Пароль не отображается при вводе, чтобы никто не узнал, сколько звёздочек вбивать.
8. Находясь в psql, создадим для RAG базу данных и виртуального пользователя. С помощью такой команды:
CREATE DATABASE rag_db; CREATE USER rag_user WITH PASSWORD 'rag_password_123456' SUPERUSER;
Да, пароль можно заменить на свой, одновременно нужно будет менять его и в файле D:\rag_api\.env
.
9. Клонируйте проект rag_api:
git clone https://github.com/danny-avila/rag_api D:\
10. Теперь займёмся Python. Я устанавливал на Python 3.12, взять можно отсюда: https://www.python.org/downloads/.
Лучше ставить в папку с коротким путём, например C:\Python312\
. Включите Add python.exe to PATH, иначе команда py не найдёт нужную версию.
11. Создаём и активируем виртуальное окружение, затем устанавливаем зависимости:
py -3.12 -m venv C:\rag_env && C:\rag_env\Scripts\activate && cd /d D:\rag_api && pip install -r requirements.txt
12. Создайте файл D:\rag_api\.env
, следующего содержания:
VECTOR_DB_TYPE=pgvector
POSTGRES_DB=rag_db
POSTGRES_USER=rag_user
POSTGRES_PASSWORD=rag_password_123456
DB_HOST=localhost
DB_PORT=5432
DB_NAME=rag_db
COLLECTION_NAME=ragapicollection
# Перед началом индексации данные делятся на фрагменты длиной 1500 символов,
# с перехлестом в 100 символов. Эти значения можно изменить ниже.
CHUNK_SIZE=1500
CHUNK_OVERLAP=100
# Указываем провайдера и модель для эмбеддингов.
# Для intfloat/multilingual-e5-base (≈110M параметров)
# требуется 1,2–1,5 RAM/VRAM.
# Примеры других мультиязычных моделей, которые попробовать:
# - sentence-transformers/all-MiniLM-L6-v2 (≈22M параметров, ~0,4–0,6 ГБ RAM/VRAM)
# - BAAI/bge-large-zh/bge-large-m3 (≈330M параметров, ~3,5–4,5 ГБ RAM/VRAM)
EMBEDDINGS_PROVIDER=huggingface
EMBEDDINGS_MODEL=intfloat/multilingual-e5-base
# Параметры сервера RAG API:
RAG_HOST=0.0.0.0
RAG_PORT=8000
13. И наконец, подключаем RAG‑сервер к LibreChat’у. Откройте D:\LibreChat\.env
и добавьте строку:
RAG_API_URL=http://0.0.0.0:8000
Всё, подготовка закончена. Дальше начинается запуск и тестирование.
Пора запускать сервер, пробуем сделать это следующей командой:
cd /d D:\rag_api && C:\rag_env\Scripts\python.exe ‑m uvicorn main:app ‑host 0.0.0.0 ‑port 8000
(Если хочется удобства — в Windows можно создать ярлык «RAG‑сервер для LibreChat», который делает то же самое: cmd /k "cd /d D:\rag_api && C:\rag_env\Scripts\python.exe -m uvicorn main:app --host 0.0.0.0 --port 8000"
.)
При первом запуске скачается эмбеддинг‑модель с Hugging Face:
В конце концов окно запущенного сервера выглядит так:
Пока активен запущенный в командной строке RAG‑сервер, в LibreChat становится возможным прикреплять (вдобавок к изображениям) тексты и документы.
С одним значительным «но»...
Как уже замечено в прошлой статье, RAG — это не просто один из способов загрузки офисных файлов в LibreChat, а, по сути, единственный способ их загрузить. Соглашусь, что это не очень удобно (и данная проблема обсуждается в ветвях репозитория), поэтому не будет лишним повторить, что все дороги ведут в Open WebUI.
Наглядный пример XML-разметки, в которой файлы передаются в конечную ИИ-модельЧтобы проверить систему, я сгенерировал документацию через Gemini 2.5 Pro — объём примерно ~32 500 символов.
Дальше тест был прост: я прикреплял этот Markdown‑файл к LibreChat и задавал вопросы по его содержимому. Как именно шёл запрос:
Перетаскивал Markdown‑файл в диалог;
В промпте задавал конкретный вопрос, относящийся к материалу файла. RAG‑система искала релевантные фрагменты и передавала их вместе с запросом в LLM.
Дополнительно в промпте просил вывести те самыe фрагменты, которые RAG признала релевантными (то есть, по сути, вернуть невидимую часть запроса обратно), — чтобы прочитать, что именно попало в контекст модели.
Итак — что получилось в тесте. Всего было 20 вопросов. В качестве конечной модели я использовал ChatGPT o3-mini — мини‑модель, быстрая и подходящая для задач с парсингом и быстрыми ответами.
Первая половина вопросов задумывались простыми, с упором на ключевые слова; вторая половина более обобщённые, для углубленного теста RAG‑системы.
Продолжим разбирать результаты и выводы?
СкриншотКакова основная цель протокола EtherLink (ELP v4.2) и какие у него ключевые особенности?
RAG уверенно поймал тему, выбрав шесть фрагментов, но слегка расплескал контекст — часть кусков оказалась о портах и JSON‑примерах.
СкриншотЧто такое когнитивный поток (Cognitive Flow) и какие основные поля содержит его JSON‑структура?
Система сработала почти идеально — вытащила фрагменты с определением и JSON‑структурой потока, лишь слегка добавив шум. Ответ получился полный и аккуратный, без выдумок. Типичный случай, когда узкий запрос показывает силу RAG.
СкриншотКакие компоненты входят в состав архитектуры эфирного узла AetherCore?
Тут RAG промахнулась — вместо списка компонентов из раздела 3.1 подала общие описания и теорию. LLM, не имея точных данных, ответила частично верно, но поверхностно.
СкриншотКак протокол DPoC (Dynamic Proof‑of‑Coherence) обеспечивает консенсус между узлами?
Отличный результат — RAG нашел нужный блок с описанием кворума и голосования, а LLM чётко воспроизвела механизм без искажений.
СкриншотЧто делает модуль безопасности «Эгида» и какие методы шифрования он использует?
RAG попал точно в нужный раздел, между тем добавив пару бесполезных кусков. LLM грамотно структурировала ответ: X.509, AES-256-GCM, ECDSA, всё по тексту. Демонстрация идеального взаимодействия RAG + LLM.
СкриншотКакие метрики производительности экспортируются в формате Prometheus?
RAG‑система вытащила таблицу метрик и контекст, добавив чуть‑чуть мусора из JSON‑разделов. LLM корректно пересказала все показатели и типы. Простая задача — чистый тест на факт‑ретрив, выполнен уверенно.
СкриншотЧто представляет собой AetherVM и зачем используется язык AetherScript?
Три из пяти фрагментов в точку, два — шум. Видно, что RAG вытянул глоссарий и примеры, но пропустил детали про байт‑код. Ответ ChatGPT o3-mini тем не менее — краткий, точный, с минимумом воды. Рабочий кейс с лёгким недоборчиком контекста.
СкриншотКакие типы топологий поддерживает сетевая модель AetherCore?
Промах RAG — ключевой раздел с явным списком топологий пропущен. Модель логично додумала на основе общих описаний. Результат выглядит умно, но по факту неточен.
СкриншотВ чём заключается отличие AetherCore от традиционных HPC и облачных архитектур?
Почти эталон: RAG достал таблицу сравнений и нужные куски, LLM выдала структурированный список отличий без ошибок. Небольшие потери деталей, но ответ читается как готовый фрагмент статьи.
СкриншотКакие команды доступны в интерфейсе командной строки ACLI?
Один фрагмент попал точно в цель, остальные — шумовые. Несмотря на это, LLM выдала стопроцентно корректный список команд. Хороший пример, как даже при грязном контексте модель может фильтровать мусор.
СкриншотКаким образом теория динамических когерентных полей влияет на маршрутизацию когнитивных потоков?
Большинство фрагментов релевантны, ответ математически точен и понятен.
СкриншотПочему модель Hybrid Distributed Computing (HDC) считается «гибридной» и какие преимущества это даёт для NP‑трудных задач?
RAG‑система уверенно справилась с вопросом о доступных API‑интерфейсах, вытянув правильные разделы из документации. Ответ получился точным и почти без шума, хотя часть фрагментов касалась лишь косвенно SDK и могла быть отброшена.
СкриншотКак система AetherCore реагирует на каскадный отказ узлов и какие механизмы обеспечивают самовосстановление сети?
Тест показал, что RAG может чётко доставать структурированные таблицы и YAML‑примеры. Модель верно воспроизвела поля логов и уровни серьёзности.
СкриншотЧем квантовые шарды (QSh) отличаются от реальных квантовых компьютеров и какие задачи на них решаются?
Здесь система немного споткнулась: RAG пропустил ключевой подпункт с пошаговым сценарием, из‑за чего LLM ответила в общих чертах. Тем не менее общая логика и терминология были выдержаны, а конечная ИИ‑модель o3-mini честно призналась, что подробностей в тексте нет. Хороший пример самокоррекции LLM при неполных данных.
СкриншотКак параметр
coherence_gain
в псевдокоде маршрутизатора влияет на выбор узла?
Релевантные фрагменты выбраны почти идеально — RAG вытащил куски из раздела о модульной системе и пакетах, с упоминанием версии протоколов и путей импорта.
СкриншотПочему архитектура AetherCore не имеет единой точки отказа (SPOF) и как это реализуется на уровне протоколов?
Очень наглядный кейс: RAG подобрал правильные куски, но добавил немного «фонового текста» про мониторинг. LLM аккуратно отфильтровала шум, объяснив механизм приоритизации и SLA‑метрики. Система показала, что даже с частично релевантным контекстом может выдать связный технический ответ.
СкриншотКак связаны между собой компоненты NodeManager, FlowDispatcher и Cognitive Router в процессе обработки потока?
Ответ чёткий, но неполный: не хватает упоминания rollback‑процедур. Пример, когда RAG работает «вширь», но не «вглубь».
СкриншотКаким образом AetherTrace может быть использована для аудита безопасности или SLA‑анализа?
Система показала стабильность: выбрала нужные фрагменты про REST и gRPC‑шлюзы, а LLM логично структурировала их в список. Мелкий минус — не были подхвачены детали авторизации.
СкриншотЕсли в сети наблюдается рост энтропии
E(S)
в формуле когерентности, как это повлияет на производительность и поведение системы?
RAG вытащил в целом правильные куски про формулу, но добавил немного шума из соседних разделов. Модель корректно объяснила, как рост энтропии снижает согласованность потоков. Ответ точный, но без деталей про веса α, β, γ — чувствуется лёгкая неполнота.
СкриншотКаким образом AetherCore может быть применён в задачах управления городской инфраструктурой, согласно кейсам документа?
Система попала почти идеально: подтянула кейсы с интернетом вещей и транспортом, а LLM связала архитектуру с реальными сценариями.
Снова подчеркну: всё, что было выше, — про конкретную эмбеддинг‑модель intfloat/multilingual‑e5-base. Именно от эмбеддингов на 90% зависит точность RAG‑поиска. Я специально выбрал простую, но быструю модель, чтобы показать, насколько сильно качество эмбеддингов влияет на результат.
Если бы вместо неё мы взяли, например, BAAI/bge‑large‑zh/bge‑large‑m3 (или что‑то ещё более тяжёлое — вплоть до облачного варианта), картина была бы иной: точность заметно выше, но и потребление памяти выросло бы в разы. А без GPU обработка небольшого документа составила бы несколько минут.
В общем и целом ответы LLM устойчиво качественные: при точных фрагментах, предоставленных RAG, — исчерпывающие, при шумных — аккуратные обобщения без галлюцинаций. Видно, что модель неплохо фильтрует шум и даже при неидеальных данных ChatGPT o3-mini сохраняет структуру и корректность.
Повторяется закономерность — узкие вопросы обрабатываются лучше широких. RAG честно вытаскивает релевантные чанки, но иногда перестраховывается и добавляет соседние абзацы. Где вопрос узкий и формулировка конкретная, точность на уровне 85–95%.
И наконец, тесты показали, что в текущем виде это уже рабочий инструмент для поиска по техдокам, помощник для инженеров и исследователей, а также отличный полигон, чтобы протестировать параметры RAG.
Таким образом, надстройка RAG — это не просто технический трюк, а стратегическое улучшение, которое кардинально расширяет сферу применения чат‑бота. Он перестает быть просто генератором текста и становится интеллектуальным интерфейсом к вашей персональной или корпоративной базе знаний.
Проведенное тестирование на 20 вопросах наглядно продемонстрировало сильные и слабые стороны системы. Это доказывает, что RAG — настраиваемый инструмент, у которого есть несколько переменных (включая используемые модели, размеры фрагментов и выбор между локальным или облачным запуском).
В статье я применил модель ChatGPT o3-mini. Вы тоже можете протестировать её и многие другие (Claude, Grok, Gemini, Midjourney...) в сервисе BotHub, эта ссылка даёт бонусные 100 000 капсов.