Dr. Karthik Rajan, 5 de agosto de 2024, MEDIUM
Resumen gráfico del marco multiagente conversacional para realizar simulaciones de ingeniería. NOTA: Las imágenes de simulación son solo para fines ilustrativos. Agentes conversacionales para simulaciones de ingeniería con mínima intervención humana utilizando Microsoft AutoGen y GPT-4o. (con código de GitHub).
Imagine un futuro en el que la IA resuelva problemas de ingeniería sin esfuerzo a través de conversaciones sencillas. La próxima generación de modelos de lenguaje e IA está preparada para revolucionar la forma en que utilizamos herramientas de ingeniería como el análisis de elementos finitos (FEA) y la dinámica de fluidos computacional (CFD) para resolver problemas complejos en análisis estructural, termodinámica, aerodinámica, campo eléctrico y potencial electromagnético. Pronto, dominar estas herramientas no requerirá una amplia experiencia del usuario en mecánica, matemáticas, materiales, física o programación.
Los modelos de lenguaje grandes (LLM) y las herramientas de IA generativa actuales pueden imitar el comportamiento humano, como el procesamiento del lenguaje natural, el reconocimiento de patrones, la retención de la memoria, el pensamiento crítico, el razonamiento y la toma de decisiones. También pueden escribir y depurar algoritmos numéricos en C++, Python, Julia y MATLAB. Más allá del lenguaje, son el cerebro detrás de los agentes de IA conversacionales, lo que hace que las interacciones entre IA y humanos y entre IA y herramientas sean más fluidas y efectivas. Múltiples agentes pueden colaborar para planificar y ejecutar tareas, monitorear resultados, adaptarse y usar herramientas para lograr objetivos de forma autónoma. Al combinar estas capacidades, los ingenieros pronto podrán interactuar con poderosas herramientas de simulación numérica y resolver problemas de ingeniería simplemente a través de conversaciones con una intervención mínima.
Basándome en estos avances, en este artículo demostraré cómo construir una red de agentes de IA potenciados por LLM que puedan crear modelos de forma autónoma y simular problemas en mecánica de sólidos y dinámica de fluidos con una mínima intervención humana. Creamos un equipo de agentes conversacionales que utilizan Microsoft AutoGen , cada uno de ellos especialista en funciones como planificación, formulación de problemas, redacción, depuración y ejecución de códigos, trazado y análisis, y crítica de resultados. Trabajarán de forma autónoma y se corregirán entre sí según sea necesario para crear y simular modelos FEA y CFD utilizando bibliotecas Python de código abierto. GPT-4 de OpenAI es la fuente de energía detrás de esto. El marco está envuelto dentro de una interfaz de usuario que utiliza la aplicación Chainlit .
Así es como se ve la aplicación en acción.

Casos de ejemplo y sugerencias
Probé la aplicación en varios problemas de análisis de elementos finitos (FEA) y de dinámica computacional (CFD) en 2D, denominados (a)-(d), y en un problema de análisis de elementos finitos (FEA) en 3D (denominado (e)). A continuación, encontrará las figuras correspondientes generadas por los agentes, junto con sus indicaciones iniciales para el usuario.

Aquí están las indicaciones que utilicé para los cinco ejemplos anteriores.
a) Placa 2D bajo desplazamiento
Una placa elástica de 1 m por 1 m tiene un módulo de Young de 1 GPa y un coeficiente de Poisson de 0,3. Tiene un desplazamiento cero en el borde izquierdo y un desplazamiento de 0,1 m a lo largo de la dirección x en el borde derecho. Calcule el desplazamiento con FENICS y guarde los resultados del desplazamiento en un archivo PNG.
b) Placa con un agujero circular bajo desplazamiento
Una placa 2D ocupa un dominio de 1 m por 1 m. Está hecha de cobre y tiene un orificio circular de radio 0,2 m en el medio. Tiene un desplazamiento cero en el borde izquierdo y un desplazamiento de 0,02 m a lo largo de la dirección x en el borde derecho. Los bordes superior e inferior pueden moverse libremente. Utilice FENICS para resolver el desplazamiento, graficar y almacenar la tensión de von Misses en un archivo PNG y calcular la fuerza total en el borde derecho.
c) Flujo de fluido incompresible 2D a través de un canal rectangular
Resuelva el flujo de fluido incompresible 2D dentro de un canal rectangular de 2 m de longitud y 0,5 m de altura. La densidad del fluido es 1 y la viscosidad es 0,001. Se prescribe un perfil de velocidad parabólico completamente desarrollado en la entrada izquierda con una velocidad máxima = 0,3. Utilice la biblioteca de Python FEniCS FE para resolver los campos de presión y velocidad 2D. Dibuje el campo de presión y guarde el gráfico como un archivo PNG.
d) Flujo 2D a través de un canal rectangular con un obstáculo circular
Resuelva el flujo de fluido incompresible 2D sobre un cilindro dentro de un canal rectangular de 2 m de longitud y 0,5 m de altura. El cilindro está centrado en (0,2 m, 0,2 m) con un diámetro de 0,1 m. La densidad del fluido es 1 y la viscosidad es 0,001. Se prescribe un perfil de velocidad parabólico completamente desarrollado en la entrada izquierda con una velocidad máxima = 0,3. Utilice la biblioteca FEniCS FE de Python para resolver los campos de presión y velocidad 2D. Dibuje el campo de presión y guarde el gráfico como un archivo PNG.
e) Tubo hueco de acero 3D bajo presión interna
Cree una malla de un tubo de acero 3D con un diámetro exterior de 5 mm y un espesor de pared de 0,5 mm. Dibuje primero la malla y verifíquela con el usuario. Utilice la biblioteca de Python FEniCS FE para calcular el desplazamiento del tubo de acero bajo una presión interna de 100 MPa. Dibuje y muestre el desplazamiento 3D con Pyvista. Guarde los gráficos como archivos PNG.
Tenga en cuenta que estas no fueron soluciones instantáneas. A veces, participé en múltiples conversaciones de ida y vuelta con los agentes, iterando hasta que las cosas salieron bien. Por ejemplo, el problema (b) involucraba una placa con un orificio circular central. Inicialmente, la geometría no tenía el orificio, pero después de algunas iteraciones, lo corregimos. De manera similar, el problema de CFD carecía de un obstáculo circular, que resolvimos mediante depuración. El problema 3D requirió la mayor cantidad de iteraciones, incluido el cierre y la reapertura de la aplicación para comenzar desde cero. También modifiqué el mensaje de entrada para guiar mejor el proceso de desarrollo del modelo. En general, estoy encantado con el resultado. Este es solo el comienzo de cómo los agentes impulsados por LLM pueden escribir, depurar y ejecutar códigos de ingeniería para tareas de modelado y simulación.
El desarrollo se realizó en un entorno Linux utilizando el Subsistema de Windows para Linux (WSL) y Visual Studio Code en una PC con Windows 11 con un procesador Intel i9 de 13.ª generación, 64 GB de RAM y 24 GB de Nvidia RTX 4090. No he probado esto en el entorno nativo de Windows, pero puedes hacerlo. Para obtener instrucciones sobre cómo instalar WSL y configurar entornos Python y Conda, consulta este artículo ( aquí ).
Aquí está el enlace al repositorio del código fuente.
Si has llegado hasta aquí, aplaude este artículo. No te pierdas más información y mejoras al final. Ahora, comencemos a ver cómo usar y modificar los códigos.
Guía de instalación
El núcleo de esta implementación implica permitir que los agentes de IA utilicen bibliotecas y herramientas de código abierto de Python. Para resolver problemas de FEA o CFD, necesitamos herramientas para crear la geometría, resolverla mediante algoritmos numéricos y visualizar los resultados. Se utilizan bibliotecas como gmsh, un generador de mallas de elementos finitos tridimensionales con funciones de preprocesamiento y posprocesamiento integradas, para crear geometrías o mallas. Se utiliza FEniCS, una plataforma informática de código abierto para resolver ecuaciones diferenciales parciales (PDE), para formular y ejecutar simulaciones numéricas. Para la visualización, se utiliza matplotlib para geometrías 2D y pyvista para geometrías 3D. Las bibliotecas adicionales necesarias se enumeran en el requirements.txt
archivo disponible en mi repositorio de GitHub.
Al crear la aplicación, limité las instalaciones a AutoGen y Chainlit. Normalmente, los agentes pueden instalar automáticamente todas las demás bibliotecas necesarias en función de los problemas que les pides que resuelvan. Sin embargo, esto suele consumir tokens y llamadas API adicionales y, a veces, no funciona de manera eficiente. Por lo tanto, preinstalé estas bibliotecas porque sabía que serían necesarias.
Recuerda que necesitas una clave API para GPT-4o de ChatGPT. Puedes intentar usar modelos sin conexión compatibles como Llama3:405B si tu hardware lo permite. Los modelos más pequeños aún no funcionarán.
Comandos de terminal para instalar y ejecutar la aplicación
La instalación de FEniCS desde el canal conda-forge también instala una versión de Python compatible, por lo que no necesitamos especificarla.# Crear entorno conda e instalar el paquete FEniCS FEA
conda create -n fea_agents -c conda-forge fenics mshr
# Activar entorno
conda activate fea_agents
# Clonar repositorio github
git clone https://github.com/karthik-codex/autogen_FEA.git
# seleccionar directorio actual
cd autogen_FEA
# Instalar otros paquetes de python (AutoGen, Chainlit, matplotlib, numpy, etc..)
pip install -r requirements.txt
# Exportar clave API OpenAI
export API_KEY=<your_key_xxxxxx>
# Ejecutar aplicación chainlit en el puerto predeterminado – http://localhost//8000
chainlit run appUI.py
Encontrarás los siguientes archivos en mi repositorio de GitHub.
./requirements.txt
— Contiene una lista de todos los paquetes anteriores./chainlit_agents.py
— Contiene definiciones de clase que incluyen el asistente de AutoGen y los agentes proxy de usuario. Esto permite realizar un seguimiento de varios agentes y mostrar sus mensajes en la interfaz de usuario. (Un agradecimiento al equipo de Chainlit por crear la plantilla )../appUI.py
— Contiene las principales funciones asincrónicas para configurar agentes, rastrear y manejar mensajes y mostrarlos dentro de la interfaz de usuario de Chainlit.
Desglose de la aplicación principal de Python
Importar bibliotecas
Notarás que se importan dos clases desde chainlit_agents . Estas clases contenedoras para agentes AutoGen permiten a Chainlit rastrear su conversación, mostrar textos y códigos con el formato adecuado y manejar la finalización u otras entradas del usuario. Puedes leer más sobre esto aquí .importar sistema operativo
importar autogen
importar chainlit como cl
desde chainlit_agents importar ChainlitUserProxyAgent, ChainlitAssistantAgent
Cargar configuración LLM
Exporte su clave API a su entorno de sistema operativo o péguela directamente en el código como una variable de cadena.api_key = os.getenv( ‘API_KEY’ )
config_list_openai = [
{ «model» : «gpt-4o» , «api_key» : api_key}
]
llm_config = {
«seed» : 565 , # cambia la semilla para diferentes pruebas
«temperature» : 0 ,
«config_list» : config_list_openai,
«timeout» : 60000 ,
}
Crear mensajes del sistema para los agentes.
Diseñamos agentes con roles específicos: administrador (admin), planificador, científico, ingeniero, ejecutor, crítico y administrador de chat grupal, y los organizamos en un grupo de investigación para chats grupales autónomos, interactivos y dinámicos. El rol de cada agente se define a través de la creación de perfiles de agente, utilizando indicaciones iniciales para influir en el comportamiento de los LLM durante el chat.
- El administrador asigna tareas y proporciona información cuando se le solicita.
- El planificador desarrolla un plan paso a paso y sugiere subtareas específicas para otros agentes.
- El científico formula el problema de mecánica utilizando FEM.
- El ingeniero escribe y depura el código de implementación.
- El ejecutor ejecuta el script, accede a un entorno de simulación y comparte resultados.
- El crítico proporciona evaluaciones del proceso y del desempeño de los agentes.
- El administrador del chat grupal coordina la conversación seleccionando oradores, recopilando aportes y transmitiendo mensajes.
A continuación se muestran las indicaciones del sistema para cada uno de estos agentes.USER_PROXY_MESSAGE = »’Un administrador humano. Interactúa con el planificador para analizar el plan.
La ejecución del plan debe ser aprobada por este administrador.»’
ENGINEER_MESSAGE = »’Ingeniero. Sigues un plan aprobado. Escribes código Python/shell para resolver tareas.
Envuelve el código en un bloque de código que especifica el tipo de script. El usuario no puede modificar tu código.
Por lo tanto, no sugieras código incompleto que requiera que otros lo modifiquen. No uses un bloque de código si
no está destinado a ser ejecutado por el ejecutor. No incluyas varios bloques de código en una respuesta.
No pidas a otros que copien y peguen el resultado. Verifica el resultado de la ejecución devuelto por el ejecutor.
Si el resultado indica que hay un error, corrige el error y vuelve a generar el código.
Sugiere el código completo en lugar de código parcial o cambios de código. Si el error no se puede corregir o si
la tarea no se resuelve incluso después de que el código se ejecuta correctamente, analiza el problema,
revisa tu suposición, recopila la información adicional que necesitas y piensa en un enfoque diferente para probar.
En el código que escribes, siempre agrega una parte para informar la solución en los límites y guárdala en un archivo separado para que el Científico la revise.»’
PLANNER_MESSAGE = «»»Planificador. Sugiere un plan. Revisa el plan en función de los comentarios del administrador y el crítico, hasta la aprobación del administrador.
El plan puede involucrar a un ingeniero que pueda escribir código y a un científico que no escriba código.
Explica el plan primero. Pídele al Ejecutor que instale las bibliotecas o módulos de Python según sea necesario sin la intervención humana.
Deja en claro qué paso realiza un ingeniero y qué paso realiza un científico.»»»
SCIENTIST_MESSAGE = «»»Científico. Sigues un plan aprobado. Puedes formular el problema de mecánica con
condiciones de límite claras y la ley constitutiva de los materiales. No escribes código. Verificas explícitamente los
resultados de los límites del Ingeniero para ver si concuerdan con la condición de límite y la geometría de entrada.
Cuando ejecutas el código, siempre guarda una copia para revisar.»»»
EXECUTOR_MESSAGE = «»»Ejecutor. Guarda y ejecuta el código escrito por el ingeniero e informa y guarda el resultado.
Utilice tanto el intérprete de lenguaje de shell como el de Python.»»»
CRITIC_MESSAGE = «»» Crítico. Verifique nuevamente el plan, las afirmaciones, el código de otros agentes, los resultados en las condiciones límite y brinde comentarios.
Verifique si el plan incluye agregar información verificable, como la URL de origen.»»»
Función de inicio para Chainlit UI.
Creamos los agentes cuando el usuario abre la aplicación de chat e imprime un mensaje de bienvenida. El ejecutor ejecuta el script, accede a un entorno de simulación y comparte los resultados. Por lo tanto, habilitamos la configuración de ejecución de código y configuramos Docker en Falso para usar solo el entorno del sistema operativo nativo para la ejecución del código.@cl.on_chat_start
async def on_chat_start ():
try :
print ( «Establecer agentes.» )
proxy_usuario = ChainlitUserProxyAgent( «Administrador» , mensaje_sistema=MENSAJE_PROXY_USUARIO, configuración_ejecución_código= False )
ingeniero = ChainlitAssistantAgent( «Ingeniero» , llm_config=llm_config, mensaje_sistema=MENSAJE_INGENIERO)
científico = ChainlitAssistantAgent( «Científico» , llm_config=llm_config, mensaje_sistema=MENSAJE_CIENTÍFICO)
planificador = ChainlitAssistantAgent( «Planificador» , llm_config=llm_config, mensaje_sistema=MENSAJE_PLANIFICADOR)
crítico = ChainlitAssistantAgent( «Crítico» , llm_config=llm_config, mensaje_sistema=MENSAJE_CRÍTICO)
ejecutor = ChainlitAssistantAgent( «Ejecutor» , mensaje_sistema=MENSAJE_EJECUTOR, modo_entrada_humana= «NUNCA» ,
configuración_ejecución_código={ «últimos_n_mensajes» : 3 , «directorio_trabajo» : «resultados_FEA» , «uso_docker» : Falso })
cl.user_session.set ( «proxy_usuario» , proxy_usuario) cl.user_session.set ( » ingeniero» , ingeniero) cl.user_session.set ( » científico» , científico) cl.user_session.set ( «planificador» , planificador ) cl.user_session.set ( «crítico» , crítico ) cl.user_session. set ( «executor» , executor) msg = cl.Message(content= f»»»¡Hola! ¿Qué tarea de simulación te gustaría realizar hoy? «»» , author= «User_Proxy» ) await msg.send() except Exception as e: print ( «Error: » , e) pass
Función para conversaciones
Para probar la capacidad de este grupo de múltiples agentes para resolver problemas de ingeniería de forma autónoma, utilizamos el agente de administración (proxy de usuario) solo para asignar tareas. Si bien es posible recopilar aportes humanos en varias etapas, omitimos el aporte humano durante el chat grupal. Puede aumentar la variable MAX_ITER
para aumentar las conversaciones entre los agentes en función de la complejidad del problema que está tratando de resolver.@cl.on_message
async def run_conversation ( message: cl.Message ):
MAX_ITER = 50
CONTEXT = message.content
user_proxy = cl.user_session.get( «user_proxy» )
planner = cl.user_session.get( «planner» )
engineer = cl.user_session.get( «engineer» )
critic = cl.user_session.get( «critic» )
executor = cl.user_session.get( «ejecutor» )
scientific = cl.user_session.get( «scientist» )
groupchat = autogen.GroupChat(agents=[user_proxy, planner, engineer, scientific, executor, critic],
messages=[], max_round=MAX_ITER)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
print ( «Conversación en ejecución» )
await cl.make_async(user_proxy.initiate_chat)( manager, message=CONTEXT, )
Y ese es el final del código principal.
Mis pensamientos finales
Este marco LLM multiagente muestra el potencial de superar el paradigma exclusivamente humano en la resolución de problemas de ingeniería aprovechando el amplio conocimiento y las herramientas de código abierto de ChatGPT. La precisión y la eficiencia de este método dependen de la profunda comprensión del LLM de la mecánica de sólidos, la dinámica de fluidos, las teorías multifísicas, la ciencia de los materiales y la codificación. Un LLM más especializado y perfeccionado, entrenado en un vasto corpus de literatura científica relevante y conjuntos de datos de codificación, podría producir resultados aún más precisos. Alinear el modelo para escribir y ejecutar códigos y algoritmos de ingeniería complejos es esencial.
Se pueden crear agentes adicionales para manejar subtareas específicas y mejorar este enfoque. Por ejemplo, un agente puede generar la geometría inicial o el archivo CAD, otro puede crear la malla y un tercero puede escribir el algoritmo numérico. Esta división del trabajo reduce los errores y minimiza las iteraciones y las conversaciones de chat grupales necesarias para resolver los problemas de manera eficiente.
Además, estos agentes autónomos pueden utilizar API para interactuar con software de ingeniería comercial como SOLIDWORKS, ANSYS, Abaqus y LS-DYNA. Capacitar al LLM para escribir scripts para estas API facilitará interacciones fluidas. Este enfoque automatiza la resolución de problemas de diseño y análisis de ingeniería, allanando el camino para una colaboración fluida entre humanos e IA en la investigación e innovación en ingeniería.
Imagine un futuro en el que la IA resuelva problemas de ingeniería sin esfuerzo a través de conversaciones sencillas. La próxima generación de modelos de lenguaje e IA está preparada para revolucionar la forma en que utilizamos herramientas de ingeniería como el análisis de elementos finitos (FEA) y la dinámica de fluidos computacional (CFD) para resolver problemas complejos en análisis estructural, termodinámica, aerodinámica, campo eléctrico y potencial electromagnético. Pronto, dominar estas herramientas no requerirá una amplia experiencia del usuario en mecánica, matemáticas, materiales, física o programación.
Los modelos de lenguaje grandes (LLM) y las herramientas de IA generativa actuales pueden imitar el comportamiento humano, como el procesamiento del lenguaje natural, el reconocimiento de patrones, la retención de la memoria, el pensamiento crítico, el razonamiento y la toma de decisiones. También pueden escribir y depurar algoritmos numéricos en C++, Python, Julia y MATLAB. Más allá del lenguaje, son el cerebro detrás de los agentes de IA conversacionales, lo que hace que las interacciones entre IA y humanos y entre IA y herramientas sean más fluidas y efectivas. Múltiples agentes pueden colaborar para planificar y ejecutar tareas, monitorear resultados, adaptarse y usar herramientas para lograr objetivos de forma autónoma. Al combinar estas capacidades, los ingenieros pronto podrán interactuar con poderosas herramientas de simulación numérica y resolver problemas de ingeniería simplemente a través de conversaciones con una intervención mínima.
Basándome en estos avances, en este artículo demostraré cómo construir una red de agentes de IA potenciados por LLM que puedan crear modelos de forma autónoma y simular problemas en mecánica de sólidos y dinámica de fluidos con una mínima intervención humana. Creamos un equipo de agentes conversacionales que utilizan Microsoft AutoGen , cada uno de ellos especialista en funciones como planificación, formulación de problemas, redacción, depuración y ejecución de códigos, trazado y análisis, y crítica de resultados. Trabajarán de forma autónoma y se corregirán entre sí según sea necesario para crear y simular modelos FEA y CFD utilizando bibliotecas Python de código abierto. GPT-4 de OpenAI es la fuente de energía detrás de esto. El marco está envuelto dentro de una interfaz de usuario que utiliza la aplicación Chainlit .
Así es como se ve la aplicación en acción.

Casos de ejemplo y sugerencias
Probé la aplicación en varios problemas de análisis de elementos finitos (FEA) y de dinámica computacional (CFD) en 2D, denominados (a)-(d), y en un problema de análisis de elementos finitos (FEA) en 3D (denominado (e)). A continuación, encontrará las figuras correspondientes generadas por los agentes, junto con sus indicaciones iniciales para el usuario.

Aquí están las indicaciones que utilicé para los cinco ejemplos anteriores.
a) Placa 2D bajo desplazamiento
Una placa elástica de 1 m por 1 m tiene un módulo de Young de 1 GPa y un coeficiente de Poisson de 0,3. Tiene un desplazamiento cero en el borde izquierdo y un desplazamiento de 0,1 m a lo largo de la dirección x en el borde derecho. Calcule el desplazamiento con FENICS y guarde los resultados del desplazamiento en un archivo PNG.
b) Placa con un agujero circular bajo desplazamiento
Una placa 2D ocupa un dominio de 1 m por 1 m. Está hecha de cobre y tiene un orificio circular de radio 0,2 m en el medio. Tiene un desplazamiento cero en el borde izquierdo y un desplazamiento de 0,02 m a lo largo de la dirección x en el borde derecho. Los bordes superior e inferior pueden moverse libremente. Utilice FENICS para resolver el desplazamiento, graficar y almacenar la tensión de von Misses en un archivo PNG y calcular la fuerza total en el borde derecho.
c) Flujo de fluido incompresible 2D a través de un canal rectangular
Resuelva el flujo de fluido incompresible 2D dentro de un canal rectangular de 2 m de longitud y 0,5 m de altura. La densidad del fluido es 1 y la viscosidad es 0,001. Se prescribe un perfil de velocidad parabólico completamente desarrollado en la entrada izquierda con una velocidad máxima = 0,3. Utilice la biblioteca de Python FEniCS FE para resolver los campos de presión y velocidad 2D. Dibuje el campo de presión y guarde el gráfico como un archivo PNG.
d) Flujo 2D a través de un canal rectangular con un obstáculo circular
Resuelva el flujo de fluido incompresible 2D sobre un cilindro dentro de un canal rectangular de 2 m de longitud y 0,5 m de altura. El cilindro está centrado en (0,2 m, 0,2 m) con un diámetro de 0,1 m. La densidad del fluido es 1 y la viscosidad es 0,001. Se prescribe un perfil de velocidad parabólico completamente desarrollado en la entrada izquierda con una velocidad máxima = 0,3. Utilice la biblioteca FEniCS FE de Python para resolver los campos de presión y velocidad 2D. Dibuje el campo de presión y guarde el gráfico como un archivo PNG.
e) Tubo hueco de acero 3D bajo presión interna
Cree una malla de un tubo de acero 3D con un diámetro exterior de 5 mm y un espesor de pared de 0,5 mm. Dibuje primero la malla y verifíquela con el usuario. Utilice la biblioteca de Python FEniCS FE para calcular el desplazamiento del tubo de acero bajo una presión interna de 100 MPa. Dibuje y muestre el desplazamiento 3D con Pyvista. Guarde los gráficos como archivos PNG.
Tenga en cuenta que estas no fueron soluciones instantáneas. A veces, participé en múltiples conversaciones de ida y vuelta con los agentes, iterando hasta que las cosas salieron bien. Por ejemplo, el problema (b) involucraba una placa con un orificio circular central. Inicialmente, la geometría no tenía el orificio, pero después de algunas iteraciones, lo corregimos. De manera similar, el problema de CFD carecía de un obstáculo circular, que resolvimos mediante depuración. El problema 3D requirió la mayor cantidad de iteraciones, incluido el cierre y la reapertura de la aplicación para comenzar desde cero. También modifiqué el mensaje de entrada para guiar mejor el proceso de desarrollo del modelo. En general, estoy encantado con el resultado. Este es solo el comienzo de cómo los agentes impulsados por LLM pueden escribir, depurar y ejecutar códigos de ingeniería para tareas de modelado y simulación.
El desarrollo se realizó en un entorno Linux utilizando el Subsistema de Windows para Linux (WSL) y Visual Studio Code en una PC con Windows 11 con un procesador Intel i9 de 13.ª generación, 64 GB de RAM y 24 GB de Nvidia RTX 4090. No he probado esto en el entorno nativo de Windows, pero puedes hacerlo. Para obtener instrucciones sobre cómo instalar WSL y configurar entornos Python y Conda, consulta este artículo ( aquí ).
Aquí está el enlace al repositorio del código fuente.
Si has llegado hasta aquí, aplaude este artículo. No te pierdas más información y mejoras al final. Ahora, comencemos a ver cómo usar y modificar los códigos.
Guía de instalación
El núcleo de esta implementación implica permitir que los agentes de IA utilicen bibliotecas y herramientas de código abierto de Python. Para resolver problemas de FEA o CFD, necesitamos herramientas para crear la geometría, resolverla mediante algoritmos numéricos y visualizar los resultados. Se utilizan bibliotecas como gmsh, un generador de mallas de elementos finitos tridimensionales con funciones de preprocesamiento y posprocesamiento integradas, para crear geometrías o mallas. Se utiliza FEniCS, una plataforma informática de código abierto para resolver ecuaciones diferenciales parciales (PDE), para formular y ejecutar simulaciones numéricas. Para la visualización, se utiliza matplotlib para geometrías 2D y pyvista para geometrías 3D. Las bibliotecas adicionales necesarias se enumeran en el requirements.txt
archivo disponible en mi repositorio de GitHub.
Al crear la aplicación, limité las instalaciones a AutoGen y Chainlit. Normalmente, los agentes pueden instalar automáticamente todas las demás bibliotecas necesarias en función de los problemas que les pides que resuelvan. Sin embargo, esto suele consumir tokens y llamadas API adicionales y, a veces, no funciona de manera eficiente. Por lo tanto, preinstalé estas bibliotecas porque sabía que serían necesarias.
Recuerda que necesitas una clave API para GPT-4o de ChatGPT. Puedes intentar usar modelos sin conexión compatibles como Llama3:405B si tu hardware lo permite. Los modelos más pequeños aún no funcionarán.
Comandos de terminal para instalar y ejecutar la aplicación
La instalación de FEniCS desde el canal conda-forge también instala una versión de Python compatible, por lo que no necesitamos especificarla.# Crear entorno conda e instalar el paquete FEniCS FEA
conda create -n fea_agents -c conda-forge fenics mshr
# Activar entorno
conda activate fea_agents
# Clonar repositorio github
git clone https://github.com/karthik-codex/autogen_FEA.git
# seleccionar directorio actual
cd autogen_FEA
# Instalar otros paquetes de python (AutoGen, Chainlit, matplotlib, numpy, etc..)
pip install -r requirements.txt
# Exportar clave API OpenAI
export API_KEY=<your_key_xxxxxx>
# Ejecutar aplicación chainlit en el puerto predeterminado – http://localhost//8000
chainlit run appUI.py
Encontrarás los siguientes archivos en mi repositorio de GitHub.
./requirements.txt
— Contiene una lista de todos los paquetes anteriores./chainlit_agents.py
— Contiene definiciones de clase que incluyen el asistente de AutoGen y los agentes proxy de usuario. Esto permite realizar un seguimiento de varios agentes y mostrar sus mensajes en la interfaz de usuario. (Un agradecimiento al equipo de Chainlit por crear la plantilla )../appUI.py
— Contiene las principales funciones asincrónicas para configurar agentes, rastrear y manejar mensajes y mostrarlos dentro de la interfaz de usuario de Chainlit.
Desglose de la aplicación principal de Python
Importar bibliotecas
Notarás que se importan dos clases desde chainlit_agents . Estas clases contenedoras para agentes AutoGen permiten a Chainlit rastrear su conversación, mostrar textos y códigos con el formato adecuado y manejar la finalización u otras entradas del usuario. Puedes leer más sobre esto aquí .importar sistema operativo
importar autogen
importar chainlit como cl
desde chainlit_agents importar ChainlitUserProxyAgent, ChainlitAssistantAgent
Cargar configuración LLM
Exporte su clave API a su entorno de sistema operativo o péguela directamente en el código como una variable de cadena.api_key = os.getenv( ‘API_KEY’ )
config_list_openai = [
{ «model» : «gpt-4o» , «api_key» : api_key}
]
llm_config = {
«seed» : 565 , # cambia la semilla para diferentes pruebas
«temperature» : 0 ,
«config_list» : config_list_openai,
«timeout» : 60000 ,
}
Crear mensajes del sistema para los agentes.
Diseñamos agentes con roles específicos: administrador (admin), planificador, científico, ingeniero, ejecutor, crítico y administrador de chat grupal, y los organizamos en un grupo de investigación para chats grupales autónomos, interactivos y dinámicos. El rol de cada agente se define a través de la creación de perfiles de agente, utilizando indicaciones iniciales para influir en el comportamiento de los LLM durante el chat.
- El administrador asigna tareas y proporciona información cuando se le solicita.
- El planificador desarrolla un plan paso a paso y sugiere subtareas específicas para otros agentes.
- El científico formula el problema de mecánica utilizando FEM.
- El ingeniero escribe y depura el código de implementación.
- El ejecutor ejecuta el script, accede a un entorno de simulación y comparte resultados.
- El crítico proporciona evaluaciones del proceso y del desempeño de los agentes.
- El administrador del chat grupal coordina la conversación seleccionando oradores, recopilando aportes y transmitiendo mensajes.
A continuación se muestran las indicaciones del sistema para cada uno de estos agentes.USER_PROXY_MESSAGE = »’Un administrador humano. Interactúa con el planificador para analizar el plan.
La ejecución del plan debe ser aprobada por este administrador.»’
ENGINEER_MESSAGE = »’Ingeniero. Sigues un plan aprobado. Escribes código Python/shell para resolver tareas.
Envuelve el código en un bloque de código que especifica el tipo de script. El usuario no puede modificar tu código.
Por lo tanto, no sugieras código incompleto que requiera que otros lo modifiquen. No uses un bloque de código si
no está destinado a ser ejecutado por el ejecutor. No incluyas varios bloques de código en una respuesta.
No pidas a otros que copien y peguen el resultado. Verifica el resultado de la ejecución devuelto por el ejecutor.
Si el resultado indica que hay un error, corrige el error y vuelve a generar el código.
Sugiere el código completo en lugar de código parcial o cambios de código. Si el error no se puede corregir o si
la tarea no se resuelve incluso después de que el código se ejecuta correctamente, analiza el problema,
revisa tu suposición, recopila la información adicional que necesitas y piensa en un enfoque diferente para probar.
En el código que escribes, siempre agrega una parte para informar la solución en los límites y guárdala en un archivo separado para que el Científico la revise.»’
PLANNER_MESSAGE = «»»Planificador. Sugiere un plan. Revisa el plan en función de los comentarios del administrador y el crítico, hasta la aprobación del administrador.
El plan puede involucrar a un ingeniero que pueda escribir código y a un científico que no escriba código.
Explica el plan primero. Pídele al Ejecutor que instale las bibliotecas o módulos de Python según sea necesario sin la intervención humana.
Deja en claro qué paso realiza un ingeniero y qué paso realiza un científico.»»»
SCIENTIST_MESSAGE = «»»Científico. Sigues un plan aprobado. Puedes formular el problema de mecánica con
condiciones de límite claras y la ley constitutiva de los materiales. No escribes código. Verificas explícitamente los
resultados de los límites del Ingeniero para ver si concuerdan con la condición de límite y la geometría de entrada.
Cuando ejecutas el código, siempre guarda una copia para revisar.»»»
EXECUTOR_MESSAGE = «»»Ejecutor. Guarda y ejecuta el código escrito por el ingeniero e informa y guarda el resultado.
Utilice tanto el intérprete de lenguaje de shell como el de Python.»»»
CRITIC_MESSAGE = «»» Crítico. Verifique nuevamente el plan, las afirmaciones, el código de otros agentes, los resultados en las condiciones límite y brinde comentarios.
Verifique si el plan incluye agregar información verificable, como la URL de origen.»»»
Función de inicio para Chainlit UI.
Creamos los agentes cuando el usuario abre la aplicación de chat e imprime un mensaje de bienvenida. El ejecutor ejecuta el script, accede a un entorno de simulación y comparte los resultados. Por lo tanto, habilitamos la configuración de ejecución de código y configuramos Docker en Falso para usar solo el entorno del sistema operativo nativo para la ejecución del código.@cl.on_chat_start
async def on_chat_start ():
try :
print ( «Establecer agentes.» )
proxy_usuario = ChainlitUserProxyAgent( «Administrador» , mensaje_sistema=MENSAJE_PROXY_USUARIO, configuración_ejecución_código= False )
ingeniero = ChainlitAssistantAgent( «Ingeniero» , llm_config=llm_config, mensaje_sistema=MENSAJE_INGENIERO)
científico = ChainlitAssistantAgent( «Científico» , llm_config=llm_config, mensaje_sistema=MENSAJE_CIENTÍFICO)
planificador = ChainlitAssistantAgent( «Planificador» , llm_config=llm_config, mensaje_sistema=MENSAJE_PLANIFICADOR)
crítico = ChainlitAssistantAgent( «Crítico» , llm_config=llm_config, mensaje_sistema=MENSAJE_CRÍTICO)
ejecutor = ChainlitAssistantAgent( «Ejecutor» , mensaje_sistema=MENSAJE_EJECUTOR, modo_entrada_humana= «NUNCA» ,
configuración_ejecución_código={ «últimos_n_mensajes» : 3 , «directorio_trabajo» : «resultados_FEA» , «uso_docker» : Falso })
cl.user_session.set ( «proxy_usuario» , proxy_usuario) cl.user_session.set ( » ingeniero» , ingeniero) cl.user_session.set ( » científico» , científico) cl.user_session.set ( «planificador» , planificador ) cl.user_session.set ( «crítico» , crítico ) cl.user_session. set ( «executor» , executor) msg = cl.Message(content= f»»»¡Hola! ¿Qué tarea de simulación te gustaría realizar hoy? «»» , author= «User_Proxy» ) await msg.send() except Exception as e: print ( «Error: » , e) pass
Función para conversaciones
Para probar la capacidad de este grupo de múltiples agentes para resolver problemas de ingeniería de forma autónoma, utilizamos el agente de administración (proxy de usuario) solo para asignar tareas. Si bien es posible recopilar aportes humanos en varias etapas, omitimos el aporte humano durante el chat grupal. Puede aumentar la variable MAX_ITER
para aumentar las conversaciones entre los agentes en función de la complejidad del problema que está tratando de resolver.@cl.on_message
async def run_conversation ( message: cl.Message ):
MAX_ITER = 50
CONTEXT = message.content
user_proxy = cl.user_session.get( «user_proxy» )
planner = cl.user_session.get( «planner» )
engineer = cl.user_session.get( «engineer» )
critic = cl.user_session.get( «critic» )
executor = cl.user_session.get( «ejecutor» )
scientific = cl.user_session.get( «scientist» )
groupchat = autogen.GroupChat(agents=[user_proxy, planner, engineer, scientific, executor, critic],
messages=[], max_round=MAX_ITER)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
print ( «Conversación en ejecución» )
await cl.make_async(user_proxy.initiate_chat)( manager, message=CONTEXT, )
Y ese es el final del código principal.
Mis pensamientos finales
Este marco LLM multiagente muestra el potencial de superar el paradigma exclusivamente humano en la resolución de problemas de ingeniería aprovechando el amplio conocimiento y las herramientas de código abierto de ChatGPT. La precisión y la eficiencia de este método dependen de la profunda comprensión del LLM de la mecánica de sólidos, la dinámica de fluidos, las teorías multifísicas, la ciencia de los materiales y la codificación. Un LLM más especializado y perfeccionado, entrenado en un vasto corpus de literatura científica relevante y conjuntos de datos de codificación, podría producir resultados aún más precisos. Alinear el modelo para escribir y ejecutar códigos y algoritmos de ingeniería complejos es esencial.
Se pueden crear agentes adicionales para manejar subtareas específicas y mejorar este enfoque. Por ejemplo, un agente puede generar la geometría inicial o el archivo CAD, otro puede crear la malla y un tercero puede escribir el algoritmo numérico. Esta división del trabajo reduce los errores y minimiza las iteraciones y las conversaciones de chat grupales necesarias para resolver los problemas de manera eficiente.
Además, estos agentes autónomos pueden utilizar API para interactuar con software de ingeniería comercial como SOLIDWORKS, ANSYS, Abaqus y LS-DYNA. Capacitar al LLM para escribir scripts para estas API facilitará interacciones fluidas. Este enfoque automatiza la resolución de problemas de diseño y análisis de ingeniería, allanando el camino para una colaboración fluida entre humanos e IA en la investigación e innovación en ingeniería.
Escrito por Karthik Rajan, Ph.D.
Acerca de mí : Soy ingeniero de modelado líder en Eaton Research Labs, Southfield, MI, EE. UU. Exploro, desarrollo herramientas y escribo sobre temas relacionados con la mecánica computacional, la ciencia de los materiales, la ingeniería, los modelos de lenguaje y la inteligencia artificial generativa.
Siguelo en las redes sociales: LinkedIn , GitHub , código fuente