Feast proporciona una API de FeatureStore de alto nivel que te permite definir funcionalidades y grupos de funcionalidades (vistas de características), almacenamiento en línea y fuera de línea, y la capacidad de mover dinámicamente datos del almacenamiento fuera de línea al almacenamiento en línea (materialización). La integración de MongoDB permite usar MongoDB como almacén en línea y almacén offline para Feast, lo que facilita definir funcionalidades una sola vez y servirlas de forma consistente tanto en el entrenamiento de modelos como en la inferencia en línea, sin necesidad de mantener sistemas de almacenamiento separados.
El modelo flexible de documentos de MongoDB y MQL le permiten manejar los complejos patrones de consulta requeridos por el almacén offline. Para la tienda online, MongoDB está optimizado para los patrones de acceso a escala web: lecturas/escrituras rápidas, escalabilidad horizontal y esquemas flexibles que minimizan uniones y viajes de ida y vuelta.
En esta visión general de la integración, puedes encontrar:
Una introducción a MongoDB como tienda en línea y fuera de línea de Feast.
Cómo los conceptos de Feast se mapean a MongoDB.
Explicaciones detalladas de los diseños de las tiendas offline y online de MongoDB.
Ejemplos de configuración para establecer los almacenes de MongoDB en Feast.
Conceptos clave
Tiendas en linea y offline
La tienda en linea es un almacén clave-valor respaldado por una única colección de MongoDB, optimizada para la recuperación de baja latencia de las últimas funcionalidades por entidad durante la inferencia en linea.
La tienda offline es una capa de computación y traducción que **query** filas de datos históricos de **funcionalidad** almacenados en una **colección** de **MongoDB** (normalmente llamada
feature_history) para conjuntos de **datasets** de **entrenamiento**, puntuación y materialización (promocionando datos a la tienda **en linea**).
Patrones comunes de flujo de trabajo
Un flujo de trabajo típico de extremo a extremo se ve así:
Define entidades, vistas de características y fuentes de datos que apunten a colecciones respaldadas por MongoDB.
Incorpora datos de características en el almacén offline mediante
offline_write_batch, que acepta una tabla PyArrow como input e inserta los datos en la colección de MongoDBfeature_historysiguiendo el esquema del almacén offline.Genera datos de entrenamiento utilizando
get_historical_features, que ejecuta una unión eficiente en el tiempo sobre filas de características históricas almacenadas en MongoDB.Materialice los últimos valores de las funcionalidades desde la tienda offline en la tienda en linea mediante
pull_latest_from_table_or_queryyonline_write_batch.Sirve funcionalidades en linea a través de las APIs en linea de Feast, que leen de una única colección de MongoDB indexada por una clave de entidad serializada.
Cómo los conceptos de Feast se corresponden con MongoDB
La integración de MongoDB sigue el modelo conceptual estándar de Feast, pero asigna esas abstracciones a un esquema de MongoDB diseñado para documentos en línea centrados en la entidad y eventos históricos de solo anexión.
Mapeo conceptual
Concepto Fiesta | Rol en el banquete | Representación de MongoDB |
|---|---|---|
entidad | Objeto de dominio que describen las funcionalidades (por ejemplo, driver, usuario) | Codificado en una clave de entidad serializada; almacenado como |
Clave de unión | Columna(s) utilizadas para identificar una fila de entidad en un dataframe. | Se ingresa a |
Clave de entidad serializada | Codificación binary determinista de nombres y valores de claves de unión. | En linea: |
funcionalidad | Medición nombrada y tipada en un punto determinado. | Un campo dentro del subdocumento |
FeatureView | Vincula funcionalidades a entidades, fuente de datos y TTL; unidad de organización. | Sin conexión: |
DataSource | Puntero de metadatos que indica dónde residen las funcionalidades históricas. |
|
OfflineStore | Interfaz de lectura/escritura para funcionalidades históricas y uniones PIT. |
|
OnlineStore | Almacén de baja latencia de los valores más recientes de las funcionalidades por entidad. | Colección única de MongoDB de document de entidad identificados por |
TTL | Vent de la ventana de en el nivel de la FeatureView. | Impuesto en las consultas fuera de línea y postfiltrado en Python al calcular funcionalidades históricas; también puede combinarse con |
FeatureService | Lista denominada de referencias de funcionalidad para un model. | No hay una representación directa de MongoDB; Feast la utiliza para decidir de qué rutas |
Registro | Almacén de metadatos para entidades, vistas de características y servicios. | Sin cambios; la integración de MongoDB no reemplaza el registro de Feast. |
RetrievalJob | Contenedor de ejecución diferida que devuelve tablas de funcionalidades. | Para MongoDB offline store, encapsula una agregación MQL y expone exportaciones Arrow respaldadas por conversión de cursor a Arrow. |
Materialización | Propagación programada de las últimas funcionalidades offline en la tienda en linea. | Implementado mediante |
Tienda Offline de MongoDB
modelo de datos
La tienda offline de MongoDB utiliza una sola colección compartida (por defecto feature_history) que almacena filas históricas de características sólo de adición para todas las vistas de características.
Cada document representa una observación de una entidad para un FeatureView en una marca de tiempo de evento específica:
{ "entity_id": "Binary(...)", "feature_view": "driver_stats", "event_timestamp": "ISODate(2024-01-15T12:00:00Z)", "created_at": "ISODate(2024-01-15T12:01:00Z)", "features": { "conv_rate": 0.72, "acc_rate": 0.91, "avg_daily_trips": 14 } }
Propiedades clave:
Solo añadir: los datos históricos se tratan como inmutables; las correcciones se escriben como nuevas filas con marcas temporales más recientes de
created_aten lugar de actualizaciones en el lugar.Compatible con series temporales:
event_timestamprepresenta cuándo se observó el valor de la funcionalidad;created_atse utiliza como criterio de desempate cuando varias observaciones comparten la misma marca de tiempo del evento.Agrupación por FeatureView:
feature_viewidentifica a qué FeatureView pertenece la fila, por lo que una única colección puede alojar varios FV.
Un solo índice compuesto admite todos los patrones de query principales:
(entity_id ASC, feature_view ASC, event_timestamp DESC, created_at DESC)
Este índice permite escaneos eficientes de rango sobre entidades y vistas de características, mientras garantiza que la observación más reciente por (entity_id, feature_view) se vea primero durante la agregación.
Query patrón | Comportamiento del índice |
|---|---|
| Exploración por rango de índices en el prefijo |
| La ordenación no realiza ninguna operación: el orden del índice coincide con el orden de clasificación. |
| El cursor visita por primera vez el último document por |
|
|
Sin este índice, los cuatro patrones de query se degradan a COLLSCAN. El índice se crea de forma perezosa en el primer uso a través de _ensure_indexes, almacenado en caché por cadena de conexión en un conjunto de nivel de proceso _indexes_ensured, de modo que solo se crea una vez por duración del proceso.
Operaciones principales sin conexión
La tienda offline de MongoDB implementa la interfaz estándar de tienda offline de Feast:
offline_write_batch- Escribe unpyarrow.Tablede datos de funcionalidades en la colección subyacente de MongoDB, utilizando laMongoDBSourceconfigurada de metadatos para determinarconnection_string,databaseycollection.get_historical_features- Dada unaentity_dfde entidades y marcas de tiempo de eventos más un conjunto de FeatureViews, devuelve una tabla ampliada donde cada fila incluye valores de funcionalidad correctos en el punto en el tiempo: para cada par(entity_id, event_timestamp), se selecciona el valor de funcionalidad más reciente cuyoevent_timestamp <= entity_event_timestampy dentro del TTL.pull_latest_from_table_or_query- Devuelve una fila por entidad que contiene los valores de características más recientes en una ventana temporal, utilizada por el motor de materialización de Feast para sembrar la tienda en línea.pull_all_from_table_or_query- Recupera todas las filas de una fuente de datos en un intervalo de fechas especificado para exportar o inspeccionar, respaldada por el mismo esquema e índice defeature_history.persist(a través deRetrievalJob.persist) - Guarda el resultado de una consulta de funcionalidades históricas en una colección separada o en un sumidero externo a través deSavedDatasetStorage, diferente defeature_history.
Ruta de llamada:
FeatureStore.write_to_offline_store(feature_view_name, df) → provider.ingest_df_to_offline_store(feature_view, arrow_table) → OfflineStore.offline_write_batch(config, feature_view, table, progress)
Semántica de solo anexado: Los documentos se insertan con insert_many(ordered=False) en 10,000documentos por lote. No existe inserción ni deduplicación en el momento del guardado: se permiten y retienen varios documentos para el mismo (entity_id, feature_view, event_timestamp) tuple.
La resolución de conflictos se aplaza hasta el momento de la lectura:
pull_latest_from_table_or_queryselecciona el document con elcreated_atmás alto dentro del grupo ganadorevent_timestamp.get_historical_features(scoring path) usa$sort … created_at DESCpara que$group $firsttambién seleccione el mejorcreated_atcuando las marcas de tiempo estén empatadas.
Una corrección escrita con un created_at posterior, por lo tanto, prevalece sin ninguna operación de eliminación o actualización.
pull_latest_from_table_or_query devuelve una fila por entidad con los valores más recientes de funcionalidad en una ventana de [start_date, end_date]. No se suministra entity_df.
Etapas de la pipeline:
$match { feature_view, event_timestamp: {$gte, $lte} } → $sort { entity_id, event_timestamp DESC, created_at DESC } → $group $first by entity_id → $project { entity_id, event_timestamp, features.* }
El índice compuesto sirve el $match + $sort eficientemente; $group $first selecciona un document por entidad sin materializar el resto.
Implementación de agregación
La implementación offline recomendada es la tienda offline basada en agregación de MongoDB, llamada MongoDBOfflineStore.
Características clave:
Utiliza una única colección
feature_historycompartida por todas las Visualizaciones de Características, diferenciada porfeature_view.Se apoya en el índice compuesto
(entity_id, feature_view, event_timestamp, created_at)para todas las consultas, evitando el escaneo completo de la colección.Utiliza
$group $firstdel lado del servidor para cargas de trabajo de "puntuación" (una fila por entidad), ypd.merge_asofpara cargas de trabajo de "entrenamiento" con identificadores de entidad repetidos, equilibrando la corrección y el rendimiento.Uso de memoria limitado mediante el procesamiento por partes, para que se puedan procesar grandes valores de
entity_dfsin agotar la memoria RAM.
Los benchmarks muestran que esta implementación ofrece la mejor combinación de rendimiento y eficiencia de memoria en comparación con los enfoques alternativos de MongoDB offline.
get_historical_features es la API central de Feast. Acepta un entity_df (N filas de columnas de claves de entidad + event_timestamps) y K objetos FeatureView y devuelve un DataFrame con las mismas N filas más M columnas de características, con valores correctos en cada event_timestamp de fila (exactitud por punto en el tiempo).
Notación:
N → número de entidades
M → número de funcionalidades
P → número de observaciones
F → número de vistas de funcionalidades
K → número de vistas de funcionalidades solicitadas en una sola llamada
get_historical_features
Ruta de puntuación
La ruta de puntuación se activa cuando entity_df no tiene IDs de entidad repetidos: el escenario de inferencia común donde cada fila solicita las características para una entidad distinta en un momento distinto.
Detección:
scoring_path = ( entity_df[all_entity_id_cols].drop_duplicates().shape[0] == len(entity_df) )
Al puntuar, se agrega la etapa $group $first del lado del servidor:
$match → $sort → $group $first → $project
The $group groups by (entity_id, feature_view) and picks the document with the highest (event_timestamp, created_at) — i.e., the first document in order after the preceding $sort. MongoDB never materialises the other P-1 documentos for each entity per vista de funcionalidad; the cursor simply advances to the siguiente clave de grupo after picking one documento. El costo por entidad es O(log P) (búsqueda en el índice) en lugar de O(P).
El $match usa event_timestamp: {$lte: max_ts} donde max_ts es la marca de tiempo máxima de solicitud de entidad en el fragmento actual. Esta es una aproximación conservadora (la “Superación”): el servidor puede devolver document ligeramente en el futuro para algunas entidades. El postfiltro de Python a continuación corrige esto, anulando las filas no válidas:
# Merge on entity_id (left = entity_df rows, right = server results) merged = result[["_fv_entity_id", event_timestamp_col]].merge( fv_join, on="_fv_entity_id", how="left" ) # Null out rows where the server doc is in the future or outside TTL future_mask = merged["_fv_ts"] > merged[event_timestamp_col] if fv.ttl: ttl_mask = merged["_fv_ts"] < ( merged[event_timestamp_col] - fv.ttl ) bad_mask = future_mask | ttl_mask else: bad_mask = future_mask for feat in features: vals = merged[feat].copy() vals[bad_mask | merged["_fv_ts"].isna()] = None result[col] = vals.values
Esta es una única llamada pd.merge seguida de una indexación booleana vectorizada — trabajo O(N) en código C de Pandas, independiente de P y M.
Ruta de entrenamiento
Cuando entity_df tiene ids de entidad repetidas (un conjunto de datasets de entrenamiento con muchas instancias de snapshot por entidad), se omite la etapa $group. La agregación devuelve todos los documents en la ventana de marca de tiempo para cada entidad, y Python utiliza pd.merge_asof para encontrar el document más reciente en o antes de la event_timestamp de cada fila:
$match → (no $group)
result = pd.merge_asof( result.sort_values(event_timestamp_col), fv_df_subset.sort_values("_fv_ts"), left_on=event_timestamp_col, right_on="_fv_ts", by="_fv_entity_id", direction="backward", )
Dos niveles de control de segmentación controlan el uso de memoria:
Nivel | Constante | Propósito |
|---|---|---|
Exterior | 50,000 filas | Limites |
Interno | ID de entidad 10,000 | Limita el tamaño del arreglo |
Para entity_df más grande que CHUNK_SIZE, el bucle externo ejecuta varias llamadas _run_single y concatena los resultados:
if len(working_df) <= CHUNK_SIZE: result_df = _run_single(working_df, coll) else: chunks = [ _run_single(chunk, coll) for chunk in _chunk_dataframe(working_df, CHUNK_SIZE) ] result_df = pd.concat(chunks, ignore_index=True)
Por lo tanto, la memoria máxima en el lado de Python es O(CHUNK_SIZE x M x K) independientemente del valor total de N.
El subdocumento de MongoDB features se expande en columnas individuales utilizando pd.apply en lugar de pd.json_normalize. Esto conserva tipos complejos (dicts para Mapa y Estructura, listas para arreglo) que json_normalize aplanaría o perdería. También se aplica la asignación de campo inversa para que los nombres de columnas proyectadas coincidan con la definición de FeatureView:
if "features" in fv_df.columns: for feat in features: src_col = reverse_fm.get(feat, feat) fv_df[feat] = fv_df["features"].apply( lambda d, _s=src_col: ( d.get(_s) if isinstance(d, dict) else None ) ) fv_df = fv_df.drop(columns=["features"])
Capacidades de la tienda offline
Capacidad | ¿Admitido? | notas |
|---|---|---|
| Sí | Implementado a través de |
| Sí | Utiliza |
| Sí | Análisis histórico completo con filtros de tiempo sobre |
| Sí | Escribe tablas Arrow en MongoDB a través del |
| Sí | Exporta los resultados históricos de query a una colección separada usando |
Las comodidades adicionales, como la exportación directa a lagos de datos o almacenes, dependen de la implementación específica de RetrievalJob y se espera que sigan los patrones estándar de Feast para almacenes offline.
Tienda en línea de MongoDB
modelo de datos
La tienda en línea de MongoDB utiliza una única colección para todas las FeatureViews, indexada por la clave de entidad serializada.
_id:serialized_entity_key(entity_key), producido por la función de codificación estable de Feast que ordena los nombres y valores de las entidades y los codifica en bytes.featuressubdocumento anidado donde cada FeatureView mantiene su propio namespace de funcionalidades.event_timestamps● timestamps por FeatureView que indican cuándo se escribió el último valor para ese FeatureView.created_timestampoupdated_at: campos de contabilidad útiles para la indexación TTL y la diagnostica.
Ejemplo (simplificado):
{ "_id": "b\"<serialized_entity_key>\"", "features": { "driver_stats": { "rating": 4.91, "trips_last_7d": 132 }, "pricing": { "surge_multiplier": 1.2 } }, "event_timestamps": { "driver_stats": "ISODate(2026-01-01T12:00:00Z)", "pricing": "ISODate(2026-01-21T12:00:00Z)" }, "created_timestamp": "ISODate(2026-01-21T12:00:00Z)" }
Justificación del diseño:
Una única colección mantiene el estado de cada entidad en un solo document, lo que coincide con la expectativa de Feast de búsquedas basadas en claves y evita el fraccionamiento del estado entre colecciones por FeatureView.
El uso de la clave de entidad serializada como
_idreutiliza la codificación determinista de Feast, evita llaves primarias duplicadas en diferentes colecciones y mantiene la recuperación en solo una búsqueda de clave por entidad.
Al igual que la tienda sin conexión (que utiliza una sola colección feature_history con un campo de discriminador feature_view), la tienda en linea también utiliza una sola colección para todas las FeatureViews.
La tienda en línea es fundamentalmente orientada a la clave de entidad, no orientada a la vista de funcionalidades. Aunque la API de FeatureStore de alto nivel invoca online_read y online_write_batch con una única Vista de Características, el model de almacenamiento subyacente en Feast está diseñado en torno a una única fila lógica por clave de entidad. Esa fila puede acumular atributos de varios Vistas de atributos a lo largo del tiempo.
Utilizar una única colección nos permite mantener un documento unificado por entidad y actualizar solamente el subdocumento relevante (p. ej., features.<feature_view_name>) de manera atómica, sin duplicar las claves de entidad entre las colecciones.
Un diseño de colección única fue el estándar para Feast desde el principio (originalmente se diseñó para Redis) y aprovecha las fortalezas de MongoDB. Los beneficios incluyen:
Amplificación de guardar reducida
Gestión simplificada de índices (solo un índice primario
_id)No existe coordinación entre colecciones cuando múltiples FeatureViews comparten las mismas entidades
Semántica coherente de recuperación con el model de obtención basado en claves de Feast
Un diseño de colección por FeatureView fragmentaría el estado de la entidad, requeriría coordinación adicional o queries de múltiples colecciones si alguna vez se componen las funcionalidades, y aumentaría la sobrecarga operativa sin una ventaja de rendimiento para el patrón de acceso de Feast.
Clave de entidad serializada como _idFeast proporciona serialize_entity_key, una función de codificación estable que ordena explícitamente los nombres y valores de las entidades antes de concatenarlos para garantizar una secuencia de bytes predecible (con escritura tipada con struct.pack y produciendo bytes). Esto significa que podemos utilizarlo directamente como el _id.
Nota
Mientras que serialize_entity_key proporciona un _id estable, su resultado no está distribuido uniformemente y, por lo tanto, no es ideal para particionado. Si su implementación requiere particionar la colección de tiendas en línea, considere una clave de partición con hash o un campo adicional.
Operaciones en linea principales
La tienda en línea de MongoDB implementa la API estándar de la tienda en línea de Feast:
online_write_batch- Durante la materialización, Feast guarda los valores actuales de las funcionalidades de cada entidad en los documents de MongoDB. Cada actualización de upsert por lote actualiza solo el subdocumento anidado correspondientefeatures.<feature_view>y su entrada correspondiente enevent_timestamps, manteniendo los document de la entidad atómicos y consistentes.online_readyget_online_features: la prestación en línea resuelve las claves de entidad en valores_idutilizando la misma lógica de serialización que fuera de línea y, a continuación, realiza búsquedas de claves. Cada búsqueda devuelve todas las funcionalidades solicitadas para la entidad en un solo viaje de ida y vuelta, aprovechando la estructura anidadafeatures.TTL y frescura: el TTL de la funcionalidad se configura en el FeatureView y se utiliza principalmente en uniones PIT fuera de línea; el TTL en linea puede implementarse con un índice en
updated_ato en una marca de tiempo similar, en consonancia con la noción de Feast de que los almacenes fuera de línea solo agregan, mientras que los almacenes en linea mantienen el estado más reciente.
Configuración
Configuración de la tienda offline
La tienda offline se configura usando MongoDBOfflineStoreConfig:
class MongoDBOfflineStoreConfig(FeastConfigBaseModel): type: str = "...MongoDBOfflineStore" connection_string: str = "mongodb://localhost:27017" database: str = "feast" collection: str = "feature_history"
Ejemplo feature_store.yaml:
offline_store: type: feast.infra.offline_stores.contrib.mongodb_offline_store.mongodb.MongoDBOfflineStore connection_string: "mongodb+srv://user:pass@cluster.mongodb.net" database: feast collection: feature_history
MongoDBSource es el DataSource correspondiente. Su name campo se convierte en el discriminador feature_view almacenado en cada document. Para conocer todas las opciones de configuración, consulta la referencia MongoDB fuente de datos en los Feast Docs.
source = MongoDBSource( name="driver_stats", timestamp_field="event_timestamp", created_timestamp_column="created_at", )
Próximos pasos
Sigue el inicio rápido de Feast para configurar una tienda de características local y luego intercambiar MongoDB como tienda en linea y offline utilizando los ejemplos de configuración de esta página.
Consulta la tienda en linea MongoDB referencia en la documentación de Feast para opciones de configuración, compatibilidad asíncrona y la matriz completa de funcionalidades.
Consulta la MongoDB Offline Store documentación de referencia para la configuración de la tienda offline y la funcionalidad compatible.
Revisa la referencia de Fuente de datos de MongoDB para obtener opciones de
MongoDBSourcey detalles del esquema.Aprende los conceptos básicos de Feast, como entidades, vistas de características y materialización en la Guía de conceptos de Feast.