Ir al contenido

Mantenimiento & Operaciones

El knowledge graph necesita mantenimiento periódico para mantenerse saludable. A medida que se añaden entidades, observaciones y relaciones, el grafo acumula duplicados semánticos, entidades sobredimensionadas y datos estancados que degradan la calidad de la búsqueda y la utilidad general del sistema.

sofia actúa como gatekeeper de este proceso — no hay modificaciones automáticas. La filosofía del sistema es clara: las tools de mantenimiento marcan problemas, los humanos deciden qué hacer con esa información.

Todas las tools de mantenimiento son de solo lectura por diseño — reportan estado y proponen acciones, pero nunca modifican datos sin aprobación explícita. Este documento cubre las cuatro operaciones de mantenimiento disponibles y las mejores prácticas para mantener el knowledge graph en óptimas condiciones.


La tabla observations incluye una columna similarity_flag que permite detectar automáticamente observaciones potencialmente duplicadas dentro de una entidad.

Cuando add_observations() agrega una nueva observación a una entidad, calcula la similitud coseno entre el texto nuevo y todas las observaciones existentes de esa misma entidad. El proceso usa dos criterios:

Criterio principal — similitud coseno:

CondiciónValor
Similitud coseno >=0.85
AcciónMarcar con similarity_flag=1

Criterio complementario — containment score:

Cuando los textos comparados tienen longitud asimétrica (ratio de longitud >= 2.0, es decir, uno es 2x o más largo que el otro), el sistema también calcula un score de containment. Si containment >= 0.7, la observación recibe similarity_flag=1 independientemente del score de coseno.

ParámetroValorCuándo aplica
Ratio de longitud>= 2.0Un texto es 2x+ más largo que el otro
Containment >=0.7Texto corto contenido en el largo
find_duplicate_observations(
entity_name: str,
threshold: float = 0.85,
containment_threshold: float = 0.7
) → dict[str, Any]

Retorna pares de observaciones con score de similitud por encima del umbral, permitiendo revisar y decidir cuáles consolidar.

El flujo completo es de solo lectura hasta el último paso:

  1. Detectaradd_observations() marca automáticamente con similarity_flag=1
  2. Revisarfind_duplicate_observations() lista los pares sospechosos con sus scores
  3. Consolidardelete_observations() elimina manualmente los duplicados (acción humana). El embedding de la observación restante se regenera automáticamente.

Consulta la Referencia de Tools para los detalles completos de find_duplicate_observations y delete_observations.


Las entidades crecen con el tiempo. Una sesión de trabajo prolongada o un proyecto activo pueden acumular decenas de observaciones que abordan múltiples tópicos, diluyendo la señal semántica y dificultando la búsqueda.

El splitting es un proceso de cuatro pasos con aprobación humana obligatoria:

find_split_candidates → analyze_entity_split → propose_entity_split_tool → revisión de sofia → execute_entity_split_tool
PasoToolTipoQué hace
1find_split_candidatesSolo lecturaEscanea todas las entidades y retorna las que exceden umbrales
2analyze_entity_splitSolo lecturaAnaliza una entidad específica: conteo, tópicos, split score
3propose_entity_split_toolSolo lecturaGenera propuesta concreta de splits con observaciones agrupadas
4execute_entity_split_toolEscrituraEjecuta el split aprobado (requiere aprobación de sofia)
Tipo de entidadUmbral de observaciones
Sesion15
Proyecto25
Otras20

El sistema usa TF-IDF para agrupar las observaciones de una entidad en clusters coherentes por tópico. El algoritmo:

  1. Tokeniza todas las observaciones de la entidad
  2. Calcula los pesos TF-IDF (con stop words en español, longitud mínima de palabra de 4 caracteres)
  3. Agrupa las observaciones por sus términos de mayor peso
  4. Asigna una etiqueta de tópico basada en los términos dominantes de cada grupo

Esto permite que el split no sea aleatorio, sino que cada sub-entidad resultante agrupe observaciones semánticamente relacionadas.

Después de ejecutar un split, se crean automáticamente dos tipos de relaciones bidireccionales:

  • contiene (parent → child) — la entidad original contiene a las nuevas sub-entidades
  • parte_de (child → parent) — las sub-entidades son parte de la entidad original

Todos los splits usan transacciones atómicas de SQLite (todo o nada). Si cualquier paso falla — crear una sub-entidad, mover observaciones, establecer relaciones — toda la operación se revierte y no se modifica nada.

Después de un split exitoso, el sistema regenera los embeddings para todas las nuevas entidades creadas. Cada sub-entidad recibe un embedding basado en su snapshot completo (nombre + tipo + observaciones asignadas), lo que garantiza que la búsqueda semántica funcione correctamente con la nueva estructura.

Consulta la Referencia de Tools para las firmas completas de las tools de splitting.


consolidation_report genera un diagnóstico completo de salud del knowledge graph en un solo llamado. Es completamente de solo lectura — no modifica absolutamente nada.

consolidation_report(
stale_days: float = 90.0
) → dict[str, Any]

Entidades que exceden sus umbrales de observaciones y tienen diversidad temática suficiente para justificar una división (split_score > 1.0). El sistema evalúa cada entidad con analyze_entity_split y reporta aquellas con needs_split: true.

Observaciones con similarity_flag=1 — posibles duplicados semánticos detectados automáticamente por add_observations(). Estas son candidatas para consolidación manual.

Entidades que no han sido accedidas en los últimos N días (default: 90) y tienen un bajo conteo de accesos totales. Son candidatas para archivo, consolidación o eliminación.

Entidades que exceden los umbrales de tamaño según su tipo (Sesion=15, Proyecto=25, otras=20) independientemente de su diversidad temática. Pueden necesitar split o revisión.

El reporte retorna:

  • Conteos resumen: número de entidades/observaciones en cada categoría
  • Listas detalladas: para cada categoría, una lista de las entidades u observaciones afectadas con sus métricas relevantes

Un workflow típico:

  1. Ejecutar consolidation_report() — revisar los conteos resumen
  2. Para candidatas a split: ejecutar el workflow completo de splitting sobre las candidatas de mayor prioridad
  3. Para observaciones marcadas: ejecutar find_duplicate_observations() sobre las entidades afectadas y consolidar duplicados
  4. Para entidades estancadas: evaluar si siguen siendo relevantes — archivar o eliminar si no
  5. Para entidades grandes: monitorear — pueden volverse candidatas a split una vez que crucen el umbral de diversidad

Ejecutar consolidation_report() de forma mensual para detectar entidades estancadas o sobredimensionadas antes de que afecten la calidad de la búsqueda.


El knowledge graph implementa un mecanismo de decaimiento temporal que afecta cómo las entidades rankean en los resultados de búsqueda semántica. Las entidades accedidas frecuentemente mantienen su relevancia; las no tocadas se desvanecen gradualmente.

La tabla entity_access_log registra cada acceso a entidades:

CampoDescripción
entity_nameNombre de la entidad accedida
queryTexto de la consulta que la recuperó
accessed_atTimestamp del acceso

La función compute_importance() usa una constante ALPHA_CONS=0.2 como señal de consolidación para el decay multi-día:

importancia = ALPHA_CONS * log(1 + accesos_totales) * (ALPHA_DECAY ^ dias_desde_ultimo_acceso)
ComponenteEfecto
ALPHA_CONS * log(1 + accesos_totales)Más accesos = mayor importancia (con crecimiento logarítmico)
ALPHA_DECAY ^ dias_desde_ultimo_accesoMás días sin acceso = menor importancia (decaimiento exponencial)

Este score de importancia alimenta el Limbic Scoring, que re-rankea los resultados de búsqueda semántica. El efecto práctico:

  • Las entidades accedidas frecuentemente rankean más alto en consultas relevantes
  • Las entidades no tocadas durante semanas se desplazan hacia abajo gradualmente
  • La señal ayuda a identificar candidatas para archivar o consolidar — si una entidad tiene baja importancia y no se accede, probablemente es un dato estancado
  • Las entidades nunca se olvidan por completo — el temporal floor del Sistema Límbico (TEMPORAL_FLOOR = 0.1) garantiza que incluso las entidades antiguas conservan un score mínimo

Solo almacenar en el knowledge graph lo que aporta valor duradero:

PersistirNo persistir
Decisiones tomadasLogs de tests
Hallazgos de investigaciónListas de archivos
Cambios de estado del proyectoDetalles de implementación temporal
Conclusiones de sesionesOutput de debug
Configuraciones relevantesIteraciones intermedias

Ejecutar find_duplicate_observations de forma periódica sobre las entidades más activas. Los duplicados semánticos acumulados diluyen la señal del embedding y pueden causar rankings inesperados en la búsqueda semántica.

Ejecutar reportes de consolidación mensualmente

Sección titulada «Ejecutar reportes de consolidación mensualmente»

consolidation_report() con stale_days=90 detecta tres tipos de problemas en un solo llamado: entidades sobredimensionadas, duplicados pendientes y datos estancados. Un ciclo mensual mantiene el grafo manejable.

No esperar a que las entidades se vuelvan inmanejables. Cuando una entidad se acerca al 80% de su umbral por tipo y tiene clusters de tópicos claramente distintos, ejecuta el workflow de splitting. El splitting proactivo mantiene el grafo limpio y la búsqueda precisa. El costo de un split temprano es mucho menor que el de lidiar con una entidad de 40+ observaciones que mezcla cinco tópicos distintos.


  • Referencia de Tools — especificación completa de la API para todas las tools MCP
  • Sistema Límbico — cómo el decaimiento temporal y los patrones de acceso afectan el ranking de búsqueda
  • Arquitectura — vista general del sistema incluyendo el módulo de scoring y el splitter de entidades