Dans le cours : Créer des agents IA avec LangChain et LlamaIndex
Exploiter les call functions
Dans le cours : Créer des agents IA avec LangChain et LlamaIndex
Exploiter les call functions
L'un des concepts les plus intéressants lorsque nous travaillons avec les API et les LLM, c'est l'utilisation des Functions Call. Alors, c'est quoi une Function Call ? En quelques mots, une Function Call, c'est le fait de vouloir interroger un LLM avec un prompt. Cependant, lorsque le LLM analyse notre prompt pour répondre, donc pour donner la réponse à notre prompt, il va avoir besoin d'avoir des informations supplémentaires. En réalité, il ne le saura qu'en analysant le prompt. C'est-à-dire, on lui envoie un prompt, donc lui, il va l'analyser tout le prompt et il va détecter un certain nombre d'éléments à partir du prompt, puis il va se dire : « Il me faut telle ou telle autre information pour fournir une réponse pertinente. » Alors, qu'est-ce qu'on va faire ? On va dire à notre LLM que lorsque tu vas essayer de répondre à ce prompt, si tu constates que tu as besoin d'une information en particulier, tu peux me la demander en appelant telle ou telle autre fonction. On va faire un exemple très simple, dans lequel nous allons demander la météo pour une ville donnée et on va voir comment on peut utiliser ce concept de Functions Call. Dans cet exemple, cette fonction, elle fait quelque chose de très simple, elle reçoit une chaîne de caractères city qui va représenter le nom d'une ville. Puis elle me retourne un json en indiquant que la température dans la ville city est égale à un chiffre aléatoire entre 1 et 70. On peut mettre plutôt entre -40 ou deux valeurs qui peuvent être vraies dans la réalité, mais nous, on va mettre entre 1 et 70. Donc ça, c'est une fonction qui peut accéder au service interne d'une entreprise. C'est une méthode qui va être appelée à un moment donné, et cette méthode, elle va recevoir ici un argument. Puis après, elle va utiliser cet argument pour nous retourner une structure de données avec l'information concernant la température estimée de la ville city. Donc l'idée, c'est vraiment d'avoir un service qui accède à des données privées d'une entreprise ou à un site Internet ou à n'importe quelle source de données. Ici, weather_tool, je définis justement la mécanique d'appel à ma Function Call. Donc ici, la Fonction Call, c'est en fait la fonction qui va être appelée, celle-ci, get_weather_for_city. Là, je définis juste un outil dont le nom est weather_tool, qui est attaché à notre fonction. C'est là où je fais l'association entre cet outil tool et cette fonction. Puis je donne la description de mon outil en disant que cet outil permet d'obtenir l'information concernant la température d'une ville. Donc, j'ai weather_tool, et je crée mon LLM comme nous l'avons fait précédemment, tout simplement. Puis aprés je définis un agent en utilisant cette fonction initialize_agent, dans laquelle, regardez j'ai un tableau, une liste tools dans laquelle je peux indiquer un certain nombre d'outils. Ici, je peux en définir plusieurs. Moi, dans cet exemple, je n'ai qu'une seule fonction attachée à cet outil, à ce tool. J'ai un seul tool, mais je peux en avoir un certain nombre, je peux en avoir trois, quatre, cinq, autant que j'en souhaite. Et je dis que cet agent utilise ce LLM que je crée avec ChatOpenAI. Puis tout simplement, je récupère un prompt : « Quel temps fait-il à Paris ? » En fait, je fais response = agent.invoke avec le prompt et on va visualiser la réponse. Qu'est-ce qu'il va se passer lors de cet appel ? Le LLM utilisé ici va analyser cette phrase, mais cette fois, mon agent, ici, l'agent qui va gérer tous les appels vers le LLM et vers mes fonctions, en fait il va regarder, il va demander au LLM d'analyser ce prompt et de voir est-ce que pour répondre à ce prompt il aura besoin d'utiliser un des outils attachés à cet agent. Je n'ai qu'un seul ici. Et notre LLM, il va dire : « Oui, j'aimerais connaître la température à Paris. » En tout cas, je dois avoir des informations concernant Paris pour répondre à la question « Quel temps fait-il à Paris ? » Pourquoi le LLM il va dire ça ? Parce qu'il va savoir que nous avons fourni un outil dans la description justement, cet outil-là. Et cette description est la suivante : « Provides the weather information for a given city. » Donc notre LLM lorsqu'il va voir qu'il y a un outil est attaché à cet agent et qui permet d'obtenir des informations liées sur le temps d'une ville, à ce moment-là il va se dire : « J'ai détecté que le prompt concerne bien une question relative au temps qu'il va avoir lieu dans une ville et j'ai un outil qui permet de me donne cette information, donc je vais l'utiliser. » Alors tout ça pour dire qu'avec les Functions Call, la fonction, elle ne va pas forcément appelée. Nous, tout simplement, ce que nous faisons, c'est de déclarer un agent ici, de dire cet agent, il dispose d'un certain nombre d'outils qu'on peut lister ici. Chaque outil sera défini avec sa structure et associé à une fonction et une description. En fait, le LLM va analyser le prompt et il va se dire : « Je dispose d'un certain nombre d'outils. » Et il va lire les descriptions de tous ces outils. Il va savoir si pour répondre à ce problème, il a besoin d'utiliser un ou plusieurs outils parmi ceux que nous lui avons fournis. Sinon, il va répondre directement à notre prompt. J'exécute ce programme. C'est le programme /03_02_langchain, et je lance l'exécution. Ici, j'ai mis un warning, parce que comme on retourne une structure JSON ici, dans la dernière version de LangChain, il y a d'autres manières de faire pour s'en assurer que le type de retour est de type JSON. Ici, j'ai un message de type warning juste pour m'indiquer que certaines des fonctionnalités que j'utilise vont être remplacées. Ce n'est pas très important. En l'occurrence, il s'agit d'utiliser, ici il me dit : La fonction initialize_agent est deprecated dans LangChain 0.1. Il me dit : Utilise plutôt agent constructor methods like create_react_agent, etc. Mais l'idée, en tout cas, de ce programme est de voir que quand on a lancé notre prompt ici, on a fait invoke et on a affiché la réponse. Quand on a fait invoke, ce qui s'est passé, c'est qu'il y a eu ici l'appel à la méthode get_weather_for_city for Paris. Et là, il me dit qu'input, c'est « Quel temps fait-il à Paris ? » Donc ça, c'est l'agent a reçu cet input, et son output, c'est : « Il fait 40 degrés à Paris. » Si je réexécute, je vais avoir éventuellement une autre réponse, puisque nous, on a un peu triché dans notre programme. Voilà, j'ai 48 degrés à Paris. J'espère que ça n'a jamais arrivé ! D'avoir 48 degrés à Paris. Pourquoi ? Parce qu'effectivement nous, ici, on a une fonction un peu qui retourne une valeur aléatoire. Mais l'idée c'est de dire qu'on peut exécuter des fonctions qui vont accèder à des données privées ou à des sources particulières et qui vont compléter la réponse. Le résultat de leur exécution va être utilisé par le LLM pour compléter sa réponse.
Table des matières
-
-
-
-
-
(Verrouillé)
Comprendre les LLM functions2 m 41 s
-
Exploiter les call functions7 m 30 s
-
(Verrouillé)
Étendre un LLM avec un agent LangChain5 m 49 s
-
(Verrouillé)
Configurer la trousse à outils d'un agent5 m 41 s
-
(Verrouillé)
Suivre le flux d'exécution d'un agent4 m 54 s
-
Étendre un LLM avec un agent LlamaIndex7 m 46 s
-
(Verrouillé)
-