Artículo
· 15 ene, 2024 Lectura de 5 min

Etiquetado de datos en IRIS utilizando Python Embebido y la API de OpenAI

La invención y popularización de LLMs (Large Language Models) como GPT-4 de OpenAI ha desencadenado una ola de soluciones innovadoras que permiten aprovechar grandes volúmenes de datos no estructurados, que eran prácticamente imposibles de procesar manualmente hasta hace poco. Estas aplicaciones pueden incluir la recuperación de datos (echad un vistazo al curso sobre ML301 de Don Woodlock, con una excelente introducción a la Generación Aumentada de Recuperación), el análisis de sentimientos, e incluso agentes de IA totalmente autónomos, por nombrar sólo algunos ejemplos!

En este artículo, quiero demostrar cómo la funcionalidad de Python Embebido de IRIS puede ser utilizada para interactuar directamente con la librería Python de OpenAI, a través de la creación de una sencilla aplicación de etiquetado de datos que asignará automáticamente palabras clave a los registros que metamos en una tabla de IRIS. Estas palabras clave pueden después ser usadas para buscar y categorizar los datos, así como para analítica de datos. Utilizaré reseñas de productos realizadas por clientes como ejemplo de caso de uso.

Requisitos previos

  • Una instancia en ejecución de IRIS
  • Una clave API de OpenAPI (que podéis crear aquí)
  • Un entorno de desarrollo configurado (yo utilizaré VS Code en este artículo)

La Clase Review

Vamos a empezar creando una clase ObjectScript que definirá el modelo de datos para nuestras reseñas de clientes. Para hacerlo sencillo, sólo definiremos 4 campos %String: el nombre del cliente, el nombre del producto, el cuerpo de la reseña y las palabras clave que generaremos. La clase debe heredar de  %Persistent para que podamos guardar sus objetos en disco.

Class DataTagging.Review Extends %Persistent
{
Property Name As %String(MAXLEN = 50) [ Required ];
Property Product As %String(MAXLEN = 50) [ Required ];
Property ReviewBody As %String(MAXLEN = 300) [ Required ];
Property Keywords As %String(MAXLEN = 300) [ SqlComputed, SqlComputeOnChange = ReviewBody ];
}

Como queremos que la propiedad Keywords se calcule automáticamente al insertar o actualizar la propiedad ReviewBody, la marcaré como SqlComputed. En esta página de la documentación podéis aprender más sobre los valores calculados: Computed Property Values (en inglés).

El Método KeywordsComputation

Ahora queremos definir un método que se utilizará para calcular las palabras clave en función del cuerpo de la reseña. Podemos usar Python Embebido para interactuar directamente con el paquete oficial de Python de openai. Pero primero tenemos que instalarlo. Para hacerlo, ejecutad el siguiente comando en el intérprete de comandos:

<your-IRIS-installation-path>/bin/irispip install --target <your-IRIS-installation-path>/mgr/python openai

Ahora podemos usar la API de completado de chat de OpenAI para generar las palabras clave:

ClassMethod KeywordsComputation(cols As %Library.PropertyHelper) As %String [ Language = python ]
{
    '''
    This method is used to compute the value of the Keywords property
    by calling the OpenAI API to generate a list of keywords based on the review body.
    '''
    from openai import OpenAI

    client = OpenAI(
        # Defaults to os.environ.get("OPENAI_API_KEY")
        api_key="<your-api-key>",
    )

    # Set the prompt; use few-shot learning to give examples of the desired output
    user_prompt = "Generate a list of keywords that summarize the content of a customer review of a product. " \
                + "Output a JSON array of strings.\n\n" \
                + "Excellent watch. I got the blue version and love the color. The battery life could've been better though.\n\nKeywords:\n" \
                + "[\"Color\", \"Battery\"]\n\n" \
                + "Ordered the shoes. The delivery was quick and the quality of the material is terrific!.\n\nKeywords:\n" \
                + "[\"Delivery\", \"Quality\", \"Material\"]\n\n" \
                + cols.getfield("ReviewBody") + "\n\nKeywords:"
    # Call the OpenAI API to generate the keywords
    chat_completion = client.chat.completions.create(
        model="gpt-4",  # Change this to use a different model
        messages=[
            {
                "role": "user",
                "content": user_prompt
            }
        ],
        temperature=0.5,  # Controls how "creative" the model is
        max_tokens=1024,  # Controls the maximum number of tokens to generate
    )

    # Return the array of keywords as a JSON string
    return chat_completion.choices[0].message.content
}

Observad cómo, en el prompt, primero especifico las instrucciones generales de cómo quiero que GPT-4 "genere una lista de palabras clave que resuman el contenido de una reseña de producto de un cliente" y después doy dos ejemplos de entradas junto con las salidas apropiadas. A continuación, introduzco cols.getfield("ReviewBody") y termino el prompt con la palabra "Keywords:" (Palabras clave), instándole a completar la frase proporcionando las palabras clave en el mismo formato que los ejemplos que le di. Este es un ejemplo sencillo de la técnica Few-Shot Prompting.

Elegí guardar las palabras clave como un string JSON por simplificar la presentación; una mejor forma de almacenar las palabras clave en producción podría ser un DynamicArray, pero eso lo dejaré como un ejercicio para el lector.

Generación de Palabras clave

Ahora podemos probar nuestra aplicación de etiquetado de datos insertando una fila en nuestra tabla, usando la siguiente consulta SQL a través del Portal de Gestión:

INSERT INTO DataTagging.Review (Name, Product, ReviewBody)
VALUES ('Ivan', 'BMW 330i', 'Solid car overall. Had some engine problems but got everything fixed under the warranty.')

Como podéis ver debajo, generó automáticamente cuatro palabras clave para nosotros. ¡Bien hecho!

Conclusión

En resumen, la capacidad de InterSystems IRIS para embeber código Python permite una amplia gama de posibilidades cuando se trabaja con datos no estructurados. Aprovechar el potencial de OpenAI para el etiquetado automático de datos es solo un ejemplo de lo que se puede conseguir con esta potente funcionalidad. Y se disminuyen los errores humanos y se mejora la eficiencia general.

Comentarios (0)1
Inicie sesión o regístrese para continuar