Maison >développement back-end >tutoriel php >Exploiter OpenAI Assistant pour la reconnaissance d'entités nommées dans PHP/Symfony 7
L'intégration de grands modèles de langage dans les backends de produits réels est le dernier champ de bataille en matière d'innovation. Mais comme pour toutes les tendances technologiques, les vrais gagnants ne sont pas ceux qui se précipitent pour tout savoir. Il s'agit plutôt de faire une pause, de réfléchir et de prendre des décisions intelligentes.
Même si l’IA est plus accessible que jamais, penser qu’il s’agit d’une tâche triviale est une grave erreur. Le domaine en est encore à ses balbutiements, et presque tous les acteurs de la technologie et des affaires tentent de trouver comment lui donner un sens. Internet regorge à la fois d’informations fiables et de battage médiatique trompeur.
Croyez-le ou non, vous n’avez pas besoin de sauter sur chaque potin que vous entendez sur l’IA. Prenez du recul et abordez-le de manière réfléchie.
Si vous êtes un développeur PHP ou si vous travaillez avec une base de code PHP, l'IA peut ressembler à un concept extraterrestre. Les classes, les interfaces, les files d'attente de messages et les frameworks semblent être des mondes différents de la PNL, du réglage fin, des descentes de gradient stochastiques, de LoRA, de RAG et de tout ce jargon. Je comprends. Pour apprendre systématiquement ces concepts, comme tout en génie logiciel, nous avons besoin de temps et de bonnes pratiques.
Mais l’IA, l’apprentissage automatique et la science des données ne sont-ils pas le domaine des programmeurs Python ou R ? Vous avez en partie raison. La plupart des apprentissages automatiques fondamentaux sont effectués en Python. Et honnêtement, Python est un plaisir à apprendre : il est polyvalent et peut être appliqué à d’innombrables projets intéressants. De la création et de la formation d'un modèle de langage à son déploiement via une API, Python a ce qu'il vous faut.
Mais revenons à PHP.
Ne vous inquiétez pas, vous n'êtes pas sur le point de devenir obsolète en tant qu'ingénieur logiciel ordinaire. Bien au contraire. Alors que nous sommes de plus en plus censés comprendre des domaines connexes tels que la conteneurisation, le CI/CD, l’ingénierie des systèmes et l’infrastructure cloud, l’IA devient rapidement une autre compétence essentielle de notre boîte à outils. Il n’y a pas de meilleur moment que maintenant pour commencer à apprendre.
Cela dit, je ne recommande pas de se lancer tête première dans la création de réseaux de neurones à partir de zéro (sauf si vous le souhaitez vraiment). Il est facile de se sentir dépassé. Au lieu de cela, laissez-moi vous montrer un point de départ pratique pour vos expériences d'IA.
Voici ce que nous aborderons dans ce guide :
Flux de travail IA asynchrones
Je vais vous montrer comment mettre en œuvre un flux de travail d'IA à l'aide d'une file d'attente de messages, qu'il s'agisse de RabbitMQ, d'Amazon SQS ou de votre courtier préféré.
Solution prête pour la production
Vous verrez un exemple réel de solution déployée dans un système de production qui répond aux exigences commerciales de base avec l'IA
Intégration Symfony
La solution est entièrement implémentée dans le framework Symfony PHP.
Outils OpenAI
Nous utiliserons la bibliothèque OpenAI PHP et les derniers OpenAI Assistants 2.0.
Structure de l'ensemble de données
Comment créer un ensemble de données pour entraîner et évaluer votre modèle d'IA.
Affiner les modèles OpenAI
Apprenez à préparer un fichier .jsonl approprié et à affiner le modèle GPT-4o-mini ou un autre de la famille GPT pour votre cas d'utilisation professionnel spécifique.
Création et test d'un assistant OpenAI 2.0
Comprenez comment configurer un assistant OpenAI et testez-le dans OpenAI Playground.
Bases de connaissances
Plongez dans le concept de bases de connaissances : pourquoi GPT ne sait pas tout et comment lui fournir le bon contexte pour augmenter considérablement la précision.
Intégration PHP et Symfony
Apprenez à connecter de manière transparente votre agent IA à votre application Symfony.
Intéressé ? Allons-y.
Plongeons dans le problème que nous résolvons.
À la base, nous avons affaire à un bloc de texte qui représente quelque chose – une adresse, dans notre cas. Le but est de classer ses composants en groupes prédéfinis.
Ainsi, lorsqu'un utilisateur nous envoie une adresse, nous visons à renvoyer une structure JSON qui segmente l'adresse en ses parties. Par exemple :
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Pourquoi est-ce important ?
Eh bien, ces adresses sont saisies par des personnes – nos clients – et elles sont souvent incohérentes. Voici pourquoi nous avons besoin de données structurées et analysées :
Pour y parvenir, nous disséquons l'adresse en groupes prédéfinis comme « rue », « maison », « code postal », etc., puis nous la réassemblons dans l'ordre souhaité.
Pourquoi ne pas utiliser des expressions régulières ?
À première vue, cela semble simple. Si nous imposons le formatage aux nouveaux clients ou si nous savons qu'ils écrivent généralement les adresses d'une manière spécifique, les expressions régulières peuvent sembler une solution raisonnable.
Cependant, considérons des exemples d'adresses roumaines :
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Les adresses roumaines sont souvent complexes, écrites sans ordre particulier et omettent fréquemment des éléments comme le code postal. Même les expressions régulières les plus sophistiquées ont du mal à gérer une telle variabilité de manière fiable.
C'est là que brillent les modèles d'IA comme GPT-3.5 Turbo ou GPT-4o-mini : ils peuvent gérer les incohérences et les complexités bien au-delà de ce que les règles statiques comme les regex peuvent gérer.
Oui, nous développons un flux de travail d'IA qui améliore considérablement l'approche traditionnelle.
Chaque projet de machine learning se résume à deux éléments essentiels : les données et le modèle. Et même si les modèles sont importants, les données sont bien plus critiques.
Les modèles sont préemballés, testés et peuvent être échangés pour voir lequel est le plus performant. Mais ce qui change vraiment la donne, c'est la qualité des données que nous fournissons au modèle.
Le rôle des données dans l'apprentissage automatique
En règle générale, nous divisons notre ensemble de données en deux ou trois parties :
Pour ce projet, nous souhaitons diviser une adresse en ses composants, ce qui en fait une tâche de classification. Pour obtenir de bons résultats avec un grand modèle de langage (LLM) comme GPT, nous avons besoin d'au moins 100 exemples dans notre ensemble de données de formation.
Le format brut de notre ensemble de données n'a pas beaucoup d'importance, mais j'ai choisi une structure intuitive et facile à utiliser :
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Voici un exemple :
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Comme vous pouvez le voir, l'objectif est de produire une réponse JSON structurée basée sur l'adresse d'entrée.
Tout d’abord, vous aurez besoin d’un compte API OpenAI. C'est un processus simple et je recommande d'ajouter quelques fonds initiaux : 10 $ ou 20 $ suffisent pour commencer. OpenAI utilise un modèle d'abonnement prépayé pratique, vous aurez donc un contrôle total sur vos dépenses.
Vous pouvez gérer la facturation de votre compte ici :
Explorer le terrain de jeu OpenAI
Une fois votre compte configuré, rendez-vous sur OpenAI Playground.
Prenez un moment pour vous familiariser avec l'interface. Lorsque vous êtes prêt, recherchez la section « Assistants » dans le menu de gauche.
C'est ici que nous allons créer notre instance GPT personnalisée.
Personnalisation de votre assistant GPT
Nous adapterons notre assistant GPT pour répondre à nos besoins spécifiques en deux étapes :
Instructions système détaillées avec exemples
Cette étape nous aide à tester et valider rapidement si la solution fonctionne. C'est le moyen le plus rapide d'obtenir des résultats.
Réglage fin avec la base de connaissances (simple RAG)
Une fois que nous serons satisfaits des premiers résultats, nous affinerons le modèle. Ce processus réduit le besoin de fournir des exemples détaillés dans chaque invite, ce qui, à son tour, diminue le temps d'inférence (le temps nécessaire au modèle pour répondre via l'API).
Les deux étapes combinées nous donnent les résultats les plus précis et les plus efficaces.
Alors, commençons.
Pour notre système de reconnaissance d'entités nommées, nous avons besoin que le modèle génère des réponses JSON structurées de manière cohérente. Pour y parvenir, il est essentiel de créer une invite système réfléchie.
Voici ce sur quoi nous allons nous concentrer :
La technique des « quelques coups » est une approche puissante pour cette tâche. Il fonctionne en fournissant au modèle quelques exemples de la relation entrée-sortie souhaitée. À partir de ces exemples, le modèle peut généraliser et gérer des entrées qu’il n’a jamais vues auparavant.
Éléments clés d'une invite de quelques prises de vue :
L'invite se compose de plusieurs parties, qui doivent être soigneusement structurées pour de meilleurs résultats. Bien que l'ordre exact puisse varier, il est essentiel d'inclure les sections suivantes :
La première partie de l'invite fournit un aperçu général de ce que nous attendons du modèle.
Par exemple, dans ce cas d'utilisation, l'entrée est une adresse roumaine, qui peut inclure des fautes d'orthographe et un formatage incorrect. Ce contexte est essentiel car il prépare le terrain pour le modèle, expliquant le type de données qu'il traitera.
Après avoir défini la tâche, nous guidons l'IA sur la façon de formater sa sortie.
Ici, la structure JSON est expliquée en détail, y compris la manière dont le modèle doit dériver chaque paire clé-valeur de l'entrée. Des exemples sont inclus pour clarifier les attentes. De plus, tous les caractères spéciaux sont correctement échappés pour garantir un JSON valide.
Les exemples sont l'épine dorsale de la technique des « quelques coups ». Plus nous fournissons des exemples pertinents, meilleures sont les performances du modèle.
Grâce à la vaste fenêtre contextuelle de GPT (jusqu'à 16 000 jetons), nous pouvons inclure un grand nombre d'exemples.
Pour créer l'ensemble d'exemples :
Commencez avec une invite de base et évaluez manuellement la sortie du modèle.
Si le résultat contient des erreurs, corrigez-les et ajoutez la version corrigée à l'ensemble d'exemples.
Ce processus itératif améliore les performances de l’assistant au fil du temps.
C'est inévitable : votre assistant fera des erreurs. Parfois, il peut répéter la même erreur.
Pour résoudre ce problème, incluez des informations correctives claires et polies dans votre invite. Expliquez clairement :
Quelles erreurs l'assistant fait.
Ce que vous attendez plutôt du résultat.
Ces commentaires aident le modèle à ajuster son comportement et à générer de meilleurs résultats.
Maintenant que nous avons élaboré l'invite initiale de notre solution de validation de principe en quelques étapes, il est temps de configurer et de tester l'Assistant.
Étape 1
Étape 2 : Configurez votre assistant
Étape 3 : Choisissez le bon modèle
Pour ce projet, j'ai choisi GPT-4o-mini car :
Cela dit, vous devez toujours sélectionner votre modèle en fonction d'un équilibre entre précision et coût. Exécutez ou recherchez des références pour déterminer ce qui fonctionne le mieux pour votre tâche spécifique.
Une fois la configuration initiale en place, nous pouvons désormais spécifier le schéma de sortie directement dans l'Assistant créateur.
Étape 1 : Utilisation de l'option « Générer »
Au lieu de créer le schéma manuellement, j'ai utilisé l'option "Générer" fournie par l'Assistant créateur. Voici comment :
L'outil fait un excellent travail en générant automatiquement un schéma qui correspond à votre structure.
--
Pour garantir des réponses cohérentes et prévisibles, réglez la température aussi basse que possible.
Qu'est-ce que la température ?
La température contrôle le caractère aléatoire des réponses du modèle. Une valeur de température faible signifie que le modèle produit des sorties plus prévisibles et déterministes.
Pour notre cas d'utilisation, c'est exactement ce que nous voulons. Lorsqu’on lui donne la même adresse en entrée, le modèle doit toujours renvoyer la même réponse correcte. La cohérence est la clé pour des résultats fiables.
Une fois tous les paramètres en place, rendez-vous sur le Playground pour tester votre solution.
Le Playground fournit une console sur laquelle vous pouvez faire travailler votre Assistant. C'est là que le plaisir commence : vous pouvez tester rigoureusement votre solution simple pour découvrir :
Ces résultats vous aideront à affiner la section Informations correctives de votre invite, rendant ainsi votre Assistant plus robuste.
Vous trouverez ci-dessous un exemple de résultat d'un de mes tests manuels :
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Pourquoi les tests manuels sont-ils importants ?
Les tests pratiques à l’ancienne constituent la base de la création d’une solution fiable. En évaluant manuellement les sorties du modèle, vous repérerez rapidement les problèmes et comprendrez comment les résoudre. Même si l'automatisation viendra plus tard, les tests manuels constituent une étape inestimable dans la création d'une preuve de concept solide.
Il est maintenant temps de tout intégrer dans votre application PHP Symfony. La configuration est simple et suit une architecture asynchrone classique.
Voici une répartition du flux :
1.Interaction frontale
En général, ce que nous avons ici est une configuration asynchrone classique avec file d'attente de messages. Nous avons 2 instances de l'application Symfony exécutées dans le conteneur Docker. Le premier consiste à interagir avec le client frontend.
Par exemple, lorsqu'un client tape :
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
L'application traite l'adresse d'entrée et la conditionne dans un objet Message.
L'objet Message est ensuite enveloppé dans une instance Symfony Messenger Envelope. Le message est sérialisé au format JSON, avec des métadonnées supplémentaires pour le traitement.
Symfony Messenger est parfait pour gérer les tâches asynchrones. Cela nous permet de décharger les opérations fastidieuses, comme l'appel de l'API OpenAI, vers des processus en arrière-plan.
Cette approche garantit :
Vous trouverez ci-dessous la classe de message utilisée pour notre système :
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
L'application se connecte à une instance RabbitMQ à l'aide de l'extension PHP amqp. Pour configurer cela, vous devez définir la liaison de transport et de message dans votre fichier de configuration Messenger.yaml.
Référez-vous à la documentation officielle de Symfony Messenger pour des conseils détaillés :
Configuration du transport Symfony Messenger
Documentation : https://symfony.com/doc/current/messenger.html#transport-configuration
Une fois le message transmis au courtier (par exemple, RabbitMQ, AmazonMQ ou AWS SQS), il est récupéré par la deuxième instance de l'application. Cette instance exécute le démon Messenger pour consommer les messages, comme indiqué 3 dans le schéma d'architecture.
Le processus de consommation est géré en exécutant :
bin/console messager:consommer
fonctionne comme c'est le processus.
Le démon récupère le message de la file d'attente configurée, le désérialise dans la classe Message correspondante et le transmet au gestionnaire de messages pour traitement.
Voici le Gestionnaire de messages où se produit l'interaction avec l'assistant OpenAI :
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Points clés du gestionnaire
Journalisation
Enregistre le début du traitement pour la traçabilité et le débogage.
Service de normalisation
L'OpenAIAddressNormalizationService est appelé pour traiter l'adresse d'entrée via l'Assistant.
Persistance
L'adresse normalisée est enregistrée dans la base de données à l'aide d'EntityManager de Doctrine.
Le gestionnaire de messages peut ressembler à du code Symfony standard, mais le noyau se trouve dans cette ligne :
INPUT: <what goes into the LLM> OUTPUT: <what the LLM should produce>
Ce service est chargé d'interagir avec OpenAI via la bibliothèque PHP désignée.
Client PHP OpenAI
Plongeons dans la mise en œuvre du service avec l'utilisation du client PHP.
Voici l’implémentation complète d’OpenAIAddressNormalizationService :
input: STRADA EREMIA GRIGORESCU, NR.11 BL.45B,SC.B NR 11/38, 107065 PLOIESTI output: {{"street": "Eremia Grigorescu", "house_number": "11", "flat_number": "38", "block": "45B", "staircase": "45B", floor: "", "apartment": "", "landmark": "", "postcode": "107065", "county": "Prahova", 'commune': '', 'village': '', "city" "Ploiesti"}}
Le workflow pour obtenir une inférence (ou un achèvement) (essentiellement la réponse de GPT) à l'aide de la bibliothèque openai-php/client suit trois étapes principales :
La première étape consiste à configurer le client OpenAI et à récupérer l'Assistant configuré :
INPUT: BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124 OUTPUT: { "street": "Bdul 21 Decembrie 1989", "house": "93", "flat": "50", "block": "", "staircase": "", "floor": "", "apartment": "", "landmark": "", "intercom": "", "postcode": "400124", "county": "Cluj", "commune": "", "village": "", "city": "Cluj" }
Initialisation du client : La méthode OpenAI::client() crée un nouveau client à l'aide de votre clé API et de votre identifiant d'organisation.
Récupération de l'Assistant : La méthode retrieve() se connecte à l'instance spécifique de l'Assistant configurée pour votre tâche, identifiée par son ID unique.
Une fois le client et l'Assistant initialisés, vous pouvez créer et exécuter un fil de discussion pour commencer l'interaction. Un fil de discussion agit comme un pipeline de communication, gérant l'échange de messages entre l'utilisateur et l'Assistant.
Voici comment le fil de discussion est lancé :
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Après avoir lancé le fil de discussion, l'application gère la réponse. Étant donné que les processus OpenAI peuvent ne pas se terminer instantanément, vous devez interroger l'état du fil jusqu'à ce qu'il soit marqué comme « terminé » :
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Interrogation : L'application vérifie à plusieurs reprises l'état du fil de discussion (en file d'attente ou en cours). Une fois que le statut passe à « terminé », le thread contient la sortie finale.
Une fois le fil de discussion terminé, l'application récupère les messages de réponse pour en extraire l'adresse normalisée :
INPUT: <what goes into the LLM> OUTPUT: <what the LLM should produce>
L'adresse normalisée peut désormais être renvoyée au client frontal pour une utilisation immédiate ou stockée dans la base de données en tant qu'entité structurée, comme CustomerAddressNormalized, pour un traitement ultérieur.
Lorsque vous exécutez cette configuration, vous devriez pouvoir extraire et enregistrer la sortie structurée d'OpenAI pour la reconnaissance d'entités nommées et d'autres tâches de classification ou de génération.
Dans certains cas, les solutions d’IA de base ne suffisent pas. Lorsque la conformité réglementaire et les exigences commerciales exigent une grande précision, nous devons faire un effort supplémentaire pour garantir que les résultats sont factuels et fiables.
Par exemple, lors de la génération d'une structure JSON, nous devons garantir que son contenu correspond à la réalité. Un risque courant est celui du modèle hallucinant l’information – comme inventer un lieu basé sur un code postal fourni. Cela peut entraîner de graves problèmes, en particulier dans les environnements à enjeux élevés.
Vérité fondamentale avec base de connaissances
Pour éliminer les hallucinations et garantir l'exactitude des faits, nous devons fournir à l'Assistant une base de connaissances sur la vérité terrain. Cela sert de référence définitive pour le modèle, garantissant qu'il utilise des informations précises lors de l'inférence.
Mon approche : une base de connaissances sur les codes postaux
J'ai créé un fichier JSON simple (mais assez volumineux, environ 12 Mo) contenant la démarcation complète de tous les codes postaux en Roumanie. Cette structure de type dictionnaire fournit :
Code postal : La valeur d'entrée.
Informations validées : Des faits tels que la ville, le comté et le nom général du lieu correspondant.
Cette base de connaissances sert de point de référence à l'assistant lors de la reconnaissance d'entités nommées.
Structure de la base de connaissances
Voici un exemple d'extrait de la structure JSON de la base de connaissances :
{ "street": "Strada Grui", "block": "Bloc 7", "staircase": "Scara A", "apartment": "Apartament 6", "city": "Zărnești" }
Une fois la base de connaissances prête, il est temps de demander à l'Assistant de l'utiliser efficacement. Bien que vous puissiez l'intégrer directement dans l'invite, cette approche augmente l'utilisation et les coûts des jetons. C’est donc un excellent moment pour introduire le réglage précis.
Le réglage fin consiste à modifier les couches les plus externes (en particulier les matrices de poids) d'un modèle pré-entraîné, en l'adaptant à une tâche spécifique. Dans notre cas, la reconnaissance d'entités nommées (NER) est un candidat parfait.
Un modèle affiné :
L'objectif principal est d'aligner plus étroitement le modèle sur les nuances des données du monde réel qu'il traitera. La formation sur des données spécifiques à un domaine permet au modèle de mieux comprendre et de générer des réponses appropriées. Cela réduit également le besoin de post-traitement ou de correction d'erreurs par l'application.
Pour affiner le modèle, nous avons besoin d'un ensemble de données correctement formaté au format .jsonl (JSON Lines), comme l'exige OpenAI. Chaque entrée de l'ensemble de données comprend :
Cet ensemble de données fournit à l'Assistant des exemples spécifiques à un domaine, lui permettant d'apprendre comment répondre à des invites similaires à l'avenir.
Voici un exemple de la façon de structurer une entrée de réglage fin :
STRADA GRUI, BLOC 7, SCARA A, APARTAMENT 6, ZĂRNEŞTI BD. 21 DECEMBRIE 1989 nr. 93 ap. 50, CLUJ, 400124
Décomposons la structure d'une entrée de réglage fin dans le fichier .jsonl, en utilisant notre cas de traitement d'adresse roumain comme exemple :
Chaque entrée est conçue pour simuler une véritable interaction entre l'utilisateur et l'Assistant, encapsulant :
Cette approche aide le modèle à apprendre le comportement souhaité dans des contextes du monde réel.
1. Message de rôle système
Décrit les capacités de l'assistant et l'étendue de ses fonctionnalités, en définissant les attentes concernant les types d'entités qu'il doit reconnaître et extraire, telles que les noms de rue, les numéros de maison et les codes postaux.
Exemple : le système explique que l'assistant est conçu pour fonctionner comme un modèle de reconnaissance d'entités nommées pour les adresses roumaines, détaillant les composants qu'il doit extraire et classer.
2. Message sur le rôle de l'utilisateur
3. Message sur le rôle d'assistant
Une fois le dossier de formation créé, l’étape suivante consiste à préparer un dossier de validation. Ce fichier évalue la précision de l'Assistant affiné sur des données réelles. La structure est similaire à celle du fichier de formation, ce qui rend l'automatisation de la création des deux fichiers plus simple.
Le fichier de validation est conçu pour tester les capacités de généralisation du modèle. Cela garantit que l'Assistant optimisé peut gérer de nouvelles entrées et fonctionner de manière cohérente, même lorsqu'il est confronté à des exemples peu familiers ou difficiles.
Message système :
Pour maintenir la cohérence avec le processus de formation, le message système doit être identique à celui utilisé dans le fichier de formation.
Message de l'utilisateur :
Introduit une nouvelle entrée (par exemple, une adresse) qui n'était pas incluse dans le fichier de formation. Le nouvel exemple doit être réaliste et spécifique à un domaine, et remettre en question le modèle en incluant des erreurs ou des complexités mineures.
Message de l'assistant :
Fournit la réponse structurée attendue pour la nouvelle entrée utilisateur.
Cela sert de référence pour valider l’exactitude du modèle.
Pour rationaliser la création de fichiers de formation et de validation, des scripts d'automatisation peuvent être utilisés. Ces scripts génèrent des fichiers .jsonl correctement formatés en fonction des ensembles de données d'entrée.
Visitez le référentiel contenant les scripts pour générer les fichiers de formation et de validation :
Scripts de génération .jsonl automatisés
C'est une version Python de l'automatisation de réglage fin. La version PHP arrive bientôt.
Pourquoi la validation est importante ?
Si vous préférez, vous pouvez affiner l'Assistant manuellement à l'aide de l'interface utilisateur graphique (GUI) d'OpenAI. Une fois que vous avez préparé les dossiers de formation et de validation, suivez ces étapes pour commencer :
Étape 1 : Accédez à l'assistant de réglage fin
Étape 2 : Configurer le réglage fin
Dans le menu de réglage fin, mettez à jour les paramètres suivants :
Étape 3 : Surveiller le processus de réglage fin
Une fois le processus de réglage fin lancé, vous pouvez suivre sa progression dans le tableau de bord de réglage fin :
Le tableau de bord fournit des mises à jour en temps réel et affiche plusieurs mesures pour vous aider à surveiller et évaluer le processus de formation.
Mesures clés à comprendre
Perte d'entraînement Mesure dans quelle mesure le modèle s'adapte aux données d'entraînement. Une perte de formation inférieure indique que le modèle apprend efficacement des modèles au sein de l'ensemble de données.
Perte de validation complète Indique les performances sur les données invisibles de l'ensemble de données de validation. Une perte de validation plus faible suggère que le modèle se généralisera bien à de nouvelles entrées.
Étapes et temps Les étapes de formation sont un nombre d'itérations où les poids du modèle sont mis à jour en fonction de lots de données.
L'horodatage indique quand chaque étape a été traitée, ce qui permet de surveiller la durée de l'entraînement et les intervalles entre les évaluations.
Interprétation des métriques
La surveillance des métriques ci-dessous vous aide à déterminer si le processus de réglage fin converge correctement ou nécessite des ajustements.
Sous-ajustement : Se produit lorsque les deux pertes restent élevées, ce qui montre que le modèle n'apprend pas efficacement.
Une fois votre Assistant formé et affiné, il est temps de l'intégrer à votre application et de commencer à évaluer ses performances.
Commencez simplement.
Commencez par des tests manuels, soit dans Assistants Playground, soit directement dans votre application. Évitez de trop compliquer votre évaluation à ce stade ; concentrez-vous sur le fait que les bases fonctionnent comme prévu.
Par exemple, vous pouvez utiliser un outil simple comme Google Sheets pour comparer manuellement l'entrée et la sortie, comme indiqué ici :
C'est la première étape.
Les solutions d'IA et de ML nécessitent une évaluation continue pour garantir que les performances restent cohérentes. Pour des tâches telles que la reconnaissance d'entités nommées, des outils automatisés tels que l'extension PromptFlow pour Visual Studio Code peuvent aider à rationaliser les tests et la validation.
Références
Documentation de réglage fin d'OpenAI
Documentation Symfony Messenger
Bibliothèque cliente OpenAI PHP
Extension PromptFlow pour VS Code
Merci !
Merci d'avoir pris le temps d'explorer ce guide ! J'espère qu'il vous fournira une base solide pour créer et affiner vos solutions basées sur l'IA. Si vous avez des questions ou des suggestions, n'hésitez pas à nous contacter ou à laisser un commentaire.
Bon codage et bonne chance avec vos projets d'IA ! ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!