Face à l'explosion de l'IA et des modèle de langage (LLM) dans le quotidien des développeurs il est parfois difficile de trouver une utilisation qui sorte véritablement du lot.
Aujourd'hui, nous vous proposons de découvrir l'un de ces packages innovants : explorons le package cognesy/instructor-php qui vous permettra d'analyser puis d'extraire des informations depuis un texte brut directement dans une classe en PHP !
Installation
Le package nécessitera au minimum une version 8.2 de PHP, 11 de Laravel et s'installera simplement avec composer
:
1composer require cognesy/instructor-php
Par défaut, le package utilisera les API d'OpenAI, il sera nécessaire de créer puis de la placer dans votre .env
la clé d'API suivante :
1OPENAI_API_KEY=
De nombreux autres LLM sont également supporté
C'est bon, vous êtes prêt à utiliser le package !
Usage basique
Pour commencer, nous allons définir une classe qui représentera la structure de données que nous allons chercher à extraire, dans notre cas, nous allons essayer d'identifier des personnes ayant un nom et un âge :
1class Person2{3 public string $name;4 public int $age;5}
Maintenant, créons une simple phrase que nous allons analyser pour en extraire des personne :
1$text = "His name is Jason and he is 28 years old.";
Nous n'avons plus qu'à utiliser le service Instructor
du package en lui transmettant le texte ainsi que la structure de données à extraire :
1$instructor = new Instructor();2 3$person = $instructor->request(4 messages: $text,5 responseModel: Person::class,6)->get();7 8$person->name; // Jason9$person->age; // 28
Dans cet exemple, nous nous contentons d'analyser et d'extraire une seule instance de la classe Person
, il est tout à fait possible d'indiquer à l'instructeur qu'une liste de personnes doit être extraite. Pour ce faire, modifions notre texte afin d'y ajouter plusieurs individus :
1$text = <<<TEXT2Jason is 25 years old. Jane is 18 yo. John is 30 years old3and Anna is 2 years younger than him.4TEXT;
Ce texte est intéressant car il nécessite une compréhension plus poussée pour en déduire certaines informations. L'âge d'Anna n'est pas écrit explicitement, il faut le déduire à partir de l'âge de John. Cet exemple, bien que trivial, démontre les capacités de compréhension du modèle lors de l'extraction !
1$instructor = new Instructor(); 2 3$sequence = $instructor->request( 4 messages: $text, 5 responseModel: Sequence::of(Person::class), 6)->get(); 7 8$persons = $sequence->list; 9 10count($persons); // 411 12$persons[3]->name; // Anna13$persons[3]->age; // 28
L'instructeur a correctement identifié les quatre individus ainsi que l'âge d'Anna !
Afin d'aider et de maximiser l'extraction des informations, le package offre également la possibilité d'annoter les différentes propriétés de notre classe cible en fournissant du contexte supplémentaire ou des instructions de traitement à l'instructeur.
Peut-être que la propriété "âge" pourrait prêter à confusion pour le LLM ? Dans ce cas, précisons-lui l'intention de la propriété à l'aide de l'annotation Description
.
Nous pouvons également appliquer une règle de formatage à une propriété à l'aide de l'annotation Instructions
, par exemple, nous voulons que le nom extrait soit toujours en majuscules :
1use Cognesy\Instructor\Schema\Attributes\Description; 2use Cognesy\Instructor\Schema\Attributes\Instructions; 3 4#[Description("Information about Person")] 5class Person { 6 #[Instructions("Make person name ALL CAPS")] 7 public string $name; 8 #[Description("Person's age")] 9 public int $age;10}
Ces instructions supplémentaires se font en langage naturel et il vous sera extrêmement facile d'ajouter du contexte pour améliorer l'extraction par l'instructeur !
Les exemples que nous vous présentons dans cet article sont relativement simplistes, mais le package est également capable d'analyser des chaînes de texte complexes contenant des éléments en cascade à extraire !
1class Person { 2 public string $name; 3 /** @var Skill[] */ 4 public array $skills; 5} 6 7class Skill { 8 public string $name; 9 public SkillType $type;10}11 12enum SkillType : string {13 case Technical = 'technical';14 case Other = 'other';15}
Bien d'autres fonctionnalités plus avancées sont également disponibles, il vous sera possible de configurer le prompt utilisé par l'instructeur afin de préciser l'origine du texte ou le résultat attendu.
Vous pourrez également définir la structure de données que le LLM devra analyser dans votre texte avant d'assigner les différentes propriétés de la classe cible, cette option sera utile pour vos textes les plus verbeux.
Les recherches dans des fichiers volumineux pourraient également s'avérer longues et fastidieuses, un mode streaming vous permettra d'afficher en flux continu les résultats extraits avant la fin de l'analyse.
Vous trouverez dans la documentation, dans la section examples, un ensemble de cas d'utilisation, du plus simple au plus complexe, qui vous offrira un éventail des possibilités du package.
Conclusion
Pour conclure, cognesy/instructor-php est un outil extrêmement puissant et déjà riche de bon nombre de fonctionnalités malgré sa relative jeunesse.
L'outil n'est pas toujours simple à appréhender et les anomalies provoquées par les modèles LLM peuvent parfois générer des résultats incohérents ou imprévisibles.
Pour autant, la rapidité avec laquelle vous obtiendrez des premières extractions pertinentes est relativement déconcertante et devrait vous motiver à explorer davantage la documentation !
Source : https://github.com/cognesy/instructor-php
A lire
Autres articles de la même catégorie
Une façon différente d’organiser son application avec Laravel Actions
Présentation du paquet lorisleiva/laravel-actions mettant en avant une façon différente d'organiser le code
Marc COLLET
Type-Safe de A à Z
Unifiez les types entre le backend et le frontend pour réduire les bugs et améliorer la cohérence de votre code
Rémy Guillermic
Améliorez vos tests avec Infection
Vos tests seront-ils suffisamment exhaustifs pour être à l'épreuve de mutations ?
Mathieu De Gracia