mnemo — локальный слой памяти для LLM с графом знаний
📂 Исходный код на GitHubLocal-first AI memory layer для любого LLM. Персистентный граф знаний, извлечение сущностей, семантический поиск. Работает с Ollama, OpenAI, Anthropic или любым OpenAI-совместимым бэкендом.
Задача
LLM-приложения, построенные на кастомных пайплайнах, не имеют персистентной памяти между сессиями. mnemo решает эту проблему — локальный помощник на Rust, который извлекает сущности из текста, строит граф знаний в SQLite и подставляет релевантный контекст в будущие промпты. Без облака, без Python, без vendor lock-in.
Репозиторий: https://github.com/zaydmulani09/mnemo
Как работает
Пайплайн состоит из двух основных потоков:
-
Ingest — отправляете сырой текст (реплика чата, документ, заметку) через
POST /ingest. mnemo прогоняет его через LLM, извлекает именованные сущности (люди, инструменты, места, концепции) и связи между ними. Сущности дедуплицируются по имени+тип, алиасы мержатся, всё пишется в SQLite. Ин-memory граф на petgraph обновляется атомарно. -
Retrieve — через
POST /retrieveзапускается 6-стадийный пайплайн: полнотекстовый поиск по чанкам → поиск по именам сущностей → расширение через граф (BFS) → фильтрация по отношениям → скоринг и ранжирование → сборка строкиcontext_prompt. Эту строку вы подставляете в system prompt вашего LLM.
Граф — ключевое отличие. Результаты, полученные через расширение графа, получают коэффициент 0.5x, поэтому прямые совпадения всегда ранжируются выше выводных.
Архитектура
Четыре Rust-крейта:
| Крейт | Тип | Назначение |
|---|---|---|
mnemo-core |
lib | Извлечение сущностей, графовые операции, retrieval, DB-слой |
mnemo-api |
bin | Axum REST API — тонкий слой хендлеров над mnemo-core |
mnemo-cli |
bin | CLI-инструмент через blocking reqwest |
mnemo-bench |
bin | Бенчмарки (12 наборов) |
Быстрый старт
Docker + Ollama (полностью бесплатно):
git clone https://github.com/zaydmulani09/mnemo
cd mnemo
docker compose up -d
docker exec mnemo-ollama ollama pull llama3
curl http://localhost:8080/health
Бинарник (Ollama или OpenAI отдельно):
cargo install --path crates/mnemo-api
export MNEMO_LLM_BASE_URL=http://localhost:11434/v1
mnemo-api
Python SDK:
pip install mnemo-sdk
from mnemo import MnemoClient
client = MnemoClient()
client.ingest("Я строю Rust-векторную базу данных vecdb")
print(client.get_context("над чем я работаю?"))
API
Основные эндпоинты:
| Метод | Путь | Описание |
|---|---|---|
POST |
/ingest |
Сохранить текст, извлечь сущности |
POST |
/retrieve |
Получить ранжированный контекст |
GET |
/entities |
Список сущностей (пагинация) |
GET |
/entities/:id/neighbors |
Соседи в графе знаний |
POST |
/search |
Полнотекстовый поиск |
GET |
/stats |
Статистика: сущности, чанки, граф |
DELETE |
/wipe |
Удалить всю память |
Полная документация API с curl-примерами: docs/api.md
Конфигурация
Переменные окружения или TOML-файл:
db_path = "mnemo.db"
port = 8080
[llm]
provider = "ollama"
base_url = "http://localhost:11434/v1"
model = "llama3"
api_key = "ollama"
timeout_secs = 30
max_retries = 3
max_tokens = 2048
temperature = 0.1
Переменные окружения имеют приоритет над TOML. Поддерживаемые провайдеры: ollama, openai, anthropic, custom.
CLI
cargo install --path crates/mnemo-cli
mnemo ingest "Я использую Neovim и тёмную тему"
mnemo search "какой редактор я использую?"
mnemo entities
mnemo entity <uuid> --neighbors
mnemo stats
Производительность
Apple M2, SQLite WAL, debug-сборка (release в 3–5 раз быстрее):
| Операция | Задержка | Пропускная способность |
|---|---|---|
| Вставка сущности | ~0.12 ms | ~8 300 ops/s |
| Полнотекстовый поиск | ~0.28 ms | ~3 500 ops/s |
| Соседи графа (depth=2) | ~0.89 ms | ~1 100 ops/s |
| Полный retrieval-пайплайн | ~4.2 ms | ~238 ops/s |
Чем отличается от альтернатив
- Единый статический бинарник на Rust (не Python-демон)
- SQLite — данные переживают рестарты
- petgraph — многохоповый обход графа
- Нулевая зависимость от облака
- Любой OpenAI-совместимый LLM-бэкенд
- Ранжированный retrieval с графовым расширением
Кому подходит — разработчикам кастомных LLM-пайплайнов, которым нужна локальная, структурированная, контролируемая память. Кому нет — тем, кто использует managed-агентов с уже встроенной памятью.
Лицензия: MIT. 122 Rust-теста, 21 Python-тест, 12 бенчмарков.
Источник: https://github.com/zaydmulani09/mnemo