Sessions and memory

Busca na memória

memory_search encontra notas relevantes dos seus arquivos de memória, mesmo quando a redação difere do texto original. Ele funciona indexando a memória em pequenos trechos e pesquisando neles usando embeddings, palavras-chave ou ambos.

Início rápido

Se você tiver uma assinatura do GitHub Copilot, uma chave de API da OpenAI, Gemini, Voyage ou Mistral configurada, a busca na memória funcionará automaticamente. Para definir um provedor explicitamente:

{
  agents: {
    defaults: {
      memorySearch: {
        provider: "openai", // or "gemini", "local", "ollama", etc.
      },
    },
  },
}

Para configurações com vários endpoints, provider também pode ser uma entrada personalizada de models.providers.<id>, como ollama-5080, quando esse provedor define api: "ollama" ou outro proprietário de adaptador de embedding.

Para embeddings locais sem chave de API, defina provider: "local". Checkouts do código-fonte ainda podem exigir aprovação de build nativo: pnpm approve-builds e depois pnpm rebuild node-llama-cpp.

Alguns endpoints de embedding compatíveis com OpenAI exigem rótulos assimétricos, como input_type: "query" para buscas e input_type: "document" ou "passage" para trechos indexados. Configure-os com memorySearch.queryInputType e memorySearch.documentInputType; consulte a referência de configuração de memória.

Provedores compatíveis

Provedor ID Precisa de chave de API Observações
Bedrock bedrock Não Detectado automaticamente quando a cadeia de credenciais da AWS é resolvida
Gemini gemini Sim Oferece suporte à indexação de imagem/áudio
GitHub Copilot github-copilot Não Detectado automaticamente, usa a assinatura do Copilot
Local local Não Modelo GGUF, download de ~0,6 GB
Mistral mistral Sim Detectado automaticamente
Ollama ollama Não Local, deve ser definido explicitamente
OpenAI openai Sim Detectado automaticamente, rápido
Voyage voyage Sim Detectado automaticamente

Como a busca funciona

O OpenClaw executa dois caminhos de recuperação em paralelo e mescla os resultados:

flowchart LR
    Q["Query"] --> E["Embedding"]
    Q --> T["Tokenize"]
    E --> VS["Vector Search"]
    T --> BM["BM25 Search"]
    VS --> M["Weighted Merge"]
    BM --> M
    M --> R["Top Results"]
  • Busca vetorial encontra notas com significado semelhante ("gateway host" corresponde a "a máquina que executa o OpenClaw").
  • Busca por palavras-chave BM25 encontra correspondências exatas (IDs, strings de erro, chaves de configuração).

Se apenas um caminho estiver disponível (sem embeddings ou sem FTS), o outro será executado sozinho.

Quando embeddings estão indisponíveis, o OpenClaw ainda usa ranqueamento lexical sobre os resultados de FTS em vez de recorrer apenas à ordenação bruta por correspondência exata. Esse modo degradado impulsiona trechos com maior cobertura dos termos da consulta e caminhos de arquivos relevantes, o que mantém a revocação útil mesmo sem sqlite-vec ou um provedor de embedding.

Melhorando a qualidade da busca

Dois recursos opcionais ajudam quando você tem um histórico grande de notas:

Decaimento temporal

Notas antigas perdem peso de ranqueamento gradualmente para que informações recentes apareçam primeiro. Com a meia-vida padrão de 30 dias, uma nota do mês passado pontua 50% do seu peso original. Arquivos perenes como MEMORY.md nunca sofrem decaimento.

MMR (diversidade)

Reduz resultados redundantes. Se cinco notas mencionam a mesma configuração de roteador, o MMR garante que os principais resultados cubram tópicos diferentes em vez de se repetirem.

Ativar ambos

{
  agents: {
    defaults: {
      memorySearch: {
        query: {
          hybrid: {
            mmr: { enabled: true },
            temporalDecay: { enabled: true },
          },
        },
      },
    },
  },
}

Memória multimodal

Com o Gemini Embedding 2, você pode indexar imagens e arquivos de áudio junto com Markdown. As consultas de busca continuam sendo texto, mas correspondem a conteúdo visual e de áudio. Consulte a referência de configuração de memória para a configuração.

Busca na memória da sessão

Você pode opcionalmente indexar transcrições de sessão para que memory_search possa lembrar conversas anteriores. Isso é opcional via memorySearch.experimental.sessionMemory. Consulte a referência de configuração para obter detalhes.

Solução de problemas

Sem resultados? Execute openclaw memory status para verificar o índice. Se estiver vazio, execute openclaw memory index --force.

Apenas correspondências por palavra-chave? Seu provedor de embedding pode não estar configurado. Verifique openclaw memory status --deep.

Embeddings locais expiram? ollama, lmstudio e local usam um tempo limite maior para lote inline por padrão. Se o host estiver simplesmente lento, defina agents.defaults.memorySearch.sync.embeddingBatchTimeoutSeconds e execute novamente openclaw memory index --force.

Texto CJK não encontrado? Reconstrua o índice FTS com openclaw memory index --force.

Leitura adicional

Relacionado