PTENES
MÓDULO 2.3

🧠 Memoria y conocimiento

SQLite FTS5 para búsquedas de texto completo, BM25 para clasificar por relevancia, sistema de 2 capas, categorías de memoria y compactación automática.

6
Temas
60
Minutos
Interm.
Nivel
Técnico
Tipo
1

🗃 SQLite FTS5 — búsqueda de texto completo

FTS5 (Full-Text Search versión 5) es un módulo de SQLite que convierte la base de datos en un motor de búsqueda completo. Cero configuración, cero servidor, cero costo — solo SQLite con superpoderes de búsqueda.

🏗 Esquema de la memoria

CREATE VIRTUAL TABLE memories USING fts5(
content, -- Texto del hecho/memoria
category, -- fact | conversation | solution
created_at, -- Timestamp ISO
metadata, -- JSON con contexto extra
tokenize = 'unicode61'
);

💡 ¿Por qué no usar embeddings + vector DB?

Las bases de datos vectoriales son más precisas para la búsqueda semántica, pero añaden complejidad y costos (modelo de embeddings + base de datos aparte). Para un asistente personal con vocabulario consistente, FTS5 + BM25 ofrece un rendimiento excelente con complejidad cero.

2

📊 BM25 — Clasificación por relevancia

BM25 (Best Match 25) es el algoritmo de clasificación que SQLite FTS5 usa de forma predeterminada. Es el mismo algoritmo que usan Elasticsearch y Solr. Da como resultado recuerdos clasificados según su relevancia real, no por fecha de creación.

🔍 Consulta con BM25

-- Busca recuerdos sobre Python, ordenados por relevancia
SELECT content, category, bm25(memories) as score
FROM memories
WHERE memories MATCH 'Python FastAPI'
ORDER BY score
LIMIT 5;
3

🏗 Sistema de 2 capas de memoria

La arquitectura de memoria resuelve el problema de ventana de contexto: no puedes poner toda la memoria en el system prompt. La solución son 2 capas con propósitos distintos.

📄 Capa 1: MEMORY.md

Hechos estáticos de bootstrap. Siempre en el system prompt. Ejemplo: nombre del usuario, stack tecnológico, empresa, zona horaria.

Tamaño recomendado: < 500 tokens

🗄 Capa 2: memory.db

Hechos dinámicos e historial. Se buscan por relevancia cuando es necesario. Puede crecer indefinidamente: solo los 5 más relevantes se incluyen en el contexto.

Tamaño: ilimitado (búsqueda por relevancia)
4

🏷 Categorías de memoria

Cada entrada en memory.db tiene una categoría que permite búsquedas más precisas. Cuando Jarvis necesita contexto, filtra por la categoría más relevante para la pregunta actual.

fact

Hechos sobre el usuario y el mundo

Preferencias, configuraciones, información sobre proyectos. Ej.: "El usuario usa PostgreSQL 16 en producción"

conversation

Fragmentos de conversaciones importantes

Decisiones tomadas y contexto de proyectos discutidos. Ej.: "En 2026-04, decidimos usar Redis para las sesiones"

solution

Soluciones que funcionaron

Cómo se resolvieron los problemas. Jarvis consulta esta información antes de sugerir soluciones. Ej.: "Docker build lento → agregar .dockerignore lo resolvió"

5

🔍 Deduplicación automática

Sin deduplicación, la memoria acumula variaciones del mismo hecho. El store.py implementa una operación upsert inteligente: antes de guardar, busca hechos similares y actualiza el existente si la similitud es alta.

🔄 Algoritmo de deduplicación

1
Llega un nuevo hecho para guardarlo
2
FTS5 busca hechos similares en la misma categoría
3
Si score BM25 > threshold (0.7): UPDATE del hecho existente
4
Si score < threshold: INSERT de nuevo hecho
6

🗜 Compactación automática

Una memoria que crece sin límite se vuelve lenta de buscar. Compactación automática resume periódicamente las entradas antiguas en hechos más concisos, manteniendo la relevancia sin consumir espacio de forma descontrolada.

✓ Qué compactar

  • ✓Conversaciones de más de 30 días
  • ✓Hechos redundantes sobre el mismo tema
  • ✓Historial de decisiones anteriores

✗ Qué preservar

  • ✗Soluciones que funcionaron (alto valor)
  • ✗Preferencias fundamentales del usuario
  • ✗Hechos consultados con frecuencia

✅ Resumen del Módulo 2.3

✓
SQLite FTS5 — Búsqueda full-text nativa, cero dependencias externas
✓
BM25 — Ranking por relevancia real, no por fecha
✓
2 capas — MEMORY.md (bootstrap estático) + memory.db (historial dinámico)
✓
Categorías — fact, conversation, solution para búsquedas precisas
✓
Deduplicación — El upsert inteligente evita duplicados mediante similitud BM25
✓
Compactación — La resumición de memorias antiguas mantiene la búsqueda eficiente

Próxima ruta:

Ruta 3 — Seguridad Zero-Trust: la ruta más importante del curso