LocalLens
Arquitectura

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:

  1. discoverTextDocuments(rootPath) (src/files.ts) recorre la carpeta, filtra todo lo que no sea un archivo de texto seguro y devuelve LocalDocument[].
  2. chunkDocuments(documents, { brainId }) (src/rag.ts) llama a ragChunk para partir cada documento en chunks de ~220 tokens con 40 tokens de solapamiento, y devuelve TextChunk[].
  3. QvacGateway.ingestChunks(workspace, chunks) (src/qvac.ts) embeddea cada chunk con GTE_LARGE_FP16 y los escribe en un workspace de QVAC con nombre.
  4. LocalLensStore.saveBrain y saveChunks (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:

  1. QvacGateway.search(workspace, question, 5) (src/qvac.ts) embeddea la pregunta y corre ragSearch, devolviendo los top 5 SearchHit[].
  2. buildGroundedHistory(question, hits) (src/rag.ts) produce un ChatMessage[] de dos mensajes con las reglas del sistema y los extractos numerados.
  3. QvacGateway.answer(history) (src/qvac.ts) llama a completion() de QVAC con stream: true y produce cada contentDelta como un AsyncGenerator<string>.
  4. LocalLensApp.askBrain (src/locallens.ts) acumula el stream y devuelve { answer, citations }.

Dónde vive cada paso

EtapaMóduloLlamada clave
Descubrimiento de archivossrc/files.tsdiscoverTextDocuments
Chunkingsrc/rag.tschunkDocumentsragChunk
Embedding e ingestsrc/qvac.tsingestChunksragIngest
Persistenciasrc/store.tssaveBrain, saveChunks
Recuperaciónsrc/qvac.tssearchragSearch
Promptsrc/rag.tsbuildGroundedHistory
Completionsrc/qvac.tsanswercompletion
Workflowsrc/locallens.tsLocalLensApp.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

On this page