{"schemaVersion":1,"id":"https://lucioduran.com/es/projects/llm-semantic-cache","url":"https://lucioduran.com/es/projects/llm-semantic-cache","title":"LLM Semantic Cache","description":"Caché exacta y semántica en SQLite con aislamiento por usuario, permisos y versión, invalidación transaccional y evaluación local de aciertos correctos e incorrectos.","language":"es","datePublished":"2026-10-22","dateModified":"2026-10-22","contentFormat":"text/markdown","content":"[Proyectos](<https://lucioduran.com/es/projects>) / LLM Semantic Cache\n\n# LLM Semantic Cache\n\nCaché exacta y semántica en SQLite con aislamiento por usuario, permisos y versión, invalidación transaccional y evaluación local de aciertos correctos e incorrectos.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 · Licencia: [MIT](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/LICENSE>)\n\nFicha publicada: 2026-10-22 · Ficha actualizada: 2026-10-22\n\n[Repositorio](<https://github.com/lucioduran/llm-semantic-cache>) · [Evidencia original](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/report.json>) · [Release v0.1.0](<https://github.com/lucioduran/llm-semantic-cache/releases/tag/v0.1.0>)\n\n## Problema y utilidad para agentes\n\nDos preguntas parecidas pueden necesitar respuestas distintas al cambiar usuario, permisos, entidad, fecha o fuente. La similitud no autoriza reutilizar una respuesta; calcular embeddings también tiene costo.\n\nEl proyecto hace explícito el contexto que permite reutilización y mide si el ahorro neto sobrevive al trabajo extra de la caché semántica. Conserva un diagnóstico inseguro para mostrar el efecto de ignorar esos límites.\n\n## Arquitectura\n\n1. **Aislamiento antes de similitud.** Filtra por usuario, permisos, versión, entidad, fecha y namespace del modelo de embeddings antes de comparar. Intenta coincidencia exacta antes de calcular un vector.\n2. **Invalidación transaccional.** SQLite coordina escrituras. Un ticket de generación capturado antes de leer fuentes impide guardar resultados anteriores a una invalidación. Expiración, reemplazo y borrado lógico son explícitos.\n3. **Evaluación con modelos locales.** MiniLM genera embeddings y FLAN-T5-small responde a 48 solicitudes ficticias por política. Guarda respuestas, decisiones, vectores y tiempos para replay sin inferencia.\n\n- [Diseño y metodología](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/design.md>)\n\n## Qué demuestra\n\n- Diseño de fronteras de reutilización y rechazo de escrituras en vuelo después de invalidar.\n- Medición separada de hits correctos, reutilización incorrecta y exactitud de respuestas.\n- Contabilidad de ahorro neto que incluye embedding, lookup, generación, escrituras e invalidación.\n\n## Resultados publicados\n\nUna ejecución local de orden fijo con 48 solicitudes por política, en Intel Xeon W-3223 con cuatro hilos. MiniLM y FLAN-T5-small están fijados por revisión; el umbral de similitud es 0,90.\n\nLas tasas de acierto usan todas las solicitudes como denominador. Un hit correcto exige mismo alcance, hecho solicitado y valor de referencia. El ahorro neto incluye trabajo por solicitud y excluye descarga, carga y calentamiento de modelos.\n\n### Reutilización y tiempo neto\n\n| Política | Hits correctos | Hits incorrectos | Tiempo total (s) | Tiempo ahorrado |\n| --- | --- | --- | --- | --- |\n| Sin caché | 0/48 | 0/48 | 3.893 | 0% |\n| Exacta con aislamiento | 12/48 | 0/48 | 2.915 | 25.1% |\n| Semántica con aislamiento | 16/48 | 0/48 | 3.310 | 15.0% |\n| Diagnóstico sin aislamiento | 8/48 | 32/48 | 0.717 | Beneficio inválido |\n\nLa caché semántica reutilizó cuatro respuestas más que la exacta, pero ahorró menos tiempo: 15,0 % frente a 25,1 %. Consumió 0,308 s en embeddings. La variación de generación también influye; una sola ejecución no establece un orden estable de rendimiento.\n\nEl diagnóstico sin aislamiento produjo 32 reutilizaciones incorrectas, el 80 % de sus hits. Sin caché, con caché exacta y con caché semántica se obtuvo 100 % de exact match sobre preguntas numéricas simples; ese resultado no establece seguridad general. [Resumen de resultados](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/summary.json>).\n\n## Reproducir\n\nBiblioteca y replay con Python 3.11 o posterior y SQLite, sin dependencias de modelos. La reproducción neural descarga los dos modelos públicos y usa el lock del entorno medido.\n\nUsá una carpeta de salida nueva y ejecutá una medición por vez. Los comandos son POSIX y el lock corresponde a Intel macOS. El llamador debe obtener permisos y alcance de fuentes confiables en cada solicitud.\n\n### Revisar la evidencia guardada\n\n```\ngit clone https://github.com/lucioduran/llm-semantic-cache.git\ncd llm-semantic-cache\ngit checkout 78efb52757165a2f1dc5cc2f76197317b853643a\npython -m scripts.verify results/reference/report.json\n```\n\n### Repetir la medición local\n\n```\npython3.11 -m venv .venv\n. .venv/bin/activate\npython -m pip install -r requirements-models.lock\npython -m scripts.evaluate download\nOMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 MKL_NUM_THREADS=4 python -m scripts.evaluate run --output results/my-run\npython -m scripts.verify results/my-run/report.json\n```\n\n## Alcance y límites\n\n- La biblioteca no autentica usuarios ni interpreta permisos. Una versión que omita dependencias del prompt, modelo, contenido o política puede permitir reutilización obsoleta.\n- Las lecturas concurrentes pueden haber obtenido una respuesta antes de invalidar; no hay barrera de revocación distribuida. La invalidación global de tickets puede rechazar escrituras no relacionadas.\n- Búsqueda semántica lineal por alcance, sin índice vectorial, single-flight, límite de tamaño ni limpieza automática. El borrado es lógico.\n- Corpus pequeño escrito por el autor, una ejecución y sin intervalos temporales. No es auditoría de seguridad, prueba de escala ni evaluación general de calidad.\n\n- [Orquestación de IA, memoria y reutilización de respuestas](<https://lucioduran.com/es/blog/semantic-kernel-langchain-ai-orchestration>)\n\n## Fuentes y revisión\n\nResultados del informe y trazas incluidos en v0.1.0. El informe identifica el commit de implementación, pero no contiene una fecha de ejecución. La fecha de release se muestra por separado.\n\n- Revisión consultada: [` 78efb52757165a2f1dc5cc2f76197317b853643a `](<https://github.com/lucioduran/llm-semantic-cache/commit/78efb52757165a2f1dc5cc2f76197317b853643a>)\n- Revisión registrada por el experimento: [` c9c450254b5e7875c04611b5e3e4d22addca6db6 `](<https://github.com/lucioduran/llm-semantic-cache/commit/c9c450254b5e7875c04611b5e3e4d22addca6db6>)\n- Release publicada: [v0.1.0](<https://github.com/lucioduran/llm-semantic-cache/releases/tag/v0.1.0>) · 2026-10-21T23:13:38Z\n\n- [README y uso](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/README.md>)\n- [Evidencia original](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/report.json>)\n- [Resumen de resultados](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/summary.json>)\n- [Respuestas y trazas originales](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/trace.jsonl>)\n- [Diseño y metodología](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/design.md>)\n- [Datos y procedencia](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/requests.json>)\n- [Configuración congelada](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/config.json>)\n- [Análisis de errores](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/methodology.md>)\n- [Modelos, revisiones y licencias](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/model-notices.md>)\n- [Dependencias del entorno medido](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/requirements-models.lock>)\n- [Licencia MIT](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/LICENSE>)","headings":[{"level":1,"text":"LLM Semantic Cache","url":"https://lucioduran.com/es/projects/llm-semantic-cache#title"},{"level":2,"text":"Problema y utilidad para agentes","url":"https://lucioduran.com/es/projects/llm-semantic-cache#problem"},{"level":2,"text":"Arquitectura","url":"https://lucioduran.com/es/projects/llm-semantic-cache#architecture"},{"level":2,"text":"Qué demuestra","url":"https://lucioduran.com/es/projects/llm-semantic-cache#demonstrates"},{"level":2,"text":"Resultados publicados","url":"https://lucioduran.com/es/projects/llm-semantic-cache#results"},{"level":3,"text":"Reutilización y tiempo neto","url":"https://lucioduran.com/es/projects/llm-semantic-cache#results-cache"},{"level":2,"text":"Reproducir","url":"https://lucioduran.com/es/projects/llm-semantic-cache#reproduce"},{"level":3,"text":"Revisar la evidencia guardada","url":"https://lucioduran.com/es/projects/llm-semantic-cache#reproduce-replay"},{"level":3,"text":"Repetir la medición local","url":"https://lucioduran.com/es/projects/llm-semantic-cache#reproduce-inference"},{"level":2,"text":"Alcance y límites","url":"https://lucioduran.com/es/projects/llm-semantic-cache#scope"},{"level":2,"text":"Fuentes y revisión","url":"https://lucioduran.com/es/projects/llm-semantic-cache#sources"}],"sections":[{"heading":"LLM Semantic Cache","level":1,"url":"https://lucioduran.com/es/projects/llm-semantic-cache","content":"[Proyectos](<https://lucioduran.com/es/projects>) / LLM Semantic Cache"},{"heading":"LLM Semantic Cache","level":1,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#title","content":"Caché exacta y semántica en SQLite con aislamiento por usuario, permisos y versión, invalidación transaccional y evaluación local de aciertos correctos e incorrectos.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 · Licencia: [MIT](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/LICENSE>)\n\nFicha publicada: 2026-10-22 · Ficha actualizada: 2026-10-22\n\n[Repositorio](<https://github.com/lucioduran/llm-semantic-cache>) · [Evidencia original](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/report.json>) · [Release v0.1.0](<https://github.com/lucioduran/llm-semantic-cache/releases/tag/v0.1.0>)"},{"heading":"Problema y utilidad para agentes","level":2,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#problem","content":"Dos preguntas parecidas pueden necesitar respuestas distintas al cambiar usuario, permisos, entidad, fecha o fuente. La similitud no autoriza reutilizar una respuesta; calcular embeddings también tiene costo.\n\nEl proyecto hace explícito el contexto que permite reutilización y mide si el ahorro neto sobrevive al trabajo extra de la caché semántica. Conserva un diagnóstico inseguro para mostrar el efecto de ignorar esos límites."},{"heading":"Arquitectura","level":2,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#architecture","content":"1. **Aislamiento antes de similitud.** Filtra por usuario, permisos, versión, entidad, fecha y namespace del modelo de embeddings antes de comparar. Intenta coincidencia exacta antes de calcular un vector.\n2. **Invalidación transaccional.** SQLite coordina escrituras. Un ticket de generación capturado antes de leer fuentes impide guardar resultados anteriores a una invalidación. Expiración, reemplazo y borrado lógico son explícitos.\n3. **Evaluación con modelos locales.** MiniLM genera embeddings y FLAN-T5-small responde a 48 solicitudes ficticias por política. Guarda respuestas, decisiones, vectores y tiempos para replay sin inferencia.\n\n- [Diseño y metodología](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/design.md>)"},{"heading":"Qué demuestra","level":2,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#demonstrates","content":"- Diseño de fronteras de reutilización y rechazo de escrituras en vuelo después de invalidar.\n- Medición separada de hits correctos, reutilización incorrecta y exactitud de respuestas.\n- Contabilidad de ahorro neto que incluye embedding, lookup, generación, escrituras e invalidación."},{"heading":"Resultados publicados","level":2,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#results","content":"Una ejecución local de orden fijo con 48 solicitudes por política, en Intel Xeon W-3223 con cuatro hilos. MiniLM y FLAN-T5-small están fijados por revisión; el umbral de similitud es 0,90.\n\nLas tasas de acierto usan todas las solicitudes como denominador. Un hit correcto exige mismo alcance, hecho solicitado y valor de referencia. El ahorro neto incluye trabajo por solicitud y excluye descarga, carga y calentamiento de modelos."},{"heading":"Reutilización y tiempo neto","level":3,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#results-cache","content":"| Política | Hits correctos | Hits incorrectos | Tiempo total (s) | Tiempo ahorrado |\n| --- | --- | --- | --- | --- |\n| Sin caché | 0/48 | 0/48 | 3.893 | 0% |\n| Exacta con aislamiento | 12/48 | 0/48 | 2.915 | 25.1% |\n| Semántica con aislamiento | 16/48 | 0/48 | 3.310 | 15.0% |\n| Diagnóstico sin aislamiento | 8/48 | 32/48 | 0.717 | Beneficio inválido |\n\nLa caché semántica reutilizó cuatro respuestas más que la exacta, pero ahorró menos tiempo: 15,0 % frente a 25,1 %. Consumió 0,308 s en embeddings. La variación de generación también influye; una sola ejecución no establece un orden estable de rendimiento.\n\nEl diagnóstico sin aislamiento produjo 32 reutilizaciones incorrectas, el 80 % de sus hits. Sin caché, con caché exacta y con caché semántica se obtuvo 100 % de exact match sobre preguntas numéricas simples; ese resultado no establece seguridad general. [Resumen de resultados](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/summary.json>)."},{"heading":"Reproducir","level":2,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#reproduce","content":"Biblioteca y replay con Python 3.11 o posterior y SQLite, sin dependencias de modelos. La reproducción neural descarga los dos modelos públicos y usa el lock del entorno medido.\n\nUsá una carpeta de salida nueva y ejecutá una medición por vez. Los comandos son POSIX y el lock corresponde a Intel macOS. El llamador debe obtener permisos y alcance de fuentes confiables en cada solicitud."},{"heading":"Revisar la evidencia guardada","level":3,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#reproduce-replay","content":"```\ngit clone https://github.com/lucioduran/llm-semantic-cache.git\ncd llm-semantic-cache\ngit checkout 78efb52757165a2f1dc5cc2f76197317b853643a\npython -m scripts.verify results/reference/report.json\n```"},{"heading":"Repetir la medición local","level":3,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#reproduce-inference","content":"```\npython3.11 -m venv .venv\n. .venv/bin/activate\npython -m pip install -r requirements-models.lock\npython -m scripts.evaluate download\nOMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 MKL_NUM_THREADS=4 python -m scripts.evaluate run --output results/my-run\npython -m scripts.verify results/my-run/report.json\n```"},{"heading":"Alcance y límites","level":2,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#scope","content":"- La biblioteca no autentica usuarios ni interpreta permisos. Una versión que omita dependencias del prompt, modelo, contenido o política puede permitir reutilización obsoleta.\n- Las lecturas concurrentes pueden haber obtenido una respuesta antes de invalidar; no hay barrera de revocación distribuida. La invalidación global de tickets puede rechazar escrituras no relacionadas.\n- Búsqueda semántica lineal por alcance, sin índice vectorial, single-flight, límite de tamaño ni limpieza automática. El borrado es lógico.\n- Corpus pequeño escrito por el autor, una ejecución y sin intervalos temporales. No es auditoría de seguridad, prueba de escala ni evaluación general de calidad.\n\n- [Orquestación de IA, memoria y reutilización de respuestas](<https://lucioduran.com/es/blog/semantic-kernel-langchain-ai-orchestration>)"},{"heading":"Fuentes y revisión","level":2,"url":"https://lucioduran.com/es/projects/llm-semantic-cache#sources","content":"Resultados del informe y trazas incluidos en v0.1.0. El informe identifica el commit de implementación, pero no contiene una fecha de ejecución. La fecha de release se muestra por separado.\n\n- Revisión consultada: [` 78efb52757165a2f1dc5cc2f76197317b853643a `](<https://github.com/lucioduran/llm-semantic-cache/commit/78efb52757165a2f1dc5cc2f76197317b853643a>)\n- Revisión registrada por el experimento: [` c9c450254b5e7875c04611b5e3e4d22addca6db6 `](<https://github.com/lucioduran/llm-semantic-cache/commit/c9c450254b5e7875c04611b5e3e4d22addca6db6>)\n- Release publicada: [v0.1.0](<https://github.com/lucioduran/llm-semantic-cache/releases/tag/v0.1.0>) · 2026-10-21T23:13:38Z\n\n- [README y uso](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/README.md>)\n- [Evidencia original](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/report.json>)\n- [Resumen de resultados](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/summary.json>)\n- [Respuestas y trazas originales](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/trace.jsonl>)\n- [Diseño y metodología](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/design.md>)\n- [Datos y procedencia](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/requests.json>)\n- [Configuración congelada](<https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/config.json>)\n- [Análisis de errores](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/methodology.md>)\n- [Modelos, revisiones y licencias](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/model-notices.md>)\n- [Dependencias del entorno medido](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/requirements-models.lock>)\n- [Licencia MIT](<https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/LICENSE>)"}],"links":[{"text":"Proyectos","url":"https://lucioduran.com/es/projects"},{"text":"Lucio Durán","url":"https://lucioduran.com/es"},{"text":"MIT","url":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/LICENSE"},{"text":"Repositorio","url":"https://github.com/lucioduran/llm-semantic-cache"},{"text":"Evidencia original","url":"https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/report.json"},{"text":"Release v0.1.0","url":"https://github.com/lucioduran/llm-semantic-cache/releases/tag/v0.1.0"},{"text":"Diseño y metodología","url":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/design.md"},{"text":"Resumen de resultados","url":"https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/summary.json"},{"text":"Orquestación de IA, memoria y reutilización de respuestas","url":"https://lucioduran.com/es/blog/semantic-kernel-langchain-ai-orchestration"},{"text":"78efb52757165a2f1dc5cc2f76197317b853643a","url":"https://github.com/lucioduran/llm-semantic-cache/commit/78efb52757165a2f1dc5cc2f76197317b853643a"},{"text":"c9c450254b5e7875c04611b5e3e4d22addca6db6","url":"https://github.com/lucioduran/llm-semantic-cache/commit/c9c450254b5e7875c04611b5e3e4d22addca6db6"},{"text":"v0.1.0","url":"https://github.com/lucioduran/llm-semantic-cache/releases/tag/v0.1.0"},{"text":"README y uso","url":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/README.md"},{"text":"Respuestas y trazas originales","url":"https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/trace.jsonl"},{"text":"Datos y procedencia","url":"https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/requests.json"},{"text":"Configuración congelada","url":"https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/config.json"},{"text":"Análisis de errores","url":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/methodology.md"},{"text":"Modelos, revisiones y licencias","url":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/model-notices.md"},{"text":"Dependencias del entorno medido","url":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/requirements-models.lock"},{"text":"Licencia MIT","url":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/LICENSE"}],"structuredData":[{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com/"},{"@type":"WebSite","@id":"https://lucioduran.com/#website","url":"https://lucioduran.com/","name":"Lucio Durán","inLanguage":["en","es"],"publisher":{"@id":"https://lucioduran.com/#person"}},{"@type":"WebPage","@id":"https://lucioduran.com/es/projects/llm-semantic-cache#page","url":"https://lucioduran.com/es/projects/llm-semantic-cache","name":"LLM Semantic Cache","description":"Caché exacta y semántica en SQLite con aislamiento por usuario, permisos y versión, invalidación transaccional y evaluación local de aciertos correctos e incorrectos.","inLanguage":"es","author":{"@id":"https://lucioduran.com/#person"},"publisher":{"@id":"https://lucioduran.com/#person"},"isPartOf":{"@id":"https://lucioduran.com/#website"},"isAccessibleForFree":true,"mainEntity":{"@id":"https://lucioduran.com/projects/llm-semantic-cache#software"},"datePublished":"2026-10-22","dateModified":"2026-10-22","breadcrumb":{"@id":"https://lucioduran.com/es/projects/llm-semantic-cache#breadcrumb"}},{"@type":"SoftwareSourceCode","@id":"https://lucioduran.com/projects/llm-semantic-cache#software","name":"LLM Semantic Cache","description":"Caché exacta y semántica en SQLite con aislamiento por usuario, permisos y versión, invalidación transaccional y evaluación local de aciertos correctos e incorrectos.","url":"https://lucioduran.com/es/projects/llm-semantic-cache","codeRepository":"https://github.com/lucioduran/llm-semantic-cache","programmingLanguage":"Python","runtimePlatform":"Python 3.11.13","license":"https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/LICENSE","version":"v0.1.0","identifier":{"@type":"PropertyValue","propertyID":"git-commit","value":"78efb52757165a2f1dc5cc2f76197317b853643a"},"author":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"isAccessibleForFree":true,"citation":["https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/README.md","https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/report.json","https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/summary.json","https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/results/reference/trace.jsonl","https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/design.md","https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/requests.json","https://raw.githubusercontent.com/lucioduran/llm-semantic-cache/78efb52757165a2f1dc5cc2f76197317b853643a/data/config.json","https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/methodology.md","https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/docs/model-notices.md","https://github.com/lucioduran/llm-semantic-cache/blob/78efb52757165a2f1dc5cc2f76197317b853643a/requirements-models.lock","https://github.com/lucioduran/llm-semantic-cache/releases/tag/v0.1.0"],"publisher":{"@id":"https://lucioduran.com/#person"},"mainEntityOfPage":{"@id":"https://lucioduran.com/es/projects/llm-semantic-cache#page"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Proyectos","item":"https://lucioduran.com/es/projects"},{"@type":"ListItem","position":2,"name":"LLM Semantic Cache","item":"https://lucioduran.com/es/projects/llm-semantic-cache"}],"@id":"https://lucioduran.com/es/projects/llm-semantic-cache#breadcrumb"}]}],"contentHash":"dafd2d16fabe58872619a3134aaa0fa66db7592af9b608e3ff7fa482486a96e1","provenance":{"method":"Deterministic serialization of the server-rendered main element","source":"https://lucioduran.com/es/projects/llm-semantic-cache","hashAlgorithm":"sha256","hashScope":"JSON document fields before contentHash and provenance","sourceHTMLBytes":47390,"contentBytes":8202}}
