Article
· Mars 22 5m de lecture

Balisage des données dans IRIS à l'aide de Python intégré et de l'API OpenAI

L'invention et la vulgarisation des grands modèles de langage (tels que GPT-4 d'OpenAI) ont lancé une vague de solutions innovantes capables d'exploiter de grands volumes de données non structurées qui étaient peu pratiques, voire impossibles, à traiter manuellement jusqu'à récemment. Ces applications peuvent inclure la récupération de données (voir le cours ML301 de Don Woodlock pour une excellente introduction à Retrieval Augmented Generation), l'analyse des sentiments, et même des agents d'IA entièrement autonomes, pour n'en nommer que quelques-uns !

Dans cet article, je souhaite démontrer comment la fonctionnalité Python intégré d'IRIS peut être utilisée pour s'interfacer directement avec la bibliothèque Python OpenAI, en créant une application simple de balisage de données qui attribuera automatiquement des mots-clés aux enregistrements que nous insérons dans une table IRIS. Ces mots clés peuvent ensuite être utilisés pour rechercher et catégoriser les données, ainsi qu'à des fins d'analyse des données. J'utiliserai les avis des clients sur les produits comme exemple de cas d'utilisation.

pré-requis

  • Une instance en cours d'exécution d'IRIS
  • Une clé API OpenAPI (que vous pouvez créer ici)
  • Un environnement de développement configuré (j'utiliserai VS Code pour cet article)

La classe Review

Commençons par créer une classe ObjectScript qui définira le modèle de données de nos avis clients. Pour simplifier les choses, nous ne définirons que 4 champs %String : le nom du client, le nom du produit, le corps de l'avis et les mots-clés que nous générerons. La classe doit étendre %Persistentafin que nous puissions enregistrer ses objets sur le disque.

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 ];
}

Puisque nous souhaitons que la propriété Keywords soit automatiquement calculée lors de l'insertion ou de la mise à jour de la propriété ReviewBody, je la marque comme SqlComputed. Vous pouvez en savoir plus sur les valeurs calculées ici.

La Méthode KeywordsComputation

Nous souhaitons maintenant définir une méthode qui sera utilisée pour calculer les mots-clés en fonction du corps de révision. Nous pouvons utiliser Embedded Python pour interagir directement avec le package openai Python officiel. Mais d’abord, nous devons l’installer. Pour ce faire, exécutez la commande shell suivante :

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

Nous pouvons désormais utiliser l'API de complétion de chat d'OpenAI pour générer les mots-clés :

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
}

Remarquez comment, dans l'invite, je précise d'abord les instructions générales sur la façon dont je souhaite que GPT-4 "génère une liste de mots clés qui résument le contenu d'un avis client sur un produit", puis je donne deux exemples d'entrées ainsi que le message souhaité en sortie. J'insère ensuite cols.getfield("ReviewBody") et termine l'invite par le mot "Keywords :", en l'incitant à compléter la phrase en fournissant les mots clés dans le même format que les exemples que je lui ai donnés. Ceci est un exemple simple de la technique Few-Shot Prompting.

J'ai choisi de stocker les mots-clés sous forme de chaîne JSON par souci de simplicité de présentation ; une meilleure façon de les stocker en production pourrait être un DynamicArray, mais je laisserai cela comme exercice au lecteur.

Générer des mots-clés

Nous pouvons maintenant tester notre application de marquage des données en insérant une ligne dans notre table à l'aide de la requête SQL suivante via le portail d'administration d'IRIS :

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.')

Comme vous pouvez le voir ci-dessous, il a généré automatiquement quatre mots-clés pour nous. Bien joué!

Conclusions

Pour résumer, la capacité d'InterSystems IRIS à intégrer du code Python permet un large éventail de possibilités lorsqu'il s'agit de données non structurées. Tirer parti de la puissance d’OpenAI pour le marquage automatisé des données n’est qu’un exemple de ce que l’on peut réaliser avec cette puissante fonctionnalité. Cela conduit à moins d’erreurs humaines et à une efficacité globale plus élevée.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer