Exploitez l'IA pour l'analyse et l'extraction de texte

Publié le 21 août 2024 par Mathieu De Gracia
Couverture de l'article Exploitez l'IA pour l'analyse et l'extraction de texte

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 Person
2{
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; // Jason
9$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 = <<<TEXT
2Jason is 25 years old. Jane is 18 yo. John is 30 years old
3and 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); // 4
11 
12$persons[3]->name; // Anna
13$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
Mathieu De Gracia avatar
Mathieu De Gracia
Des fois, mon chat code à ma place 🐱

A lire

Autres articles de la même catégorie