Lorsque j'ai expérimenté ChatGPT-3.5 pour la première fois après sa sortie, j'ai été enthousiasmé par son potentiel pour diverses applications. Cependant, mon enthousiasme s'est rapidement estompé lorsque j'ai rencontré un obstacle majeur : même si les informations précieuses renvoyées étaient exceptionnellement lisibles, elles n'étaient pas sous une forme qui pouvait être ingérée de manière fiable par une application. Ironiquement, les LLM excellent dans l'extraction d'informations à partir d'un texte non structuré, mais ne peuvent les restituer que sous une forme non structurée. Essayer d'extraire par programmation les résultats des LLM, c'était comme être dans un restaurant incroyable qui sert la nourriture la plus délicieuse, mais sans aucun ustensile - vous pouvez le voir et le sentir, mais vous ne pouvez tout simplement pas y accéder.
J'ai essayé toutes les astuces du livre pour l'amadouer et me donner un semblant de données structurées. "S'il vous plaît, séparez simplement chaque élément par une barre ou une nouvelle ligne et sautez le commentaire", je plaiderais. Parfois ça marchait, parfois non. Parfois, il numérotait ou réorganisait « utilement » les éléments, comme un assistant bien intentionné mais légèrement confus. D’autres fois, il s’agissait encore d’un commentaire furtif, rappelant celui d’un collègue bavard. Je lui ai même demandé en termes clairs de renvoyer JSON et rien d'autre, mais il a parfois laissé de côté une virgule - presque comme s'il s'agissait d'un coup passif-agressif. Finalement, j'ai abandonné et suis revenu à contrecœur aux limites moins excitantes mais plus prévisibles des algorithmes traditionnels.
Heureusement, quelques mois plus tard, OpenAI a introduit le mode JSON, une fonctionnalité qui oblige le LLM à renvoyer un JSON valide. J'ai décidé d'essayer cette fonctionnalité et je l'ai trouvée nettement plus efficace pour traiter les résultats dans mes applications. Voici un exemple de sortie avec le mode JSON activé :
PROMPT: Parse the following sentence into words and then return the results as a list of the original word and the translation in English and return the results in JSON. -- sentence -- 早安 RESULTS: { "results": [ { "original": "早安", "translation": "Good morning" } ] }
Cette sortie est certainement une amélioration. Cependant, même si la sortie est un JSON valide, sa structure peut varier en fonction du contenu de l'invite. Une approche plus prévisible consiste à spécifier le format de retour souhaité. Une façon d'y parvenir consiste à fournir un exemple de structure JSON à suivre pour le LLM. Cette méthode consiste à créer un exemple et à écrire du code pour l'analyser. Si la structure change, des modifications doivent être faites aux deux endroits.
Une approche alternative consiste à définir un objet de transfert de données (DTO) pour contenir les résultats et à l'utiliser à la fois pour instruire le LLM et pour analyser les résultats, évitant ainsi les problèmes de synchronisation. Tout d'abord, définissez le DTO, par exemple :
record Entries(List<Entry> entries) { record Entry(String originalWord, String wordInEnglish, String pronunciation) {} }
Maintenant, le DTO peut être utilisé dans les instructions d'invite ainsi que par le code d'analyse :
// Construct the prompt with the output schema. var prompt = MessageFormat.format(""" Parse the following sentence into English and return the results in JSON according to the following JSON schema. 人工智慧將引領未來,以智慧之光照亮人類無限可能的前程。 --- output json schema --- {0} """, jsonSchemaOf(Entries.class)); var result = sendPrompt(prompt, Entries.class);
Voici le code qui utilise le générateur de schéma Jackson JSON :
PROMPT: Parse the following sentence into words and then return the results as a list of the original word and the translation in English and return the results in JSON. -- sentence -- 早安 RESULTS: { "results": [ { "original": "早安", "translation": "Good morning" } ] }
Remarque : par défaut, le schéma généré inclura les champs d'ID utilisés pour les références, ce qui peut gaspiller des jetons. Consultez l'exemple de mode OpenAI JSON du référentiel pour le code qui supprime ces identifiants inutilisés.
Et enfin, voici le code qui envoie l'invite à OpenAI à l'aide du SDK Java Azure OpenAI :
record Entries(List<Entry> entries) { record Entry(String originalWord, String wordInEnglish, String pronunciation) {} }
La solution fonctionne bien la plupart du temps. Le LLM comprend efficacement le schéma JSON mais un mot d'avertissement : j'ai vu des cas où il se trompe parfois. Par exemple, si un champ est une chaîne et que son nom est au pluriel (par exemple « exampleValues »), le LLM insiste parfois pour renvoyer un tableau de chaînes à la place.
Les LLM peuvent générer des résultats remarquables, dépassant parfois les capacités de la personne moyenne. Cependant, il est fascinant de constater que, du moins pour le moment, ils ont du mal à accomplir la tâche la plus banale consistant à formater de manière fiable leur sortie générée.
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!