Присоединяйтесь к бете Hanzo и получите скидку 50% на любой платный тариф

Hanzo Brain: локальный граф знаний для агентов

Один файл SQLite, который агент читает из любой среды выполнения. Ноль обращений к LLM на операциях графа, FTS5 плюс векторы плюс извлечение типизированных рёбер в момент записи.

На этой странице

Ваш агент умный, но забывчивый. Мы это исправили. Сегодня мы выпускаем Hanzo Brain — один бинарник, один файл SQLite по пути ~/.hanzo/brain/brain.db и ту же алгоритмическую поверхность на TypeScript, Python, Rust, Go и C++. Положите файл markdown в ~/.hanzo/workspace/. Мозг его поглощает, извлекает типизированные рёбра и индексирует содержимое для гибридного поиска. LLM не вызывается. Граф накапливается.

Это слой памяти для каждой среды выполнения Hanzo — бота, сервера MCP, Hanzo Node и всего, что вы встраиваете в свой хост.

Что такое мозг

Мозг — это три вещи в одном процессе:

  1. Страницы — содержимое с адресом-slug, записанное откуда угодно, наблюдаемое на диске.
  2. Рёбра — типизированные связи (mentions, attended, works_at, invested_in, founded, advises), извлекаемые при каждой записи регулярным выражением и выводом роли. Ноль LLM.
  3. Факты — кортежи (subject, predicate, object, ts, confidence), доступные для запроса в реальном времени между сессиями.

Страницы получают индекс FTS5. Рёбра получают первичный ключ по (source, target, type). Факты получают id и метку времени. Схема достаточно коротка, чтобы держать её в голове:

CREATE TABLE pages (slug TEXT PRIMARY KEY, content TEXT, frontmatter TEXT, updated_at TEXT);
CREATE VIRTUAL TABLE pages_fts USING fts5(content, content='pages', content_rowid='rowid');
CREATE TABLE edges (source TEXT, target TEXT, type TEXT, evidence TEXT, PRIMARY KEY (source, target, type));
CREATE TABLE facts (id TEXT PRIMARY KEY, subject TEXT, predicate TEXT, object TEXT, source TEXT, ts TEXT, confidence REAL);

Это весь контракт. Каждый бэкенд его соблюдает. Каждая среда выполнения пишет побайтово одинаковый файл.

Почему извлечение без LLM важно

Экстракторы на LLM сжигают токены, задержку и деньги на каждой записи. Они дают дрейф между прогонами. Они делают граф недетерминированным.

Мозг извлекает рёбра регулярным выражением и выводом роли в момент записи. Это быстро, это бесплатно, и при том же входе рёбра каждый раз одни и те же. Когда вы поглощаете «Алиса основала Acme. Она вложилась в Foobar», вы получаете:

people/alice -[founded]->     companies/acme
people/alice -[invested_in]-> companies/foobar

Каждый раз. На каждой среде выполнения. Без кругового похода.

Если хотите обогащение LLM сверху — снятие неоднозначности сущностей, проверку утверждений, пересказ — вызывайте свою модель поверх детерминированного графа. Граф — это субстрат. LLM — необязательная отделка.

Один файл. Каждая среда выполнения.

Один и тот же brain.db открывается в TypeScript, Python, Rust, Go и C++. Без перевода формата, без миграции. Если вы пишете из hanzobot/go на сервере и читаете из @hanzo/bot-memory в воркере браузера, вы читаете файл, который записал сервер.

ВозможностьTSPythonRustGoC++
Интерфейс BrainStoreдадададада
SQLite (по умолчанию)дадададада
Гибридный поиск FTS5дадаtraitдада
Экстрактор связей графададададада
Загрузчик рецептовдадададада
Сменные бэкендыдадададада

Суммы тестов по средам на запуске: 121 TS + 53 Python + 58 Go + 38 Rust (mcp) + 38 Rust (node) + 98 C++ = 406 тестов, все зелёные. Каждая среда несёт то же слияние, тот же rerank (MMR), тот же RRF, ту же нормализацию slug, тот же экстрактор рёбер.

Запросы через MCP

Мозг открыт через MCP как три инструмента:

  • brain.recall <entity> — каждый факт, когда-либо утверждённый о сущности, с метками времени.
  • brain.search <query> — гибридный FTS плюс вектор, слитые через RRF, необязательный rerank MMR.
  • brain.ingest <slug> <content> — пишет страницу, сам извлекает рёбра, обновляет FTS.

Каждый агент, который говорит с Hanzo Node, с MCP-сервером Hanzo или с ботом на hanzobot/*, получает эти инструменты бесплатно. Без sidecar, без лишнего сервиса, без отдельной базы, которую надо вести.

Для пути одного бинарника на Go:

go install github.com/hanzobot/go/cmd/hanzo-bot@latest

hanzo-bot brain init                  # opens ~/.hanzo/brain/brain.db
hanzo-bot brain ingest people/alice.md
hanzo-bot brain recall people/alice
hanzo-bot brain search "founded"

Для Python:

from hanzo_memory.graph_links import extract_edges
edges = extract_edges(slug="people/alice", content="Alice founded Acme.")

Для Rust, встроенного в hanzo-mcp:

use hanzo_mcp::brain::{extract_edges, slugify};
let edges = extract_edges("people/alice", "Alice is CEO of Acme.", Some("person"));

Сменное хранение, тот же контракт

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

БэкендКогда
sqliteв одиночку, < 100K страниц
qdrantвекторный ANN на масштабе
meilisearchFTS по ключевым словам на масштабе
zapdbканоническое многоязычное нативное хранилище
replicateWAL SQLite, потоком в S3 для резервной копии
vfsблочная ФС потоковой передачи с S3, без предела размера
postgresмногоарендные командные развёртывания

Для распределённой семантики в форме SQLite на нескольких машинах мы используем транспорт ZAP, консенсус Quasar и zapdb. Мозг остаётся тем же. Контракт «байты внутрь, байты наружу» держится.

Накопительная память

Смысл мозга не в базе данных. Смысл в смене допущения. Ваш агент не начинает каждую сессию с пустого листа. Markdown, который вы написали год назад, уже граф. Вчерашние разговоры породили рёбра и факты, которые сегодняшняя сессия запрашивает, не платя за это токенами. Два агента на двух машинах могут делить brain.db через replicate и сойтись к одному виду.

Вот что мы называем накопительной памятью. Граф растёт. Модель дешевеет. Пользователь видит помощника, который помнит.

Заберите мозг

  • Канон TypeScript (идёт с ботом): npm install -g @hanzo/bot && hanzo-bot serve
  • Python: pip install hanzo-memory
  • Один бинарник Go: go install github.com/hanzobot/go/cmd/hanzo-bot@latest
  • Rust: член рабочего пространства hanzoai/node и hanzoai/mcp
  • C++: только заголовки в hanzobot/cpp/include/hanzo/brain/

Исходники: github.com/hanzoai/brain. Лицензия: MIT.


Один файл. Пять сред выполнения. Ноль вызовов LLM на операциях графа. Сначала локально, по замыслу.

Комментарии

Войдите с Hanzo ID, чтобы комментировать.

Загрузка комментариев…

Читать далее