You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Web-Dev-For-Beginners/translations/fr/10-ai-framework-project/README.md

51 KiB

Cadre dIA

Vous vous êtes déjà senti dépassé en essayant de créer des applications dIA à partir de zéro ? Vous nêtes pas seul ! Les cadres dIA sont comme un couteau suisse pour le développement dIA ce sont des outils puissants qui peuvent vous faire gagner du temps et éviter bien des maux de tête lors de la création dapplications intelligentes. Pensez à un cadre dIA comme à une bibliothèque bien organisée : il fournit des composants préconstruits, des API standardisées et des abstractions intelligentes pour que vous puissiez vous concentrer sur la résolution de problèmes au lieu de vous battre avec les détails dimplémentation.

Dans cette leçon, nous explorerons comment des cadres comme LangChain peuvent transformer des tâches dintégration dIA autrefois complexes en un code propre et lisible. Vous découvrirez comment relever des défis concrets tels que le suivi des conversations, la mise en œuvre de lappel doutils et la gestion de différents modèles dIA via une interface unifiée.

Quand nous aurons terminé, vous saurez quand privilégier les cadres plutôt que les appels API bruts, comment utiliser efficacement leurs abstractions, et comment construire des applications dIA prêtes pour une utilisation réelle. Explorons ce que les cadres dIA peuvent faire pour vos projets.

Ce que vous pouvez faire dans les 5 prochaines minutes

Parcours rapide pour développeurs pressés

flowchart LR
    A[⚡ 5 minutes] --> B[Installer LangChain]
    B --> C[Créer un client ChatOpenAI]
    C --> D[Envoyer la première invite]
    D --> E[Voir la puissance du framework]
  • Minute 1 : Installer LangChain : pip install langchain langchain-openai
  • Minute 2 : Configurez votre jeton GitHub et importez le client ChatOpenAI
  • Minute 3 : Créez une conversation simple avec des messages système et utilisateur
  • Minute 4 : Ajoutez un outil basique (comme une fonction add) et voyez lappel doutil IA
  • Minute 5 : Expérimentez la différence entre appels API bruts et abstraction via cadre

Code de test rapide :

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini"
)

response = llm.invoke([
    SystemMessage(content="You are a helpful coding assistant"),
    HumanMessage(content="Explain Python functions briefly")
])
print(response.content)

Pourquoi cest important : En 5 minutes, vous verrez comment les cadres dIA transforment une intégration complexe en appels de méthodes simples. Cest la base qui alimente les applications dIA en production.

Pourquoi choisir un cadre ?

Vous êtes prêt à construire une application dIA super ! Mais voilà : plusieurs voies soffrent à vous, chacune ayant ses avantages et inconvénients. Cest un peu comme choisir entre marcher, faire du vélo ou conduire pour aller quelque part elles vous mèneront toutes à destination, mais lexpérience (et leffort) seront totalement différents.

Analysons les trois principales façons dintégrer lIA dans vos projets :

Approche Avantages Idéal pour Considérations
Requêtes HTTP directes Contrôle total, aucune dépendance Requêtes simples, apprentissage des bases Code plus verbeux, gestion des erreurs manuelle
Intégration SDK Moins de code répétitif, optimisation par modèle Applications mono-modèle Limité à certains fournisseurs spécifiques
Cadres dIA API unifiée, abstractions intégrées Applications multi-modèles, workflows complexes Courbe dapprentissage, possible sur-abstraction

Bénéfices pratiques des cadres

graph TD
    A[Votre Application] --> B[Cadre d'IA]
    B --> C[OpenAI GPT]
    B --> D[Anthropic Claude]
    B --> E[Modèles GitHub]
    B --> F[Modèles Locaux]
    
    B --> G[Outils Intégrés]
    G --> H[Gestion de la Mémoire]
    G --> I[Historique des Conversations]
    G --> J[Appel de Fonction]
    G --> K[Gestion des Erreurs]

Pourquoi les cadres comptent :

  • Unifie plusieurs fournisseurs dIA sous une même interface
  • Gère automatiquement la mémoire de conversation
  • Fournit des outils prêts à lemploi pour tâches courantes comme embeddings et appels de fonction
  • Gère la gestion des erreurs et la logique de réessai
  • Transforme des workflows complexes en appels de méthodes lisibles

💡 Astuce de pro : Utilisez un cadre lorsque vous souhaitez alterner entre différents modèles dIA ou construire des fonctionnalités complexes comme des agents, de la mémoire ou lappel doutils. Privilégiez les API directes pour apprendre les bases ou créer des applications simples et ciblées.

En résumé : Comme choisir entre des outils spécialisés dartisan et un atelier complet, il sagit dadapter loutil à la tâche. Les cadres excellent pour des applications complexes et riches en fonctionnalités, tandis que les API directes conviennent aux cas dusage simples.

🗺️ Votre parcours dapprentissage vers la maîtrise des cadres dIA

journey
    title Des API brutes aux applications IA en production
    section Fondations du cadre
      Comprendre les avantages de l'abstraction: 4: You
      Maîtriser les bases de LangChain: 6: You
      Comparer les approches: 7: You
    section Systèmes de conversation
      Construire des interfaces de chat: 5: You
      Mettre en œuvre des modèles de mémoire: 7: You
      Gérer les réponses en streaming: 8: You
    section Fonctionnalités avancées
      Créer des outils personnalisés: 6: You
      Maîtriser la sortie structurée: 8: You
      Construire des systèmes de documents: 8: You
    section Applications en production
      Combiner toutes les fonctionnalités: 7: You
      Gérer les scénarios d'erreur: 8: You
      Déployer des systèmes complets: 9: You

Votre destination : À la fin de cette leçon, vous maîtriserez le développement avec cadres dIA et serez capable de créer des applications dIA sophistiquées et prêtes pour la production, dignes des assistants IA commerciaux.

Introduction

Dans cette leçon, nous allons apprendre à :

  • Utiliser un cadre dIA courant.
  • Aborder des problèmes courants comme les conversations, lusage doutils, la mémoire et le contexte.
  • Exploiter cela pour construire des applications dIA.

🧠 Écosystème de développement des cadres dIA

mindmap
  root((Cadres d'IA))
    Avantages de l'Abstraction
      Simplification du Code
        API Unifiées
        Gestion d'Erreurs Intégrée
        Modèles Cohérents
        Réduction du Code Redondant
      Support Multi-Modeles
        Fournisseur Agnostique
        Changement Facile
        Options de Secours
        Optimisation des Coûts
    Composants Principaux
      Gestion de la Conversation
        Types de Messages
        Systèmes de Mémoire
        Suivi du Contexte
        Persistance de l'Historique
      Intégration d'Outils
        Appel de Fonction
        Connexions API
        Outils Personnalisés
        Automatisation des Flux de Travail
    Fonctionnalités Avancées
      Sortie Structurée
        Modèles Pydantic
        Schémas JSON
        Sécurité des Types
        Règles de Validation
      Traitement de Documents
        Embeddings
        Magasins Vectoriels
        Recherche de Similarité
        Systèmes RAG
    Modèles de Production
      Architecture d'Application
        Conception Modulaire
        Limites d'Erreur
        Opérations Asynchrones
        Gestion d'État
      Stratégies de Déploiement
        Scalabilité
        Surveillance
        Performance
        Sécurité

Principe de base : Les cadres dIA abstraient la complexité tout en offrant des abstractions puissantes pour la gestion des conversations, lintégration doutils et le traitement documentaire, permettant aux développeurs de créer des applications dIA sophistiquées avec un code propre et maintenable.

Votre première requête IA

Commençons par les fondamentaux en créant votre première application IA qui envoie une question et reçoit une réponse. Comme Archimède découvrant le principe de la poussée dans son bain, parfois les observations les plus simples conduisent aux idées les plus puissantes et les cadres rendent ces idées accessibles.

Configurer LangChain avec GitHub Models

Nous allons utiliser LangChain pour nous connecter à GitHub Models, ce qui est plutôt chouette car cela vous donne un accès gratuit à divers modèles dIA. Le meilleur ? Vous navez besoin que de quelques paramètres de configuration simples pour commencer :

from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini",
)

# Envoyer une invite simple
response = llm.invoke("What's the capital of France?")
print(response.content)

Décomposons ce qui se passe ici :

  • Crée un client LangChain utilisant la classe ChatOpenAI - cest votre passerelle vers lIA !
  • Configure la connexion à GitHub Models avec votre jeton dauthentification
  • Spécifie quel modèle IA utiliser (gpt-4o-mini) pensez à cela comme choisir votre assistant IA
  • Envoie votre question via la méthode invoke() cest là que la magie opère
  • Extrait et affiche la réponse et voilà, vous discutez avec lIA !

🔧 Note de configuration : Si vous utilisez GitHub Codespaces, vous avez de la chance le GITHUB_TOKEN est déjà configuré pour vous ! Vous travaillez en local ? Pas de souci, il vous suffit de créer un jeton daccès personnel avec les bonnes permissions.

Sortie attendue :

The capital of France is Paris.
sequenceDiagram
    participant App as Votre application Python
    participant LC as LangChain
    participant GM as Modèles GitHub
    participant AI as GPT-4o-mini
    
    App->>LC: llm.invoke("Quelle est la capitale de la France ?")
    LC->>GM: Requête HTTP avec invite
    GM->>AI: Traiter l'invite
    AI->>GM: Réponse générée
    GM->>LC: Retourner la réponse
    LC->>App: response.content

Créer une IA conversationnelle

Le premier exemple montre le minimum, mais ce nest quun échange unique vous posez une question, obtenez une réponse, et cest tout. Dans les applications réelles, vous voulez que votre IA se souvienne de ce que vous avez déjà discuté, comme Watson et Holmes construisant leurs conversations denquête au fil du temps.

Cest là que LangChain devient particulièrement utile. Il fournit différents types de messages qui aident à structurer les conversations et vous permettent de donner une personnalité à votre IA. Vous construirez des expériences de chat qui maintiennent le contexte et le caractère.

Comprendre les types de messages

Pensez à ces types de messages comme à différents « chapeaux » que portent les participants dans une conversation. LangChain utilise différentes classes de messages pour suivre qui dit quoi :

Type de message But Exemple dutilisation
SystemMessage Définit la personnalité et le comportement de lIA « Vous êtes un assistant de programmation utile »
HumanMessage Représente lentrée utilisateur « Explique comment fonctionnent les fonctions »
AIMessage Stocke les réponses de lIA Réponses précédentes de lIA dans la conversation

Créer votre première conversation

Créons une conversation où notre IA assume un rôle spécifique. Nous allons la faire incarner le capitaine Picard un personnage connu pour sa sagesse diplomatique et son leadership :

messages = [
    SystemMessage(content="You are Captain Picard of the Starship Enterprise"),
    HumanMessage(content="Tell me about you"),
]

Décryptage de cette configuration de conversation :

  • Établit le rôle et la personnalité de lIA via SystemMessage
  • Fournit la requête initiale de lutilisateur par HumanMessage
  • Crée une base pour une conversation à multiples tours

Le code complet pour cet exemple ressemble à ceci :

from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini",
)

messages = [
    SystemMessage(content="You are Captain Picard of the Starship Enterprise"),
    HumanMessage(content="Tell me about you"),
]


# fonctionne
response  = llm.invoke(messages)
print(response.content)

Vous devriez voir un résultat similaire à :

I am Captain Jean-Luc Picard, the commanding officer of the USS Enterprise (NCC-1701-D), a starship in the United Federation of Planets. My primary mission is to explore new worlds, seek out new life and new civilizations, and boldly go where no one has gone before. 

I believe in the importance of diplomacy, reason, and the pursuit of knowledge. My crew is diverse and skilled, and we often face challenges that test our resolve, ethics, and ingenuity. Throughout my career, I have encountered numerous species, grappled with complex moral dilemmas, and have consistently sought peaceful solutions to conflicts.

I hold the ideals of the Federation close to my heart, believing in the importance of cooperation, understanding, and respect for all sentient beings. My experiences have shaped my leadership style, and I strive to be a thoughtful and just captain. How may I assist you further?

Pour maintenir la continuité de la conversation (au lieu de réinitialiser le contexte à chaque fois), vous devez continuer à ajouter les réponses à votre liste de messages. Comme les traditions orales qui ont préservé les histoires à travers les générations, cette approche construit une mémoire durable :

from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini",
)

messages = [
    SystemMessage(content="You are Captain Picard of the Starship Enterprise"),
    HumanMessage(content="Tell me about you"),
]


# fonctionne
response  = llm.invoke(messages)

print(response.content)

print("---- Next ----")

messages.append(response)
messages.append(HumanMessage(content="Now that I know about you, I'm Chris, can I be in your crew?"))

response  = llm.invoke(messages)

print(response.content)

Plutôt sympa, non ? Ce qui se passe ici, cest que nous appelons le LLM deux fois dabord avec nos deux messages initiaux, puis à nouveau avec lhistorique complet de la conversation. Cest comme si lIA suivait vraiment notre discussion !

Lorsque vous exécutez ce code, vous obtenez une seconde réponse qui ressemble à :

Welcome aboard, Chris! It's always a pleasure to meet those who share a passion for exploration and discovery. While I cannot formally offer you a position on the Enterprise right now, I encourage you to pursue your aspirations. We are always in need of talented individuals with diverse skills and backgrounds. 

If you are interested in space exploration, consider education and training in the sciences, engineering, or diplomacy. The values of curiosity, resilience, and teamwork are crucial in Starfleet. Should you ever find yourself on a starship, remember to uphold the principles of the Federation: peace, understanding, and respect for all beings. Your journey can lead you to remarkable adventures, whether in the stars or on the ground. Engage!
sequenceDiagram
    participant User
    participant App
    participant LangChain
    participant AI
    
    User->>App: "Parle-moi de toi"
    App->>LangChain: [SystemMessage, HumanMessage]
    LangChain->>AI: Conversation formatée
    AI->>LangChain: Réponse du Capitaine Picard
    LangChain->>App: Objet AIMessage
    App->>User: Afficher la réponse
    
    Note over App: Ajouter AIMessage à la conversation
    
    User->>App: "Puis-je rejoindre ton équipage ?"
    App->>LangChain: [SystemMessage, HumanMessage, AIMessage, HumanMessage]
    LangChain->>AI: Contexte complet de la conversation
    AI->>LangChain: Réponse contextuelle
    LangChain->>App: Nouveau AIMessage
    App->>User: Afficher la réponse contextuelle

Je prends ça pour un peut-être ;)

Réponses en streaming

Avez-vous remarqué comment ChatGPT semble « taper » ses réponses en temps réel ? Cest le streaming en action. Comme regarder un calligraphe expert travailler voir les caractères apparaître trait par trait au lieu dapparaître dun coup le streaming rend linteraction plus naturelle et fournit un retour immédiat.

Implémenter le streaming avec LangChain

from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini",
    streaming=True
)

# Diffuser la réponse
for chunk in llm.stream("Write a short story about a robot learning to code"):
    print(chunk.content, end="", flush=True)

Pourquoi le streaming est génial :

  • Montre le contenu au fur et à mesure de sa création fini lattente gênante !
  • Fait ressentir aux utilisateurs que quelque chose se passe vraiment
  • Donne limpression de rapidité, même si ce nest pas techniquement le cas
  • Permet aux utilisateurs de commencer à lire pendant que lIA « réfléchit »

💡 Conseil expérience utilisateur : Le streaming est vraiment utile quand vous traitez des réponses longues comme des explications de code, de lécriture créative ou des tutoriels détaillés. Vos utilisateurs adoreront voir lavancement au lieu de fixer un écran vide !

🎯 Check pédagogique : Bénéfices de labstraction du cadre

Pause et réflexion : Vous venez dexpérimenter la puissance des abstractions des cadres dIA. Comparez cela aux appels API bruts des leçons précédentes.

Auto-évaluation rapide :

  • Pouvez-vous expliquer comment LangChain simplifie la gestion des conversations comparé au suivi manuel des messages ?
  • Quelle est la différence entre les méthodes invoke() et stream(), et quand utiliser chacune ?
  • Comment le système de types de messages du cadre améliore-t-il lorganisation du code ?

Lien avec le monde réel : Les modèles dabstraction que vous avez apprises (types de message, interfaces de streaming, mémoire de conversation) sont utilisées dans toutes les grandes applications dIA de linterface de ChatGPT à lassistance au codage de GitHub Copilot. Vous maîtrisez les mêmes modèles architecturaux que les équipes de développement IA professionnelles.

Question défi : Comment concevriez-vous une abstraction de cadre pour gérer différents fournisseurs de modèles IA (OpenAI, Anthropic, Google) via une interface unique ? Considérez les avantages et compromis.

Modèles de prompt

Les modèles de prompt fonctionnent comme les structures rhétoriques utilisées dans loratoire classique pensez à comment Cicéron adaptait ses discours pour différents publics tout en gardant le même cadre persuasif. Ils vous permettent de créer des prompts réutilisables où vous pouvez substituer différentes informations sans tout réécrire. Une fois le modèle mis en place, il suffit de remplir les variables avec les valeurs souhaitées.

Créer des prompts réutilisables

from langchain_core.prompts import ChatPromptTemplate

# Définir un modèle pour les explications de code
template = ChatPromptTemplate.from_messages([
    ("system", "You are an expert programming instructor. Explain concepts clearly with examples."),
    ("human", "Explain {concept} in {language} with a practical example for {skill_level} developers")
])

# Utiliser le modèle avec différentes valeurs
questions = [
    {"concept": "functions", "language": "JavaScript", "skill_level": "beginner"},
    {"concept": "classes", "language": "Python", "skill_level": "intermediate"},
    {"concept": "async/await", "language": "JavaScript", "skill_level": "advanced"}
]

for question in questions:
    prompt = template.format_messages(**question)
    response = llm.invoke(prompt)
    print(f"Topic: {question['concept']}\n{response.content}\n---\n")

Pourquoi vous aimerez les modèles :

  • Maintient la cohérence de vos prompts dans toute votre app
  • Fini la concaténation de chaînes désordonnée juste des variables claires et simples
  • Votre IA se comporte de manière prévisible car la structure reste la même
  • Les mises à jour sont un jeu denfant changez le modèle une fois, cest corrigé partout

Sortie structurée

Vous êtes déjà frustré dessayer danalyser des réponses IA qui reviennent sous forme de texte non structuré ? La sortie structurée, cest comme apprendre à votre IA à suivre la démarche systématique que Linné utilisait pour la classification biologique organisée, prévisible et facile à manipuler. Vous pouvez demander du JSON, des structures de données spécifiques ou nimporte quel format dont vous avez besoin.

Définir des schémas de sortie

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Field

class CodeReview(BaseModel):
    score: int = Field(description="Code quality score from 1-10")
    strengths: list[str] = Field(description="List of code strengths")
    improvements: list[str] = Field(description="List of suggested improvements")
    overall_feedback: str = Field(description="Summary feedback")

# Configurer l'analyseur
parser = JsonOutputParser(pydantic_object=CodeReview)

# Créer une invite avec des instructions de format
prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a code reviewer. {format_instructions}"),
    ("human", "Review this code: {code}")
])

# Formater l'invite avec des instructions
chain = prompt | llm | parser

# Obtenir une réponse structurée
code_sample = """
def calculate_average(numbers):
    return sum(numbers) / len(numbers)
"""

result = chain.invoke({
    "code": code_sample,
    "format_instructions": parser.get_format_instructions()
})

print(f"Score: {result['score']}")
print(f"Strengths: {', '.join(result['strengths'])}")

Pourquoi la sortie structurée change la donne :

  • Plus besoin de deviner le format de la réponse cest cohérent à chaque fois
  • Sintègre directement à vos bases de données et APIs sans travail supplémentaire
  • Capture les réponses IA bizarres avant quelles ne cassent votre app
  • Rend votre code plus clair car vous savez exactement avec quoi vous travaillez

Appel doutils

Nous arrivons maintenant à lune des fonctionnalités les plus puissantes : les outils. Cest ainsi que vous donnez à votre IA des capacités pratiques au-delà de la conversation. Comme les guildes médiévales créaient des outils spécialisés pour des métiers spécifiques, vous pouvez équiper votre IA dinstruments ciblés. Vous décrivez les outils disponibles, et quand quelquun demande quelque chose qui correspond, votre IA peut agir.

Utiliser Python

Ajoutons quelques outils ainsi :

from typing_extensions import Annotated, TypedDict

class add(TypedDict):
    """Add two integers."""

    # Les annotations doivent avoir un type et peuvent optionnellement inclure une valeur par défaut et une description (dans cet ordre).
    a: Annotated[int, ..., "First integer"]
    b: Annotated[int, ..., "Second integer"]

tools = [add]

functions = {
    "add": lambda a, b: a + b
}

Que se passe-t-il ici ? Nous créons un schéma pour un outil appelé add. En héritant de TypedDict et en utilisant ces types Annotated sophistiqués pour a et b, nous donnons au LLM une image claire de ce que fait cet outil et de ce dont il a besoin. Le dictionnaire functions est comme notre boîte à outils il indique à notre code exactement quoi faire lorsque lIA décide dutiliser un outil spécifique.

Voyons comment nous appelons le LLM avec cet outil ensuite :

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini",
)

llm_with_tools = llm.bind_tools(tools)

Ici, nous appelons bind_tools avec notre tableau tools et, de ce fait, le LLM llm_with_tools a désormais connaissance de cet outil.

Pour utiliser ce nouveau LLM, nous pouvons taper le code suivant :

query = "What is 3 + 12?"

res = llm_with_tools.invoke(query)
if(res.tool_calls):
    for tool in res.tool_calls:
        print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
print("CONTENT: ",res.content)

Maintenant que nous appelons invoke sur ce nouveau llm, qui dispose doutils, il y a peut-être la propriété tool_calls remplie. Si cest le cas, tout outil identifié possède une propriété name et args qui identifient quel outil doit être appelé et avec quels arguments. Le code complet ressemble à ceci :

from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
import os
from typing_extensions import Annotated, TypedDict

class add(TypedDict):
    """Add two integers."""

    # Les annotations doivent avoir un type et peuvent éventuellement inclure une valeur par défaut et une description (dans cet ordre).
    a: Annotated[int, ..., "First integer"]
    b: Annotated[int, ..., "Second integer"]

tools = [add]

functions = {
    "add": lambda a, b: a + b
}

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini",
)

llm_with_tools = llm.bind_tools(tools)

query = "What is 3 + 12?"

res = llm_with_tools.invoke(query)
if(res.tool_calls):
    for tool in res.tool_calls:
        print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
print("CONTENT: ",res.content)

En exécutant ce code, vous devriez voir une sortie similaire à :

TOOL CALL:  15
CONTENT: 

LIA a examiné « What is 3 + 12 » et reconnu cette tâche comme étant pour loutil add. Comme un bibliothécaire compétent sait quelle référence consulter selon le type de question posée, elle a pris cette décision à partir du nom de loutil, sa description et les spécifications des champs. Le résultat de 15 provient de notre dictionnaire functions exécutant loutil :

print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))

Un outil plus intéressant qui appelle une API web

Ajouter des nombres démontre le concept, mais les outils réels effectuent généralement des opérations plus complexes, comme appeler des API web. Développons notre exemple pour que lIA récupère du contenu sur internet similaire à la façon dont les opérateurs télégraphistes connectaient autrefois des lieux éloignés :

class joke(TypedDict):
    """Tell a joke."""

    # Les annotations doivent avoir un type et peuvent optionnellement inclure une valeur par défaut et une description (dans cet ordre).
    category: Annotated[str, ..., "The joke category"]

def get_joke(category: str) -> str:
    response = requests.get(f"https://api.chucknorris.io/jokes/random?category={category}", headers={"Accept": "application/json"})
    if response.status_code == 200:
        return response.json().get("value", f"Here's a {category} joke!")
    return f"Here's a {category} joke!"

functions = {
    "add": lambda a, b: a + b,
    "joke": lambda category: get_joke(category)
}

query = "Tell me a joke about animals"

# le reste du code est identique

Maintenant, si vous exécutez ce code, vous obtiendrez une réponse disant quelque chose comme :

TOOL CALL:  Chuck Norris once rode a nine foot grizzly bear through an automatic car wash, instead of taking a shower.
CONTENT:  
flowchart TD
    A[Requête Utilisateur : "Raconte-moi une blague sur les animaux"] --> B[Analyse LangChain]
    B --> C{Outil Disponible ?}
    C -->|Oui| D[Sélectionner l'outil de blague]
    C -->|Non| E[Générer une réponse directe]
    
    D --> F[Extraire les Paramètres]
    F --> G[Appeler blague(catégorie="animaux")]
    G --> H[Requête API vers chucknorris.io]
    H --> I[Retourner le contenu de la blague]
    I --> J[Afficher à l'utilisateur]
    
    E --> K[Réponse générée par IA]
    K --> J
    
    subgraph "Couche de Définition des Outils"
        L[Schéma TypedDict]
        M[Mise en œuvre de la Fonction]
        N[Validation des Paramètres]
    end
    
    D --> L
    F --> N
    G --> M

Voici le code dans son intégralité :

from langchain_openai import ChatOpenAI
import requests
import os
from typing_extensions import Annotated, TypedDict

class add(TypedDict):
    """Add two integers."""

    # Les annotations doivent avoir le type et peuvent éventuellement inclure une valeur par défaut et une description (dans cet ordre).
    a: Annotated[int, ..., "First integer"]
    b: Annotated[int, ..., "Second integer"]

class joke(TypedDict):
    """Tell a joke."""

    # Les annotations doivent avoir le type et peuvent éventuellement inclure une valeur par défaut et une description (dans cet ordre).
    category: Annotated[str, ..., "The joke category"]

tools = [add, joke]

def get_joke(category: str) -> str:
    response = requests.get(f"https://api.chucknorris.io/jokes/random?category={category}", headers={"Accept": "application/json"})
    if response.status_code == 200:
        return response.json().get("value", f"Here's a {category} joke!")
    return f"Here's a {category} joke!"

functions = {
    "add": lambda a, b: a + b,
    "joke": lambda category: get_joke(category)
}

llm = ChatOpenAI(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="openai/gpt-4o-mini",
)

llm_with_tools = llm.bind_tools(tools)

query = "Tell me a joke about animals"

res = llm_with_tools.invoke(query)
if(res.tool_calls):
    for tool in res.tool_calls:
        # print("APPEL DE L'OUTIL : ", tool)
        print("TOOL CALL: ", functions[tool["name"]](../../../10-ai-framework-project/**tool["args"]))
print("CONTENT: ",res.content)

Embeddings et traitement des documents

Les embeddings représentent lune des solutions les plus élégantes en IA moderne. Imaginez que vous puissiez prendre nimporte quel texte et le transformer en coordonnées numériques qui capturent son sens. Cest exactement ce que font les embeddings - ils transforment le texte en points dans un espace multi-dimensionnel où des concepts similaires se regroupent. Cest comme avoir un système de coordonnées pour les idées, rappelant la façon dont Mendeleïev a organisé le tableau périodique par propriétés atomiques.

Création et utilisation des embeddings

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter

# Initialiser les embeddings
embeddings = OpenAIEmbeddings(
    api_key=os.environ["GITHUB_TOKEN"],
    base_url="https://models.github.ai/inference",
    model="text-embedding-3-small"
)

# Charger et diviser les documents
loader = TextLoader("documentation.txt")
documents = loader.load()

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# Créer la base de données vectorielle
vectorstore = FAISS.from_documents(texts, embeddings)

# Effectuer une recherche de similarité
query = "How do I handle user authentication?"
similar_docs = vectorstore.similarity_search(query, k=3)

for doc in similar_docs:
    print(f"Relevant content: {doc.page_content[:200]}...")

Chargeurs de documents pour divers formats

from langchain_community.document_loaders import (
    PyPDFLoader,
    CSVLoader,
    JSONLoader,
    WebBaseLoader
)

# Charger différents types de documents
pdf_loader = PyPDFLoader("manual.pdf")
csv_loader = CSVLoader("data.csv")
json_loader = JSONLoader("config.json")
web_loader = WebBaseLoader("https://example.com/docs")

# Traiter tous les documents
all_documents = []
for loader in [pdf_loader, csv_loader, json_loader, web_loader]:
    docs = loader.load()
    all_documents.extend(docs)

Ce que vous pouvez faire avec les embeddings :

  • Construire des recherches qui comprennent réellement ce que vous voulez dire, pas seulement des correspondances par mots-clés
  • Créer une IA capable de répondre aux questions à propos de vos documents
  • Faire des systèmes de recommandation proposant du contenu vraiment pertinent
  • Organiser et catégoriser automatiquement votre contenu
flowchart LR
    A[Documents] --> B[Fractionneur de Texte]
    B --> C[Créer des Représentations vectorielles]
    C --> D[Stockage Vectoriel]
    
    E[Requête Utilisateur] --> F[Représentation de la Requête]
    F --> G[Recherche de Similarité]
    G --> D
    D --> H[Documents Pertinents]
    H --> I[Réponse IA]
    
    subgraph "Espace Vectoriel"
        J[Document A : [0.1, 0.8, 0.3...]]
        K[Document B : [0.2, 0.7, 0.4...]]
        L[Requête : [0.15, 0.75, 0.35...]]
    end
    
    C --> J
    C --> K
    F --> L
    G --> J
    G --> K

Construire une application IA complète

Nous allons maintenant intégrer tout ce que vous avez appris dans une application complète un assistant de programmation capable de répondre aux questions, dutiliser des outils et de maintenir la mémoire de la conversation. Comme la presse à imprimer a combiné des technologies existantes (caractères mobiles, encre, papier et pression) pour créer quelque chose de transformateur, nous allons combiner nos composants IA en quelque chose de pratique et utile.

Exemple dapplication complète

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
from langchain_community.vectorstores import FAISS
from typing_extensions import Annotated, TypedDict
import os
import requests

class CodingAssistant:
    def __init__(self):
        self.llm = ChatOpenAI(
            api_key=os.environ["GITHUB_TOKEN"],
            base_url="https://models.github.ai/inference",
            model="openai/gpt-4o-mini"
        )
        
        self.conversation_history = [
            SystemMessage(content="""You are an expert coding assistant. 
            Help users learn programming concepts, debug code, and write better software.
            Use tools when needed and maintain a helpful, encouraging tone.""")
        ]
        
        # Définir les outils
        self.setup_tools()
    
    def setup_tools(self):
        class web_search(TypedDict):
            """Search for programming documentation or examples."""
            query: Annotated[str, "Search query for programming help"]
        
        class code_formatter(TypedDict):
            """Format and validate code snippets."""
            code: Annotated[str, "Code to format"]
            language: Annotated[str, "Programming language"]
        
        self.tools = [web_search, code_formatter]
        self.llm_with_tools = self.llm.bind_tools(self.tools)
    
    def chat(self, user_input: str):
        # Ajouter le message de l'utilisateur à la conversation
        self.conversation_history.append(HumanMessage(content=user_input))
        
        # Obtenir la réponse de l'IA
        response = self.llm_with_tools.invoke(self.conversation_history)
        
        # Gérer les appels d'outils s'il y en a
        if response.tool_calls:
            for tool_call in response.tool_calls:
                tool_result = self.execute_tool(tool_call)
                print(f"🔧 Tool used: {tool_call['name']}")
                print(f"📊 Result: {tool_result}")
        
        # Ajouter la réponse de l'IA à la conversation
        self.conversation_history.append(response)
        
        return response.content
    
    def execute_tool(self, tool_call):
        tool_name = tool_call['name']
        args = tool_call['args']
        
        if tool_name == 'web_search':
            return f"Found documentation for: {args['query']}"
        elif tool_name == 'code_formatter':
            return f"Formatted {args['language']} code: {args['code'][:50]}..."
        
        return "Tool execution completed"

# Exemple d'utilisation
assistant = CodingAssistant()

print("🤖 Coding Assistant Ready! Type 'quit' to exit.\n")

while True:
    user_input = input("You: ")
    if user_input.lower() == 'quit':
        break
    
    response = assistant.chat(user_input)
    print(f"🤖 Assistant: {response}\n")

Architecture de lapplication :

graph TD
    A[Saisie Utilisateur] --> B[Assistant de Codage]
    B --> C[Mémoire de Conversation]
    B --> D[Détection d'Outil]
    B --> E[Traitement LLM]
    
    D --> F[Outil de Recherche Web]
    D --> G[Outil de Formatage de Code]
    
    E --> H[Génération de Réponse]
    F --> H
    G --> H
    
    H --> I[Interface Utilisateur]
    H --> C

Fonctionnalités clés que nous avons implémentées :

  • Mémorise toute votre conversation pour la continuité du contexte
  • Effectue des actions via des appels doutils, pas seulement la conversation
  • Suit des schémas dinteraction prévisibles
  • Gère automatiquement la gestion des erreurs et des workflows complexes

🎯 Point pédagogique : Architecture IA en production

Compréhension de larchitecture : Vous avez construit une application IA complète combinant gestion de conversation, appel doutils et workflows structurés. Cela représente le développement dapplications IA de niveau production.

Concepts clés maîtrisés :

  • Architecture orientée classes : structure organisée et maintenable pour applications IA
  • Intégration doutils : fonctionnalités personnalisées au-delà de la conversation
  • Gestion de la mémoire : contexte de conversation persistant
  • Gestion des erreurs : comportement robuste de lapplication

Lien avec lindustrie : Les modèles darchitecture que vous avez mis en œuvre (classes de conversation, systèmes doutils, gestion mémoire) sont les mêmes utilisés dans des applications IA dentreprise telles que lassistant IA de Slack, GitHub Copilot, et Microsoft Copilot. Vous construisez avec une pensée architecturale de qualité professionnelle.

Question de réflexion : Comment étendriez-vous cette application pour gérer plusieurs utilisateurs, un stockage persistant, ou une intégration avec des bases de données externes ? Réfléchissez aux défis de scalabilité et de gestion détat.

Devoir : Construisez votre propre assistant détude alimenté par lIA

Objectif : Créer une application IA qui aide les étudiants à apprendre les concepts de programmation en fournissant des explications, des exemples de code, et des quiz interactifs.

Exigences

Fonctionnalités principales (Obligatoires) :

  1. Interface conversationnelle : Implémenter un système de chat qui maintient le contexte sur plusieurs questions
  2. Outils éducatifs : Créer au moins deux outils qui aident à lapprentissage :
    • Outil dexplication de code
    • Générateur de quiz sur les concepts
  3. Apprentissage personnalisé : Utiliser des messages système pour adapter les réponses à différents niveaux de compétence
  4. Formatage des réponses : Implémenter une sortie structurée pour les questions de quiz

Étapes de mise en œuvre

Étape 1 : Configurez votre environnement

pip install langchain langchain-openai

Étape 2 : Fonctionnalité de base du chat

  • Créez une classe StudyAssistant
  • Implémentez la mémoire de conversation
  • Ajoutez une configuration de personnalité pour le support éducatif

Étape 3 : Ajoutez des outils éducatifs

  • Expliqueur de code : Décompose le code en parties compréhensibles
  • Générateur de quiz : Crée des questions sur les concepts de programmation
  • Suivi de progression : Suit les sujets abordés

Étape 4 : Fonctionnalités avancées (Optionnel)

  • Implémentez des réponses en streaming pour une meilleure expérience utilisateur
  • Ajoutez le chargement de documents pour intégrer le matériel de cours
  • Créez des embeddings pour la recherche de contenu basée sur la similarité

Critères dévaluation

Fonctionnalité Excellent (4) Bien (3) Satisfaisant (2) À améliorer (1)
Flux de conversation Réponses naturelles, conscientes du contexte Bonne rétention du contexte Conversation basique Pas de mémoire entre échanges
Intégration doutils Plusieurs outils utiles fonctionnant parfaitement 2+ outils implémentés correctement 1-2 outils basiques Outils non fonctionnels
Qualité du code Propre, bien documenté, gestion des erreurs Structure correcte, documentation partielle Fonctionnalité de base Mauvaise structure, pas de gestion derreurs
Valeur éducative Vraiment utile pour lapprentissage, adaptatif Bon support pédagogique Explications basiques Apport éducatif limité

Structure de code exemple

class StudyAssistant:
    def __init__(self, skill_level="beginner"):
        # Initialiser LLM, outils et mémoire de conversation
        pass
    
    def explain_code(self, code, language):
        # Outil : Expliquer le fonctionnement du code
        pass
    
    def generate_quiz(self, topic, difficulty):
        # Outil : Créer des questions d'entraînement
        pass
    
    def chat(self, user_input):
        # Interface principale de conversation
        pass

# Exemple d'utilisation
assistant = StudyAssistant(skill_level="intermediate")
response = assistant.chat("Explain how Python functions work")

Défis bonus :

  • Ajoutez des capacités dentrée/sortie vocale
  • Implémentez une interface web avec Streamlit ou Flask
  • Créez une base de connaissances à partir du matériel de cours avec embeddings
  • Ajoutez le suivi de progression et des parcours dapprentissage personnalisés

📈 Votre calendrier de maîtrise du développement de frameworks IA

timeline
    title Parcours de Développement du Cadre d'IA de Production
    
    section Fondations du Cadre
        Compréhension des Abstractions
            : Décisions cadre principal vs API
            : Apprendre les concepts de base de LangChain
            : Implémenter les systèmes de types de messages
        
        Intégration Basique
            : Connexion aux fournisseurs d'IA
            : Gérer l'authentification
            : Gérer la configuration
    
    section Systèmes de Conversation
        Gestion de la Mémoire
            : Construire l'historique des conversations
            : Implémenter le suivi du contexte
            : Gérer la persistance de session
        
        Interactions Avancées
            : Maîtriser les réponses en streaming
            : Créer des modèles d'invite
            : Implémenter la sortie structurée
    
    section Intégration d'Outils
        Développement d'Outils Personnalisés
            : Concevoir les schémas d'outils
            : Implémenter l'appel de fonctions
            : Gérer les API externes
        
        Automatisation des Flux de Travail
            : Enchaîner plusieurs outils
            : Créer des arbres de décision
            : Construire des comportements d'agents
    
    section Applications en Production
        Architecture Complète du Système
            : Combiner toutes les fonctionnalités du cadre
            : Implémenter les limites d'erreur
            : Créer un code maintenable
        
        Prêt pour l'Entreprise
            : Gérer les problématiques de scalabilité
            : Implémenter la surveillance
            : Construire des stratégies de déploiement

🎓 Étape de graduation : Vous avez maîtrisé le développement de frameworks IA en utilisant les mêmes outils et modèles qui alimentent les applications IA modernes. Ces compétences représentent la pointe du développement dapplications IA et vous préparent à construire des systèmes intelligents de niveau entreprise.

🔄 Capacités suivantes :

  • Prêt à explorer des architectures IA avancées (agents, systèmes multi-agents)
  • Préparé pour créer des systèmes RAG avec bases de données vectorielles
  • Équipé pour réaliser des applications IA multi-modales
  • Fondations posées pour la mise à léchelle et loptimisation dapplications IA

Résumé

🎉 Vous avez désormais maîtrisé les fondamentaux du développement de frameworks IA et appris à construire des applications IA sophistiquées avec LangChain. Comme un apprentissage complet, vous avez acquis une boîte à outils importante. Passons en revue ce que vous avez accompli.

Ce que vous avez appris

Concepts fondamentaux du framework :

  • Avantages des frameworks : Comprendre quand choisir les frameworks plutôt que les appels API directs
  • Bases de LangChain : Configuration et mise en place des connexions aux modèles IA
  • Types de messages : Utilisation de SystemMessage, HumanMessage, et AIMessage pour des conversations structurées

Fonctionnalités avancées :

  • Appel doutils : Création et intégration doutils personnalisés pour des capacités IA améliorées
  • Mémoire de conversation : Maintien du contexte sur plusieurs tours de conversation
  • Réponses en streaming : Livraison en temps réel des réponses
  • Modèles de prompt : Construction de prompts dynamiques et réutilisables
  • Sortie structurée : Garantir des réponses IA cohérentes et analysables
  • Embeddings : Création de capacités de recherche sémantique et de traitement de documents

Applications pratiques :

  • Construction dapplications complètes : Combinaison de plusieurs fonctionnalités pour créer des applications prêtes pour la production
  • Gestion des erreurs : Mise en place dune gestion robuste des erreurs et validations
  • Intégration doutils : Création doutils personnalisés étendant les capacités IA

Points clés à retenir

🎯 Rappelez-vous : Les frameworks IA comme LangChain sont vos meilleurs amis pour masquer la complexité et offrir beaucoup de fonctionnalités. Ils sont parfaits lorsque vous avez besoin de mémoire de conversation, dappel doutils, ou de travailler avec plusieurs modèles IA sans perdre la raison.

Cadre de décision pour lintégration IA :

flowchart TD
    A[Besoin d'intégration IA] --> B{Requête simple unique ?}
    B -->|Oui| C[Appels API directs]
    B -->|Non| D{Besoin de mémoire de conversation ?}
    D -->|Non| E[Intégration SDK]
    D -->|Oui| F{Besoin d'outils ou de fonctionnalités complexes ?}
    F -->|Non| G[Framework avec configuration basique]
    F -->|Oui| H[Mise en œuvre complète du framework]
    
    C --> I[Requêtes HTTP, dépendances minimales]
    E --> J[SDK fournisseur, spécifique au modèle]
    G --> K[Chat basique LangChain]
    H --> L[LangChain avec outils, mémoire, agents]

Où aller à partir dici ?

Commencez à construire dès maintenant :

  • Prenez ces concepts et créez quelque chose qui VOUS passionne !
  • Testez différents modèles IA via LangChain cest comme un terrain de jeu pour modèles IA
  • Créez des outils qui résolvent de vrais problèmes dans votre travail ou vos projets

Prêt pour le niveau supérieur ?

  • Agents IA : Construisez des systèmes IA capables de planifier et exécuter des tâches complexes de manière autonome
  • RAG (Retrieval-Augmented Generation) : Combinez lIA avec vos propres bases de connaissance pour des applications ultra-performantes
  • IA multi-modale : Travaillez ensemble avec du texte, des images et de laudio les possibilités sont infinies !
  • Déploiement en production : Apprenez à faire évoluer vos applications IA et à les surveiller en conditions réelles

Rejoignez la communauté :

  • La communauté LangChain est fantastique pour rester à jour et apprendre les meilleures pratiques
  • GitHub Models vous donne accès à des capacités IA de pointe parfait pour expérimenter
  • Continuez à pratiquer avec différents cas dusage chaque projet vous apprendra quelque chose de nouveau

Vous avez maintenant les connaissances pour construire des applications intelligentes et conversationnelles qui aident les gens à résoudre des problèmes réels. Comme les artisans de la Renaissance qui ont fusionné vision artistique et savoir-faire technique, vous pouvez désormais combiner capacités IA et applications pratiques. La question est : que créerez-vous ? 🚀

Défi GitHub Copilot Agent 🚀

Utilisez le mode Agent pour relever le défi suivant :

Description : Construisez un assistant avancé de revue de code alimenté par lIA qui combine plusieurs fonctionnalités LangChain, incluant appel doutils, sortie structurée et mémoire de conversation, pour fournir un feedback complet sur les soumissions de code.

Prompt : Créez une classe CodeReviewAssistant qui implémente :

  1. Un outil danalyse de la complexité du code et suggestions damélioration
  2. Un outil de vérification du code selon les bonnes pratiques
  3. Une sortie structurée utilisant des modèles Pydantic pour un format de revue cohérent
  4. Une mémoire de conversation pour suivre les sessions de revue
  5. Une interface principale de chat pouvant gérer les soumissions de code et fournir un feedback détaillé et exploitable

Lassistant doit pouvoir revoir du code dans plusieurs langages de programmation, maintenir le contexte sur plusieurs soumissions dans une session, et fournir à la fois des scores synthétiques et des suggestions damélioration détaillées.

En savoir plus sur le mode agent ici.


Avertissement :
Ce document a été traduit à laide du service de traduction automatique Co-op Translator. Bien que nous nous efforcions dassurer lexactitude, veuillez noter que les traductions automatisées peuvent comporter des erreurs ou des inexactitudes. Le document original dans sa langue dorigine doit être considéré comme la source faisant foi. Pour les informations critiques, une traduction professionnelle humaine est recommandée. Nous déclinons toute responsabilité en cas de malentendus ou de mauvaises interprétations résultant de lutilisation de cette traduction.