RE-call MCP Memory Server

Memoria de Postgres más pgvector para agentes de IA, con procedencia, veredictos de confianza y abstención explícita cuando la memoria no puede respaldar una respuesta.

Documentación

RE-call: memory that knows when not to guess

Memoria que sabe lo que ya no cree.
RE-call es el motor de recuperación que extraje de un agente de investigación que llevaba meses en funcionamiento, después de que su memoria superara su ventana de contexto y empezara a repetir con seguridad conclusiones que ya había refutado.

CI License: Apache 2.0 Python 3.11+ PostgreSQL + pgvector CI: real pgvector, types, audit RE-call MCP server

Por qué RE-call  ·  Inicio rápido  ·  Cómo funciona  ·  Superficie del producto  ·  Documentación  ·  Evidencia

README con menú de idiomas  ·  Guía de configuración: instalar, configurar y ejecutar RE-call

Por qué RE-call

La recuperación por coincidencia más cercana no puede distinguir entre lo que es verdad y lo que simplemente parece serlo. Cuando un corpus conserva su historial, y la memoria real de un agente lo hace, la afirmación retractada y su corrección son ambas recuperables, y la retractada suele ser la coincidencia más cercana. Eso no es un problema de ajuste. Un clasificador sin noción de validez no tiene forma de preferir la corrección.

RE-call surgió de un agente de investigación de trading en producción y de larga duración: meses de operación, 792 memorandos escritos, 6,469 fragmentos, reindexados diariamente por un enganche de fin de sesión. Cada protección en este repositorio existe porque ese agente falló de una manera específica sin ella. Ver docs/CASE_STUDY.md.

Está pensado para equipos que ponen memoria de agente detrás de aplicaciones reales, donde una memoria obsoleta o sin respaldo es peor que no tener memoria: mantén la capa de memoria local por defecto, adjunta políticas a cada resultado, calibra el umbral de rechazo en tu corpus y deja que la aplicación decida qué hacer con un resultado que no es lo suficientemente confiable como para responder a partir de él.

CapacidadQué significa en la práctica
Recuperación consciente de validezLos resultados superados, caducados, aún no válidos, de baja confianza y no implicados se presentan como veredictos en lugar de aplanarse en resultados de búsqueda ordinarios.
Abstención explícitaCuando ningún resultado válido supera el umbral calibrado, los llamadores reciben una abstención con un motivo en lugar de una suposición del vecino más cercano.
Operación localLa ingesta y la recuperación se ejecutan en PostgreSQL más pgvector. Se admiten incrustaciones locales, por lo que la memoria se puede construir y consultar sin una llamada LLM de la capa de memoria.
Configuración basada en políticasEl incrustador, el reordenador, la calibración, la política de confianza y el perfil de recuperación se seleccionan para cumplir con los requisitos legales, de hardware, latencia, calidad y costo. El valor predeterminado es local y sin conexión; las opciones de mayor calidad o alojadas son opcionales.
Límites de producciónIDs de inquilino, seguridad a nivel de fila, transportes HTTP MCP con ámbito de token, borrado, cuotas, tiempos de espera, migraciones y observabilidad son parte de la superficie entregada.
Evidencia reproducibleLos números publicados están vinculados a artefactos confirmados, y la compuerta de afirmaciones los verifica en CI.

Fortalezas medidas:

FortalezaLímite de evidencia
Menor costo de capa de memoriaLa comparación directa de LOCOMO registra cero llamadas LLM de capa de memoria de RE-call, mientras que el comparador paga por llamadas de extracción. Ver benchmarks/REVIEW.md.
Verificación de abstención externaEn MTRAG, el punto de referencia de RAG multiturno de IBM, RE-call es segundo en rechazos correctos entre los sistemas recalculados y se mantiene cerca de las filas de mejor calidad de respuesta. Ver docs/MTRAG_BENCHMARK.md.
La validez supera a la recuperación por coincidencia más cercanaLa superación declarada hace que la memoria actual gane sobre la memoria obsoleta pero similar. El estudio de confianza más amplio está en results/FINDINGS.md.
Más fuerte que un almacén de vectores simpleLos resultados devueltos llevan veredictos, confianza, procedencia, ámbito de inquilino y metadatos de validez. La recuperación top-k simple devuelve vecinos y deja la confianza al llamador.
Límites clarosLa evidencia indica dónde funciona RE-call, dónde no y cuándo se requiere una medición específica del corpus.

El README es la descripción general del producto. Para obtener evidencia detrás de estas afirmaciones, comienza con docs/EVIDENCE.md, luego usa results/FINDINGS.md para la interpretación completa y los límites.

Inicio rápido

RE-call mantiene la memoria en tu propio PostgreSQL con pgvector, por lo que primero se necesita una base de datos.

¿Ya tienes PostgreSQL con pgvector en ejecución? Salta adelante y apunta el DSN a él.

¿Quieres uno desechable? Guarda esto como docker-compose.yml, luego inícialo:

services:
  db:
    image: pgvector/pgvector:pg18
    environment:
      POSTGRES_USER: recall
      POSTGRES_PASSWORD: recall
      POSTGRES_DB: recall
    volumes:
      - recall_pgdata:/var/lib/postgresql
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U recall"]
      interval: 2s
      timeout: 3s
      retries: 30

volumes:
  recall_pgdata:
docker compose up -d --wait

Luego instala, crea el esquema y ejecuta el asistente de configuración guiado. El asistente registra el incrustador seleccionado, las opciones de recuperación y una calibración opcional que se ajusta a tus consultas etiquetadas y a tu corpus.

pip install "recall-rag[fastembed]"
python -m recall.cli --migration-dsn postgresql://recall:recall@localhost:5432/recall schema --dim 384 apply
python -m recall.cli setup

Esos tres comandos se ejecutan sin cambios en PowerShell.

El comando de esquema apunta a la tabla predeterminada chunks deliberadamente. Las migraciones globales deben aplicarse allí antes que cualquier otra tabla, por lo que comenzar con --table something_else en una base de datos nueva se detiene con SchemaTooOld. Para agregar un índice separado más tarde, aplica primero el destino predeterminado, luego pasa --table.

Cuando el asistente pregunta si calibrar, quiere un archivo de consultas etiquetadas y el corpus al que se refieren esas consultas. No tienes que construir ninguno para probarlo: ambos se incluyen dentro del paquete instalado, uno al lado del otro.

python -c "import recall.eval, pathlib; print(pathlib.Path(recall.eval.__file__).parent)"

Eso imprime un directorio que contiene queries.json, un conjunto etiquetado que cubre tanto preguntas respondibles como no respondibles, y corpus/, los documentos contra los que se etiquetan esas preguntas. Dale al asistente esas dos rutas y la calibración se ejecuta de extremo a extremo. Fuentes: recall/eval/queries.json y recall/eval/corpus/.

Una calibración ajustada de esa manera pertenece a esa muestra, no a tus datos. Muestra el mecanismo funcionando y te da un archivo etiquetado para copiar la forma. La calibración es por incrustador y por corpus, por lo que un modelo nuevo o un corpus sustancialmente cambiado necesita calibrarse de nuevo, y un umbral ajustado en la muestra no debe usarse para juzgar tu propia memoria.

Un archivo etiquetado necesita al menos una consulta respondible y una no respondible, y cada entrada necesita una clave query y una answerable. La calibración rechaza el archivo en lugar de ajustar un umbral a evidencia de un solo lado.

La distribución es recall-rag; la importación es recall. El nombre recall en PyPI pertenece a un paquete no relacionado, así que no instales ambos en el mismo entorno.

Trabajando desde un clon:

pip install -e ".[fastembed]"

Cómo funciona

flowchart TB
    M["Memo: markdown plus frontmatter"] --> CH["Chunk"]
    CH --> EW["Embed locally"]
    EW -. "optional" .-> SP["SPLADE encode"]
    EW --> DB
    SP -. "optional" .-> DB

    Q["Query"] --> EQ["Query encoder"]
    EQ --> DB[("PostgreSQL plus pgvector")]

    DB --> DN["Dense vector search"]
    DB --> SL["Postgres full-text search"]
    DB -. "optional" .-> LS["Learned sparse search"]

    DN --> F["Reciprocal Rank Fusion"]
    SL --> F
    LS -. "optional" .-> F

    F -. "optional" .-> RR["Cross-encoder rerank"]
    RR --> GP
    F --> GP{"Gap check: calibrated threshold"}
    GP --> TR{"Trust layer: supersession, validity, confidence"}
    CAL["Calibration: fitted per embedder and corpus"] --> TR
    TR -. "optional" .-> EJ{"Entailment judge"}
    EJ --> OUT
    TR --> OUT["Verdict, confidence, provenance, or ABSTAIN"]

    TR -. "explicit opt-in" .-> RG["Reasoning graph projection"]
    DB -. "generation-bound" .-> RG
    RG --> IP["Inference proposals: review candidates"]
    TR --> RP["Reasoning policy plus budget"]
    IP --> RP
    RP --> RV{"Citation and trust validation"}
    RV --> ROUT["Cited answer, needs review, clarification, or ABSTAIN"]

Superficie del producto

ÁreaSe entrega hoy
RecuperaciónDensa, dispersa, híbrida RRF, SPLADE opcional, reordenamiento de codificador cruzado opcional, confianza calibrada, procedencia y veredictos de confianza.
ConfiguraciónConfiguración guiada, opciones de incrustador local y alojado, perfiles de costo de recuperación, reordenamiento opcional, política de confianza estricta o de desarrollo y calibración por corpus.
AlmacenamientoPostgreSQL con pgvector, ruta de migración SQL ordenada, generaciones inmutables, indexación incremental, poda y borrado con ámbito de fuente.
Integración de agenteCLI, servidor MCP, recuperador LangChain, recuperador LlamaIndex y costuras de búsqueda inyectables para pruebas.
RazonamientoAPI de razonamiento explícita opcional, CLI y herramientas MCP sobre recuperación confiable, proyecciones de gráficos limitadas a generación, inspección de propuestas, presupuestos y validación de citas.
SeguridadAislamiento de inquilino, verificaciones de seguridad a nivel de fila, DSN de servicio y migración, transportes HTTP con token de portador, ámbitos, cuotas y rechazo de DSN inseguro.
OperacionesTiempos de espera, política de reconexión, registro estructurado, contadores, percentiles de latencia y estadísticas MCP.
Compuertas de calidadPruebas de integración reales de pgvector, verificación de tipos, linting, auditoría de dependencias, verificaciones de artefactos de afirmaciones y accesorios de regresión para modos de falla conocidos.

Deliberadamente fuera de alcance: un panel de control para el usuario final, síntesis de entidades, orquestación de alta disponibilidad, extracción automática de verdad de prosa y reescrituras de corpus a partir de propuestas de inferencia. El razonamiento es optativo, con citas restringidas y consciente de la revisión.

La ruta de migración SQL ordenada está versionada ahora, las tablas previas a la tenencia se migran en su lugar, y el tiempo de ejecución CREATE TABLE IF NOT EXISTS sigue siendo solo de arranque.

Cuándo no usar RE-call

Usa otra cosa si necesitas alojamiento administrado, ACL por fragmento, extracción automática de verdad de prosa o un sistema de memoria que reescriba hechos por ti. RE-call es una biblioteca de recuperación sobre tu base de datos PostgreSQL, no una plataforma de memoria alojada.

Lo que esto no hace

RE-call es una biblioteca de recuperación con una capa de razonamiento optativa, no un sistema de razonamiento general. No infiere cada borde de superación faltante, no prueba que una memoria sobre el tema responda a una pregunta de casi coincidencia, no promueve propuestas a verdad del corpus ni reemplaza las operaciones de base de datos con un servicio administrado. Devuelve las señales de confianza que el llamador necesita y se niega a fingir que una coincidencia cercana es siempre evidencia utilizable.

Úsalo

Para una carpeta local de markdown ad hoc, crea una tabla para ese índice, indexa el corpus y búscalo. Si no calibraste durante la configuración, usa el modo de desarrollo solo para evaluación local. Reemplaza ./notes con tu carpeta de memorandos.

python -m recall.cli --table recall_notes \
  --migration-dsn postgresql://recall:recall@localhost:5432/recall \
  schema --dim 384 apply
RECALL_TRUST_MODE=development python -m recall.cli --table recall_notes index ./notes
RECALL_TRUST_MODE=development python -m recall.cli --table recall_notes search "what did we decide about caching?"
python -m recall.cli lint ./notes
python -m recall.cli check ./notes/new-memo.md --strict

PowerShell usa los mismos comandos, pero establece el modo de desarrollo primero cuando estés ejecutando una evaluación local no calibrada:

$env:RECALL_TRUST_MODE = "development"

Para el modo de generación de producción, construye, valida, calibra y promueve una generación inmutable. Luego consulta la generación activa del inquilino:

from recall.embeddings import FastEmbedEmbedder
from recall.generation_store import GenerationStore
from recall.trust import trusted_search

emb = FastEmbedEmbedder()
with GenerationStore(DSN, dim=emb.dim, tenant="acme", pool_size=8) as store:
    store.check_schema()
    result = trusted_search(store, emb, "what is the rate limit?")
    if result.abstained:
        ...  # say you do not know
    for hit in result.hits:
        hit.verdict
        hit.confidence
        hit.validity.superseded_by

Establece RECALL_SERVING_DSN para el tráfico de aplicaciones y RECALL_MIGRATION_DSN solo en el trabajo de migración. RECALL_DSN sigue siendo un respaldo de desarrollo obsoleto para el DSN de servicio. Ver docs/MIGRATIONS.md. Los modos de configuración se resumen en docs/OPERATING_MODES.md.

Notas de seguridad operativa:

TemaRegla
Base de datos de pruebaEl conjunto de pruebas elimina tablas. Usa RECALL_TEST_DSN, nunca RECALL_DSN.
Credenciales predeterminadasEl servidor MCP rechaza un DSN recall:recall integrado no local a menos que RECALL_ALLOW_INSECURE_DSN=1 se establezca deliberadamente.
TenenciaEstablece RECALL_TENANT o PgVectorStore(tenant=...). Usa un rol de base de datos sin privilegios, porque los superusuarios de PostgreSQL omiten RLS.

MCP

El servidor MCP usa la tabla predeterminada chunks. Aplica ese esquema para el incrustador que el servidor ejecutará, luego apunta el cliente a recall_mcp.server.

python -m recall.cli --migration-dsn postgresql://recall:recall@localhost:5432/recall \
  schema --dim 384 apply

Si una tabla chunks existente se creó con otra dimensión de vector, usa una base de datos nueva o un incrustador con la dimensión coincidente. El servidor MCP stdio no acepta un indicador --table.

{
  "mcpServers": {
    "recall": {
      "command": "python",
      "args": ["-m", "recall_mcp.server"],
      "env": {
        "RECALL_SERVING_DSN": "postgresql://...",
        "RECALL_TENANT": "acme",
        "RECALL_TRUST_MODE": "development"
      }
    }
  }
}

Omite RECALL_TRUST_MODE en producción después de haber construido, calibrado y promovido una generación. El trabajo MCP local no calibrado necesita la configuración de desarrollo explícita porque no ha pasado por calibración de producción.

Herramientas: recall_search, recall_evidence, recall_index, recall_forget y recall_stats. Para presentación en idiomas distintos del inglés, pasa locale a recall_search o recall_evidence después de habilitar el punto final de traducción opcional. El texto localizado es aditivo y nunca reemplaza la evidencia canónica. La configuración está documentada en docs/ENVIRONMENT.md.

Guía completa: docs/USING_WITH_CLAUDE.md. Autenticación y tenencia: docs/AUTH.md.

LangChain y LlamaIndex

pip install "recall-rag[langchain]"
pip install "recall-rag[llamaindex]"
from recall.integrations.langchain import RecallRetriever

retriever = RecallRetriever.from_store(store, emb, k=5)
docs = retriever.invoke("what is the rate limit?")

Cuando la capa de confianza se abstiene, los adaptadores no devuelven ningún documento por defecto. Los documentos devueltos incluyen metadatos de confianza, incluyendo veredicto, confianza, coseno y detalles de sustitución.

Documentación

Comience con docs/README.md.

Documentos principales:

DocumentoPropósito
docs/WRITEUP.mdArquitectura y justificación de diseño.
docs/API.mdSuperficie compatible con Python, CLI y MCP.
docs/REPOSITORY_MAP.mdQué es producto, evidencia, soporte de benchmarks y archivo.
docs/REASONING_OPERATIONS.mdHerramientas de razonamiento opcionales, trazas, política de revisión y comportamiento operativo.
docs/AUTH.mdAutenticación, alcances y aislamiento de inquilinos.
docs/MIGRATIONS.mdRoles de migración, DSN de servicio y operaciones de esquema.
docs/OPERATING_MODES.mdModos de despliegue local, producción, calidad, alojado y evaluación.
docs/CALIBRATION.mdFlujo de trabajo de calibración y servicio consciente de la generación.
docs/CASE_STUDY.mdDe dónde viene el sistema y qué es público frente a privado.
docs/RESEARCH_PROTOCOL.mdCómo se controlan y auditan las ejecuciones de benchmarks.

Las notas de versión y advertencias de actualización están en CHANGELOG.md.

Evidencia

Comience con benchmarks/README.md. El directorio de resultados tiene su propio mapa en results/README.md.

La versión breve:

PreguntaEvidencia actual
¿La sustitución declarada supera a la búsqueda de similitud simple?Sí, en los casos límite creados medidos en los estudios de confianza y escala.
¿Se puede confiar en la abstención en todas partes?No. Funciona en brechas amplias y falla en casi-aciertos a menos que se añada una capa de capacidad de respuesta más fuerte.
¿La calidad de recuperación es universal?No. La forma del corpus domina, y la recomendación medida es evaluar su corpus antes de elegir un embedder.
¿La comparación con Mem0 es comparable?La comparación publicada utiliza las mismas preguntas LOCOMO, generador, juez y pruebas pareadas, con límites de nivel de lector indicados en la revisión del benchmark.
¿Qué añade MTRAG?Un benchmark multi-turno de terceros con un juez oficial que otorga crédito completo por rechazo correcto. RE-call no encabeza el benchmark, y ese límite se indica en docs/MTRAG_BENCHMARK.md.

Documentos de benchmark importantes:

DocumentoPropósito
results/FINDINGS.mdInterpretación, límites y resultados negativos.
results/RESULTS.mdTablas de resultados completas.
results/ARTIFACTS.mdMapa de checksums y artefactos para lectores que auditan una afirmación.
docs/MTRAG_BENCHMARK.mdConfiguración de MTRAG, resultados y límites de alcance.
benchmarks/REVIEW.mdRevisión adversarial de la comparación LOCOMO.
benchmarks/PREREGISTRATION.mdReglas pre-registradas para el benchmark principal de memoria.
benchmarks/archive/preregistrations/README.mdPre-registros archivados para brazos de benchmark de seguimiento.

Cuándo no usar RE-call

Use otra cosa si necesita alojamiento gestionado, ACL por fragmento, extracción automática de verdad a partir de prosa, o un sistema de memoria que reescriba hechos por usted. RE-call es una biblioteca de recuperación sobre su base de datos PostgreSQL, no una plataforma de memoria alojada.

Lo que esto no hace

RE-call es una biblioteca de recuperación con una capa de razonamiento opcional, no un sistema de razonamiento general. No infiere cada borde de sustitución faltante, no demuestra que una memoria relevante responde a una pregunta de casi-acierto, no promueve propuestas a verdad del corpus, ni reemplaza operaciones de base de datos con un servicio gestionado. Devuelve las señales de confianza que el llamador necesita, y se niega a fingir que una coincidencia más cercana es siempre evidencia utilizable.

Reproducir

make eval
python -m recall.eval.scale --embedder hashing --filler 50000

Las filas en la nube requieren las claves API correspondientes. Las filas locales se ejecutan sin claves.

Citación

Si describe RE-call en un artículo, publicación, charla o README propio, cite el proyecto y acredite a Giulio D'Erme. Use CITATION.cff como fuente de citación canónica.

Licencia

Licencia Apache 2.0. Consulte LICENSE, y mantenga NOTICE con las obras derivadas redistribuidas.

RE-call MCP server