Arquitetura
Pipeline de alto nível
O caminho que uma pasta percorre do disco até uma resposta embasada.
O LocalLens recebe uma pasta e uma pergunta e devolve uma resposta com citações. Tudo entre esses dois endpoints é um pipeline pequeno e fixo.
Pipeline de indexação
A indexação roda uma vez por brain, quando você cria.
Os passos no código:
discoverTextDocuments(rootPath)(src/files.ts) percorre a pasta, filtra tudo que não é um arquivo de texto seguro, e retornaLocalDocument[].chunkDocuments(documents, { brainId })(src/rag.ts) chamaragChunkpara quebrar cada documento em chunks de ~220 tokens com 40 tokens de overlap, depois retornaTextChunk[].QvacGateway.ingestChunks(workspace, chunks)(src/qvac.ts) embeda cada chunk comGTE_LARGE_FP16e escreve eles num workspace QVAC nomeado.LocalLensStore.saveBrainesaveChunks(src/store.ts) persistem o brain e seus chunks em.locallens/store.json.
Os três primeiros passos operam na pasta de entrada. O quarto guarda um registro do brain, então da próxima vez que você abrir o app, dá para fazer perguntas sem reindexar.
Pipeline de pergunta
Toda volta de chat percorre o mesmo caminho de quatro passos.
No código:
QvacGateway.search(workspace, question, 5)(src/qvac.ts) embeda a pergunta e rodaragSearch, retornando os top 5SearchHit[].buildGroundedHistory(question, hits)(src/rag.ts) produz umChatMessage[]de duas mensagens contendo as regras de sistema e os trechos numerados.QvacGateway.answer(history)(src/qvac.ts) chama ocompletion()do QVAC comstream: truee dá yield em cadacontentDeltacomo umAsyncGenerator<string>.LocalLensApp.askBrain(src/locallens.ts) acumula o stream e retorna{ answer, citations }.
Onde cada passo mora
| Etapa | Módulo | Chamada principal |
|---|---|---|
| Descoberta de arquivos | src/files.ts | discoverTextDocuments |
| Chunking | src/rag.ts | chunkDocuments → ragChunk |
| Embedding e ingest | src/qvac.ts | ingestChunks → ragIngest |
| Persistência | src/store.ts | saveBrain, saveChunks |
| Recuperação | src/qvac.ts | search → ragSearch |
| Prompt | src/rag.ts | buildGroundedHistory |
| Completion | src/qvac.ts | answer → completion |
| Workflow | src/locallens.ts | LocalLensApp.askBrain |
O que o pipeline não é
- Sem reingestão no caminho de pergunta. Perguntar nunca toca o sistema de arquivos ou o JSON store. Só lê do workspace QVAC.
- Sem segunda chamada de modelo por pergunta. Uma round-trip pro modelo de chat. Uma chamada de embedding para o passo de busca. Só.
- Sem estado conversacional. Cada pergunta é uma rodada de recuperação independente. O histórico de chat é reconstruído do zero toda vez, embasado no que a busca retornou para esta pergunta.
Essa última propriedade mantém respostas de follow-up embasadas. Se você quer
diálogo multi-turno, construa acima do buildGroundedHistory, não
dentro dele. A página RAG vs LLM
explica por quê.
Próximo
- Fluxo de request — uma única pergunta, traçada de ponta a ponta.
- RAG vs LLM — o que cada lado faz e por que eles ficam separados.
- Por que QVAC — a superfície do SDK em uso, e o que estaríamos escrevendo sem ele.
- Layout do código — onde o código mora.