2 puntos por GN⁺ 2025-06-29 | 1 comentarios | Compartir por WhatsApp
  • SymbolicAI es un framework neuro-simbólico que combina la programación clásica en Python con la naturaleza diferenciable y programable de los LLM, con el objetivo de usarse de forma natural dentro de Python
  • Los conceptos clave son las primitivas basadas en el objeto Symbol y los contratos (contracts) que validan y corrigen los resultados del LLM; el comportamiento predeterminado comienza en modo sintáctico para mayor seguridad y velocidad
  • Symbol se comporta como un valor normal de Python en modo sintáctico, y en modo semántico maneja contexto y significado; puede cambiarse mediante llamadas a funciones semánticas como semantic=True, .sem y .map()
  • El sistema de contratos aplica principios de Design by Contract a los flujos de trabajo con LLM para manejar en un solo flujo basado en decoradores la validación de entrada, los cambios de estado, la generación del LLM, la validación de salida y hasta una respuesta alternativa en caso de fallo
  • La instalación comienza con pip install symbolicai; para usarlo realmente se requiere configurar symconfig y symai.config.json, y el motor neuro-simbólico es indispensable para usar el paquete symai

El modelo al que apunta SymbolicAI

  • SymbolicAI es un framework neuro-simbólico (neuro-symbolic) que trabaja tanto con código Python convencional como con procesamiento semántico basado en LLM
  • Gracias a su diseño modular, puede ampliarse y personalizarse según la necesidad
  • Soporta integración con herramientas como escritura de motores propios, hosting de motores locales, búsqueda web y generación de imágenes
  • El nombre del proyecto busca dar crédito al trabajo fundacional de Allen Newell y Herbert Simon

La primitiva Symbol

  • En el centro de SymbolicAI está el objeto Symbol, que permite usar operaciones pequeñas y combinables como si fueran sintaxis nativa de Python
  • Symbol tiene dos formas de funcionamiento
    • Syntactic: se comporta como un valor normal de Python, como una cadena, lista o entero que se le haya pasado
    • Semantic: se conecta con el motor neuro-simbólico y maneja significado y contexto
  • El valor predeterminado es el modo sintáctico
    • Operadores de Python como ==, ~ y & están sobrecargados en symai
    • Si el motor se invocara de inmediato en cada comparación o desplazamiento de bits, sería lento y podría generar efectos secundarios inesperados
    • Mantiene seguridad y velocidad activando el comportamiento semántico solo en los puntos necesarios

Cómo cambiar al modo semántico

  • Si se especifica semantic=True al momento de crear el objeto, desde el inicio funcionará como un Symbol semántico
    • En el ejemplo, Symbol("Cats are adorable", semantic=True) hace que "feline" in S se evalúe como True
  • Cuando se necesite, se puede usar la proyección .sem para cambiar al comportamiento semántico, y .syn para volver al comportamiento sintáctico
    • Incluso con el mismo valor "Cats are adorable", en S.sem la expresión "feline" in S.sem es True, mientras que en S por defecto es False
  • Operaciones con notación de punto como .map() u otras llamadas a funciones semánticas cambian automáticamente el Symbol al modo semántico
    • En el ejemplo, al aplicar convert all fruits to vegetables a una lista de frutas, solo cambia las frutas por verduras y mantiene cat y dog
  • Las proyecciones .sem y .syn funcionan superponiendo distintas capas de comportamiento sobre el mismo objeto base, por lo que se pueden encadenar operaciones sintácticas y semánticas sobre un solo Symbol

Ejemplos de operaciones disponibles

  • SymbolicAI soporta varias primitivas, documentadas en primitives
  • == en modo sintáctico verifica coincidencia literal, mientras que en modo semántico maneja equivalencias difusas o conceptuales como "Hi" y "Hello"
  • + en modo sintáctico suma números, cadenas o listas, mientras que en modo semántico realiza combinaciones con significado, mezclas o fusión de conceptos
  • & en modo sintáctico es AND lógico o bit a bit, mientras que en modo semántico trata combinación lógica, inferencia o fusión de contexto
  • Entre las funciones exclusivas del modo semántico están .choice(cases, default), .foreach(condition, apply), .cluster(**clustering_kwargs?) y .similarity(other, metric?, normalize?)
    • .cluster() agrupa datos semánticamente y usa DBSCAN de sklearn
    • .similarity() calcula similitud entre embeddings

Cómo maneja las salidas de LLM con contratos

  • SymbolicAI aplica principios de Design by Contract al mundo de los LLM a partir de la idea de que los LLM pueden alucinar, pero el código no puede hacerlo
  • Los contratos no dependen solo de pruebas posteriores, sino que abordan la corrección desde la etapa de diseño al vincular en decoradores el modelo de datos y las restricciones de validación
  • El decorador de contrato del código de ejemplo usa las siguientes opciones
    • pre_remedy=True: intenta corregir automáticamente entradas inválidas
    • post_remedy=True: intenta corregir automáticamente salidas inválidas del LLM
    • accumulate_errors=True: entrega el historial de errores en cada reintento
    • verbose=True: muestra el progreso en la terminal
    • remedy_retry_params: usa tries=3, delay=0.4, max_delay=4.0, jitter=0.15, backoff=1.8, graceful=False
  • El flujo de alto nivel de la clase Expression con contratos aplicados es el siguiente
    • prompt: descripción estática que define lo que debe hacer el LLM, y es obligatoria
    • pre: inspecciona la entrada y es opcional
    • act: cambia el estado y es opcional
    • LLM: el motor de SymbolicAI genera la respuesta esperada
    • post: verifica si la respuesta cumple las reglas semánticas y es opcional
    • forward: es obligatoria; si el contrato se cumple, devuelve un objeto LLM con validación de tipo, y si falla devuelve una respuesta de fallback graceful
  • La documentación de contratos está en DeepWiki de contract validation system y en features/contracts

Instalación y funciones opcionales

  • La instalación básica se hace con pip
pip install symbolicai
  • También se puede clonar el repositorio y configurar un entorno virtual de Python con uv >= 0.9.17
git clone git@github.com:ExtensityAI/symbolicai.git
cd symbolicai
uv sync --python x.xx
source ./.venv/bin/activate
  • SymbolicAI usa varios motores para procesar texto, voz e imágenes, e incluye acceso a un motor de búsqueda para recuperar información de la web
  • Las dependencias opcionales pueden instalarse como extras por función
    • bitsandbytes, hf, lean, llama_cpp, ocr, qdrant, scrape, search, serpapi, services, solver, whisper, wolframalpha
  • Todas las dependencias opcionales pueden instalarse de una sola vez
pip install "symbolicai[all]"
  • uv sync --frozen instala dependencias fijadas en el lock file proporcionado
  • Algunas dependencias opcionales pueden requerir pasos adicionales de instalación, y algunas actualmente solo tienen soporte experimental, por lo que podrían no funcionar como se espera

Gestión de configuración y motor obligatorio

  • SymbolicAI usa un sistema de gestión de configuración basado en prioridades
  • La configuración se carga desde tres ubicaciones en orden de prioridad
    • Modo debug en el directorio de trabajo actual: tiene la mayor prioridad y solo aplica a symai.config.json
    • Configuración específica del entorno del entorno de Python: ubicada en {python_env}/.symai/, adecuada para configuraciones por proyecto
    • Configuración global en el directorio home: ubicada en ~/.symai/ y sirve como fallback predeterminado
  • Hay tres archivos de configuración administrados
    • symai.config.json: configuración principal de SymbolicAI
    • symsh.config.json: configuración del shell
    • symserver.config.json: configuración del servidor
  • symconfig muestra la ubicación de la configuración, la ruta de la configuración activa y la configuración actual con la información sensible ocultada, además de iniciar el caché inicial del paquete y la inicialización de archivos de configuración
  • Para usar el paquete symai, el motor neuro-simbólico es obligatorio
  • Si se especifican propiedades del motor en symai.config.json dentro de la ruta del proyecto, estas reemplazan las variables de entorno
    • La configuración de ejemplo incluye claude-sonnet-4-6 como valor de NEUROSYMBOLIC_ENGINE_MODEL, text-embedding-3-small como modelo de embeddings, tts-1 como modelo TTS, mistral-ocr-latest como modelo OCR y qdrant como motor de indexación, entre otros
  • Las advertencias para el usuario están activadas por defecto, y pueden desactivarse con la variable de entorno SYMAI_WARNINGS=0

Pruebas, documentación y licencia

  • Ejemplos para ejecutar pruebas:
pytest tests
pytest -m mandatory
pytest --cov=symbolicai tests
  • Antes de correr las pruebas, la configuración debe estar correctamente preparada
  • Como siguiente paso, se pueden consultar la página de SymbolicAI en DeepWiki, el paper y los video tutorials
  • La información de cita apunta al preprint de arXiv de 2024 titulado Symbolicai: A framework for logic-based approaches combining generative models and solvers
  • La licencia del proyecto es BSD-3-Clause License

1 comentarios

 
GN⁺ 2025-06-29
Comentarios de Hacker News
  • Estas funciones que parecen vudú son lo más interesante
    Por ejemplo, si aplicas “convierte todas las frutas en verduras” a ['apple', 'banana', 'cherry', 'cat', 'dog'] con un map semántico, sale algo como ['carrot', 'broccoli', 'spinach', 'cat', 'dog']; y equals() cambia el resultado de la comparación según el contexto, como context='greeting context' o context='politeness level'
    Los operadores de bits también se usan como una especie de combinación lógica semántica, de modo que horn_rule & observation lleva a una inferencia; por eso interpret() parece potente
    Me da curiosidad qué motivó su creación, dónde se aplica en la práctica y cuál ha sido hasta ahora el caso de uso que más les gustó

    • Lotus también podría resultar interesante: https://github.com/lotus-data/lotus
      Toma los operadores relacionales principales y los convierte en versiones semánticas como extensión de una biblioteca de dataframes en Python; cada llamada se vuelve luego un punto de “modelo” para trabajos más complejos, como enfoques basados en aprendizaje
      El SQL en la nube, como Snowflake, también parece ir en esta dirección, y en louie.ai usamos un enfoque similar con notebooks/dashboards/API de IA (MCP, etc.): al hablar con datos de Splunk, Databricks, bases de datos de grafos y similares, el sistema deduce los operadores simbólicos + semánticos adecuados al contexto, y en la práctica resultó bastante útil
      El 80% principal de los casos de uso es un flujo donde se crea un dataframe enriquecido con un map semántico, por ejemplo “trae todas las alertas del índice xyz de Splunk y agrega una columna que marque los elementos sospechosos y otra que explique el motivo”, y luego se obtiene una explicación en lenguaje natural con un reduce semántico, como “resume lo que encontraste”
    • Me pregunto por qué, al convertir una apple en verdura, se vuelve carrot
    • Creo que sería una respuesta muy larga
      No ha cambiado mucho desde que empecé el proyecto a fines de 2022; los modelos simplemente mejoraron, pero muchas de las operaciones primitivas ya existían desde la época de GPT-3
      Lo más importante últimamente es la contribución de DbC: se pueden encadenar contratos y los guardrails se propagan bien, lo cual es único porque resolvió casi todos los problemas que le lancé en relación con agentes
      Perplexity se volvió menos útil por la búsqueda web de OpenAI, y la búsqueda web de OpenAI tampoco es tan suficiente como una personalizada directamente, así que construí mi propio agente de investigación profunda: https://x.com/futurisold/status/1931751644233945216
      En la empresa también encadenamos 3 contratos para crear generación de documentos de extremo a extremo, y aquí hay un ejemplo de salida: https://drive.google.com/file/d/1Va7ALq_N-fTYeumKhH4jSxsTrWD...
      La entrada era una solicitud para comparar y analizar los prompts de sistema de los principales proveedores de IA, identificar formatos como XML/Markdown/JSON, instrucciones de adulación o manipulabilidad, restricciones de uso de herramientas, guardrails éticos y diferencias en el diseño de alineación, y sintetizarlo en un informe técnico; las instrucciones generadas se expandieron en preguntas concretas que comparaban la estructura de los prompts de sistema, los marcos lingüísticos y las restricciones operativas de OpenAI, Google, Anthropic, xAI y otros
      Los contratos se presentaron en un post de marzo y desde entonces evolucionaron mucho, pero la base y la motivación siguen siendo las mismas: https://futurisold.github.io/2025-03-01-dbc/
  • Creo que enlazar el paper junto con el notebook de ejemplos ayudaría a entenderlo
    https://github.com/ExtensityAI/symbolicai/blob/main/examples...
    https://arxiv.org/pdf/2402.00854

  • Genial
    Poder usar operadores como == y + no como sintaxis, sino como operadores semánticos, parece fertilizante para ideas nuevas; se siente parecido a cuando aparecieron los embeddings de palabras y surgió esa álgebra conceptual laxa de “King - Man + Woman = Queen”
    Dicho eso, la integración neuronal + simbólica aquí parece bastante superficial y con una especie de firewall, como en la mayoría de los sistemas, y por clasificación se acerca a Type 3 / Neuro;Symbolic: https://harshakokel.com/posts/neurosymbolic-systems
    Creo que la verdadera magia aparecerá cuando avancemos hacia una integración más fundamental, y en nuestra empresa (https://onton.com) también estamos pensando en sistemas posteriores a los LLM con una representación unificada que no sea ni puramente simbólica ni matrices densas de punto flotante, capaces de aprender de forma incremental con pocos datos ruidosos evitando el catastrophic forgetting, con confiabilidad firme en matemáticas y operaciones simbólicas, y sin alucinaciones
    Unir sistemas existentes como con una pistola de silicón también es útil, pero creo que una arquitectura integrada lo cambiará todo

  • Hay un bug en la parte del contrato de corrección
    Después de valid_opts = ['A', 'B', 'C'] aparece if v not in valid_sizes:, pero valid_sizes no está definido

    • Era un resto de una refactorización y ya está corregido
  • Es una lástima, porque “Symbolic AI” ya es un término bien definido: https://en.m.wikipedia.org/wiki/Symbolic_artificial_intellig...

    • Lo entiendo
      Podríamos cambiar el nombre, y el paper tiene una nota al pie sobre la elección del nombre
      La intención era dar crédito al trabajo fundacional de Newell y Simon, que inspiró este proyecto
  • Me da curiosidad la estructura de costos
    Quiero saber si hay que pagar el costo de inferencia del LLM cada vez que se ejecuta una línea que incluye cómputo en lenguaje natural, y si al usar una API externa realmente se cobra cada vez
    Por ejemplo, me pregunto qué pasa si se llama a una función “symbolic” dentro de un loop


    • Por ejemplo, si usas OpenAI, toda operación basada en significado se convierte en una llamada a la API de OpenAI
      Si hospedas un LLM local con llama.cpp, no hay cobros de inferencia aparte del costo de hospedar el modelo
    • Creo que esto va a necesitar caché de alguna forma
  • Hoy en día el código lo generan los LLM, así que me pregunto en qué ayuda una estructura sintáctica específica como Symbol, que contiene contexto y puede manipularse con operadores de Python, frente a código Python común creado por una persona que le indica condiciones de revisión y equilibrio
    Por ejemplo, en vez de usar una gramática que cambia frutas por verduras, también se podría hacer un prompt a un LLM para que cree un programa que reciba una lista de frutas y llame internamente al LLM para devolver las verduras correspondientes
    Quiero entender la diferencia

    • Quizás sea para reducir las alucinaciones
      Si haces que el LLM construya un sistema formal, se puede verificar mucho más fácilmente que un programa de propósito general
  • Me pregunto si también han considerado una IA neuro-simbólica que pueda evolucionar
    https://deepwiki.com/dubprime/mythral/3.2-genome-system
    ¿O qué tal una orientada a sentir emociones?
    https://deepwiki.com/search/how-do-emotives-work_193cb616-54...
    También me pregunto si leyeron Society of Mind, de Marvin Minsky

    • La respuesta corta sería que sí a todo
      También hicimos experimentos que iban desde teoría de la mente hasta emociones, pero por ahora siento que los modelos todavía no están lo suficientemente a ese nivel, así que lo dejamos en pausa porque el retorno sobre el esfuerzo disminuyó
      Podría reactivarse fácilmente, pero Minsky no es mi favorito; de esa generación me atraen más Newell/Simon
    • Aun así, lo importante es si es explicable o si es una caja negra mágica
  • Estuve probando un poco la regresión simbólica, haciendo que un LLM revisara documentos y creara operadores primitivos para meterlos en PySR de GitHub (github.com/MilesCranmer/PySR), es decir, operadores
    No llegué muy lejos porque era difícil conectar todo, pero con una herramienta así quizá lo intentaría de nuevo

    • Definitivamente es posible
      Recomiendo usar contratos
      Usé un enfoque parecido en contratos que “unían” iterativamente grafos de ontología rotos
      Como modelo de datos inspirador, tenía estructuras como Merge, Bridge, Prune y Operation; cada una definía los índices de clúster a fusionar, las relaciones de clase superior-inferior y la lista de clases a podar, y luego el validador imponía condiciones de operaciones binarias/unarias
      De forma similar, puedes crear un modelo para operadores, hacer que el contrato resuelva un operador a la vez y luego aplicar ese operador