Descubre cómo integrar el nuevo modelo OpenAI o1-preview en un script de Python para enriquecer tus proyectos de inteligencia artificial. Este script te permite interactuar con la API de OpenAI usando el modelo o1-preview, con la posibilidad de incluir contenido web en los prompts gracias a una funcionalidad de web scraping. Además, gestiona correctamente las expresiones matemáticas LaTeX en las respuestas del modelo, convirtiéndolas en texto Unicode legible en la terminal.
Introducción
El 12 de septiembre de 2024, OpenAI lanzó su nueva serie de modelos de IA, llamada OpenAI o1. Estos modelos están diseñados para realizar un razonamiento profundo antes de dar una respuesta, lo que les permite resolver problemas complejos en ciencia, programación y matemáticas. El modelo o1-preview destaca especialmente en estos ámbitos, superando a modelos anteriores como gpt-4o.
Puntos clave del script:
- Integración del modelo o1-preview: El script utiliza el modelo o1-preview por defecto, ofreciendo así capacidades de razonamiento avanzadas.
- Web scraping integrado: Puede extraer el contenido de páginas web para enriquecer el contexto del prompt.
- Gestión de expresiones LaTeX: Las expresiones matemáticas en las respuestas se convierten a texto Unicode para una lectura sencilla en la terminal.
- Personalizable: El script permite elegir el modelo de OpenAI y puede adaptarse a diversos casos de uso.
En este artículo, detallaré el código del script, explicaré cómo funciona y realizaré una serie de prompts complejos.
Requisitos
Antes de comenzar, asegúrate de tener lo siguiente:
- Python 3.x instalado en tu máquina.
- Una clave API de OpenAI. Puedes obtenerla registrándote en el sitio de OpenAI.
- Un entorno virtual de Python (recomendado para aislar las dependencias).
- Los módulos de Python necesarios.
Configuración del entorno virtual
Para aislar las dependencias de este proyecto, se recomienda usar un entorno virtual. Aquí tienes cómo crear uno e instalar las dependencias requeridas :
python3 -m venv env
source env/bin/activate # Sur Windows, utilisez env\Scripts\activate
pip install openai selenium webdriver-manager pylatexenc
Definir la clave API de OpenAI
Define tu clave API de OpenAI como variable de entorno:
export OPENAI_API_KEY='votre_clé_api_ici'
Reemplaza 'votre_clé_api_ici' por tu clave API real.
El código completo del script
Aquí está el código completo del script Python:
#!/usr/bin/env python3
import os
import sys
import argparse
import re
from openai import OpenAI
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from pylatexenc.latex2text import LatexNodes2Text
def get_web_content(url):
if not url:
return ""
try:
# Configure les options de Chrome
chrome_options = Options()
# Ne pas utiliser le mode headless pour éviter les problèmes de vérification humaine
# Utilise ChromeDriverManager pour gérer l\'installation de ChromeDriver
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=chrome_options
)
# Charge la page web
driver.get(url)
# Récupère le contenu textuel de la page
web_content = driver.execute_script("return document.documentElement.innerText")
# Ferme le navigateur
driver.quit()
return web_content if web_content else None
except Exception as e:
return None
def convert_latex_to_text(latex_str):
# Convertit les expressions LaTeX en texte Unicode
return LatexNodes2Text().latex_to_text(latex_str)
def clean_output(content):
# Trouve toutes les expressions LaTeX dans le contenu et les convertit
patterns = [r"\\\\[.*?\\\\]", r"\\\(.*?\\\)", r"\$\$.*?\$\$", r"\$.*?\$"]
for pattern in patterns:
matches = re.findall(pattern, content, flags=re.DOTALL)
for match in matches:
plain_text = convert_latex_to_text(match)
content = content.replace(match, plain_text)
return content
def get_response(prompt, client, model="o1-preview"):
urls = re.findall(r"(https?://\S+)", prompt)
for url in urls:
web_content = get_web_content(url)
if web_content:
prompt = prompt.replace(url, web_content)
else:
return f"Erreur: Le contenu web pour {url} ne peut être récupéré."
try:
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": prompt,
},
],
)
first_choice_message = response.choices[0].message
content = first_choice_message.content
# Convertit les expressions LaTeX en texte lisible
cleaned_content = clean_output(content)
return cleaned_content
except Exception as e:
return f"Une erreur est survenue : {e}"
def main():
parser = argparse.ArgumentParser()
parser.add_argument("prompt", nargs="?", help="Le prompt contenant des URLs")
parser.add_argument(
"--model",
default="o1-preview",
choices=["gpt-4o", "o1-preview", "o1-mini"],
help="Le modèle OpenAI à utiliser (par défaut o1-preview)",
)
args = parser.parse_args()
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
raise ValueError(
"La clé API OPENAI_API_KEY n'est pas définie dans les variables d\'environnement."
)
with OpenAI(api_key=openai_api_key) as client:
prompt = args.prompt or sys.stdin.read()
response = get_response(prompt, client, model=args.model)
print(response)
if __name__ == "__main__":
main()
Explicación del código
Importación de los módulos necesarios
El script comienza importando los módulos esenciales:
- os, sys, argparse, re: Módulos estándar para manejar variables de entorno, argumentos de línea de comandos y expresiones regulares.
- openai: Módulo para interactuar con la API de OpenAI.
- selenium y webdriver_manager: Para realizar web scraping.
- pylatexenc: Para convertir las expresiones LaTeX a texto Unicode legible.
Función get_web_content
Esta función recupera el contenido textual de una página web.
def get_web_content(url):
if not url:
return ""
try:
# Configure les options de Chrome
chrome_options = Options()
# Ne pas utiliser le mode headless pour éviter les problèmes de vérification humaine
# Utilise ChromeDriverManager pour gérer l\'installation de ChromeDriver
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=chrome_options
)
# Charge la page web
driver.get(url)
# Récupère le contenu textuel de la page
web_content = driver.execute_script("return document.documentElement.innerText")
# Ferme le navigateur
driver.quit()
return web_content if web_content else None
except Exception as e:
return None
Puntos clave:
- Opciones de Chrome: El script no usa el modo headless para evitar problemas de verificación humana que algunas páginas aplican a navegadores en modo headless.
- ChromeDriverManager: Gestiona automáticamente la instalación y actualización de ChromeDriver.
- Extracción de contenido: Usa JavaScript para extraer el texto completo de la página.
- Gestión de excepciones: En caso de error, la función devuelve
None.
Función convert_latex_to_text
Esta función convierte las expresiones LaTeX a texto Unicode.
def convert_latex_to_text(latex_str):
# Convertit les expressions LaTeX en texte Unicode
return LatexNodes2Text().latex_to_text(latex_str)
Puntos clave:
- Utiliza la biblioteca
pylatexencpara convertir las expresiones LaTeX, haciendo las fórmulas matemáticas legibles en la terminal.
Función clean_output
Esta función procesa la respuesta del modelo para convertir las expresiones LaTeX.
def clean_output(content):
# Trouve toutes les expressions LaTeX dans le contenu et les convertit
patterns = [r"\\\\[.*?\\\\]", r"\\\(.*?\\\)", r"\$\$.*?\$\$", r"\$.*?\$"]
for pattern in patterns:
matches = re.findall(pattern, content, flags=re.DOTALL)
for match in matches:
plain_text = convert_latex_to_text(match)
content = content.replace(match, plain_text)
return content
Puntos clave:
- Búsqueda de expresiones LaTeX: Usa expresiones regulares para identificar las fórmulas.
- Conversión: Cada fórmula se convierte a texto Unicode.
- Reemplazo: Las fórmulas LaTeX se sustituyen por su equivalente legible.
Función get_response
Prepara el prompt, gestiona el web scraping si es necesario, llama a la API de OpenAI y limpia la respuesta.
def get_response(prompt, client, model="o1-preview"):
urls = re.findall(r"(https?://\S+)", prompt)
for url in urls:
web_content = get_web_content(url)
if web_content:
prompt = prompt.replace(url, web_content)
else:
return f"Erreur: Le contenu web pour {url} ne peut être récupéré."
try:
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": prompt,
},
],
)
first_choice_message = response.choices[0].message
content = first_choice_message.content
# Convertit les expressions LaTeX en texte lisible
cleaned_content = clean_output(content)
return cleaned_content
except Exception as e:
return f"Une erreur est survenue : {e}"
Puntos clave:
- Gestión de URLs: Si el prompt contiene URLs, se extrae el contenido e inserta.
- Llamada a la API de OpenAI: Envía el prompt modificado al modelo especificado.
- Limpieza de la respuesta: Las expresiones LaTeX se convierten para una lectura sencilla.
Función main
Maneja los argumentos de línea de comando y ejecuta el script.
def main():
parser = argparse.ArgumentParser()
parser.add_argument("prompt", nargs="?", help="Le prompt contenant des URLs")
parser.add_argument(
"--model",
default="o1-preview",
choices=["gpt-4o", "o1-preview", "o1-mini"],
help="Le modèle OpenAI à utiliser (par défaut o1-preview)",
)
args = parser.parse_args()
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
raise ValueError(
"La clé API OPENAI_API_KEY n'est pas définie dans les variables d\'environnement."
)
with OpenAI(api_key=openai_api_key) as client:
prompt = args.prompt or sys.stdin.read()
response = get_response(prompt, client, model=args.model)
print(response)
Puntos clave:
- Argumentos: El script acepta un prompt y un modelo como argumentos.
- Clave API: Verifica que la clave API esté definida.
- Ejecución: Llama a la función
get_responsey muestra la respuesta.
Ejecución del script
if __name__ == "__main__":
main()
Ejemplos de uso
Hacer una pregunta que requiera razonamiento
./openai_poc.py "Dans un triangle rectangle, si les côtés adjacents à l'angle droit mesurent 3 cm et 4 cm, calcule la longueur de l'hypoténuse."
Para calcular la longitud de la hipotenusa en un triángulo rectángulo cuyos catetos miden 3 cm y 4 cm, usamos el teorema de Pitágoras:
Sustituyendo los valores dados:
Tomando la raíz cuadrada de ambos lados:
Por lo tanto, la longitud de la hipotenusa es 5 cm.
La longitud de la hipotenusa es 5 cm.
Generar un resumen de una página web
./openai_poc.py "Fais-moi un résumé de cette page : https://openai.com/index/introducing-openai-o1-preview/"
OpenAI anunció el 12 de septiembre de 2024 la introducción de una nueva serie de modelos de IA llamada OpenAI o1, diseñada para tomar más tiempo en reflexionar antes de responder. Estos modelos son capaces de razonar a través de tareas complejas y resolver problemas más difíciles que los modelos anteriores en ciencia, programación y matemáticas.
El primer modelo de esta serie, o1-preview, ya está disponible en ChatGPT y a través de la API de OpenAI. También se ofrece una versión más ligera y económica, llamada OpenAI o1-mini, que ofrece capacidades de codificación eficaces a un coste reducido de un 80% respecto a o1-preview.
Resolver una multiplicación simple
./openai_poc.py "Quel est le résultat de 15 x 12 ?"
El resultado de es 180.
Resolver una ecuación simple
./openai_poc.py "Résous l'équation 2x + 5 = 15."
Para resolver la ecuación , sigue los siguientes pasos:
- Restar 5 de ambos lados de la ecuación para aislar el término con la variable:
- Dividir ambos lados de la ecuación por 2 para resolver para :
Solución: .
Calcular un porcentaje
./openai_poc.py "Quel est 20% de 250 ?"
de es igual a 50.
Cálculo:
Calcular el área de un círculo
./openai_poc.py "Calcule l'aire d'un cercle de rayon 5 cm."
Para calcular el área de un círculo de radio 5 cm, utiliza la fórmula del área de un círculo:
donde:
- es el área del círculo,
- es el radio del círculo.
Sustituyendo por 5 cm:
Por lo tanto, el área del círculo es .
Si deseas un valor aproximado, usando :
Así, el área del círculo es aproximadamente 78,54 cm².
Calcular una integral simple
./openai_poc.py "Calcule l'intégrale de 0 à 1 de x^2 dx."
Para calcular la integral de 0 a 1 de la función , integramos respecto a y evaluamos la expresión obtenida entre los límites 0 y 1.
Pasos del cálculo:
- Integración de la función :
donde C es la constante de integración.
- Evaluación entre los límites 0 y 1 :
- Cálculo de los valores en los límites :
- Resta de los valores para obtener el resultado final :
Conclusión:
El valor de la integral de 0 a 1 de es por tanto .
Calcular una velocidad media
./openai_poc.py "Si une voiture parcourt 150 km en 3 heures, quelle est sa vitesse moyenne ?"
Para calcular la velocidad media de un coche que recorre 150 km en 3 horas, usamos la fórmula de la velocidad media:
Aplicando los valores dados:
La velocidad media del coche es por tanto 50 km/h.
Mecánica clásica
./openai_poc.py "Un bloc de 5 kg est tiré sur une surface sans frottement par une force de 20 N. Calcule son accélération."
Para calcular la aceleración del bloque, usamos la segunda ley de Newton, que establece que la fuerza resultante que actúa sobre un objeto es igual a la masa del objeto multiplicada por su aceleración ().
Dado:
- Masa del bloque,
- Fuerza aplicada,
- Superficie sin fricción (por lo que no hay fuerza opuesta debida al rozamiento)
Al reordenar la fórmula para resolver la aceleración (), obtenemos:
Sustituyendo los valores dados:
Respuesta: La aceleración del bloque es de 4 metros por segundo al cuadrado ().
Resolución de ecuaciones diferenciales
./openai_poc.py "Résous l'équation différentielle dy/dx = x^2 + y^2 avec la condition initiale y(0) = 1."
Para resolver la ecuación diferencial:
con la condición inicial , notamos que esta ecuación es no lineal y no puede resolverse con métodos elementales como separación de variables o factores integrantes estándar. Sin embargo, podemos intentar transformar la ecuación a una forma más manejable.
Paso 1 : Reconocer la naturaleza de la ecuación
La ecuación dada es una ecuación diferencial de Riccati que tiene la forma general:
En nuestro caso, se escribe:
Paso 2 : Transformar la ecuación en una ecuación lineal de segundo orden
Para resolver una ecuación de Riccati, se puede utilizar la sustitución:
donde es una función por determinar, y es la derivada de respecto a .
Cálculo de en función de :
Aplicando la regla del cociente:
Paso 3 : Sustituir en la ecuación inicial
Sustituimos y en la ecuación diferencial original:
Simplificamos la ecuación:
Ahora multiplicamos ambos miembros por para eliminar los denominadores:
Simplificamos:
Dividimos por (suponiendo ):
Paso 4 : Resolver la ecuación lineal de segundo orden
Obtenemos entonces una ecuación diferencial lineal homogénea de segundo orden:
Esta ecuación es lineal con coeficientes variables. Se conoce como una forma relacionada con la ecuación de Airy modificada. Las soluciones no se expresan en términos de funciones elementales, sino en términos de funciones especiales llamadas funciones de Airy.
Soluciones de la ecuación:
Las soluciones generales de la ecuación son:
donde y son las funciones de Airy de primera y segunda especie, e es la unidad imaginaria tal que .
Paso 5 : Volver a
Recordando que:
Conociendo , podemos hallar calculando la derivada de y efectuando el cociente.
Paso 6 : Aplicar la condición inicial
Para determinar las constantes de integración y , debemos aplicar la condición inicial . No obstante, dada la complejidad de las funciones de Airy con argumentos complejos, el cálculo explícito resulta delicado.
Conclusión
La solución de la ecuación diferencial dada con la condición inicial se expresa en términos de funciones especiales (funciones de Airy). No puede expresarse en términos de funciones elementales como polinomios, exponenciales, senos o cosenos.
Respuesta final :
La solución de la ecuación diferencial con está dada implícitamente en términos de las funciones de Airy, y no puede escribirse explícitamente con funciones elementales.
Electromagnetismo
./openai_poc.py "Calcule le champ électrique à une distance r d'une charge ponctuelle Q."
El campo eléctrico creado por una carga puntual a una distancia viene dado por la ley de Coulomb. La fórmula para calcular el campo eléctrico es:
donde:
- es el campo eléctrico (en voltios por metro, V/m),
- es la carga puntual (en coulombs, C),
- es la distancia a la carga (en metros, m),
- es la permitividad del vacío, con un valor aproximado de .
Ejemplo de cálculo:
Supongamos que tienes una carga (2 microcoulombs) y quieres calcular el campo eléctrico a una distancia .
- Calcula la constante delante de la fracción:
- Aplica la fórmula:
Conclusión:
El campo eléctrico a una distancia de de una carga puntual de es .
Así, para calcular el campo eléctrico a una distancia dada de una carga puntual, utiliza la fórmula anterior reemplazando y por los valores específicos del problema.
Equilibrio químico
./openai_poc.py "Explique comment le principe de Le Chatelier s'applique à l'équilibre suivant : N2 + 3H2 ⇌ 2NH3."
El principio de Le Chatelier establece que, cuando un sistema en equilibrio sufre una modificación (estrés) externa, reacciona de forma que minimiza esa perturbación y establece un nuevo equilibrio. Aplicado al equilibrio químico siguiente:
podemos analizar cómo distintas modificaciones influyen en la posición del equilibrio.
1. Variación de la concentración : - Aumento de la concentración de reactivos (N₂ o H₂): Si se añade diazote (N₂) o dihidrógeno (H₂) al sistema, la concentración de estos reactivos aumenta. Según el principio de Le Chatelier, el equilibrio se desplazará en el sentido que consuma estos reactivos adicionales, es decir hacia la derecha, favoreciendo la formación de amoníaco (NH₃).
-
Disminución de la concentración de productos (NH₃): Si se retira amoníaco del sistema, la concentración de NH₃ disminuye. El equilibrio se desplazará entonces hacia la derecha para compensar esta disminución, favoreciendo de nuevo la formación de amoníaco.
-
Aumento de la concentración de productos (NH₃): Si se añade amoníaco al sistema, el equilibrio se desplazará hacia la izquierda para reducir el exceso de NH₃, favoreciendo la formación de N₂ y H₂.
2. Variación de la presión:
-
Aumento de la presión total del sistema: Para los gases, un aumento de la presión (por disminución del volumen) favorece la reacción que produce menos moles gaseosos. En esta reacción, se pasa de 4 moles de gas (1 N₂ + 3 H₂) a 2 moles de gas (2 NH₃). Por lo tanto, el aumento de la presión desplaza el equilibrio hacia la derecha, favoreciendo la formación de amoníaco.
-
Disminución de la presión total del sistema: En cambio, una disminución de la presión favorecerá la reacción que produce más moles gaseosos, desplazando el equilibrio hacia la izquierda y favoreciendo la disociación de NH₃ en N₂ y H₂.
3. Variación de la temperatura:
-
Naturaleza exotérmica de la reacción: La síntesis del amoníaco es una reacción exotérmica (), es decir, que libera calor.
-
Aumento de la temperatura: Al aumentar la temperatura, se aporta calor al sistema. Según el principio de Le Chatelier, el equilibrio se desplazará en el sentido que absorba ese calor adicional, por lo tanto hacia la izquierda (reacción endotérmica), favoreciendo la disociación de NH₃ en N₂ y H₂.
-
Descenso de la temperatura: Al bajar la temperatura, el sistema reacciona produciendo calor para compensar esa pérdida. El equilibrio se desplaza así hacia la derecha (reacción exotérmica), favoreciendo la formación de amoníaco.
4. Presencia de un catalizador:
- Efecto del catalizador: La adición de un catalizador (como hierro finamente dividido con promotores) aumenta la velocidad a la que se alcanza el equilibrio, pero no modifica la posición del equilibrio. Acelera tanto las reacciones directa como inversa de manera igual.
Resumen:
El principio de Le Chatelier permite predecir la dirección en la que un equilibrio químico se desplazará en respuesta a una modificación de las condiciones del sistema. Para la síntesis del amoníaco:
- Alta presión favorece la formación de NH₃ (menos moles gaseosos).
- Baja temperatura favorece la formación de NH₃ (reacción exotérmica).
- Aumento de las concentraciones de N₂ o H₂ favorece la formación de NH₃.
- Retiro de NH₃ del sistema favorece la formación de más NH₃.
Estos principios se aplican en el proceso Haber-Bosch para optimizar la producción industrial de amoníaco.
Conclusión
Este script de Python ofrece una integración práctica del modelo OpenAI o1-preview, permitiendo aprovechar sus capacidades de razonamiento avanzadas para una amplia gama de cuestiones, desde las más sencillas hasta las más complejas. Tanto si eres un principiante curioso como un experto que busca poner a prueba los límites del modelo, este script es una herramienta útil para tus proyectos en inteligencia artificial.
Recursos
- Anuncio del modelo OpenAI o1-preview
- Documentación oficial de la API OpenAI
- Documentación de Selenium
- Documentación de pylatexenc
- Guía sobre entornos virtuales en Python
Este documento ha sido traducido de la versión fr al idioma es utilizando el modelo gpt-5-mini. Para más información sobre el proceso de traducción, consulte https://gitlab.com/jls42/ai-powered-markdown-translator