Construção de um sistema de arquivos virtual para substituir RAG em um assistente de documentação com IA
(mintlify.com)- Para superar as limitações da busca baseada em RAG tradicional, a estrutura dos documentos foi convertida para um sistema de arquivos virtual composto por arquivos e diretórios
- Foi implementado o ChromaFs, que permite executar comandos
grep,cat,lsefindcom base no banco de dados Chroma, sem copiar arquivos reais - Com essa abordagem, o tempo de criação de sessão foi reduzido de 46 segundos para 100 milissegundos, e o custo computacional adicional caiu para próximo de 0 dólar
- O controle de acesso é tratado com filtragem RBAC nos metadados de caminho dos arquivos, eliminando a necessidade de contêineres separados ou gestão de grupos de usuários
- Como resultado, o assistente de documentação da Mintlify pode operar em grande escala com uma arquitetura de resposta imediata, baixo custo e sem estado
Uma abordagem de sistema de arquivos virtual além dos limites do RAG
- A busca de documentos baseada em RAG tradicional retornava apenas trechos de texto compatíveis com a consulta, dificultando respostas que atravessam várias páginas ou buscas exatas por padrões
- Para resolver isso, a estrutura dos documentos foi transformada em um formato navegável como um sistema de arquivos, mapeando cada página de documentação como um arquivo e cada seção como um diretório
- O agente pode explorar diretamente os documentos com os comandos
grep,cat,lsefind, em uma estrutura projetada para pesquisar a documentação como um desenvolvedor navega em uma base de código
O problema do gargalo com contêineres
- A abordagem comum consiste em criar um ambiente sandbox isolado e clonar o repositório para fornecer ao agente um sistema de arquivos real
- Porém, em assistentes no frontend, a latência de criação de sessão se torna um problema grave, com tempo p90 de criação de sessão em cerca de 46 segundos
- Considerando 850 mil conversas por mês, mesmo em uma configuração mínima (1 vCPU, 2 GiB de RAM, sessão mantida por 5 minutos), o custo anual de infraestrutura ultrapassa 70 mil dólares
- Para eliminar esse gargalo, era necessário um sistema de arquivos virtual que respondesse instantaneamente e operasse com baixo custo
Implementação do shell virtual — ChromaFs
- Em vez de um sistema de arquivos real, é fornecida apenas a ilusão de um sistema de arquivos virtual
- Como os dados de documentação já estavam indexados no banco de dados Chroma, o ChromaFs foi construído sobre essa base
- O ChromaFs intercepta comandos UNIX e os converte em consultas ao Chroma
- Como resultado, o tempo de criação de sessão foi reduzido de 46 segundos para 100 ms, e o custo computacional adicional caiu para próximo de 0 dólar
| Metric | Sandbox | ChromaFs |
|---|---|---|
| P90 Boot Time | ~46 s | ~100ms |
| Marginal Compute Cost | ~$0.0137/conversa | ~$0 |
| Search Mechanism | varredura em disco | consulta de metadados no BD |
| Infrastructure | sandbox externo como Daytona | reutilização do BD existente |
- Implementado com base no just-bash (Vercel Labs), com suporte aos comandos
grep,cat,ls,findecd - Aproveitando a interface
IFileSystemdo just-bash, a lógica de pipes e flags foi mantida, enquanto as chamadas de acesso a arquivos foram convertidas em consultas ao Chroma
Bootstrapping da árvore de diretórios
- Como o ChromaFs precisa saber quais arquivos existem antes de executar, a árvore completa de arquivos é armazenada em uma coleção do Chroma na forma de JSON compactado (
__path_tree__) - Na inicialização do servidor, isso é carregado e restaurado em duas estruturas de memória
Set<string>com os caminhos dos arquivosMap<string, string[]>com a lista de filhos por diretório
- Depois disso, os comandos
ls,cdefindsão processados instantaneamente na memória local, sem chamadas de rede, e sessões subsequentes do mesmo site reutilizam a árvore em cache
Controle de acesso
- A árvore de caminhos inclui os campos
isPublicegroups, mantendo apenas os arquivos acessíveis com base no token de sessão do usuário - Arquivos sem permissão de acesso são completamente removidos da árvore, de modo que o agente nem sequer reconhece esses caminhos
- Nos sandboxes tradicionais, isso exigiria gerenciar grupos de usuários no Linux,
chmod, separação por contêiner etc., mas no ChromaFs o RBAC é implementado apenas com uma lógica simples de filtragem
| Path | Access | Visible |
|---|---|---|
| /auth/oauth.mdx | public | ✓ |
| /auth/api-keys.mdx | public | ✓ |
| /internal/billing.mdx | admin, billing | ✗ |
| /api-reference/users.mdx | public | ✓ |
| /api-reference/payments.mdx | billing | ✗ |
Recombinação de fragmentos de documentos
- Os documentos armazenados no Chroma são divididos em vários fragmentos para embedding
- Ao executar
cat /auth/oauth.mdx, todos os fragmentos com o mesmo slug depagesão recuperados, ordenados porchunk_indexe então mesclados - O resultado é armazenado em cache, evitando novas consultas ao BD mesmo em fluxos repetidos com
grep - Itens como grandes especificações OpenAPI são registrados como lazy file pointer, sendo carregados do S3 apenas no momento do acesso
- Todas as operações de escrita retornam erro
EROFS(sistema de arquivos somente leitura), preservando uma arquitetura segura e sem estado
Otimização do Grep
- Como o comando
grep -rfica muito lento com varreduras simples pela rede, ele foi otimizado com uma estrutura de filtragem em duas etapas- Etapa 1: uso de consultas do Chroma (
$contains,$regex) para selecionar os arquivos candidatos - Etapa 2: pré-carregamento no cache Redis e filtragem precisa em memória no
just-bash
- Etapa 1: uso de consultas do Chroma (
- Com isso, até buscas recursivas em larga escala podem ser concluídas em milissegundos
Conclusão
- O ChromaFs opera o assistente de documentação da Mintlify, usado mais de 30 mil vezes por dia por centenas de milhares de usuários
- Ao substituir os sandboxes, ele alcança criação instantânea de sessões, custo adicional próximo de zero, RBAC embutido e arquitetura sem estado
- Pode ser usado diretamente em todos os sites de documentação da Mintlify (mintlify.com/docs)
1 comentários
Comentários do Hacker News
O motivo para voltar a dar atenção à busca baseada em sistema de arquivos é que estamos redescobrindo uma forma de busca semântica que não é baseada em embeddings
Assim como um bibliotecário organiza livros por assunto nas prateleiras, estruturar arquivos por domínio é mais interpretável
É uma forma de busca que existe há muito tempo, mas só agora estamos percebendo novamente seu valor
Post de blog relacionado
Esse conceito também foi bem representado em Ralph Wrecks The Internet, da Pixar
Tweet de referência 1, Tweet de referência 2
Em vez disso, ao deixar o agente explorar diretamente a árvore de diretórios, ele passou a entender a estrutura dos módulos em 30 segundos e a pedir os arquivos corretos
Eu tinha esquecido que a própria hierarquia de diretórios já era um grafo de conhecimento criado por humanos
Isso é o mesmo conceito do inverted index do Google, ou seja, não é exatamente algo novo
Para mim, o RAG não oferecia um jeito de ler o conteúdo diretamente
Então agora estou consolidando o conhecimento em páginas estáticas baseadas em Markdown, e depois das edições gero um arquivo JSON para que o agente consulte essa fonte
Link explicativo
A afirmação de que busca em sistema de arquivos é melhor que RAG é confusa
Busca por palavra-chave, como grep, é um método antigo, e o RAG usa busca vetorial
Mas em bancos de dados é possível indexar conteúdo com hierarquias, tags e estruturas arbitrárias
A busca pode combinar palavra-chave, vetores, tf-idf, BM25 e outros métodos
Voltar ao sistema de arquivos dá a sensação de regredir para tecnologia dos anos 60
Agentes de programação baseados em CLI se comportam de forma muito mais inteligente ao acessar arquivos
O ponto principal é que o agente pode executar por conta própria várias consultas ad-hoc
Se o agente puder consultar livremente um banco que suporte embeddings e busca full-text, isso já é suficientemente agentic
Usar sistema de arquivos como se fosse um DB não tem nada de novo
A conta de que 850 mil conversas por mês custariam mais de 70 mil dólares por ano parece estranha
Eu estava me perguntando onde CPU e memória estavam sendo tão consumidas, e a resposta era o ChromaFs baseado em just-bash da Vercel Labs
Estou curtindo o renascimento das aplicações CLI
Criei um sistema de arquivos virtual com FUSE que espelha o sistema de arquivos real do Mac, restringindo o agente a operar apenas dentro daquela árvore
Mantenho um agente de longa duração por repositório, e as permissões são controladas pelo sistema de arquivos virtual
Projeto bashguard
Nós usamos tanto sistema de arquivos virtual (VFS) quanto RAG
O ponto central do RAG é a qualidade dos dados: dividimos documentos em unidades semânticas e geramos metadados e links
Fazemos embedding de cada chunk junto com o documento usando voyage contextual embedding
Na busca, o agente pode seguir os links ou analisar o texto original
A qualidade do reranking afeta muito o desempenho
Ele suporta grep, bm25, jq, ferramentas de preview etc., e roda sobre Pydantic AI
Emular um shell POSIX em TypeScript para fazer busca hierárquica parece overengineering
Cada execução de ls ou grep aumenta os ciclos de inferência e, com isso, a latência
Não conheço bem a stack técnica, mas fiquei me perguntando por que criar um shell falso
Uma solução com FUSE parece mais natural
Não havia necessidade de compatibilidade POSIX completa, apenas de navegação em documentos somente leitura
Por isso foi mais simples suportar apenas parte dos comandos bash
No contexto de tornar documentos acessíveis por ferramentas de sistema de arquivos, o AI SDK da Vercel é interessante
Eles incluem documentos .mdx na raiz do pacote npm para induzir o agente a usar grep primeiro na documentação local
Exemplo de SKILL.md
É uma boa abordagem para startups como a Mintlify, mas em organizações complexas pode ser pouco prática
Em ambientes com estrutura não hierárquica ou documentação misturada, o RAG pode ser mais útil
RAG não é solução para tudo, e a equipe do Claude Code chegou à mesma conclusão