Pipeline de alto nivel
El camino que toma una carpeta desde el disco hasta una respuesta fundamentada.
LocalLens toma una carpeta y una pregunta, y devuelve una respuesta con citas. Todo lo que pasa entre esos dos extremos es un pipeline pequeño y fijo.
Pipeline de indexación
La indexación corre una vez por cerebro, cuando lo creas.
Los pasos en código:
discoverTextDocuments(rootPath)(src/files.ts) recorre la carpeta, filtra todo lo que no sea un archivo de texto seguro y devuelveLocalDocument[].chunkDocuments(documents, { brainId })(src/rag.ts) llama aragChunkpara partir cada documento en chunks de ~220 tokens con 40 tokens de solapamiento, y devuelveTextChunk[].QvacGateway.ingestChunks(workspace, chunks)(src/qvac.ts) embeddea cada chunk conGTE_LARGE_FP16y los escribe en un workspace de QVAC con nombre.LocalLensStore.saveBrainysaveChunks(src/store.ts) persisten el cerebro y sus chunks en.locallens/store.json.
Los primeros tres pasos trabajan sobre la carpeta de entrada. El cuarto guarda un registro del cerebro, así que la próxima vez que abras la app puedes hacer preguntas sin reindexar.
Pipeline de preguntas
Cada round-trip de chat recorre el mismo camino de cuatro pasos.
En código:
QvacGateway.search(workspace, question, 5)(src/qvac.ts) embeddea la pregunta y correragSearch, devolviendo los top 5SearchHit[].buildGroundedHistory(question, hits)(src/rag.ts) produce unChatMessage[]de dos mensajes con las reglas del sistema y los extractos numerados.QvacGateway.answer(history)(src/qvac.ts) llama acompletion()de QVAC constream: truey produce cadacontentDeltacomo unAsyncGenerator<string>.LocalLensApp.askBrain(src/locallens.ts) acumula el stream y devuelve{ answer, citations }.
Dónde vive cada paso
| Etapa | Módulo | Llamada clave |
|---|---|---|
| Descubrimiento de archivos | src/files.ts | discoverTextDocuments |
| Chunking | src/rag.ts | chunkDocuments → ragChunk |
| Embedding e ingest | src/qvac.ts | ingestChunks → ragIngest |
| Persistencia | src/store.ts | saveBrain, saveChunks |
| Recuperación | src/qvac.ts | search → ragSearch |
| Prompt | src/rag.ts | buildGroundedHistory |
| Completion | src/qvac.ts | answer → completion |
| Workflow | src/locallens.ts | LocalLensApp.askBrain |
Qué no hace el pipeline
- Sin re-ingestión en el camino de la pregunta. Preguntar nunca toca el filesystem ni el store JSON. Solo lee desde el workspace de QVAC.
- Sin una segunda llamada al modelo por pregunta. Un round-trip al modelo de chat. Una llamada de embedding para el paso de búsqueda. Eso es todo.
- Sin estado conversacional. Cada pregunta es una ronda independiente de recuperación. El historial de chat se reconstruye desde cero cada vez, fundamentado en lo que la búsqueda devolvió para esta pregunta.
Esa última propiedad mantiene las respuestas de seguimiento
fundamentadas. Si quieres diálogo multi-turn, constrúyelo encima
de buildGroundedHistory, no dentro. La página
RAG vs LLM explica por qué.
Siguiente
- Flujo del request — una única pregunta, traceada de extremo a extremo.
- RAG vs LLM — qué hace cada lado y por qué se mantienen separados.
- Por qué QVAC — la superficie del SDK en uso y qué estaríamos escribiendo sin él.
- Layout del código fuente — dónde vive el código.