← Все гайды AI Release
EN Подписаться на @ai_release1

Как настроить локальный семантический поиск по файлам с Rummage и EmbeddingGemma 2

Обновлено: 24.10.2026 · AI Release · @ai_release1
Как настроить локальный семантический поиск по файлам с Rummage и EmbeddingGemma 2

TL;DR

- Python 3.10+ и venv (минимальную поддерживаемую версию сверьте с документацией Rummage)

- Rummage — CLI-инструмент локальной индексации и поиска по файлам (набор команд и флагов сверьте с документацией проекта)

- локальные веса модели EmbeddingGemma 2 — модель эмбеддингов семейства Gemma, превращает фрагмент текста в вектор чисел

- свободное место под веса модели и под индекс (точный размер весов — на странице модели)

- интернет только на этапе скачивания весов; сами запросы выполняются локально

Требования и подготовка

Иллюстрация к разделу «Требования и подготовка»
Иллюстрация к разделу «Требования и подготовка»

Чек-лист перед стартом:

Как устроен поиск. Понимание потока данных экономит часы отладки:

1. Обход каталога → список файлов, отфильтрованный по include/exclude.

2. Нарезка файлов на чанки (фрагменты по N символов с перекрытием).

3. Каждый чанк прогоняется через EmbeddingGemma 2 → вектор чисел.

4. Векторы + путь к файлу + смещение чанка записываются в индекс.

5. Запрос пользователя прогоняется через ту же модель → вектор запроса.

6. Считается близость (косинусное сходство — мера «похожести» двух векторов) → топ-K чанков → пути файлов и сниппеты.

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

Пример: если проиндексировали ~/Documents/wiki моделью по пути ~/models/embeddinggemma-2, то и запрос должен идти с model.path: ~/models/embeddinggemma-2 в конфиге — не с другой версией весов.

Шаг 1. Установить Rummage и скачать веса модели

Что сделать: создать виртуальное окружение, установить Rummage, скачать веса EmbeddingGemma 2 в локальный каталог.

Зачем: веса должны лежать на диске, чтобы поиск работал без сети; а изоляция окружения гарантирует, что команда rummage вызывается из нужного Python.

python3 -m venv ~/.venvs/rummage
source ~/.venvs/rummage/bin/activate
python -m pip install --upgrade pip
pip install rummage

Пример: имя пакета и способ установки (PyPI / cargo / готовый бинарник) сверьте с документацией Rummage — если пакет ставится иначе, замените строку pip install rummage на команду из документации.

Проверка установки:

rummage --version
rummage --help

Как проверить: --version печатает номер версии, --help — список подкоманд. Если оболочка отвечает bash: rummage: command not found, окружение не активировано.

Скачивание весов:

pip install -U huggingface_hub
huggingface-cli download <org>/<repo-embeddinggemma-2> \
  --local-dir ~/models/embeddinggemma-2

Пример: <org>/<repo-embeddinggemma-2> — идентификатор репозитория модели; точное значение сверьте на странице модели EmbeddingGemma 2, подставлять произвольную строку нельзя.

ls -la ~/models/embeddinggemma-2 | head

Как проверить: в листинге есть config.json, файлы токенизатора и файлы весов. Если каталог пуст — скачивание прервалось, повторите команду.

Шаг 2. Создать конфиг и построить индекс

Иллюстрация к разделу «Шаг 2. Создать конфиг и построить индекс»
Иллюстрация к разделу «Шаг 2. Создать конфиг и построить индекс»

Что сделать: описать конфиг (модель, путь индекса, размер чанка, что включать и что исключать) и прогнать индексацию каталога.

Зачем: без явного конфига инструмент либо возьмёт значения по умолчанию, либо не поймёт, где лежат веса. exclude критичен: без него в индекс попадут .git, node_modules и бинарники — индекс раздуется, а качество упадёт.

# ~/.config/rummage/config.yaml
model:
  path: /home/<user>/models/embeddinggemma-2
  batch_size: 16
index:
  path: /home/<user>/.local/share/rummage/index
  chunk_size: 800
  chunk_overlap: 100
search:
  top_k: 10
include:
  - "**/*.md"
  - "**/*.txt"
  - "**/*.pdf"
exclude:
  - "**/.git/**"
  - "**/node_modules/**"
  - "**/*.png"
  - "**/*.zip"

Пример: замените /home/<user> на свой домашний каталог (echo $HOME). Имена ключей (chunk_size, chunk_overlap, top_k) и их допустимые диапазоны сверьте с документацией Rummage — конфиг выше показывает структуру, а не гарантированный для всех версий синтаксис.

Почему это работает: чанк — минимальная единица поиска. Слишком большой чанк размывает смысл, слишком маленький теряет контекст; перекрытие (chunk_overlap) не даёт разрезать мысль на границе фрагмента.

Индексация:

rummage index ~/Documents/wiki --config ~/.config/rummage/config.yaml

Пример ожидаемого вывода (формат зависит от версии):

Scanning /home/user/Documents/wiki
Matched 412 files
Embedded 3184 chunks
Index written to /home/user/.local/share/rummage/index

Как проверить: число Matched files больше нуля и примерно совпадает с find ~/Documents/wiki -type f | wc -l. Если Matched 0 files — фильтры include/exclude не пропускают ваши расширения.

Пробный запрос:

rummage search "как настроить резервное копирование" --top-k 5

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

Шаг 3. Проверить качество и зафиксировать результат

Иллюстрация к разделу «Шаг 3. Проверить качество и зафиксировать результат»
Иллюстрация к разделу «Шаг 3. Проверить качество и зафиксировать результат»

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

Зачем: «команда отработала» не значит «поиск ищет». Проверять надо на запросах, для которых вы заранее знаете правильный ответ.

rummage search "договор аренды 2023" --top-k 3 --format json

Пример: флаг --format json (и само его наличие) сверьте с документацией — он нужен, чтобы результат можно было обработать скриптом, а не читать глазами.

Контрольная таблица — заполните её под свой корпус и прогоняйте после каждой переиндексации:

Контрольный запросОжидаемый файл в топ-3Что считать успехом
«инструкция по восстановлению пароля»`docs/password-reset.md`файл в топ-3
«схема резервного копирования»`ops/backup.md`файл на 1-м месте
«договор аренды 2023»`contracts/2023/lease.pdf`файл в топ-3

Как проверить: из 10 контрольных запросов минимум 7 дают правильный файл в топ-3. Меньше — проблема в чанкинге (попробуйте chunk_size 400 и 1200 и сравните) или в том, что нужные файлы не попали в include.

Если корпус перерос несколько тысяч файлов и одного локального индекса мало, следующий шаг — вынести векторы в отдельную векторную БД: Локальный RAG: как поднять Qdrant или Chroma на своём мини-ПК.

Возможные проблемы и решения

Проблема. Команда не находится после установки

source ~/.venvs/rummage/bin/activate
which rummage

Проблема. Модель не загружается по локальному пути

ls ~/models/embeddinggemma-2/config.json
grep -n "path:" ~/.config/rummage/config.yaml

Проблема. Индекс построился, но файлов ноль

rummage index ~/Documents/wiki --config ~/.config/rummage/config.yaml --verbose
find ~/Documents/wiki -name "*.md" | wc -l

Временная мера для диагностики — убрать exclude целиком, переиндексировать и посмотреть на число файлов.

Резюме и следующие шаги

Вы получили локальный семантический поиск: файлы нарезаны на чанки, векторизованы EmbeddingGemma 2 и лежат в индексе, а запросы ищут по смыслу, а не по точному совпадению слов. Дальше стоит автоматизировать переиндексацию по расписанию и, при росте корпуса, вынести векторы в Qdrant или Chroma.

FAQ

Нужен ли интернет для поиска?

Нет, после скачивания весов модель работает локально; сеть нужна только на этапе установки и загрузки модели.

Почему поиск находит файлы по словам, которых в них нет?

Потому что сравниваются не слова, а векторы смысла: запрос «резервное копирование» может найти документ со словами «бэкап» и «снапшот».

Можно ли сменить модель эмбеддингов на уже построенном индексе?

Нет, индекс придётся перестроить: векторы разных моделей лежат в разных пространствах и несопоставимы.

Почему PDF ищутся хуже, чем markdown?

Текст из PDF извлекается с шумом (колонтитулы, разрывы строк), поэтому чанки получаются грязнее; проверьте качество извлечения на одном файле, прежде чем менять настройки.

🤖 Кратко для ИИ