Skip to content

[T22] Memoria conversacional con SQLite checkpointer + reescritura de query #10

Description

@johnma96

Objetivo

Que el bot responda correctamente preguntas de seguimiento. Son dos problemas
distintos que hay que resolver juntos porque el usuario los ve como uno.

Contexto

Observado el 10/08/2026 con el bot en uso real: pregunta "qué es Attention is
All You Need" → responde bien. Pregunta "cuál es el mecanismo" → dice que no
tiene contexto.

Problema 1 — sin memoria. answer_query no recibe historial ni
session_id. Cada mensaje es una llamada independiente.

Problema 2 — sin reescritura de query. Aunque hubiera memoria, el retrieval
se hace con la query cruda. "cuál es el mecanismo" es anafórica: su embedding no
se parece a ningún chunk del corpus. Agregar memoria no arregla retrieval.

El Protocol MemoryStore ya existe en domain/interfaces.py y
config.py ya tiene memory_store y sqlite_db_path. El andamiaje está; la
implementación no.

Criterios de aceptación

Memoria:

  • infrastructure/memory/sqlite.py implementando el Protocol MemoryStore
  • Checkpointer de LangGraph conectado, con thread_id derivado del
    chat_id de Telegram
  • El historial persiste entre reinicios del proceso
  • Test unitario del store con base en memoria

Reescritura de query:

  • Nodo de reescritura agregado al grafo, antes de la recuperación
  • Usa el historial para resolver referencias anafóricas
  • Usa un modelo barato (Haiku), no el de generación
  • Si la query no es anafórica, la deja pasar sin modificar (evitar reescribir
    lo que ya está bien)
  • Test: dada una query anafórica y un historial, verificar que la query
    reescrita contiene el referente

Verificación de extremo a extremo:

  • El caso concreto del 10/08 funciona: preguntar por un paper, luego "cuál es
    el mecanismo", y obtener respuesta con contexto correcto

Lo que NO se debe hacer:

  • Confirmado que el historial NO se guarda en context.user_data de
    python-telegram-bot: es memoria en RAM que se pierde al reiniciar, no se
    comparte entre canales, y pondría estado del motor en el adaptador

Capas afectadas

  • infrastructure/memory/sqlite.py — nuevo
  • application/agents/research_agent/ — nodo de reescritura, checkpointer
  • scripts/run_telegram_bot.py — wiring del store y del thread_id

Decisiones a documentar

¿Checkpointer de LangGraph o MemoryStore propio? LangGraph trae
SqliteSaver. Usarlo es más rápido pero acopla la persistencia al framework y
deja el Protocol MemoryStore sin uso. Implementar el Protocol propio es más
trabajo pero mantiene la abstracción. Decidir y justificar; si se usa
SqliteSaver, documentar si MemoryStore se elimina o para qué queda.

Cuántos turnos de historial se pasan. Todo el historial crece sin límite y
consume tokens. Definir una ventana (últimos N turnos) o una estrategia de
resumen.

Objetivo de aprendizaje

Que memoria y retrieval son capas distintas del mismo problema visible.
Entender por qué el retrieval necesita una query autocontenida y qué es una
referencia anafórica en términos de embeddings.

Fuera de alcance

Resumen de conversaciones largas. Memoria de largo plazo entre sesiones
distintas (esto es memoria de sesión).

Estimación

5h

Depende de

T18. Independiente de T20 y T21.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions