Une des techniques les plus efficace pour améliorer la performance d’un prompt est la Chaine de pensée (Chain of Thought ou CoT).
Cette technique peut s’appliquer dans toutes les situations du LLM Engineering:
- Génération de contenu
- Création d’entités structurées
- Workflow d’Agents
- Étape de Génération d’un RAG
- Extraction de facettes
- et bien d’autres!
Pour bien comprendre le fonctionnement de la Chaine de pensée et comment l’utiliser, il est nécessaire de comprendre le fonctionnement interne d’un LLM durant le processus d’inférence (génération).
Fonctionnement de la Chaine de pensée
Comme souvent avec les LLMs, on peut faire une analogie avec le raisonnement humain.
Pour mieux résoudre un problème, on peut par exemple le découper en plusieurs tâches ou bien résumer toutes les données disponible en amont.
Cela nous permet de mieux structurer notre pensée pour résoudre le problème.
La Chaine de pensée est une technique relativement similaire qui exploite les capacités probabilistes des LLMs afin de renforcer le champ sémantique de ce que l’on souhaite faire générer.
Concrètement, cela consiste la plupart du temps à donner des exemples ou faire générer des étapes intermédiaires au LLM pour mieux guider la génération de la réponse finale.
Boucle d’inférence
Pour bien comprendre les mécanismes sous-jacent de la Chaine de pensée, il faut comprendre le fonctionnement de l’inférence (la génération).
L’inférence, c’est le processus dans lequel un prompt est fourni à un LLM et une réponse est fournie à l’utilisateur.
Lors de l’inférence, l’ensemble des tokens du prompt est passé au LLM qui va ensuite proposer le token ayant le plus de probabilités d’apparaitre.
Puis l’ensemble du prompt + ce nouveau token sont à nouveau passés au LLM qui propose le token suivant et ainsi de suite.
Ce processus est répété jusqu’à ce que le LLM propose un token spécial qui indique la fin de la génération. À ce moment la, plutôt que de repartir pour un cycle d’inférence, le résultat est renvoyé à l’utilisateur du modèle.
Cela signifie que les tokens générés par le LLM sont aussi pris en compte dans la génération et c’est l’explication du mécanisme de la Chaine de pensée.
Un Prompt Engineer peut donc utiliser deux leviers lorsqu’il réfléchit à son inférence:
- Le texte du prompt initial
- Les étapes de génération intermédiaires
4 exemples concrets pour comprendre
Passons maintenant à la pratique avec 4 utilisations de la Chaine de pensée dans des cas concrets plutôt que des « Hello World Foobar » eux même générés par un LLM pour faire du SEO.
Chaque exemple présente un cas d’usage concret de LLM Engineering et est accompagné d’un exemple de génération avec GPT-4o.
Génération de contenu
Un des cas d’usage récurrent des LLM est la génération d’un résumé.
Plutôt que de demander directement au LLM de générer un résumé, nous pouvons d’abord lui demander de générer une table des matières puis un résumé.
Cela mettra l’accent sur les chapitres à résumer car ils seront listés dans les étapes de génération intermédiaires.
Le résultat final aura donc plus de chance d’être exhaustif sur le contenu du document initial.
Tu es doté d’un excellent esprit de synthèse. Je vais te donner le contenu d’un document et tu auras deux tâches: - Commence par écrire la table des matières de ce document en incluant tous les niveaux de titres - Termine par écrire un résumé du contenu du document en t’aidant de la table des matières # Begin Document {{ document }} # End Document
Dans ce exemple, la technique de Chaine de pensée nous permet de faire extraire des informations du texte (la table des matières) afin de guider la génération finale.
Voir la génération de contenu avec Chaine de pensée
Création d’entités structurés
La Chaine de Pensée est aussi très utile pour contrôler le format de génération d’entités structurées.
Ici, nous pouvons directement donner au LLM des exemples du format de réponse attendu:
Tu es un excellent pédagogue capable de créer des cours de qualité. A partir du document suivant, extrait les messages clés ainsi que les changements attendus. # Begin Document {{ document }} # End Document Utilise le format YAML suivant pour répondre: ```yaml granules: - keyMessage: “un message clé” desiredChange: “changement attendu lorsque l’apprenant aura compris le message clé” - keyMessage: “un autre message clé” desiredChange: “changement attendu lorsque l’apprenant aura compris le message clé” ```
Ici, ces exemples vont réduire fortement les chances d’avoir des hallucinations dans la réponse finale du LLM.
Voir la création d’entités structurés avec Chaine de pensée
Agent LLM
Dans le fonctionnement d’un Agent LLM, il est préférable de demander au LLM de générer explicitement un plan des actions qu’il doit réaliser pour accomplir sa tâche.
Tu es un Agent semi-autonome capable d’utiliser des outils pour accomplir une tâche. Ta tâche est de réserver un créneau de réunion pour les personnes suivantes: - Adrien - Hubert Tu peux utiliser les outils suivants: - listMeetings(name: string): liste les réunions à venir d’une personne - bookMeeting(nameA: string, nameB: string, time: Date): réserve une réunion Commence par faire un plan des actions que tu vas devoir réaliser pour résoudre ta tâche. Ensuite répond avec les outils que tu veux utiliser dans un bloc YAML, exemple: ```yaml tools: - name: listMeetings arguments: [“Aschen”] ```
A partir de ce prompt, le LLM devrait commencer par donner la liste des actions qu’il estime devoir utiliser et cela lui permettra d’utiliser les outils fournis à bon escient.
Exemple d’un Agent LLM avec chaine de pensée
Étape de génération d’un RAG
Dans un cas d’usage RAG, l’utilisation de la Chaine de pensée peut améliorer la qualité de la réponse générée tout en réduisant les hallucinations.
Le défi de cet étape est de faire utiliser au LLM le contenu des documents retrouvés pour répondre à la question.
Nous pouvons donc commencer par demander au LLM de faire un résumé des informations pertinentes contenues dans les documents:
Tu dois répondre à la question suivante d’un utilisateur: {{ userQuestion }} Tu dois utiliser le contenu des documents suivants pour répondre: # Begin Documents {{ documents }} # End Documents Commence par lister les informations de chaque document qui sont pertinentes pour répondre à la question de l’utilisateur. Ensuite, utilise ces informations pour générer une réponse directe à la question de l’utilisateur. Utilise le format YAML suivant pour répondre: ```yaml informations: - “extrait d’un document pertinent par rapport à la question” - “un autre extrait d’un document” - “utilise autant d’extrait de document que nécessaire” finalAnswer: “réponse finale à la question de l’utilisateur en t’aidant des informations extraites des documents” ```
L’étape d’extraction des informations jugées pertinente permettra au LLM de renforcer ce champ sémantique lorsqu’il devra générer la réponse finale car tous les tokens précédemment générés seront aussi utilisés.
Exemple de génération RAG avec Chaine de pensée
Conclusion
La Chaine de pensée est une technique très efficace pour améliorer la performance des prompts.
Elle permet de renforcer le champ sémantique du résultat attendu de deux manières différentes:
- Chaine de pensée explicite: en donnant des exemples du résultat attendu dans le prompt
- Chaine de pensée interne: en indiquant au LLM de générer des étapes de “raisonnement” intermédiaire
La deuxième technique est particulièrement efficace car elle permet d’utiliser les capacités du LLM pour extraire des informations qu’il pourra lui même utiliser lors de l’étape finale de génération !
Finalement, la Chaine de pensée peut s’utiliser à l’intérieur d’un même prompt mais peut aussi être découpée dans une Chaine de prompt afin d’améliorer encore les performances.
Bien sur, cela augmente la latence et les coûts mais dans bien des situations le résultat est à la hauteur de l’investissement 😉
Laisser un commentaire