Семантический поиск по памяти AI: векторы вместо grep
Проблема: память есть, а найти — нельзя
Современные AI-агенты хранят память в markdown-файлах. Это удобно: файлы читаемы человеком, их можно редактировать вручную, они легко копируются и версионируются. Но есть обратная сторона — когда файлов становится десятки или сотни, найти нужную запись превращается в боль.
Вы вспоминаете: «Какое кеширование мы выбрали для API?». Открываете папку memory, листаете файлы. Ctrl+F по слову «кеш» — ничего. Потому что в файле написано «Redis с TTL 300 секунд», а слова «кеш» там нет. Grep молчит. Вы теряете 15 минут на ручной поиск — или сдаётесь и спрашиваете AI заново, теряя контекст.
Это классическая проблема: ключевые слова не совпадают с формулировками. Память написана в одном стиле, а вопрос задан в другом. Традиционный поиск бессилен.
Решение: семантический поиск через векторы
Инструмент memsearch решает эту проблему. Он берёт ваши markdown-файлы памяти, нарезает на фрагменты, превращает каждый фрагмент в вектор (эмбеддинг) и сохраняет в векторную базу данных Milvus. После этого вы можете искать по смыслу, а не по буквам.
Запрос «какое кеширование мы выбрали» найдёт фрагмент про Redis с TTL — потому что векторное пространство понимает семантическую близость. Слова разные, смысл один.
Гибридный поиск: векторы + текст
memsearch использует гибридный ретривер — комбинацию двух подходов:
- Dense vectors (эмбеддинги) — семантический поиск. Находит фрагменты, близкие по смыслу, даже если формулировки完全不同.
- BM25 (полнотекстовый поиск) — классический статистический поиск по терминам. Хорош для точных совпадений: имён, артефактов, кода.
Результаты обоих методов объединяются через Reciprocal Rank Fusion (RRF) — алгоритм, который пересчитывает релевантность с учётом позиций в обоих списках. Итог: вы получаете и семантические, и точные совпадения, отсортированные по релевантности.
Это принципиально лучше, чем чистый векторный поиск. Если вы ищете «функция parse_config из utils.py», векторный поиск может вернуть «настройки парсера» — похоже по смыслу, но не то. BM25 точно найдёт нужную функцию. Гибридный подход покрывает оба сценария.
Как устроен рабочий процесс
1. Установка. memsearch — Python-пакет, ставится одной командой. Никаких внешних зависимостей кроме Docker (для Milvus) или локального режима без Docker.
2. Индексация. Указываете путь к папке с markdown-файлами памяти. memsearch нарезает файлы на чанки, вычисляет эмбеддинги и загружает в Milvus. Каждый чанк идентифицируется по SHA-256 хешу содержимого — если файл не изменился, он не переиндексируется. Ноль лишних API-вызовов.
3. Поиск. Запрашиваете на естественном языке. Возвращаете релевантные фрагменты с указанием источника — какого файла и какого абзаца.
4. Автосинхронизация. Запускаете file watcher — и memsearch автоматически переиндексирует изменённые файлы. Память агента обновилась — индекс обновился сам. Никакого ручного вмешательства.
Провайдеры эмбеддингов
memsearch работает с любым провайдером:
- OpenAI (text-embedding-3-small, text-embedding-3-large)
- Google (text-embedding-004)
- Voyage AI (voyage-3)
- Ollama (локальные модели через API)
- Полностью локальный режим — без API-ключей, модели запускаются на вашей машине
Для локального режима достаточно установить pip install "memsearch[local]" — всё остальное подтянется автоматически.
Почему markdown остаётся источником истины
Важная деталь: векторный индекс — это кэш, а не основное хранилище. Ваши markdown-файлы никогда не модифицируются. Индекс можно удалить и пересоздать в любой момент. Это значит:
- Вы можете редактировать память вручную в любом редакторе
- Файлы работают с git, как обычные текстовые файлы
- Нет привязки к конкретной базе данных — переехали на другой сервер, проиндексировали заново
- Память остаётся portable и читаемой человеком
Пример из жизни
У вас агент, который ведёт заметки о проектах. За три месяца накопилось 80+ файлов в папке memory. Вы спрашиваете:
«Какой подход к авторизации мы обсуждали для нового API?»
Без семантического поиска: grep по «авторизация» — может найтись, а может нет. Зависит от того, как именно записали.
С memsearch: поиск по смыслу найдёт фрагмент «JWT с refresh-токенами, срок жизни access — 15 минут» — даже если в файле нет слова «авторизация», а написано «аутентификация» или «auth flow».
Когда это нужно
- У вас AI-агент с markdown-памятью, которая растёт со временем
- Вы часто ищете прошлые решения и не можете их найти
- Вы хотите, чтобы агент мог сам обращаться к своей памяти по смыслу
- Вам нужна автосинхронизация — память обновилась, индекс обновился
Если память агента — это десятки файлов и сотни записей, ручной поиск не масштабируется. Семантический поиск решает задачу раз и навсегда.
Установка за 5 минут
# Установка
pip install memsearch
# Конфигурация (интерактивный мастер)
memsearch config init
# Индексация памяти
memsearch index ~/path/to/memory/
# Поиск
memsearch search "какое кеширование мы выбрали?"
# Автосинхронизация
memsearch watch ~/path/to/memory/
Для полностью локального режима (без API-ключей):
pip install "memsearch[local]"
memsearch config set embedding.provider local
memsearch index ~/path/to/memory/
Итого
memsearch превращает неструктурированную кучу markdown-файлов в интеллектуальную поисковую систему. Векторный семантический поиск + BM25 полнотекстовый поиск + RRF ранжирование. Автосинхронизация через file watcher. Ноль модификаций исходных файлов. Работает с любым провайдером эмбеддингов, включая полностью локальный.
Память AI-агента должна быть не только читаемой, но и находимой.
Скачать скилл (Markdown)
# Семантический поиск по памяти
Встроенная система памяти OpenClaw хранит всё в виде markdown-файлов — но по мере роста памяти на протяжении недель и месяцев найти одно конкретное решение с прошлого вторника становится невозможно. Поиска нет, только прокрутка файлов.
Этот сценарий добавляет **векторный семантический поиск** поверх существующих markdown-файлов памяти OpenClaw с помощью [memsearch](https://github.com/zilliztech/memsearch), чтобы вы могли мгновенно находить любое прошлое воспоминание по смыслу, а не только по ключевым словам.
## Что делает этот скилл
- Индексирует все ваши markdown-файлы памяти OpenClaw в векторную базу данных (Milvus) одной командой
- Ищет по смыслу: «какое кеширующее решение мы выбрали?» находит нужную запись, даже если слово «кеширование» в ней не встречается
- Гибридный поиск (плотные векторы + полнотекстовый BM25) с переранжированием RRF для наилучших результатов
- Хеширование содержимого SHA-256 означает, что неизменённые файлы никогда не переиндексируются — нулевые затраты на API-вызовы
- Файловый наблюдатель автоматически переиндексирует при изменениях файлов памяти, поэтому индекс всегда актуален
- Работает с любым провайдером эмбеддингов: OpenAI, Google, Voyage, Ollama или полностью локально (без API-ключа)
## Проблема
Память OpenClaw хранится в виде обычных markdown-файлов. Это отлично для переносимости и читаемости человеком, но в ней нет поиска. По мере роста памяти вам приходится либо искать по файлам через grep (только по ключевым словам, пропускает семантические совпадения), либо загружать целые файлы в контекст (тратит токены на нерелевантное содержимое). Вам нужен способ спросить «что я решил по поводу X?» и получить точный релевантный фрагмент, независимо от формулировки.
## Необходимые скиллы
- Скиллы OpenClaw не требуются — memsearch — это автономный Python CLI/библиотека
- Python 3.10+ с pip или uv
## Как настроить
1. Установите memsearch:
```bash
pip install memsearch
```
2. Запустите интерактивный мастер настройки:
```bash
memsearch config init
```
3. Проиндексируйте директорию памяти OpenClaw:
```bash
memsearch index ~/path/to/your/memory/
```
4. Ищите по памяти по смыслу:
```bash
memsearch search "what caching solution did we pick?"
```
5. Для живой синхронизации запустите файловый наблюдатель — он автоматически индексирует при каждом изменении файла:
```bash
memsearch watch ~/path/to/your/memory/
```
6. Для полностью локальной установки (без API-ключей) установите локальный провайдер эмбеддингов:
```bash
pip install "memsearch[local]"
memsearch config set embedding.provider local
memsearch index ~/path/to/your/memory/
```
## Ключевые выводы
- **Markdown остаётся основным источником данных.** Векторный индекс — это просто производный кеш, который можно перестроить в любой момент командой `memsearch index`. Ваши файлы памяти никогда не изменяются.
- **Умная дедупликация экономит деньги.** Каждый фрагмент идентифицируется хешем содержимого SHA-256. Повторный запуск `index` встраивает только новый или изменённый контент, поэтому вы можете запускать его так часто, как хотите, без лишних затрат на API-вызовы эмбеддингов.
- **Гибридный поиск превосходит чисто векторный.** Объединение семантического сходства (плотные векторы) с сопоставлением по ключевым словам (BM25) через Reciprocal Rank Fusion находит как запросы по смыслу, так и точные совпадения.
## Ссылки
- [memsearch GitHub](https://github.com/zilliztech/memsearch) — библиотека, лежащая в основе этого сценария
- [Документация memsearch](https://zilliztech.github.io/memsearch/) — полная справка по CLI, Python API и архитектуре
- [OpenClaw](https://github.com/openclaw/openclaw) — архитектура памяти, вдохновившая memsearch
- [Milvus](https://milvus.io/) — векторная база данных для хранения индексов