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
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.
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.
| Capacidad | Qué significa en la práctica |
|---|---|
| Recuperación consciente de validez | Los 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ícita | Cuando 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 local | La 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íticas | El 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ón | IDs 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 reproducible | Los números publicados están vinculados a artefactos confirmados, y la compuerta de afirmaciones los verifica en CI. |
Fortalezas medidas:
| Fortaleza | Límite de evidencia |
|---|---|
| Menor costo de capa de memoria | La 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 externa | En 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 cercana | La 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 simple | Los 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 claros | La 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
| Área | Se entrega hoy |
|---|---|
| Recuperación | Densa, dispersa, híbrida RRF, SPLADE opcional, reordenamiento de codificador cruzado opcional, confianza calibrada, procedencia y veredictos de confianza. |
| Configuración | Configuració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. |
| Almacenamiento | PostgreSQL con pgvector, ruta de migración SQL ordenada, generaciones inmutables, indexación incremental, poda y borrado con ámbito de fuente. |
| Integración de agente | CLI, servidor MCP, recuperador LangChain, recuperador LlamaIndex y costuras de búsqueda inyectables para pruebas. |
| Razonamiento | API 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. |
| Seguridad | Aislamiento 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. |
| Operaciones | Tiempos de espera, política de reconexión, registro estructurado, contadores, percentiles de latencia y estadísticas MCP. |
| Compuertas de calidad | Pruebas 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:
| Tema | Regla |
|---|---|
| Base de datos de prueba | El conjunto de pruebas elimina tablas. Usa RECALL_TEST_DSN, nunca RECALL_DSN. |
| Credenciales predeterminadas | El servidor MCP rechaza un DSN recall:recall integrado no local a menos que RECALL_ALLOW_INSECURE_DSN=1 se establezca deliberadamente. |
| Tenencia | Establece 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:
| Documento | Propósito |
|---|---|
| docs/WRITEUP.md | Arquitectura y justificación de diseño. |
| docs/API.md | Superficie compatible con Python, CLI y MCP. |
| docs/REPOSITORY_MAP.md | Qué es producto, evidencia, soporte de benchmarks y archivo. |
| docs/REASONING_OPERATIONS.md | Herramientas de razonamiento opcionales, trazas, política de revisión y comportamiento operativo. |
| docs/AUTH.md | Autenticación, alcances y aislamiento de inquilinos. |
| docs/MIGRATIONS.md | Roles de migración, DSN de servicio y operaciones de esquema. |
| docs/OPERATING_MODES.md | Modos de despliegue local, producción, calidad, alojado y evaluación. |
| docs/CALIBRATION.md | Flujo de trabajo de calibración y servicio consciente de la generación. |
| docs/CASE_STUDY.md | De dónde viene el sistema y qué es público frente a privado. |
| docs/RESEARCH_PROTOCOL.md | Có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:
| Pregunta | Evidencia 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:
| Documento | Propósito |
|---|---|
| results/FINDINGS.md | Interpretación, límites y resultados negativos. |
| results/RESULTS.md | Tablas de resultados completas. |
| results/ARTIFACTS.md | Mapa de checksums y artefactos para lectores que auditan una afirmación. |
| docs/MTRAG_BENCHMARK.md | Configuración de MTRAG, resultados y límites de alcance. |
| benchmarks/REVIEW.md | Revisión adversarial de la comparación LOCOMO. |
| benchmarks/PREREGISTRATION.md | Reglas pre-registradas para el benchmark principal de memoria. |
| benchmarks/archive/preregistrations/README.md | Pre-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.