Pular para o conteúdo

Busca

O Engram indexa o conteúdo das notas para a busca semântica, que encontra notas com significado parecido com o da sua consulta, mesmo quando a redação é diferente. A busca por correspondência exata também é suportada, mas onde ela roda depende do escopo.

  • Busca semântica no cofre inteiro. Similaridade vetorial sobre os embeddings de cada nota. Encontra ideias relacionadas, não só texto literal. É isso que roda hoje no painel de busca do app web.
  • Busca por palavra-chave e híbrida. O backend também indexa as notas para uma busca por palavra-chave (lexical) segura para criptografia e um modo híbrido que funde resultados lexicais e vetoriais (veja abaixo). Isso está no backend; o painel de busca do app web ainda não expõe uma troca de modo, então por enquanto ele faz consultas semânticas.
  • Correspondência exata dentro de uma nota aberta. Ctrl/Cmd+F e o Find/Replace do editor funcionam sobre a nota descriptografada na sua sessão atual, como em qualquer editor de texto.

O Engram oferece busca por palavra-chave (lexical) em todo o seu cofre, e faz isso sem quebrar a criptografia em repouso. Em vez de varrer texto em claro, o backend indexa um vetor esparso por trecho, com chave HMAC(your vault key, token), de modo que o servidor consegue comparar os termos da consulta com o índice sem nunca ter em mãos o texto legível das notas. Os modos de palavra-chave, semântico (vetorial) e híbrido (lexical + vetorial combinados no servidor por reciprocal-rank fusion) estão todos no ar no backend.

Isso significa que a busca verdadeira por substring/regex sobre o texto bruto continua não sendo possível no servidor (o índice é de tokens, não de caracteres). Para busca literal com regex, que diferencia maiúsculas de minúsculas ou filtrada por caminho, o painel de Busca local do Obsidian (que roda sobre seus arquivos .md em disco) continua sendo a ferramenta. O Ctrl/Cmd+F do editor também funciona para localizar dentro de uma nota aberta.

A busca do Engram e a do Obsidian são complementares: semântica, por palavra-chave e híbrida na nuvem; busca literal completa com regex / diferenciação de maiúsculas / filtro por caminho no disco. O painel de busca local do Obsidian roda sobre o mesmo cofre que o Engram está sincronizando.

  • Painel de busca do app web (a barra de busca): consultas semânticas hoje
  • O plugin do Obsidian faz a busca no mesmo backend do app web
  • O painel de busca do Obsidian para busca literal local com regex / diferenciação de maiúsculas / caminho sobre o cofre no disco

Para um padrão regex ou uma correspondência literal restrita a um caminho, use a busca local do Obsidian.

  1. Sua consulta é transformada em embedding (o modelo de consulta é assimétrico em relação ao modelo de documentos, ajustado para recuperação e não para indexação)
  2. O Qdrant devolve as K melhores correspondências vetoriais com quantização binária + rescore
  3. Se um reranker estiver configurado (RERANKER_BACKEND=jina + JINA_URL no backend), os candidatos são reordenados com uma mistura 40/60 das pontuações vetorial e do reranker; se não, vale o ranking vetorial puro

A implantação padrão na nuvem roda hoje sem reranker; o adaptador Jina está pronto e basta ativá-lo.

Restringir a busca a uma pasta é possível pela API. Passe um parâmetro de consulta folder=<path>. Uma sintaxe de consulta na caixa de busca, como folder:work/, está no roadmap, mas ainda não foi ligada na interface.

  • O cofre é muito pequeno (< 20 notas). Há menos embeddings para comparar; os resultados tendem a ser ruidosos até o cofre crescer
  • Notas recém-importadas. O embedding roda de forma assíncrona pelo Oban; notas recém-escritas podem levar alguns segundos para aparecer nos resultados
  • Jargão muito específico. A similaridade semântica funciona melhor para conceitos. Para identificadores exatos (o nome de uma função, um código de erro), a busca por palavra-chave e a híbrida (lexical + vetorial) são mais adequadas. As duas já estão no ar no backend, e a exposição na interface do app web ainda vai chegar. Enquanto isso, a busca local do Obsidian cobre identificadores exatos.