fenic es una librería de DataFrames diseñada para construir pipelines de inteligencia artificial y modelos de lenguaje sobre datos no estructurados, con una API inspirada en PySpark y cuyo motor local es Polars. Durante su desarrollo, el equipo detectó que las operaciones que un pipeline de IA necesita sobre texto —fragmentación por tokens, plantillas Jinja, consultas jq sobre columnas JSON, coincidencia difusa con seis métricas de distancia de edición, análisis de Markdown y de transcripciones SRT/WebVTT, y conversiones a tipos lógicos más ricos— no existen de forma nativa en Polars. Implementarlas como UDF de Python resultó inviable por tres motivos: velocidad (se ejecuta bajo el GIL con un viaje de ida y vuelta por fila), composición (cada UDF actúa como barrera de optimización que obliga a materializar datos y rompe el pipeline de una sola pasada) y tipado (el tipo de salida se afirma de forma laxa en lugar de declararse en el plan).
La solución adoptada fueron los plugins de expresiones de Polars escritos en Rust mediante pyo3-polars. Cada plugin expone una función Rust que recibe Series de Arrow, declara su tipo de salida y se registra en Python como un espacio de nombres propio; al motor de Polars le resulta indistinguible de una operación incorporada. Así, las operaciones corren dentro del motor, sobre memoria Arrow compartida, sin Python ni serialización por fila, preservan sus tipos y componen con el resto de expresiones en un único árbol planificable. En total, fenic registra nueve espacios de nombres —json, jinja, markdown, chunking, tokenization, fuzz, regexp, dtypes y transcript— apoyándose en librerías Rust maduras como jaq, minijinja, rapidfuzz, tiktoken y un analizador de Markdown. El artículo recorre además la arquitectura concreta del mecanismo: una capa fina en Python que registra el espacio de nombres y otra en Rust que implementa el kernel, con pyo3-polars generando automáticamente el FFI y el marshaling de Arrow.
