Alternar tema

Mnemo: uma camada de memória de longo prazo portátil para LLMs locais

Easton editorial illustration: portable local memory cartridge, local model terminal dock, SQLite graph index

"O README do GitHub do Mnemo confirma o posicionamento do projeto, o quickstart Docker + Ollama, a arquitetura de crates Rust, exemplos de SDK, contagens de testes e escopo dos benchmarks."

Seu modelo no Ollama já responde perguntas, mas cada conversa ainda começa do zero. A decisão de projeto discutida ontem, a preferência definida hoje e a restrição que você vai precisar amanhã desaparecem.

Esse é o problema de memória nos LLMs locais. O Ollama oferece um serviço de modelo capaz de responder. O que ele responde, e se lembra das restrições anteriores, depende do quanto você repete manualmente em cada prompt.

Mnemo não está refazendo RAG. Ele usa grafo de conhecimento e extração de entidades para gerenciar memória de longo prazo, permitindo que seu LLM local lembre decisões de projeto e relações entre entidades, em vez de perguntar de novo: “para que serve esta API?“

1. O que é Mnemo: posicionamento e capacidades principais

1.1 Lendo o posicionamento

Em “local-first AI memory layer”, duas partes importam:

  • local-first: os dados ficam na sua máquina, não sobem para a nuvem, podem ser migrados e não dependem da vida de um SaaS
  • memory layer: não é outro RAG nem outro framework de agente. Ele cuida da memória em si: extração de entidades, construção de grafo e recuperação semântica

Por exemplo: você pergunta “qual é a URL base da API deste projeto?”. Uma busca vetorial pura pode devolver vários trechos relacionados a “API”, mas não sabe de qual projeto você está falando. A recuperação por grafo pode seguir a cadeia “projeto -> API -> baseUrl” e devolver o valor configurado antes.

Isso só funciona se a extração de entidades estiver correta. Se o LLM dividir “URL base da API” em duas entidades, “API” e “URL base”, o grafo se fragmenta e a recuperação quebra. É aí que o ruído começa a se acumular.

Com o posicionamento claro, fica mais fácil ler as capacidades.

1.2 Matriz de capacidades principais

O README do Mnemo lista quatro capacidades principais:

  1. persistent knowledge graph (grafo de conhecimento persistente)

    • Entidades e relações ficam em SQLite, não em vetores descartáveis
    • A estrutura do grafo pode ser consultada, exportada e migrada
  2. entity extraction (extração de entidades)

    • Identifica automaticamente entidades em conversas, como pessoas, projetos, APIs e decisões
    • Não é recuperação vetorial pura. Ele transforma “para que serve esta API?” em uma estrutura entidade-relação consultável
    • A qualidade depende da compreensão do LLM. LLMs locais como llama3 podem identificar entidades de forma errada em conversas complexas, e o ruído se acumula. O README não traz limpeza automática, então é preciso revisar regularmente a qualidade do grafo
  3. semantic retrieval (recuperação semântica)

    • Combina grafo e vetores, priorizando relações entre entidades em vez de pura similaridade
    • Reduz ruído de busca vetorial: documentos muito similares, mas irrelevantes, não devem dominar o resultado
  4. graph-first vs pure vector search

Busca vetorial pura pergunta: “o que é parecido?”. Recuperação por grafo pergunta: “o que está relacionado?”. A primeira pode trazer ruído parecido, mas irrelevante. A segunda segue cadeias de relação entre entidades.

A comparação deixa mais claro:

DimensãoBusca vetorial puraGrafo de conhecimento do Mnemo
Lógica de recuperaçãoRanking por similaridadeRastreamento entidade-relação
Risco de ruídoAlto, porque algo parecido pode ser irrelevanteMenor, porque há âncoras de entidade
ExplicabilidadeBaixa, vetores são caixa-pretaAlta, o grafo é visível
PortabilidadeVetores são difíceis de exportarSQLite pode ser exportado
Cenário adequadoBusca documentalMemória de projeto, relações entre entidades

1.3 Stack técnico e licença

Stack técnico:

  • Rust, dividido em quatro crates descritas na próxima seção
  • SQLite para armazenamento local, com modo WAL
  • petgraph para o grafo em memória
  • API OpenAI, Ollama ou Anthropic como backend LLM

Licença: MIT License. Dá para usar, modificar e redistribuir.

Avisos de risco:

  • Projeto em estágio inicial, com base no README do GitHub de 2026-06-05
  • APIs e arquitetura podem mudar
  • Não há validação ampla em produção documentada
  • Os números de desempenho do README são medições próprias, não prova independente

2. Arquitetura: quatro crates em Rust

Mnemo é escrito em Rust e dividido em quatro crates com responsabilidades claras:

mnemo-core: lógica central

  • Extração de entidades, construção do grafo e lógica de recuperação
  • Não depende de um backend LLM específico; define interfaces

mnemo-api: servidor

  • Oferece a API HTTP, por padrão na porta 8080
  • Recebe conversas, chama core e devolve resultados
  • Health check: curl http://localhost:8080/health

mnemo-cli: ferramenta de linha de comando

  • Depuração, gestão e consultas
  • Opera diretamente no SQLite local, sem HTTP

mnemo-bench: benchmarks de desempenho

  • Os 122 Rust tests, 21 Python tests e 12 benchmarks mencionados no README aparecem aqui
  • Fonte das medições próprias

Vantagens de separar em quatro crates:

  • core pode ser testado isoladamente, sem depender da API
  • cli facilita depuração local sem subir o serviço
  • bench fica isolado e não afeta código de produção

Pontos fracos:

  • Sem Docker, você precisa da toolchain completa de Rust
  • Quando APIs entre crates mudam, várias partes podem precisar de ajuste ao mesmo tempo

3. Instalação e deploy: três caminhos

Mnemo oferece três caminhos de deploy, por ordem de complexidade:

3.1 Docker + Ollama: o jeito mais rápido de começar

Pré-requisitos: Docker e Ollama instalados.

# 1. clonar o projeto
git clone https://github.com/zaydmulani09/mnemo.git
cd mnemo

# 2. iniciar Docker
docker compose up -d

# 3. baixar o modelo dentro do Docker
docker exec mnemo-ollama ollama pull llama3

# 4. health check
curl http://localhost:8080/health

Atenção: os comandos podem mudar. Use o README do GitHub como fonte de verdade.

Explicação: Docker compose sobe dois contêineres: mnemo-api, o servidor, e mnemo-ollama, o serviço Ollama. O segundo é opcional. Se você já tem Ollama rodando localmente, pode usar só o contêiner mnemo-api e conectar com MNEMO_LLM_BASE_URL=http://host.docker.internal:11434/v1.

Validar a conexão LLM: quando o health check devolve {"status":"ok"}, a API está de pé, mas a conexão com o LLM ainda não foi testada. Envie uma requisição com curl:

curl -X POST http://localhost:8080/v1/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "Qual é a URL base da API deste projeto?"}'

Se vier resultado de extração de entidades, a conexão LLM funciona.

Vantagens:

  • Não precisa de toolchain Rust
  • Docker cuida das dependências automaticamente
  • Ollama e Mnemo ficam na mesma rede compose, o que simplifica a rede

Desvantagens:

  • Docker consome recursos
  • Depurar é menos prático, porque é preciso entrar no contêiner para inspecionar SQLite
  • Logs ficam espalhados entre dois contêineres

3.2 Binary: compilação local

Pré-requisitos: toolchain Rust instalada, com cargo e rustc, e Ollama instalado.

# 1. clonar o projeto
git clone https://github.com/zaydmulani09/mnemo.git
cd mnemo

# 2. compilar a crate da API
cargo install --path crates/mnemo-api

# 3. configurar o endereço do Ollama
export MNEMO_LLM_BASE_URL=http://localhost:11434/v1

# 4. iniciar o serviço
mnemo-api

Atenção: os comandos podem mudar. Use o README do GitHub como fonte de verdade; este caminho exige toolchain Rust.

Explicação: o tempo de compilação depende do hardware. Em um Apple M2, fica em torno de 2 a 3 minutos; em Windows ou Linux pode demorar mais. Se falhar, confira a versão de Rust exigida pelo README. Após compilar, mnemo-api cria um arquivo SQLite no diretório atual, normalmente mnemo.db, e salva ali a estrutura do grafo.

Validar a conexão com Ollama: antes de iniciar, confirme que Ollama está em localhost:11434 e que o modelo foi baixado com ollama pull llama3. Depois, teste com curl:

curl -X POST http://localhost:8080/v1/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "teste"}'

Vantagens:

  • Não depende de Docker
  • Mais fácil de depurar, por ser um processo local com logs no mesmo terminal
  • mnemo-cli pode operar direto no SQLite local
  • Porta e caminho do banco podem ser personalizados por variáveis de ambiente

Desvantagens:

  • Exige toolchain Rust completa
  • Primeira compilação pode demorar
  • Dependências podem dar problema, por exemplo se cargo.lock estiver desatualizado

3.3 OpenAI-compatible: LLM em nuvem

Pré-requisitos: você tem uma API key da OpenAI, Anthropic ou outro backend compatível com OpenAI.

Lista de variáveis de ambiente, verificada no README do GitHub de 2026-06:

export MNEMO_LLM_BASE_URL=https://api.openai.com/v1
export MNEMO_LLM_API_KEY=sk-...
export MNEMO_LLM_MODEL=gpt-4o-mini
export MNEMO_LLM_PROVIDER=openai

Depois, inicie:

mnemo-api

Atenção: nomes de variáveis podem mudar. Use o README do GitHub como fonte de verdade.

Quando faz sentido:

  • Sua máquina local não tem poder de cálculo suficiente, então você usa um LLM em nuvem
  • Você já tem cota da API da OpenAI
  • Você aceita que conteúdo de conversa seja enviado para a API em nuvem. Com LLM cloud, a vantagem local-first vale para armazenamento local, não para o tráfego de inferência

Escolha um dos três caminhos conforme sua realidade. A próxima pergunta é desempenho.

4. Desempenho: medições próprias do README

O README do Mnemo lista medições de desempenho para a versão 2026-06-05:

Condições de teste:

  • Apple M2, debug build
  • SQLite em modo WAL
  • petgraph em memória

Números de desempenho:

  • Pipeline completo de recuperação: cerca de 4,2 ms
  • Release build declara ser 3 a 5 vezes mais rápido, algo como 0,8 a 1,4 ms

Atenção: é uma medição do README, não prova independente. Desempenho varia com hardware, volume de dados e backend LLM.

Como ler esses números:

  • 4,2 ms é tempo de recuperação, não tempo de inferência LLM. A inferência LLM é o gargalo
  • SQLite WAL com grafo em memória pode tornar a recuperação rápida
  • Isso mede só recuperação, não velocidade de conversa

A experiência real depende de:

  • tempo de inferência LLM, muito mais lento que a recuperação
  • tamanho da conversa, porque extração de entidades também usa inferência LLM
  • volume de dados, porque grafos maiores podem deixar a busca mais lenta

Sugestão: rode mnemo-bench no hardware alvo. Use os números do README como referência, não como promessa.

5. Características local-first e limites

5.1 Vantagens de local-first

O núcleo de local-first é simples: os dados ficam na sua máquina.

Vantagens concretas:

  1. Proteção de privacidade

    • Conversas, entidades e relações ficam em SQLite local
    • Não são enviados a um SaaS de terceiros, desde que você use um LLM local
  2. Controle dos dados

    • O arquivo SQLite pode ser exportado, copiado em backup e migrado
    • Você não depende da vida de um SaaS. Seus dados continuam com você
  3. Portabilidade

    • Ao trocar de máquina, copie o arquivo SQLite
    • Não é preciso “treinar” a memória de novo
  4. Depuração

    • SQLite é um formato padrão e pode ser visto com qualquer ferramenta SQLite
    • A estrutura do grafo é visível, não um vetor em caixa-preta

5.2 Riscos e limites

Local-first tem vantagens, mas também riscos:

  1. Acúmulo de ruído

    • Extração de entidades não é perfeita e pode errar
    • Entidades erradas afetam recuperações futuras
    • Limpeza periódica é necessária, mas Mnemo não oferece limpeza automática
    • O acúmulo de ruído não é exclusivo do Mnemo; todo sistema automático de memória sofre com isso. A diferença é que o grafo do Mnemo é visível. Você enxerga entidades ruidosas e relações erradas. Em sistemas vetoriais, o ruído fica escondido nos vetores. Isso é uma vantagem do grafo e também uma carga de manutenção
  2. Limites de rollback

    • SQLite WAL tem rollback, mas Mnemo não expõe uma interface de alto nível para “desfazer memória”
    • Apagar manualmente memórias incorretas é trabalhoso
    • O pior caso: salvar uma decisão errada, como “usar Redis como cache”. Conversas futuras podem raciocinar a partir dessa decisão. Para retirar isso, talvez seja preciso apagar manualmente todas as entidades e relações relacionadas no grafo, algo mais difícil que reconstruí-lo
    • Antes de salvar decisões críticas, valide a extração de entidades em um ambiente de teste
  3. Estado oculto

    • A estrutura do grafo pode conter relações que você não percebe
    • A recuperação pode devolver resultados sem explicar claramente por que eles apareceram
  4. Limites de aplicação

    • Com grande volume de dados, SQLite + grafo em memória pode sofrer pressão
    • Em colaboração de equipe, SQLite local não foi feito para várias pessoas escrevendo ao mesmo tempo

5.3 Tabela de decisão: quando usar e quando evitar

CenárioAdequaçãoMotivo
Projeto pessoal ou equipe pequenaAdequadoPouco volume, alta privacidade, boa portabilidade
Grande volume de dados, escala GBNão adequadoPressão sobre SQLite + grafo em memória, acúmulo de ruído
Colaboração em equipe com várias escritasNão adequadoSQLite local não suporta bem escritas concorrentes
Forte exigência de privacidadeAdequadoDados não saem da máquina se o LLM for local
Memória global compartilhadaNão adequadoLocal-first é local e exclusivo, não compartilhado globalmente
Ambiente Ollama já existenteAdequadoIntegração direta, baixa curva de aprendizado
Sem toolchain RustCondicionalUse Docker, mas a depuração fica menos prática

Julgamento: se o cenário é “projeto pessoal, alta privacidade, Ollama existente e volume moderado”, Mnemo vale um teste. Se é “grande volume, colaboração em equipe e memória global compartilhada”, espere maturidade ou avalie outra solução.

Recomendações concretas:

  • Rode primeiro o caminho Docker em um ambiente de teste e observe estrutura do grafo, qualidade da extração de entidades e resultado da recuperação
  • Use conversas de teste para medir risco de ruído. Diga coisas irrelevantes de propósito e veja se Mnemo as identifica errado
  • Prepare um plano de limpeza. Entenda cedo a estrutura SQLite para saber apagar entidades incorretas manualmente
  • Acompanhe atualizações do README. O projeto é jovem, então APIs, arquitetura e comandos de deploy podem mudar

6. Próximo passo: navegação da série

Se você ainda não leu os artigos anteriores da série de LLM local com Ollama, siga esta ordem:

  1. Guia inicial do Ollama: o primeiro passo para rodar um grande modelo de linguagem localmente

    • Comece aqui se ainda não instalou o Ollama
  2. Chamadas de API do Ollama: do curl à interface compatível com OpenAI SDK

    • Mnemo usa uma API compatível com OpenAI, então vale entender a superfície da API do Ollama
  3. Ollama Embedding na prática: busca vetorial local e RAG

    • A recuperação semântica do Mnemo depende de embeddings; este artigo cobre a base
  4. Gestão de memória para AI Agent: memória de longo prazo e governança do conhecimento

    • Mnemo é uma ferramenta de camada de memória; este artigo trata da governança de memória de agentes

Depois desses quatro artigos, instale o Mnemo e rode o caminho Docker localmente. O primeiro resultado útil é ver como o grafo de conhecimento realmente se parece.

Validar Mnemo com Docker e Ollama no caminho mínimo

Valide inicialização do Mnemo, conexão com o modelo, escrita de memória, recuperação, persistência e limpeza em um ambiente temporário antes de ligá-lo ao seu agente principal.

⏱️ Estimated time: 1-2 hours

  1. 1

    Step 1: Clonar o repositório e iniciar o compose

    Clone o repositório mnemo seguindo o README do GitHub, execute `docker compose up -d` e confirme que os contêineres mnemo-api e mnemo-ollama iniciaram.
  2. 2

    Step 2: Baixar um modelo de teste

    Dentro do contêiner, execute `docker exec mnemo-ollama ollama pull llama3`, ou escolha o modelo recomendado pelo README atual.
  3. 3

    Step 3: Verificar a saúde da API

    Acesse `http://localhost:8080/health`. Confirme primeiro que o serviço responde antes de depurar a conexão LLM.
  4. 4

    Step 4: Escrever uma memória de teste

    Use o SDK Python ou o exemplo de API do README para escrever uma memória de projeto. Não conecte ao projeto principal no primeiro dia.
  5. 5

    Step 5: Verificar recuperação e persistência após reiniciar

    Pergunte pela memória em linguagem natural, reinicie os contêineres e consulte de novo. Os dados SQLite não devem sumir.
  6. 6

    Step 6: Ensaiar exclusão e expiração

    Escreva de propósito uma memória errada e tente apagá-la, marcá-la como expirada ou reconstruir o grafo. Respostas futuras não devem usar o fato antigo.

FAQ

A memória não vai crescer até virar lixo?
Pode acontecer. Mnemo extrai entidades automaticamente, e o LLM pode identificá-las errado. O ruído se acumula. Para reduzir o problema, revise o grafo com mnemo-cli ou ferramentas SQLite e crie regras de filtragem de entidades. O README não traz uma solução completa de limpeza automática, então a qualidade do grafo ainda precisa de manutenção humana.
Onde Mnemo é melhor do que busca vetorial?
A diferença principal é a recuperação por grafo combinada com ranking por similaridade. Busca vetorial encontra trechos parecidos e pode devolver algo semelhante, mas irrelevante. Um grafo de conhecimento segue relações entre entidades, oferece âncoras, é mais explicável e combina melhor com decisões de projeto e relações entre entidades. Em troca, extração de entidades errada polui o grafo, e construir o grafo ainda exige inferência de LLM.
Dá para reverter quando Mnemo salva algo errado?
SQLite WAL tem rollback de baixo nível, mas o README do Mnemo não expõe uma interface de alto nível para desfazer a última memória. Memórias incorretas geralmente precisam ser apagadas manualmente com ferramentas SQLite ou removidas por reconstrução do grafo. Por isso, um piloto deve ensaiar exclusão, expiração e reconstrução.
Quais backends LLM o Mnemo suporta?
O README diz que ele pode se conectar a Ollama, OpenAI, Anthropic ou outra API compatível com OpenAI. Ao usar um LLM em nuvem, o conteúdo da conversa é enviado para essa API. O benefício local-first cobre o armazenamento local, não o tráfego de inferência na nuvem.
Vários agentes podem compartilhar a mesma base de memória?
Em teoria, eles podem compartilhar um arquivo SQLite, mas Mnemo não documenta um mecanismo de lock para escritas concorrentes. Se dois agentes escreverem ao mesmo tempo, podem ocorrer conflitos no SQLite. Uma configuração mais estável é uma base de memória por agente, ou compartilhamento somente leitura.
Como migrar os dados do Mnemo?
Copie o arquivo SQLite para a nova máquina e inicie o serviço com o mesmo backend LLM ou um compatível. Cuidado com o espaço de embeddings: mudar o modelo pode quebrar a compatibilidade. Depois da migração, rode conversas de teste para validar a recuperação de entidades.

12 min de leitura · Publicado em: 5 jun 2026 · Atualizado em: 14 jul 2026

Trilha de leitura da sérieParte 1 de 1

Guia Ollama LLM local

Você está lendo o primeiro post desta série. Continue para o próximo ou abra o hub da série para ver toda a trilha.

Ver hub da série

Anterior

Você está no início desta série.

Próximo

Este é o post mais recente da série até agora.

Posts relacionados

Comentários

Entre com GitHub para comentar

Easton BlogEaston Blog