AI News HubLIVE
In-site rewrite2 min read

MemoHood and MemoBase – local memory and knowledge base for AI agents

MemoBase is a plugin for hermes-agent that transforms local files, web pages, YouTube videos, audio, and Obsidian notes into a searchable knowledge base, answering strictly with verified citations to eliminate hallucinations.

SourceHacker News AIAuthor: maxskorohood

Notifications You must be signed in to change notification settings

Fork 4

Star 8

BranchesTags

Open more actions menu

Folders and files

NameName

Last commit message

Last commit date

Latest commit

History

8 Commits

8 Commits

docs

docs

skill/memobase

skill/memobase

tests

tests

.gitattributes

.gitattributes

.gitignore

.gitignore

AGENTS.md

AGENTS.md

DESIGN_v1.md

DESIGN_v1.md

GUIDE.md

GUIDE.md

LICENSE

LICENSE

README.en.md

README.en.md

README.md

README.md

init.py

init.py

answer.py

answer.py

backup.py

backup.py

chunk.py

chunk.py

cli.py

cli.py

commands.py

commands.py

config.py

config.py

db.py

db.py

embed.py

embed.py

enrich.py

enrich.py

extract.py

extract.py

ingest.py

ingest.py

install.ps1

install.ps1

install.sh

install.sh

ledger.py

ledger.py

map.py

map.py

normalize.py

normalize.py

obsidian.py

obsidian.py

plugin.yaml

plugin.yaml

rerank.py

rerank.py

retrieve.py

retrieve.py

security.py

security.py

selfcheck.py

selfcheck.py

setup_core.py

setup_core.py

stem.py

stem.py

stt.py

stt.py

systemd_env.py

systemd_env.py

tools.py

tools.py

wizard.py

wizard.py

youtube.py

youtube.py

Repository files navigation

Плагин для hermes-agent, который превращает ваши файлы (PDF/DOCX/HTML/MD/TXT/CSV), веб-страницы, YouTube-видео и целые каналы, аудиозаписи и заметки Obsidian в локальную базу знаний — и отвечает строго по ней: с дословными проверенными цитатами или честным отказом, если ответа в базе нет.

🌐 Русский · English

Зачем · Возможности · Установка · Настройки · Инструменты

flowchart TD subgraph ING["Загрузка — memobase_ingest"] FILES["Файлы и URL PDF / DOCX / HTML / MD / TXT / CSV"] OBS["Obsidian заметка или vault"] YT["YouTube видео или канал"] AUD["Аудио / голосовые / видео"] CAPS{"Субтитры ScrapeCreators → Apify"} STT["Расшифровка STT Groq Whisper → Gemini (таймкоды сегментов)"] EXT["Извлечение текста (SSRF-проверка для URL)"] NORM["Нормализация (кодировка, мусор, дедуп)"] CHUNK["Нарезка на фрагменты (по структуре, code-fence-safe)"] SCAN{"Сканер секретов (блокирует)"} EMB["Эмбеддинг Cloudflare BGE-M3"] FILES --> EXT OBS --> EXT YT --> CAPS CAPS -->|есть субтитры| EXT CAPS -.->|"нет — аудио (Apify)"| STT AUD --> STT STT -->|текст с таймкодами| EXT EXT --> NORM --> CHUNK --> SCAN SCAN -->|чисто| EMB SCAN -.->|найден секрет| QUAR["В карантин, не индексируется"] end

EMB --> DB[("memobase.db SQLite: FTS5 + vec0")]

subgraph ASK["Вопрос — memobase_ask / memobase_query"] Q["Вопрос"] HYB["Гибридный поиск FTS5(BM25+RU-стемминг) + вектор KNN"] RRF["Слияние RRF (k=60)"] RRK["Переранжирование Cohere rerank-v3.5"] GATE{"Гейт достаточности"} LLM["Модель без инструментов отвечает только по фрагментам"] VERIFY["Проверка цитат (дословно, fuzzy-match)"] Q --> HYB DB --> HYB HYB --> RRF --> RRK --> GATE GATE -->|недостаточно| REFUSE["Честный отказ: «в базе этого нет»"] GATE -->|достаточно| LLM --> VERIFY --> ANSWER["Ответ + цитаты + источники"] end

Loading

MemoBase — это отдельный, параллельно работающий модуль для документов. Он не заменяет память hermes (историю диалогов, профиль пользователя): обе системы можно держать включёнными одновременно, они не конфликтуют. MemoBase — библиотекарь, а не память.

Зачем это нужно

Когда вы просите обычную языковую модель ответить по вашему документу, есть два пути, и оба ненадёжны:

Вставить весь документ в промпт. На длинном тексте модель «теряет середину», отвечает дорого (весь документ уходит в каждый запрос) и может пересказать неточно — без всякой проверки.

Понадеяться на общие знания модели. Тогда она с уверенным видом сочинит то, чего в ваших документах нет.

MemoBase закрывает обе дыры. Это как NotebookLM, но локально и прямо внутри агента: вы загружаете источники, а плагин отвечает только тем, что в них реально есть — с дословной цитатой, источником и страницей/разделом (а у видео и аудио — с таймкодом) у каждого утверждения. Если ответа в базе нет, MemoBase честно скажет «в базе знаний этого пока нет», а не станет угадывать.

От каких проблем избавляет

Агент уверенно выдумывает факты, которых нет. → «Цитата или отказ», проверка в коде: каждая цитата дословно сверяется с источником — не сошлось, ответа не будет.

Вручную копипастишь куски PDF и статей в чат. → Кидаешь файл, сайт или видео — плагин сам разбирает источник и ищет по нему мгновенно.

Поиск по ключевым словам не понимает смысл, а чисто векторный теряет точные слова, коды, имена. → Гибрид FTS5 + вектор со склейкой RRF: находит и по смыслу, и по точному слову.

Твои документы уходят в чужое облако. → Всё в одном локальном файле SQLite; в полностью локальном режиме наружу не уходит ничего.

RAG-стек тяжёлый: PyTorch, гигабайты весов, ядовитая AGPL — не встанет на дешёвый VPS. → Без PyTorch и без AGPL, ставится за секунды.

Обязательные платные ключи. → Локальный ONNX-эмбеддер (fastembed): поиск работает вообще без ключей.

Видео и голосовые не ищутся — расшифровывай вручную. → Whisper с реальными таймкодами, целые YouTube-каналы, голосовые, Obsidian — всё в один индекс.

Под капотом — контур без галлюцинаций из четырёх ступеней:

Гейт достаточности. Прежде чем модель вообще получит право отвечать, MemoBase проверяет, нашёл ли поиск достаточно уверенный релевантный фрагмент. Не нашёл — честный отказ, ещё до генерации.

Ответ только по фрагментам. Ответ генерирует модель без доступа к другим инструментам (tool-less) — ей физически нечем «дофантазировать» помимо переданных фрагментов.

Дословная проверка цитат. Каждая цитата в ответе сверяется с исходным текстом фрагмента (точное совпадение, иначе fuzzy-сравнение) — придуманная или неточная цитата отбрасывается.

Честный отказ. Если после проверки не осталось ни одной подтверждённой цитаты, MemoBase возвращает отказ, а не непроверенный текст.

Возможности

Источники загрузки (memobase_ingest)

Файлы и веб-страницы: PDF (через pdfplumber, с откатом на pypdf), DOCX (mammoth), HTML и URL (trafilatura, с проверкой на SSRF), Markdown, TXT, CSV (построчно, с сохранением заголовка таблицы).

YouTube — целыми каналами и по одному видео. Субтитры забираются через ScrapeCreators (запасной путь — Apify); если субтитров нет вообще, скачивается аудио (Apify) и расшифровывается Groq Whisper — с настоящими таймкодами, так что цитата ведёт на конкретную минуту. Для канала больше порога (по умолчанию 20 видео) плагин сначала покажет смету в долларах и попросит подтверждение.

Аудио, голосовые и видео (STT). По умолчанию — Groq Whisper (whisper-large-v3-turbo) с таймкодами от самого декодера; длинные файлы автоматически режутся (нужен ffmpeg) и склеиваются без потери текста. Запасной путь — Gemini (его таймкоды — оценка модели, поэтому такие расшифровки помечаются пониженным доверием).

Obsidian — только чтение. Плагин сам находит ваши vault'ы по реестру Obsidian, грузит одну заметку или vault целиком, понимает frontmatter и связи [[...]], пропускает служебные папки (.obsidian/, .trash/, templates/). В сам vault MemoBase никогда не пишет.

Поиск и ответ

Гибридный поиск, понимающий русский. Полнотекстовый поиск (FTS5, BM25) с русским стеммингом на отдельной колонке (PyStemmer, Snowball «russian» — «договора» находит «договор») плюс векторный поиск по смыслу (Cloudflare BGE-M3, 1024 измерения). Результаты объединяются взаимным ранжированием (RRF, k=60) и переранжируются Cohere rerank-v3.5.

Ответы без выдумок и честный отказ. Гейт достаточности → ответ tool-less-моделью только по фрагментам → дословная проверка цитат → отказ, если ничего не подтвердилось (подробнее — раздел «Зачем»).

Данные хранятся локально. Вся база — один файл SQLite /memobase/memobase.db (векторный индекс — sqlite-vec, локально). Наружу уходит только текст вопроса и фрагментов — на эмбеддинг (Cloudflare Workers AI) и переранжирование (Cohere). Сами файлы и остальная база никуда не загружаются.

Карта базы и обогащение (опция). /memobase map строит mermaid-карту коллекции (документы, темы, Obsidian-связи, пересечения ключевых слов). При включённом memobase.enrich.enabled дешёвая модель дописывает каждому фрагменту короткую заметку «что это и откуда» — она попадает только в эмбеддинг (меньше промахов поиска), сырой текст и проверка цитат остаются нетронутыми.

Гостевые коллекции

Владелец может создать гостю личную коллекцию, выдать или мгновенно отозвать доступ на чтение/запись, задать квоты (объём, дневная загрузка, дневной бюджет, число вызовов). Подозрительные гостевые фрагменты (похожие на внедрение инструкций) не индексируются молча, а попадают в карантин на ручную проверку владельцем.

6 вшитых блокеров (защита, которая не выключается и не зависит от «обещаний» модели):

SSRF — перед любым HTTP-запросом на URL (и при предварительной оценке размера) адрес проверяется, чтобы плагин не ходил во внутреннюю сеть.

Ограждение сырых чанков — memobase_query возвращает фрагменты, обёрнутые как «это данные, а не инструкции», и прогоняет их через сканер секретов/инъекций.

Порог RRF в деград-режиме — без ключа Cohere поиск честно падает до rrf-only и применяет отдельный калиброванный порог достаточности для этого режима.

Теневая миграция векторов — при смене модели эмбеддинга переэмбеддинг пишется в теневую таблицу и атомарно переименовывается; во время миграции коллекция не отдаёт неконсистентные результаты.

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

Purge старых чанков — при повторной загрузке источника фрагменты, исчезнувшие из новой версии, гасятся (tombstone) и исключаются из поиска — база не копит «призраки» удалённого текста.

Защита от инъекций через документы. Если загруженный документ содержит текст вида «игнорируй предыдущие инструкции», MemoBase размечает его как данные, а не команды, и предупреждает баннером — и при выдаче сырых фрагментов (memobase_query), и при генерации ответа (memobase_ask вызывает модель без доступа к другим инструментам). Сабагент, привязанный к конкретной коллекции, физически не может обратиться к другой — привязка проверяется в коде.

Установка

Ставите через Telegram-бота hermes? Пришлите архив плагина в чат и попросите «распакуй и поставь по инструкции внутри» — агент выполнит установку по AGENTS.md. Ниже — ручная установка в терминале.

Одна команда: плагин копируется на место, зависимости ставятся, memobase включается в config.yaml — руками ничего донастраивать не нужно.

Скачайте/склонируйте эту папку куда угодно — необязательно сразу в /plugins/, скрипт скопирует сам.

Запустите установочный скрипт:

Windows

.\install.ps1

Linux / macOS

./install.sh

Скрипт сам находит python внутри venv hermes-agent (через hermes в PATH, переменную HERMES_VENV_PYTHON или стандартный путь /hermes-agent/venv), ставит зависимости (sqlite-vec pdfplumber pypdf mammoth trafilatura>=1.8 ftfy py3langid PyStemmer requests), копирует плагин в /plugins/memobase/ (по умолчанию %LOCALAPPDATA%\hermes\plugins\memobase на Windows; повторный запуск просто обновляет файлы на месте) и добавляет memobase в plugins.enabled в config.yaml — тем же штатным способом, каким это делает мастер /setup (при сбое — резервная правка с бэкапом config.yaml.bak; при любой ошибке скрипт не падает, а печатает точные строки для ручного добавления). Пропустить автопатч конфига — флаг --no-config / -NoConfig.

Перезапустите hermes и проверьте:

/memobase status

В конце вывода — блок «Ключи»: полный путь к .env и статус каждого ключа (✓ настроен с маской / ✗ нет / ⚠ есть в .env, но процесс не видит — записан, но нужен рестарт). Блок виден и на пустой базе, ещё до первой загрузки.

Если hermes-gateway запущен как systemd --user-юнит, установщик уже прописал EnvironmentFile

[truncated for AI cost control]