Все статьи
5 августа 2026 г.·3 мин чтения

Эмбеддинги в llama.cpp: локальный поиск по своим документам

Как поднять llama-server в режиме --embeddings, зачем нужна отдельная модель под эмбеддинги, что делает --reranking и почему для RAG приходится держать два сервера.

Чтобы модель отвечала по твоим документам, её сначала нужно научить их находить. Этим занимаются эмбеддинги: текст превращается в набор чисел, и близкие по смыслу фрагменты оказываются рядом. Дальше поиск идёт не по словам, а по смыслу.

llama.cpp умеет и это, но настраивается такой сценарий не совсем так, как обычный чат. Общая идея RAG разобрана в отдельной статье — здесь про конкретную реализацию.

Отдельная модель под эмбеддинги

Первое, что стоит принять: обычная чат-модель для этого не подходит. Нужна специализированная модель эмбеддингов — они заметно меньше, работают быстрее и обучены именно на превращение текста в вектор.

Второе: под неё поднимается отдельный экземпляр сервера. У llama-server есть ключ, который переводит его в этот режим:

llama-server -m models/embedding-model.gguf --embeddings --port 8081

В документации к ключу прямая оговорка: использовать только с моделями, предназначенными для эмбеддингов. Режим ограничивает сервер одной задачей.

Почему серверов получается два

Отсюда практическое следствие, которое удивляет при первой сборке: для RAG нужны два запущенных процесса. Один держит чат-модель и отвечает на вопросы, второй считает эмбеддинги для поиска.

llama-server -m models/qwen3-8b-q4_k_m.gguf --port 8080
llama-server -m models/embedding-model.gguf --embeddings --port 8081

Каждый занимает свою память. На машине, где чат-модель и так впритык помещается, добавление второго процесса может стать последней каплей — модель эмбеддингов маленькая, но не бесплатная.

Считай память заранее. Если чат-модель занимает почти всю видеопамять, второй сервер уедет на процессор и индексация документов растянется надолго. Иногда разумнее взять чат-модель на ступень меньше, чем экономить на модели эмбеддингов.

Эндпоинты

В режиме эмбеддингов сервер отдаёт два адреса: POST /v1/embeddings в OpenAI-совместимом формате и POST /embedding в родном формате llama.cpp. Первый удобнее, потому что к нему подключаются готовые библиотеки без переделок. Остальные эндпоинты сервера описаны в статье про llama-server.

Переранжирование

Есть ещё один ключ, о котором обычно узнают поздно:

llama-server -m models/reranker-model.gguf --reranking --port 8082

Он включает эндпоинт POST /reranking. Задача переранжирования — отобрать из найденных фрагментов действительно релевантные.

Зачем это нужно: поиск по эмбеддингам находит похожее, но «похожее» и «отвечающее на вопрос» не одно и то же. Модель-переранжировщик смотрит на пару «вопрос — фрагмент» внимательнее и пересортировывает результаты. На практике это заметно улучшает ответы, особенно когда документов много и они однотипные.

Плата предсказуемая: третья модель и третий процесс.

Что придётся написать самому

И вот здесь стоит остановиться, потому что llama.cpp даёт только кирпичи.

Сервер считает эмбеддинги. Он не читает твои PDF, не режет их на фрагменты, не хранит векторы, не ищет по ним и не собирает найденное в промпт. Всё это — код, который пишешь ты: парсинг документов, разбиение на куски с перекрытием, векторная база, запрос, сборка контекста, обновление индекса при изменении файлов.

Это неделя работы для того, кто делал такое раньше, и заметно больше для того, кто не делал. Результат при этом получается ровно под твою задачу — в этом и смысл, если задача нестандартная.

Когда собирать самому не стоит

Если задача обычная — «хочу спрашивать по своим документам», — собирать конвейер из трёх серверов и своего кода незачем. Тот же результат дают готовые приложения: AnythingLLM закрывает чат по документам почти без настройки, у Open WebUI есть свои базы знаний.

А если документы нужны не для разговора, а для работы — собрать сводку, заполнить таблицу, подготовить документ по шаблону, — то RAG вообще может оказаться лишним слоем. Индекс нужен, когда документов много и заранее неизвестно, где искать. Когда файлы лежат в конкретной папке, агенту проще открыть их напрямую.

Дока работает именно так: читает файлы там, где они лежат, и делает с ними то, что попросили, без предварительной загрузки в базу. Локальная модель ставится из интерфейса, а работа с документами и таблицами не требует поднимать три сервера и писать конвейер.

Так что llama.cpp с эмбеддингами — правильный выбор, если ты строишь свою систему поиска и понимаешь, зачем она тебе. Для всего остального готовый агент экономит ту самую неделю.