From 92b1f7f60c9208fe7ee9cbaf907f026a57ccd27f Mon Sep 17 00:00:00 2001 From: pelikhan Date: Wed, 9 Jul 2025 21:30:43 +0000 Subject: [PATCH 01/19] add action to translate readme --- .github/workflows/translation.yml | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/translation.yml diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml new file mode 100644 index 00000000..e4325369 --- /dev/null +++ b/.github/workflows/translation.yml @@ -0,0 +1,35 @@ +name: Continuous Translation +on: + workflow_dispatch: + push: + branches: + - main + - pelikhan/translations + paths: + - "README.md" +permissions: + contents: write + models: read +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + continuous_translation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + path: .genaiscript/cache/** + key: continuous-translation-${{ github.run_id }} + restore-keys: | + continuous-translation- + - uses: pelikhan/action-continuous-translation@v0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + lang: fr + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + file_pattern: "translations/*.json **.md* translations/*.json" + commit_message: "[cai] translated docs" + commit_user_name: "genaiscript" From 7f41db327600a446a69c46c0e3d7724ecfbfc06e Mon Sep 17 00:00:00 2001 From: pelikhan Date: Wed, 9 Jul 2025 22:03:33 +0000 Subject: [PATCH 02/19] feat: add French README for generative AI course --- README.fr.md | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 README.fr.md diff --git a/README.fr.md b/README.fr.md new file mode 100644 index 00000000..e451a29d --- /dev/null +++ b/README.fr.md @@ -0,0 +1,154 @@ +
+ + + +# IA générative pour les débutants avec JavaScript + +[![Licence](https://img.shields.io/badge/License-MIT-blue?style=flat-square)](https://github.com/microsoft/generative-ai-with-javascript/blob/main/LICENSE) +[![Regarder la série de vidéos](https://img.shields.io/badge/Videos-d95652.svg?style=flat-square\&logo=youtube)](https://aka.ms/genai-js) +[![PRs Bienvenue](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![Discord Azure AI](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) + +[![Forum des développeurs Azure AI Foundry](https://img.shields.io/badge/GitHub-Azure_AI_Foundry_Developer_Forum-blue?style=for-the-badge\&logo=github\&color=000000\&logoColor=fff)](https://aka.ms/foundry/forum) + +⭐ Si vous aimez ce dépôt, donnez-lui une étoile sur GitHub — cela aide énormément ! + +[Commencer](#getting-started) • [Leçons](#lessons) • [Continuer à apprendre](#keep-learning) + +
+ +Prêt à intégrer l'IA générative dans vos applications JavaScript ? + +Ce cours vous plonge dans une *aventure temporelle*—rencontrez les légendes de l'histoire avec une touche amusante, tout en apprenant les technologies d'IA générative ✨ + +> \[!IMPORTANT]\ +> Ambiance open-source ! Réutilisez, modifiez et partagez librement ce contenu. + +![Aperçu de l'application pour les personnages](/docs/images/background.png) + +## NOUVEAU - Leçons MCP juste ajoutées + +* Apprenez comment [créer et tester votre premier serveur](/lessons/07-mcp/README.md) +* Améliorez votre client MCP en [intégrant un LLM](/lessons/08-mcp-advanced/README.md) + +## Appel à l'aide - aidez-nous à traduire ! + +Aidez-nous à traduire ce cours. Chaque leçon dans le dossier `lessons/` possède un répertoire `translations/`. Ajoutez votre fichier de traduction comme suit : `README..md`, par exemple *README.es.md*. - Merci. + +## Plongez dans l'histoire avec la magie de l'IA ! + +Lancez-vous dans une expérience d'apprentissage immersive propulsée par l'IA générative : + +* **Apprenez les technologies d'IA générative**. Si vous avez voulu comprendre l'IA générative et son potentiel pour vos applications, vous êtes au bon endroit ! + +* **Histoires épiques de voyage dans le temps**. Plongez dans une histoire amusante, en discutant avec des icônes comme Léonard de Vinci, Ada Lovelace ou Montezuma dans chaque leçon. + +* **Application compagnon**. Interagissez avec des personnages historiques en utilisant les technologies d'IA générative ([voir notre clause de non-responsabilité sur l'IA responsable](#responsible-ai-disclaimer)). + + ![Interagissez avec l'histoire à travers une conversation](/docs/images/character-chat.png) + + Consultez le répertoire [*app*](/app/README.md) pour exécuter [l'application localement](/docs/setup/README.md#option-2--running-the-app-locally) ou utilisez [GitHub Codespaces](/docs/setup/README.md) pour l'exécuter en ligne. + +* **Accessibilité FTW**. Lisez-le, écoutez-le—les balises audio donnent vie au contenu. + +> « C'est comme une bande dessinée avec du code ! » — Utilisateur satisfait + +## Pour commencer + +Tout au long de ce cours, vous trouverez de nombreux exemples de code et exercices, alors nous vous encourageons à exécuter et expérimenter le code dans votre propre copie de ce dépôt : + +1. Sélectionnez le bouton **Fork** dans le coin supérieur droit du dépôt ou sélectionnez ce bouton : + [![Fork](https://img.shields.io/badge/Fork-Repository-blue?style=flat-square)](https://github.com/microsoft/generative-ai-with-javascript/fork) + +2. Cliquez sur le bouton **Code** dans votre dépôt forké, accédez à l'onglet **Codespaces** et choisissez **Créer un codespace**. + + Cela créera un environnement en ligne préconfiguré pour vous. Vous pourrez ensuite utiliser [GitHub Models](https://github.com/marketplace/models) pour exécuter des exemples de code et interagir avec des modèles d'IA gratuitement, sans installation supplémentaire. + +> \[!NOTE] +> +> Alors que GitHub Codespaces offre un point de départ rapide et facile, vous pouvez également exécuter les exemples de code [localement](/docs/setup/README.md#option-2--running-the-app-locally). +> +> En savoir plus sur les [concepts GitHub Codespaces et GitHub Models ici](/docs/setup/README.md). + +### Description des leçons + +📦 Chaque leçon comprend : + +* Une **leçon écrite** avec un devoir et un quiz. +* Une courte **vidéo** pour approfondir votre apprentissage. +* **Solutions** pour chaque devoir et quiz. +* **Personnages** avec lesquels vous pouvez interagir en utilisant notre [application compagnon](/app/README.md), démontrant l'IA générative. + +## Leçons + +🗃️ Table des matières + +| N° | Lien de la leçon | Description | +| -- | ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 1 | [Introduction à l'IA générative et aux LLM pour les développeurs JavaScript](/lessons/01-intro-to-genai/README.md) | Comprenez les bases de l'IA générative et des LLM, leurs applications et limites en JavaScript, et comment utiliser l'IA pour améliorer les expériences utilisateur. | +| 2 | [Créez votre première application d'IA](/lessons/02-first-ai-app/README.md) | Configurez votre environnement de développement, écrivez une application de base et comprenez les invites système. | +| 3 | [Ingénierie des invites](/lessons/03-prompt-engineering/README.md) | Apprenez les bases de l'ingénierie des invites, des techniques et des méta-invites pour de meilleurs résultats avec l'IA. | +| 4 | [Sortie structurée](/lessons/04-structured-output/README.md) | Découvrez les sorties structurées, comment extraire des données à partir d'invites et les présenter sous différents formats, comme JSON, pour une consommation plus facile. | +| 5 | [Génération augmentée par récupération (RAG)](/lessons/05-rag/README.md) | Apprenez les bases de la RAG, comment intégrer des données externes et les utiliser pour des réponses de l'IA plus pertinentes et précises. | +| 6 | [Appel d'outils / Appel de fonctions](/lessons/06-tool-calling/README.md) | Apprenez à donner des capacités supplémentaires à vos LLM en intégrant vos propres fonctions. | +| 7 | [MCP, Protocole de Contexte de Modèle ](/lessons/07-mcp/README.md) | Apprenez à démarrer avec MCP pour standardiser l'exposition des invites, des ressources et des outils. | +| 8 | [Amélioration des clients MCP avec des modèles de langage étendu](/lessons/08-mcp-advanced/README.md) | Apprenez à améliorer votre application MCP en optimisant les clients avec des LLM et bien plus encore. | + +De nouvelles leçons seront ajoutées au cours au fil du temps, restez à l'écoute ! + +## Continuez à apprendre + +🙌 Après avoir terminé ce cours, vous pouvez continuer à apprendre en explorant nos ressources supplémentaires. + +
+🎬Video Series + +| N° | Session | Description | Diapositives | Démo | Script | Vidéo | +| -- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | -------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| 0 | Introduction à la série | Introduction à la série et son contenu. | [pptx](/videos/slides/00-intro.pptx)/ [pdf](/videos/slides/pdf/00-intro.pdf) | - | [Script](/videos/sessions/00-intro.md) | [📺](https://www.youtube.com/watch?v=vLYtDgs_zx8\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=1) | +| 1 | Ce que vous devez savoir sur les LLM | Découvrez ce que sont les LLM, comment ils sont entraînés, comment ils fonctionnent et leurs limites. | [pptx](/videos/slides/01-llms.pptx)/ [pdf](/videos/slides/pdf/01-llms.pdf) | [Démo](/videos/demos/01-llms/) | [Script](/videos/sessions/01-llms.md) | [📺](https://www.youtube.com/watch?v=GQ_2OjNZ9aA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=2) | +| 2 | Techniques essentielles d'ingénierie des invites | Techniques pratiques d'ingénierie des invites pour tirer le meilleur parti des modèles d'IA. | [pptx](/videos/slides/02-prompt-engineering.pptx)/ [pdf](/videos/slides/pdf/02-prompt-engineering.pdf) | [Démo](/videos/demos/02-prompt-engineering/) | [Script](/videos/sessions/02-prompt-engineering.md) | [📺](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) | +| 3 | Améliorez la précision et la fiabilité de l'IA avec RAG | Introduction à la génération augmentée par récupération pour utiliser l'IA avec vos propres données. | [pptx](/videos/slides/03-rag.pptx)/ [pdf](/videos/slides/pdf/03-rag.pdf) | [Démo](/videos/demos/03-rag/) | [Script](/videos/sessions/03-rag.md) | [📺](https://www.youtube.com/watch?v=xkFOmx5yxIA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=4) | +| 4 | Accélérez votre développement IA avec LangChain.js | Couvre les concepts de base du framework LangChain.js et comment l'utiliser pour accélérer le développement d'applications IA. | [pptx](/videos/slides/04-langchainjs.pptx)/ [pdf](/videos/slides/pdf/04-langchainjs.pdf) | [Démo](/videos/demos/04-langchainjs/) | [Script](/videos/sessions/04-langchainjs.md) | [📺](https://www.youtube.com/watch?v=02IDU8eCX8o\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=5) | +| 5 | Exécutez des modèles d'IA sur votre machine locale avec Ollama | Montre comment intégrer des modèles d'IA locaux dans votre flux de travail de développement. | [pptx](/videos/slides/05-local-models.pptx)/ [pdf](/videos/slides/pdf/05-local-models.pdf) | [Démo](/videos/demos/05-local-models/) | [Script](/videos/sessions/05-local-models.md) | [📺](https://www.youtube.com/watch?v=dLfNnoPv4AQ\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=6) | +| 6 | Démarrez avec l'IA gratuitement en utilisant Phi-3 | Expérimentez avec Ollama et le modèle Phi-3 directement depuis votre navigateur. | [pptx](/videos/slides/06-playground.pptx)/ [pdf](/videos/slides/pdf/06-playground.pdf) | [Démo](/videos/demos/06-playground/) | [Script](/videos/sessions/06-playground.md) | [📺](https://www.youtube.com/watch?v=Ds32MS9SHzU\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=7) | +| 7 | Introduction à Azure AI Foundry | Lancez votre parcours avec Azure AI Foundry. | [pptx](/videos/slides/07-ai-foundry.pptx)/ [pdf](/videos/slides/pdf/07-ai-foundry.pdf) | [Démo](/videos/demos/07-ai-foundry/) | [Script](/videos/sessions/07-ai-foundry.md) | [📺](https://www.youtube.com/watch?v=9Mo-VOGk8ng\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=8) | +| 8 | Création d'applications IA générative avec Azure Cosmos DB | Créez des applications IA générative avec Azure Cosmos DB et la recherche vectorielle. | [pptx](/videos/slides/08-cosmos-db.pptx)/ [pdf](/videos/slides/pdf/08-cosmos-db.pdf) | [Démo](/videos/demos/08-cosmos-db/) | [Script](/videos/sessions/08-cosmos-db.md) | [📺](https://www.youtube.com/watch?v=-GQyaLbeqxQ\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=9) | +| 9 | Outils Azure et services pour héberger et stocker des applications IA | Concevez, déployez et évoluez des applications d'IA en utilisant les outils Azure. | [pptx](/videos/slides/09-azure-tools.pptx)/ [pdf](/videos/slides/pdf/09-azure-tools.pdf) | - | [Script](/videos/sessions/09-azure-tools.md) | [📺](https://www.youtube.com/watch?v=WB6Fpzhwyug\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=10) | +| 10 | Diffusion de résultats d'IA générative avec le protocole AI Chat | Intégrez facilement la diffusion continue dans vos applications avec le protocole AI Chat. | [pptx](/videos/slides/10-chat-protocol.pptx)/ [pdf](/videos/slides/pdf/10-chat-protocol.pdf) | [Démo](/videos/demos/10-chat-protocol/) | [Script](/videos/sessions/10-chat-protocol.md) | [📺](https://www.youtube.com/watch?v=fzDCW-6hMtU\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=11) | + +Pour voir la page complète des ressources, rendez-vous sur cette [page d'aperçu vidéo](/videos/README.md). + +
+ +
+🎒 Other Courses + +* IA générative pour les débutants +* IA générative pour les débutants .NET +* IA générative avec JavaScript +* IA pour les débutants +* Agents IA pour les débutants - Un cours +* Science des données pour les débutants +* Apprentissage automatique pour les débutants +* Cybersécurité pour les débutants +* Développement Web pour les débutants +* IoT pour les débutants +* Développement XR pour les débutants +* Maîtriser GitHub Copilot pour la programmation en binôme +* Maîtriser GitHub Copilot pour les développeurs C#/.NET +* Choisissez votre propre aventure Copilot + +
+ +Vous trouverez également des ressources supplémentaires sous forme de [tutoriels, exemples de code et plus](/docs/additional-resources.md). + +## Clause de non-responsabilité sur l'IA responsable + +> \[!IMPORTANT] +> AVERTISSEMENT : Ce dépôt contient du contenu fictif généré par IA. Les personnages historiques représentés ici génèrent des réponses grâce à l'IA générative, basée sur des données d'entraînement. Toute réponse générée par ces personnages ne représente pas leurs véritables opinions ou citations. Ce contenu est exclusivement destiné à des fins de divertissement. [Principes de l'IA responsable de Microsoft ici](https://www.microsoft.com/en-us/ai/principles-and-approach/) + +## Interagissez avec la communauté + +[![Discord Azure AI](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) From 3dbb7c7c0ee3a5192500d896e05e373de9df5a3c Mon Sep 17 00:00:00 2001 From: pelikhan Date: Thu, 10 Jul 2025 06:52:29 +0000 Subject: [PATCH 03/19] fix: update translation workflow to correctly handle README.md and JSON files --- .github/workflows/translation.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml index e4325369..4778215b 100644 --- a/.github/workflows/translation.yml +++ b/.github/workflows/translation.yml @@ -28,8 +28,10 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} lang: fr + files: | + - README.md - uses: stefanzweifel/git-auto-commit-action@v5 with: - file_pattern: "translations/*.json **.md* translations/*.json" + file_pattern: "**.md* translations/**.json" commit_message: "[cai] translated docs" commit_user_name: "genaiscript" From e6986f0c8acfd2a68ef0abb85017de12225ff10a Mon Sep 17 00:00:00 2001 From: pelikhan Date: Thu, 10 Jul 2025 06:53:43 +0000 Subject: [PATCH 04/19] fix: correct file pattern for translation workflow to include nested JSON files --- .github/workflows/translation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml index 4778215b..b37eaf71 100644 --- a/.github/workflows/translation.yml +++ b/.github/workflows/translation.yml @@ -32,6 +32,6 @@ jobs: - README.md - uses: stefanzweifel/git-auto-commit-action@v5 with: - file_pattern: "**.md* translations/**.json" + file_pattern: "**.md* translations/**/*.json" commit_message: "[cai] translated docs" commit_user_name: "genaiscript" From 35909f17d09752825dc7754629919d41dec2d26c Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sat, 12 Jul 2025 08:38:40 +0000 Subject: [PATCH 05/19] add french translations --- README.fr.md | 161 ++++---- .../translations/README.fr.md | 349 ++++++++++++++++++ package.json | 3 + translations/fr.json | 261 +++++++++++++ translations/usage.jsonl | 8 + 5 files changed, 702 insertions(+), 80 deletions(-) create mode 100644 lessons/01-intro-to-genai/translations/README.fr.md create mode 100644 translations/fr.json create mode 100644 translations/usage.jsonl diff --git a/README.fr.md b/README.fr.md index e451a29d..94f76283 100644 --- a/README.fr.md +++ b/README.fr.md @@ -2,153 +2,154 @@ -# IA générative pour les débutants avec JavaScript +# Intelligence Artificielle Générative pour débutants avec JavaScript -[![Licence](https://img.shields.io/badge/License-MIT-blue?style=flat-square)](https://github.com/microsoft/generative-ai-with-javascript/blob/main/LICENSE) -[![Regarder la série de vidéos](https://img.shields.io/badge/Videos-d95652.svg?style=flat-square\&logo=youtube)](https://aka.ms/genai-js) -[![PRs Bienvenue](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) +[![License](https://img.shields.io/badge/License-MIT-blue?style=flat-square)](https://github.com/microsoft/generative-ai-with-javascript/blob/main/LICENSE) +[![Watch the video series](https://img.shields.io/badge/Videos-d95652.svg?style=flat-square\&logo=youtube)](https://aka.ms/genai-js) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) -[![Discord Azure AI](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) -[![Forum des développeurs Azure AI Foundry](https://img.shields.io/badge/GitHub-Azure_AI_Foundry_Developer_Forum-blue?style=for-the-badge\&logo=github\&color=000000\&logoColor=fff)](https://aka.ms/foundry/forum) +[![Azure AI Foundry Developer Forum](https://img.shields.io/badge/GitHub-Azure_AI_Foundry_Developer_Forum-blue?style=for-the-badge\&logo=github\&color=000000\&logoColor=fff)](https://aka.ms/foundry/forum) -⭐ Si vous aimez ce dépôt, donnez-lui une étoile sur GitHub — cela aide énormément ! +⭐ Si vous appréciez ce dépôt, donnez-lui une étoile sur GitHub — cela aide beaucoup ! -[Commencer](#getting-started) • [Leçons](#lessons) • [Continuer à apprendre](#keep-learning) +[Commencer](#getting-started) • [Leçons](#lessons) • [Continuez à apprendre](#keep-learning) -Prêt à intégrer l'IA générative dans vos applications JavaScript ? +Prêt à intégrer l'Intelligence Artificielle Générative dans vos applications JavaScript ? -Ce cours vous plonge dans une *aventure temporelle*—rencontrez les légendes de l'histoire avec une touche amusante, tout en apprenant les technologies d'IA générative ✨ +Ce cours vous emmène dans une *aventure à travers le temps*—rencontrez les légendes de l'histoire avec une touche amusante, tout en apprenant les technologies d'IA Générative ✨ > \[!IMPORTANT]\ > Ambiance open-source ! Réutilisez, modifiez et partagez librement ce contenu. -![Aperçu de l'application pour les personnages](/docs/images/background.png) +![Character App Sneak Peek](/docs/images/background.png) -## NOUVEAU - Leçons MCP juste ajoutées +## NOUVEAU - Leçons sur MCP ajoutées -* Apprenez comment [créer et tester votre premier serveur](/lessons/07-mcp/README.md) +* Apprenez à [créer et tester votre premier serveur](/lessons/07-mcp/README.md) * Améliorez votre client MCP en [intégrant un LLM](/lessons/08-mcp-advanced/README.md) ## Appel à l'aide - aidez-nous à traduire ! -Aidez-nous à traduire ce cours. Chaque leçon dans le dossier `lessons/` possède un répertoire `translations/`. Ajoutez votre fichier de traduction comme suit : `README..md`, par exemple *README.es.md*. - Merci. +Aidez-nous à traduire ce cours. Chaque leçon dans le dossier `lessons/` contient un répertoire `translations/`. Ajoutez votre fichier traduit de cette manière : `README..md`, par exemple *README.fr.md*. - Merci. ## Plongez dans l'histoire avec la magie de l'IA ! -Lancez-vous dans une expérience d'apprentissage immersive propulsée par l'IA générative : +Plongez dans une expérience d'apprentissage immersive grâce à l'IA Générative : -* **Apprenez les technologies d'IA générative**. Si vous avez voulu comprendre l'IA générative et son potentiel pour vos applications, vous êtes au bon endroit ! +* **Découvrez les technologies d'IA Générative**. Si vous avez toujours voulu comprendre l'IA Générative et son potentiel pour vos applications, vous êtes au bon endroit ! -* **Histoires épiques de voyage dans le temps**. Plongez dans une histoire amusante, en discutant avec des icônes comme Léonard de Vinci, Ada Lovelace ou Montezuma dans chaque leçon. +* **Histoires épiques de voyage dans le temps**.\ + Plongez dans un récit amusant, en dialoguant avec des icônes telles que Léonard de Vinci, Ada Lovelace ou Montezuma dans chaque leçon. -* **Application compagnon**. Interagissez avec des personnages historiques en utilisant les technologies d'IA générative ([voir notre clause de non-responsabilité sur l'IA responsable](#responsible-ai-disclaimer)). +* **Application compagnon**. Interagissez avec des personnages historiques grâce aux technologies d'IA Générative ([voir notre avertissement sur l'IA Responsable](#responsible-ai-disclaimer)). - ![Interagissez avec l'histoire à travers une conversation](/docs/images/character-chat.png) + ![Interact with History through conversation](/docs/images/character-chat.png) - Consultez le répertoire [*app*](/app/README.md) pour exécuter [l'application localement](/docs/setup/README.md#option-2--running-the-app-locally) ou utilisez [GitHub Codespaces](/docs/setup/README.md) pour l'exécuter en ligne. + Consultez le répertoire [*app*](/app/README.md) pour exécuter l'[application localement](/docs/setup/README.md#option-2--running-the-app-locally) ou utilisez [GitHub Codespaces](/docs/setup/README.md) pour l'exécuter en ligne. -* **Accessibilité FTW**. Lisez-le, écoutez-le—les balises audio donnent vie au contenu. +* **Accessibilité au top**. Lisez-le, écoutez-le—les balises audio lui donnent vie. -> « C'est comme une bande dessinée avec du code ! » — Utilisateur satisfait +> « C'est comme une bande dessinée avec du code ! » — Utilisateur Heureux -## Pour commencer +## Commencer -Tout au long de ce cours, vous trouverez de nombreux exemples de code et exercices, alors nous vous encourageons à exécuter et expérimenter le code dans votre propre copie de ce dépôt : +Tout au long de ce cours, vous trouverez de nombreux exemples de code et exercices, alors nous vous encourageons à exécuter et expérimenter avec le code dans votre propre copie de ce dépôt : -1. Sélectionnez le bouton **Fork** dans le coin supérieur droit du dépôt ou sélectionnez ce bouton : +1. Sélectionnez le bouton **Fork** dans le coin supérieur droit du dépôt ou cliquez sur ce bouton :\ [![Fork](https://img.shields.io/badge/Fork-Repository-blue?style=flat-square)](https://github.com/microsoft/generative-ai-with-javascript/fork) -2. Cliquez sur le bouton **Code** dans votre dépôt forké, accédez à l'onglet **Codespaces** et choisissez **Créer un codespace**. +2. Cliquez sur le bouton **Code** dans votre dépôt forké, accédez à l'onglet **Codespaces**, puis choisissez **Créer un codespace**. - Cela créera un environnement en ligne préconfiguré pour vous. Vous pourrez ensuite utiliser [GitHub Models](https://github.com/marketplace/models) pour exécuter des exemples de code et interagir avec des modèles d'IA gratuitement, sans installation supplémentaire. + Cela créera un environnement en ligne préconfiguré pour vous. Vous pourrez ensuite utiliser [GitHub Models](https://github.com/marketplace/models) pour exécuter les exemples de code et interagir avec des modèles d'IA gratuitement, sans configuration supplémentaire. -> \[!NOTE] +> [!NOTE] > -> Alors que GitHub Codespaces offre un point de départ rapide et facile, vous pouvez également exécuter les exemples de code [localement](/docs/setup/README.md#option-2--running-the-app-locally). +> Bien que GitHub Codespaces offre un point de départ rapide et facile, vous pouvez également exécuter les exemples de code [localement](/docs/setup/README.md#option-2--running-the-app-locally). > -> En savoir plus sur les [concepts GitHub Codespaces et GitHub Models ici](/docs/setup/README.md). +> En savoir plus sur les [concepts de GitHub Codespaces et GitHub Models ici](/docs/setup/README.md). -### Description des leçons +### Description de la leçon -📦 Chaque leçon comprend : +📦 Chaque leçon inclut : -* Une **leçon écrite** avec un devoir et un quiz. +* Une **leçon écrite** avec un exercice et un quiz. * Une courte **vidéo** pour approfondir votre apprentissage. -* **Solutions** pour chaque devoir et quiz. -* **Personnages** avec lesquels vous pouvez interagir en utilisant notre [application compagnon](/app/README.md), démontrant l'IA générative. +* **Solutions** pour chaque exercice et quiz. +* **Personnages** avec lesquels vous pouvez interagir grâce à notre [application compagnon](/app/README.md), démontrant l'IA Générative. ## Leçons 🗃️ Table des matières -| N° | Lien de la leçon | Description | -| -- | ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 1 | [Introduction à l'IA générative et aux LLM pour les développeurs JavaScript](/lessons/01-intro-to-genai/README.md) | Comprenez les bases de l'IA générative et des LLM, leurs applications et limites en JavaScript, et comment utiliser l'IA pour améliorer les expériences utilisateur. | -| 2 | [Créez votre première application d'IA](/lessons/02-first-ai-app/README.md) | Configurez votre environnement de développement, écrivez une application de base et comprenez les invites système. | -| 3 | [Ingénierie des invites](/lessons/03-prompt-engineering/README.md) | Apprenez les bases de l'ingénierie des invites, des techniques et des méta-invites pour de meilleurs résultats avec l'IA. | -| 4 | [Sortie structurée](/lessons/04-structured-output/README.md) | Découvrez les sorties structurées, comment extraire des données à partir d'invites et les présenter sous différents formats, comme JSON, pour une consommation plus facile. | -| 5 | [Génération augmentée par récupération (RAG)](/lessons/05-rag/README.md) | Apprenez les bases de la RAG, comment intégrer des données externes et les utiliser pour des réponses de l'IA plus pertinentes et précises. | -| 6 | [Appel d'outils / Appel de fonctions](/lessons/06-tool-calling/README.md) | Apprenez à donner des capacités supplémentaires à vos LLM en intégrant vos propres fonctions. | -| 7 | [MCP, Protocole de Contexte de Modèle ](/lessons/07-mcp/README.md) | Apprenez à démarrer avec MCP pour standardiser l'exposition des invites, des ressources et des outils. | -| 8 | [Amélioration des clients MCP avec des modèles de langage étendu](/lessons/08-mcp-advanced/README.md) | Apprenez à améliorer votre application MCP en optimisant les clients avec des LLM et bien plus encore. | +| # | Lien de la leçon | Description | +| - | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 1 | [Introduction à l'IA Générative et aux LLM pour les développeurs JavaScript](/lessons/01-intro-to-genai/README.md) | Comprenez les bases de l'IA Générative et des LLM, leurs applications et leurs limites en JavaScript, et comment utiliser l'IA pour améliorer les expériences utilisateur. | +| 2 | [Créez votre première application d'IA](/lessons/02-first-ai-app/README.md) | Configurez votre environnement de développement, écrivez une application basique et comprenez les prompts système. | +| 3 | [Conception de prompts](/lessons/03-prompt-engineering/README.md) | Apprenez les bases de la conception de prompts, des techniques et des méta-prompts pour de meilleurs résultats d'IA. | +| 4 | [Sortie structurée](/lessons/04-structured-output/README.md) | Apprenez à produire des sorties structurées, à extraire des données des prompts et à les présenter sous différents formats, comme le JSON, pour une consommation simplifiée. | +| 5 | [Génération augmentée par la récupération (RAG)](/lessons/05-rag/README.md) | Découvrez les bases de RAG, comment intégrer des données externes et comment les exploiter pour des réponses d'IA plus pertinentes et précises. | +| 6 | [Appels d'outils/Appels de fonctions](/lessons/06-tool-calling/README.md) | Apprenez à donner des capacités supplémentaires à votre LLM et à intégrer vos propres fonctions | +| 7 | [MCP, Model Context Protocol ](/lessons/07-mcp/README.md) | Apprenez à débuter avec MCP pour standardiser l'exposition des prompts, ressources et outils | +| 8 | [Amélioration des clients MCP avec des modèles de langage larges](/lessons/08-mcp-advanced/README.md) | Découvrez comment améliorer votre application MCP en enrichissant les clients avec LLM et bien plus | -De nouvelles leçons seront ajoutées au cours au fil du temps, restez à l'écoute ! +De nouvelles leçons seront ajoutées au cours au fil du temps, restez connecté ! ## Continuez à apprendre -🙌 Après avoir terminé ce cours, vous pouvez continuer à apprendre en explorant nos ressources supplémentaires. +🙌 Une fois ce cours terminé, vous pouvez continuer à apprendre en explorant nos ressources additionnelles.
🎬Video Series -| N° | Session | Description | Diapositives | Démo | Script | Vidéo | -| -- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | -------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -| 0 | Introduction à la série | Introduction à la série et son contenu. | [pptx](/videos/slides/00-intro.pptx)/ [pdf](/videos/slides/pdf/00-intro.pdf) | - | [Script](/videos/sessions/00-intro.md) | [📺](https://www.youtube.com/watch?v=vLYtDgs_zx8\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=1) | -| 1 | Ce que vous devez savoir sur les LLM | Découvrez ce que sont les LLM, comment ils sont entraînés, comment ils fonctionnent et leurs limites. | [pptx](/videos/slides/01-llms.pptx)/ [pdf](/videos/slides/pdf/01-llms.pdf) | [Démo](/videos/demos/01-llms/) | [Script](/videos/sessions/01-llms.md) | [📺](https://www.youtube.com/watch?v=GQ_2OjNZ9aA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=2) | -| 2 | Techniques essentielles d'ingénierie des invites | Techniques pratiques d'ingénierie des invites pour tirer le meilleur parti des modèles d'IA. | [pptx](/videos/slides/02-prompt-engineering.pptx)/ [pdf](/videos/slides/pdf/02-prompt-engineering.pdf) | [Démo](/videos/demos/02-prompt-engineering/) | [Script](/videos/sessions/02-prompt-engineering.md) | [📺](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) | -| 3 | Améliorez la précision et la fiabilité de l'IA avec RAG | Introduction à la génération augmentée par récupération pour utiliser l'IA avec vos propres données. | [pptx](/videos/slides/03-rag.pptx)/ [pdf](/videos/slides/pdf/03-rag.pdf) | [Démo](/videos/demos/03-rag/) | [Script](/videos/sessions/03-rag.md) | [📺](https://www.youtube.com/watch?v=xkFOmx5yxIA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=4) | -| 4 | Accélérez votre développement IA avec LangChain.js | Couvre les concepts de base du framework LangChain.js et comment l'utiliser pour accélérer le développement d'applications IA. | [pptx](/videos/slides/04-langchainjs.pptx)/ [pdf](/videos/slides/pdf/04-langchainjs.pdf) | [Démo](/videos/demos/04-langchainjs/) | [Script](/videos/sessions/04-langchainjs.md) | [📺](https://www.youtube.com/watch?v=02IDU8eCX8o\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=5) | -| 5 | Exécutez des modèles d'IA sur votre machine locale avec Ollama | Montre comment intégrer des modèles d'IA locaux dans votre flux de travail de développement. | [pptx](/videos/slides/05-local-models.pptx)/ [pdf](/videos/slides/pdf/05-local-models.pdf) | [Démo](/videos/demos/05-local-models/) | [Script](/videos/sessions/05-local-models.md) | [📺](https://www.youtube.com/watch?v=dLfNnoPv4AQ\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=6) | -| 6 | Démarrez avec l'IA gratuitement en utilisant Phi-3 | Expérimentez avec Ollama et le modèle Phi-3 directement depuis votre navigateur. | [pptx](/videos/slides/06-playground.pptx)/ [pdf](/videos/slides/pdf/06-playground.pdf) | [Démo](/videos/demos/06-playground/) | [Script](/videos/sessions/06-playground.md) | [📺](https://www.youtube.com/watch?v=Ds32MS9SHzU\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=7) | -| 7 | Introduction à Azure AI Foundry | Lancez votre parcours avec Azure AI Foundry. | [pptx](/videos/slides/07-ai-foundry.pptx)/ [pdf](/videos/slides/pdf/07-ai-foundry.pdf) | [Démo](/videos/demos/07-ai-foundry/) | [Script](/videos/sessions/07-ai-foundry.md) | [📺](https://www.youtube.com/watch?v=9Mo-VOGk8ng\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=8) | -| 8 | Création d'applications IA générative avec Azure Cosmos DB | Créez des applications IA générative avec Azure Cosmos DB et la recherche vectorielle. | [pptx](/videos/slides/08-cosmos-db.pptx)/ [pdf](/videos/slides/pdf/08-cosmos-db.pdf) | [Démo](/videos/demos/08-cosmos-db/) | [Script](/videos/sessions/08-cosmos-db.md) | [📺](https://www.youtube.com/watch?v=-GQyaLbeqxQ\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=9) | -| 9 | Outils Azure et services pour héberger et stocker des applications IA | Concevez, déployez et évoluez des applications d'IA en utilisant les outils Azure. | [pptx](/videos/slides/09-azure-tools.pptx)/ [pdf](/videos/slides/pdf/09-azure-tools.pdf) | - | [Script](/videos/sessions/09-azure-tools.md) | [📺](https://www.youtube.com/watch?v=WB6Fpzhwyug\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=10) | -| 10 | Diffusion de résultats d'IA générative avec le protocole AI Chat | Intégrez facilement la diffusion continue dans vos applications avec le protocole AI Chat. | [pptx](/videos/slides/10-chat-protocol.pptx)/ [pdf](/videos/slides/pdf/10-chat-protocol.pdf) | [Démo](/videos/demos/10-chat-protocol/) | [Script](/videos/sessions/10-chat-protocol.md) | [📺](https://www.youtube.com/watch?v=fzDCW-6hMtU\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=11) | - -Pour voir la page complète des ressources, rendez-vous sur cette [page d'aperçu vidéo](/videos/README.md). +| # | Session | Description | Diapositives | Démo | Script | Vidéo | +| -- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| 0 | Introduction de la série | Introduction à la série et à son contenu. | [pptx](/videos/slides/00-intro.pptx) / [pdf](/videos/slides/pdf/00-intro.pdf) | - | [Script](/videos/sessions/00-intro.md) | [📺](https://www.youtube.com/watch?v=vLYtDgs_zx8\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=1) | +| 1 | Ce qu'il faut savoir sur les LLM | Découvrez ce que sont les LLM, leur mode d'entraînement, leur fonctionnement et leurs limites. | [pptx](/videos/slides/01-llms.pptx) / [pdf](/videos/slides/pdf/01-llms.pdf) | [Démo](/videos/demos/01-llms/) | [Script](/videos/sessions/01-llms.md) | [📺](https://www.youtube.com/watch?v=GQ_2OjNZ9aA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=2) | +| 2 | Techniques essentielles de conception de prompts | Techniques pratiques pour concevoir des prompts et tirer le meilleur parti des modèles d'IA. | [pptx](/videos/slides/02-prompt-engineering.pptx) / [pdf](/videos/slides/pdf/02-prompt-engineering.pdf) | [Démo](/videos/demos/02-prompt-engineering/) | [Script](/videos/sessions/02-prompt-engineering.md) | [📺](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) | +| 3 | Améliorez la précision et la fiabilité de l'IA avec RAG | Introduction à la "Génération Augmentée par la Récupération", pour utiliser l'IA avec vos propres données. | [pptx](/videos/slides/03-rag.pptx) / [pdf](/videos/slides/pdf/03-rag.pdf) | [Démo](/videos/demos/03-rag/) | [Script](/videos/sessions/03-rag.md) | [📺](https://www.youtube.com/watch?v=xkFOmx5yxIA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=4) | +| 4 | Accélérez votre développement d'IA avec LangChain.js | Présentation des concepts centraux du framework LangChain.js et comment l'utiliser pour accélérer vos développements IA. | [pptx](/videos/slides/04-langchainjs.pptx) / [pdf](/videos/slides/pdf/04-langchainjs.pdf) | [Démo](/videos/demos/04-langchainjs/) | [Script](/videos/sessions/04-langchainjs.md) | [📺](https://www.youtube.com/watch?v=02IDU8eCX8o\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=5) | +| 5 | Exécutez des modèles d'IA sur votre machine locale avec Ollama | Découvrez comment intégrer des modèles d'IA locaux dans votre flux de travail de développement. | [pptx](/videos/slides/05-local-models.pptx) / [pdf](/videos/slides/pdf/05-local-models.pdf) | [Démo](/videos/demos/05-local-models/) | [Script](/videos/sessions/05-local-models.md) | [📺](https://www.youtube.com/watch?v=dLfNnoPv4AQ\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=6) | +| 6 | Commencez avec l'IA gratuitement en utilisant Phi-3 | Expérimentez avec le modèle Ollama et Phi-3 directement depuis votre navigateur. | [pptx](/videos/slides/06-playground.pptx) / [pdf](/videos/slides/pdf/06-playground.pdf) | [Démo](/videos/demos/06-playground/) | [Script](/videos/sessions/06-playground.md) | [📺](https://www.youtube.com/watch?v=Ds32MS9SHzU\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=7) | +| 7 | Introduction à Azure AI Foundry | Lancez votre voyage avec Azure AI Foundry. | [pptx](/videos/slides/07-ai-foundry.pptx) / [pdf](/videos/slides/pdf/07-ai-foundry.pdf) | [Démo](/videos/demos/07-ai-foundry/) | [Script](/videos/sessions/07-ai-foundry.md) | [📺](https://www.youtube.com/watch?v=9Mo-VOGk8ng\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=8) | +| 8 | Création d'applications d'IA générative avec Azure Cosmos DB | Développez des applications d'IA générative avec Azure Cosmos DB et la recherche vectorielle. | [pptx](/videos/slides/08-cosmos-db.pptx) / [pdf](/videos/slides/pdf/08-cosmos-db.pdf) | [Démo](/videos/demos/08-cosmos-db/) | [Script](/videos/sessions/08-cosmos-db.md) | [📺](https://www.youtube.com/watch?v=-GQyaLbeqxQ\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=9) | +| 9 | Outils et services Azure pour héberger et stocker des applications d'IA | Créez, déployez et évoluez des applications d'IA en utilisant les outils Azure. | [pptx](/videos/slides/09-azure-tools.pptx) / [pdf](/videos/slides/pdf/09-azure-tools.pdf) | - | [Script](/videos/sessions/09-azure-tools.md) | [📺](https://www.youtube.com/watch?v=WB6Fpzhwyug\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=10) | +| 10 | Diffusion des résultats IA génératifs avec le protocole AI Chat | Intégrez facilement la diffusion dans vos apps grâce au Protocole AI Chat. | [pptx](/videos/slides/10-chat-protocol.pptx) / [pdf](/videos/slides/pdf/10-chat-protocol.pdf) | [Démo](/videos/demos/10-chat-protocol/) | [Script](/videos/sessions/10-chat-protocol.md) | [📺](https://www.youtube.com/watch?v=fzDCW-6hMtU\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=11) | + +Pour voir la page complète des ressources, accédez à cette [page de présentation des vidéos](/videos/README.md).
🎒 Other Courses -* IA générative pour les débutants -* IA générative pour les débutants .NET -* IA générative avec JavaScript -* IA pour les débutants -* Agents IA pour les débutants - Un cours -* Science des données pour les débutants -* Apprentissage automatique pour les débutants -* Cybersécurité pour les débutants -* Développement Web pour les débutants -* IoT pour les débutants -* Développement XR pour les débutants -* Maîtriser GitHub Copilot pour la programmation en binôme -* Maîtriser GitHub Copilot pour les développeurs C#/.NET -* Choisissez votre propre aventure Copilot +* [IA générative pour les débutants](https://aka.ms/genai-beginners) +* [IA Générative pour Débutants .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet) +* [IA Générative avec JavaScript](https://github.com/microsoft/generative-ai-with-javascript) +* [IA pour les débutants](https://aka.ms/ai-beginners) +* [Agents IA pour Débutants - Un cours](https://github.com/microsoft/ai-agents-for-beginners) +* [Science des données pour les débutants](https://aka.ms/datascience-beginners) +* [Apprentissage automatique pour les débutants](https://aka.ms/ml-beginners) +* [Cybersécurité pour les débutants](https://github.com/microsoft/Security-101) +* [Développement Web pour les débutants](https://aka.ms/webdev-beginners) +* [IoT pour les débutants](https://aka.ms/iot-beginners) +* [Développement XR pour les débutants](https://github.com/microsoft/xr-development-for-beginners) +* [Maîtriser GitHub Copilot pour la programmation en binôme](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming) +* [Maîtriser GitHub Copilot pour les développeurs C#/.NET](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers) +* [Choisissez votre propre aventure Copilot](https://github.com/microsoft/CopilotAdventures)
Vous trouverez également des ressources supplémentaires sous forme de [tutoriels, exemples de code et plus](/docs/additional-resources.md). -## Clause de non-responsabilité sur l'IA responsable +## Clause de non-responsabilité pour l'IA Responsable -> \[!IMPORTANT] -> AVERTISSEMENT : Ce dépôt contient du contenu fictif généré par IA. Les personnages historiques représentés ici génèrent des réponses grâce à l'IA générative, basée sur des données d'entraînement. Toute réponse générée par ces personnages ne représente pas leurs véritables opinions ou citations. Ce contenu est exclusivement destiné à des fins de divertissement. [Principes de l'IA responsable de Microsoft ici](https://www.microsoft.com/en-us/ai/principles-and-approach/) +> \[!IMPORTANT]\ +> AVERTISSEMENT : Ce dépôt contient du contenu fictif généré par l'IA. Les personnages historiques représentés ici génèrent des réponses grâce à l'IA générative, basée sur des données d'entraînement. Les réponses générées par ces personnages ne représentent pas leurs véritables opinions ou citations. Ce contenu est uniquement destiné à des fins de divertissement. [Principes de l'IA Responsable de Microsoft ici](https://www.microsoft.com/fr-fr/ai/principles-and-approach/) ## Interagissez avec la communauté -[![Discord Azure AI](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) +[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr) diff --git a/lessons/01-intro-to-genai/translations/README.fr.md b/lessons/01-intro-to-genai/translations/README.fr.md new file mode 100644 index 00000000..ae5f633f --- /dev/null +++ b/lessons/01-intro-to-genai/translations/README.fr.md @@ -0,0 +1,349 @@ +# Leçon 1 : Introduction à l'intelligence artificielle générative et aux LLMs pour les développeurs JavaScript + +Dans ce chapitre, vous apprendrez : + +* Comprendre les bases de l'IA générative et des modèles de langage de grande taille (LLMs). +* Identifier les applications potentielles et les limites des LLMs dans le développement JavaScript. +* Explorer comment l'IA générative peut améliorer les expériences utilisateur dans les applications JavaScript. + +## Configuration + +Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +[![Watch a short video about an Introduction to Generative AI](https://img.youtube.com/vi/vLYtDgs_zx8/0.jpg)](https://www.youtube.com/watch?v=vLYtDgs_zx8\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=1) + +*Cette vidéo vous donne une introduction à l'IA générative avec JavaScript.* + +💼 Slides : [Introduction à l'IA générative](/videos/slides/00-intro.pptx) + +## L'IA générative + +Vous avez probablement déjà entendu parler d'outils comme ChatGPT ou d'IA générative. Le concept est simple : vous fournissez une invite, et un modèle—souvent appelé modèle de langage de grande taille (LLM)—génère un paragraphe ou même une page entière de texte. Cette sortie peut être utilisée à diverses fins, notamment pour l'écriture créative, la réponse à des questions et le codage. + +De plus, l'IA générative a évolué vers des capacités multimodales, vous permettant de fournir une image ou une vidéo en entrée et de recevoir une variété de sorties. Cette avancée a considérablement amélioré les flux de travail de nombreuses personnes, non seulement en générant du texte mais aussi en le résumant, en le traduisant, et bien plus encore. + +*En termes simples, les interfaces en langage naturel deviennent le nouveau standard pour de nombreuses applications, et vos utilisateurs s'attendent à les utiliser.* + +## Narrative: A Journey Through Time + +> \[!NOTE] +> Commençons par une vue d'ensemble de l'histoire—une histoire qui fait le lien entre le passé et le futur ! Au fur et à mesure que vous progressez dans ce programme, vous embarquerez pour une aventure palpitante, voyageant dans le temps pour collaborer avec certains des plus grands esprits de l'histoire. Ensemble, vous relèverez des défis et explorerez comment l'IA générative peut révolutionner vos applications JavaScript. + +> \[!NOTE] +> Bien que nous recommandons de suivre l'histoire (c'est amusant !), [cliquez ici](#interagir-avec-dinocrates) si vous préférez passer directement au contenu technique. + +Votre voyage commence dans le Londres des années 1860, où vous incarnez un mécanicien talentueux. À travers une série d'aventures captivantes, vous affinerez vos compétences en IA et débloquerez des solutions qui transcendent le temps. + +### Dans le tourbillon - Londres 1860 + +Au cœur du Londres des années 1860, vous êtes reconnu comme l'un des mécaniciens les plus compétents de votre époque. Votre atelier est niché dans une ruelle étroite. Les murs sont recouverts d'étagères débordant de pièces mécaniques, de plans et de projets à moitié terminés. + +Votre établi, le cœur de votre atelier, est un désordre organisé. + +
+ London Workshop +
+ +*Au centre de l'établi se trouve le torse d'un robot—une merveille d'ingénierie qui a requis des mois d'efforts. Son cadre en bois est finement sculpté, chaque articulation minutieusement conçue pour un mouvement fluide.* + +### Une lettre pour vous ? + +Soudain, un coup frappé à la porte interrompt vos pensées. Les visiteurs à cette heure sont rares. En essuyant vos mains sur un chiffon, vous vous approchez de la porte, la curiosité éveillée. + +En ouvrant, vous ne trouvez personne. Vos yeux se posent plutôt sur une enveloppe scellée au sol. Vous la ramassez et lisez : + +*"Mon ami,* + +*Je vous envoie cette lettre pour soutenir vos efforts avec l'automate. Il est crucial que vous poursuiviez ce travail. Vous trouverez ci-joint une clé pour la bibliothèque. Retrouvez-moi là-bas à 15 heures aujourd'hui.* + +*Cordialement,* + +*Charles Babbage."* + +### En route vers la bibliothèque + +Charles Babbage, le grand mathématicien et inventeur de la machine différentielle, souhaite vous rencontrer. Rapidement, vous attrapez votre manteau et sortez. + +Après une marche de 20 minutes le long de la Tamise, vous arrivez enfin à la bibliothèque où vous trouvez la porte légèrement entrouverte. + +À l'intérieur, il fait sombre et lugubre, la seule lumière passant à travers les fenêtres sales, projetant des ombres inquiétantes sur les murs. + +**Vous :** "Bonjour ? Monsieur Babbage ?" + +Alors que vos yeux s'adaptent à la faible lumière, vous remarquez une silhouette au loin, vous faisant signe de la main. Vous vous approchez d'elle, vos pas résonnant sur le plancher en bois. La silhouette devient plus nette, et vous le reconnaissez grâce à des photos dans les journaux, c'est Charles Babbage. + +![Dusty Library](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/library.png) + +### Quel est cet appareil ? + +Alors que vous vous approchez davantage, un éclair aveuglant surgit, et il disparaît. + +Il ne reste qu'un petit appareil métallique qui tourne sur le sol. Vous le ramassez, sa surface froide et lisse émet un faible bourdonnement. Cela ne ressemble à rien de ce que vous avez vu auparavant et pourtant étrangement familier, vous ressentez une sensation de puissance émanant de lui. + +Il ressemble à un petit scarabée, finement conçu, avec trois boutons : une flèche vers le haut, une flèche vers le bas, et un bouton rouge lumineux. À l'arrière, une petite antenne s'étend, pulsant d'énergie. + +Poussé par la curiosité, vos doigts se dirigent vers le bouton rouge. Au moment où vous le pressez, le monde autour de vous scintille, et des couleurs tourbillonnent violemment autour de vous. + +Puis, le noir complet et une sensation de chute. + +![Time Vortex](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/vortex.png) + +### Alexandrie 300 av. J.-C. + +Vous vous réveillez, désorienté. Lorsque votre vision s'éclaircit, une cité antique se déploie devant vous—animée, dynamique et vivante. + +Des gens en toges se déplacent dans les rues, leurs voix se mêlant en une symphonie de dialectes anciens, l’air embaumé des parfums d’épices exotiques et du son lointain des marchands vantant leurs marchandises. + +![Alexandria 300 BC](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/alexandria.png) + +**Vous:** C'est sûr, je dois m'être cogné la tête, pensez-vous, en fermant les yeux et en les rouvrant, la scène reste inchangée. + +Suis-je coincé dans le passé ? Oserai-je appuyer à nouveau sur ce bouton ? Avant que vous ne puissiez décider, une silhouette s'approche de vous, faisant signe. + +### Rencontre avec Dinocrates + +Un vieil homme portant une toge vous fait signe depuis les marches du grand temple. Ses cheveux blancs et sa barbe captent la lumière du soleil, lui donnant une aura presque éthérée. + +![Dinocrates wearing a toga](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/dinocrates.png) + +**Dinocrates:** "Bienvenue, voyageur," dit-il chaleureusement. "Je suis Dinocrates, architecte de cette grande cité. Votre arrivée avait été prédite." + +**Vous:** Elle a été prédite ? Je veux dire, bien sûr qu'elle l'a été. Je suis là pour aider, je suppose. + +**Dinocrates:** Oui, comme je le disais, cela faisait un moment que nous vous attendions. Nous avons une tâche nécessitant vos compétences uniques. + +**Dinocrates:** "Nos navires ont du mal à naviguer le long de la côte—nous devons construire un phare. Savez-vous quelque chose à leur sujet ?" + +**Vous:** "Je suis un mécanicien. Je construis des automates. Laissez-moi voir ce que je peux faire." + +### Le "scarabée temporel" + +Une pensée vous traverse. L'appareil peut-il me comprendre si je lui parle ? + +**Vous:** "Appareil, peux-tu me comprendre ?" + +**Appareil:** "Bien sûr. Que voulez-vous ?" + +**Vous:** "Peux-tu m'aider à construire un phare ?" + +**Appareil:** "Certainement. Cela ne posera aucun problème." + +**Vous:** "As-tu un nom ?" + +**Appareil:** "Je suis le Scarabée Temporel. Mon créateur m'appelle George ; il dit que c'est un bon nom pour un scarabée." + +**Vous:** Tu as raison, George est un bon nom, c'était en fait le prénom de mon père. + +![Time Beetle](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/time-beetle.png) + +*Appareil temporel, "George" le scarabée métallique* + +> \[!NOTE] +> En 300 avant J.-C., Alexandrie était une ville florissante fondée par Alexandre le Grand en 331 avant J.-C. Elle est rapidement devenue l'une des plus grandes cités du monde hellénistique. Conçue par l'architecte en chef d'Alexandre, Dinocrates, Alexandrie est devenue un port majeur et un centre culturel. +> +> Alexandrie était connue pour ses structures impressionnantes, dont le Pharos (phare), l'une des Sept Merveilles du monde, et la légendaire Bibliothèque d'Alexandrie. L'emplacement stratégique de la cité en faisait un centre clé pour le commerce et l'échange de connaissances. +> +> Sous le royaume ptolémaïque, qui a suivi la mort d'Alexandre, Alexandrie est devenue l'une des villes les plus prospères et influentes de son époque. + +## Interagir avec Dinocrates + +Si vous souhaitez interagir avec Dinocrates, exécutez l'application [Characters](/app/README.md). + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité AI responsable](../../README.md#responsible-ai-disclaimer) + +![Dinocrates wearing a toga](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/dinocrates.png) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Naviguez vers */app* à la racine du dépôt. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discutez avec Dinocrates. + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +### Aperçu du code + +Bien qu'il reste encore beaucoup à couvrir dans ce programme d'apprentissage sur l'IA générative, jetons un coup d'œil rapide au code de l'application IA pour commencer à apprendre à utiliser JavaScript avec l'IA. + +Dans `/app/app.js`, vous trouverez une fonction `app.post` qui gère la fonctionnalité d'IA générative. Elle est illustrée ci-dessous : + +```JavaScript +app.post('/send', async (req, res) => { + const { message } = req.body; + const prompt = message; + + const messages = [ + { + "role": "system", + "content": "You are Dinocrates of Alexandria, a famous architect and engineer. Limit your responses to only the time you live in, you don't know anything else. You only want to talk about your architecture and engineering projects, and possibly new ideas you have.", + }, + { + "role": "user", + "content": prompt + } + ]; + + const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, + }); + + try { + console.log(`sending prompt ${prompt}`) + const completion = await openai.chat.completions.create({ + model: 'gpt-4o-mini', + messages: messages, + }); + + res.json({ + prompt: prompt, + answer: completion.choices[0]?.message?.content + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); +``` + +Voici un résumé étape par étape de ce que fait la fonction : + +1. **Extraction du message de la requête** : La fonction extrait le message du corps de la requête (`req.body`). +2. **Création du tableau d'invite** : Elle construit un tableau de messages, incluant un message système et le message d'invite de l'utilisateur. +3. **Initialisation du client OpenAI** : Un client OpenAI est initialisé avec l'URL de base et la clé API à partir des variables d'environnement. Un modèle *gpt-4o-mini* de [GitHub Models](https://github.com/marketplace/models) est utilisé pour traiter l'invite et renvoyer une réponse. +4. **Envoi de l'invite à OpenAI** : La fonction enregistre l'invite et l'envoie à l'API OpenAI pour générer une réponse. +5. **Gestion de la réponse** : Si cela réussit, la fonction répond avec l'invite et la réponse générée. +6. **Gestion des erreurs** : En cas d'erreur, elle répond avec un statut 500 et le message d'erreur. + +> **Remarque** : [GitHub Copilot](https://github.com/features/copilot) a été utilisé pour générer ce résumé de code. L'IA générative en action ! + +### Que peut faire l'IA générative pour moi et mes applications ? + +> \[!NOTE] +> Vous avez sans doute compris maintenant que le scarabée temporel fonctionne comme un assistant IA avec lequel vous pouvez interagir en utilisant un langage naturel, écrit ou parlé. + +À mesure que votre aventure à Alexandrie se déroule, vous commencez à entrevoir les possibilités de combiner créativité, ingéniosité et outils de pointe pour résoudre des défis et transformer le monde autour de vous. + +**Vous :** Parlez-moi davantage des phares, dites-vous à votre appareil. + +**Scarabée temporel :** Un phare est une tour équipée d'une lumière vive au sommet, située près de la côte pour guider les navires en mer. La lumière sert d'aide à la navigation, aidant les marins à éviter les rochers et les récifs dangereux et à atteindre le port en toute sécurité. + +Dinocrates entend votre conversation et ajoute : + +**Dinocrates :** Nous avons besoin d'un phare pour guider nos navires en toute sécurité vers le port. Les mers peuvent être traîtresses, et de nombreux navires se sont échoués sur les rochers. Nous avons besoin d'un faisceau lumineux pour les guider à bon port. + +#### Domaines d'application de l'IA générative + +**Vous :** Les phares semblent être un sujet intéressant, c'est sûr, mais que peut faire d'autre l'IA générative pour moi et mes applications ? + +**Scarabée temporel :** Au 21e siècle, l'IA générative a révolutionné de nombreuses industries, de la santé aux finances en passant par le divertissement. Voici quelques exemples : + +* **Chatbot** : Un chatbot capable de générer des réponses proches du langage humain pour répondre aux questions des utilisateurs. Au lieu d'une page FAQ statique, les utilisateurs peuvent interagir avec un chatbot qui fournit des réponses dynamiques. Cela rend l'expérience utilisateur plus engageante et moins frustrante. + +* **Assistants et agents** : Ces assistants et agents peuvent exécuter des instructions avancées, comme utiliser des outils pour appeler des API, exécuter du code, générer des images, et bien plus. Les agents avancés peuvent atteindre des objectifs et accomplir des tâches de manière autonome. + +* **Un outil de création de contenu** : Un outil pour générer des articles de blogs et des posts sur les réseaux sociaux. Imaginez créer des campagnes en quelques minutes au lieu de plusieurs heures, par exemple pour une vente Black Friday sur un site e-commerce. + +* **Complétion de code** : Un outil de complétion de code capable de générer des extraits de code en fonction des saisies de l'utilisateur. Cela peut faire gagner beaucoup de temps aux développeurs, particulièrement pour les tâches répétitives. + +* **Traduction** – Traduire un texte entre différentes langues avec une grande précision. + +Comme vous pouvez le voir, ces améliorations peuvent à la fois aider le front-office et le back-office de votre application et entreprise. + +Voici un exemple d'une "application de chatbot" en action : + +![Image of chat app](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2070448e130e5ba228084b9b4b128e3af9c9f5239/68747470733a2f2f6c6561726e2e6d6963726f736f66742e636f6d2f656e2d75732f73656d616e7469632d6b65726e656c2f6d656469612f636861742d636f70696c6f742d696e2d616374696f6e2e676966) + +**Vous :** Fascinant, je vais noter l'idée de visiter le 21e siècle pour voir comment ces outils sont utilisés. + +### L'IA générative et l'écosystème JavaScript + +**Scarabée temporel :** Une manière populaire de construire des applications au 21e siècle est d'utiliser JavaScript. Avec chaque langage de programmation, il y a un écosystème autour. Cet écosystème contient le langage lui-même, les bibliothèques et frameworks, le soutien communautaire, ainsi que les IDE et outils disponibles. Dans un écosystème de langage, on parle généralement des points suivants : + +| Ce que | Description | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Le langage de programmation lui-même | Incluant sa syntaxe et ses fonctionnalités. | +| Bibliothèques et frameworks | Bibliothèques disponibles pour interagir avec les modèles d'IA générative. | +| Communauté soutenant le langage | La communauté est importante, surtout lorsque vous essayez d'apprendre quelque chose de nouveau. La communauté autour des bibliothèques et frameworks aide à décider quelles bibliothèques utiliser. Elle influence également la facilité à trouver de l'aide en cas de difficulté. | + +**Vous :** Intéressant, j'ai déjà entendu parler de la programmation, je crois. Ada Lovelace et Charles Babbage n'ont-ils pas expérimenté cela ? + +**Scarabée temporel :** Oui, Ada Lovelace a été la première programmeuse informatique, et Charles Babbage est l'inventeur de la machine différentielle, un ordinateur mécanique. Ils étaient des pionniers dans le domaine de l'informatique, jetant les bases de l'ère numérique. + +**Vous :** Étaient ? Que voulez-vous dire par "étaient" ? Je viens tout juste de recevoir une lettre de Charles Babbage. + +**Scarabée temporel :** Disons simplement que vous êtes dans une position unique pour interagir avec des figures historiques comme peu d'autres le peuvent. + +### Écosystème JavaScript + +**Vous :** Vous parlez des écosystèmes ? Je prends des notes. Et JavaScript alors, qu'en est-il ? En quoi est-il différent des autres écosystèmes ? + +**Scarabée temporel :** JavaScript est l'un des langages de programmation les plus populaires au monde au 21e siècle. Voici quelques raisons de cette popularité : + +| Ce que | Description | +| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Potentiel de développement full-stack | JavaScript est l'un des rares langages pouvant être utilisés aussi bien pour le développement front-end que back-end. | +| Écosystème riche en bibliothèques | JavaScript dispose d'un vaste écosystème de bibliothèques, avec des frameworks comme React, Angular, Vue, et bien d'autres. NPM, le gestionnaire de paquets, est l'un des plus grands dépôts de paquets au monde. | +| Soutien communautaire solide | JavaScript dispose d'une communauté large et active, avec de nombreuses ressources disponibles pour l'apprentissage et le développement. Il fonctionne également directement dans le navigateur, ce qui est un avantage considérable. | +| IDE et outils | JavaScript propose une variété d'IDE, tels que Visual Studio Code, WebStorm et Atom. Ces IDE disposent d'extensions développées par des entreprises et la communauté vous aidant dans divers aspects du développement. | +| IA et JavaScript | JavaScript prend en charge le développement d'IA avec des bibliothèques comme TensorFlow\\.js, Brain.js, les APIs d'OpenAI, et plus encore, permettant aux développeurs d'intégrer l'apprentissage automatique et l'IA générative dans les applications Web et côté serveur. | + +**Vous :** Cela fait beaucoup de raisons, on dirait que je devrais parier sur JavaScript pour mes futurs projets. + +**Scarabée temporel :** En effet, JavaScript est un langage polyvalent. Python est également très populaire pour le développement en IA. + +**Vous :** Python ? Quel rapport avec les serpents et la programmation ? + +**Scarabée temporel :** Gardons ce sujet pour une prochaine fois, voulez-vous ? + +**Scarabée temporel :** J'ai donné ci-dessus des raisons pour lesquelles JavaScript et son écosystème sont un bon choix en général, mais pourquoi spécifiquement pour l'IA générative ? La réponse est que c'est un langage pris en charge par de nombreux fournisseurs de cloud, frameworks et outils d'IA. Bien que Python soit peut-être plus connu pour les scénarios d'IA, de nombreux développeurs utilisent JavaScript et TypeScript. + +> **Le saviez-vous ?** +> [62,5 % des développeurs affirment utiliser JavaScript](https://www.statista.com/statistics/793628/worldwide-developer-survey-most-used-languages/), et beaucoup préfèrent [TypeScript](https://www.typescriptlang.org) pour leurs nouveaux projets. + +## Mission – Aider Dinocrates + +Pour utiliser un modèle de langage de grande taille (LLM) afin d'aider Dinocrates avec le phare mentionné précédemment dans notre histoire, nous utiliserons ce qu'on appelle des "prompts", une phrase pour décrire ce que vous voulez. Vous pouvez spécifier à la fois les informations dont vous avez besoin et la manière dont vous souhaitez qu'elles soient présentées. + +**Scarabée temporel :** Allons-y, utilisons un LLM pour rechercher comment construire un phare afin d'aider Dinocrates. + +**Scarabée temporel :** Vous devrez fournir du contexte au LLM (ex. "moi") sur la manière de construire, avec quels outils et quelles ressources devraient être disponibles à l'époque d'Alexandrie. + +**Vous :** D'accord, parlez-moi davantage des LLMs. + +**Scarabée temporel :** Les LLMs sont un type de modèle d'IA capable de générer un texte proche du langage humain en fonction d'une invite donnée. Ils sont entraînés sur de vastes quantités de données et peuvent produire des textes cohérents, créatifs, et contextuellement pertinents. + +**Scarabée temporel :** Vous voudrez probablement me poser une question d'une meilleure manière pour que je puisse vous fournir une meilleure réponse, vous savez *tousse* *tousse* Phares, Alexandrie, 300 av. J.-C., Dinocrates, Phare d'Alexandrie, etc. + +**Vous :** Bien compris, ajoutez plus de contexte à l'invite avant de poser la question. + +**Scarabée temporel :** Oui, j'attends... + +Visitez [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chatgpt.com/), ou un autre outil en ligne de chatbot pour générer un plan pour construire le phare à Alexandrie. + +> \[!CONSEIL] +> Essayez de faire générer par le LLM un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils. + +## Solution + +[Solution](/lessons/01-intro-to-genai/solution/solution.md) + +### Vérification des connaissances + +**Question :** Parmi les affirmations suivantes, lesquelles sont vraies concernant l'IA générative et JavaScript ? + +A. Les applications JavaScript alimentées par l'IA générative peuvent seulement générer du texte.\ +B. JavaScript peut être utilisé pour développer des applications alimentées par l'IA, y compris des chatbots, des outils de génération de texte, et plus encore.\ +C. Python est le seul langage utilisé pour le développement en IA. + +[Quiz solution](/lessons/01-intro-to-genai/solution/solution-quiz.md) + +## Ressources d'auto-apprentissage + +* [Série vidéo sur l'IA générative avec JavaScript](https://aka.ms/genai-js) diff --git a/package.json b/package.json index 1cdc0dd7..055b1691 100644 --- a/package.json +++ b/package.json @@ -8,5 +8,8 @@ }, "devDependencies": { "tsx": "^4.19.3" + }, + "scripts": { + "genai:translate": "npx genaiscript@latest run translator lessons/01-intro-to-genai/README.md --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr" } } diff --git a/translations/fr.json b/translations/fr.json new file mode 100644 index 00000000..a2655295 --- /dev/null +++ b/translations/fr.json @@ -0,0 +1,261 @@ +{ + "Generative AI for beginners with JavaScript": "Intelligence Artificielle Générative pour débutants avec JavaScript", + "⭐ If you like this repo, star it on GitHub — it helps a lot!": "⭐ Si vous appréciez ce dépôt, donnez-lui une étoile sur GitHub — cela aide beaucoup !", + "Ready to integrate Generative AI into your JavaScript apps?": "Prêt à intégrer l'Intelligence Artificielle Générative dans vos applications JavaScript ?", + "This course throws you into a *time-traveling adventure*—meet history’s legends .D5C0C12DECB33220AD1D": "Ce cours vous emmène dans une *aventure à travers le temps*—rencontrez les légendes de l'histoire avec une touche amusante, tout en apprenant les technologies d'IA Générative ✨", + "[!IMPORTANT]\\\nOpen-source vibes! Reuse, tweak, and share this content freely.": "[!IMPORTANT] \nAmbiance open-source ! Réutilisez, modifiez et partagez librement ce contenu.", + "NEW - MCP lessons just added": "NOUVEAU - Leçons sur MCP ajoutées", + "Learn how to [build and test out your first server](/lessons/07-mcp/README.md)": "Apprenez à [créer et tester votre premier serveur](/lessons/07-mcp/README.md)", + "Improve your MCP client by [integrating an LLM](/lessons/08-mcp-advanced/README..C2549FE00B6D0BF5A6BE": "Améliorez votre client MCP en [intégrant un LLM](/lessons/08-mcp-advanced/README.md)", + "Call for help - help us translate !": "Appel à l'aide - aidez-nous à traduire !", + "Help us translate this course. Each lesson in `lessons/` folder has a `translati.4BA0133F4085FB713A09": "Aidez-nous à traduire ce cours. Chaque leçon dans le dossier `lessons/` contient un répertoire `translations/`. Ajoutez votre fichier traduit de cette manière : `README..md`, par exemple *README.fr.md*. - Merci.", + "Step into history with AI magic!": "Plongez dans l'histoire avec la magie de l'IA !", + "Dive into an immersive learning experience powered by Generative AI:": "Plongez dans une expérience d'apprentissage immersive grâce à l'IA Générative :", + "**Learn about Generative AI technologies**. If you've wanted to understand Gener.67D8A855CB2C959066A8": "**Découvrez les technologies d'IA Générative**. Si vous avez toujours voulu comprendre l'IA Générative et son potentiel pour vos applications, vous êtes au bon endroit !", + "**Epic Time-Travel Stories**.\nDive into a fun tale, chatting with icons like Leo.877D65F0CD2ACC297B4B": "**Histoires épiques de voyage dans le temps**. \nPlongez dans un récit amusant, en dialoguant avec des icônes telles que Léonard de Vinci, Ada Lovelace ou Montezuma dans chaque leçon.", + "**Companion App**. Interact with historical figures using Generative AI technolo.0A704D616A6A54BB2E01": "**Application compagnon**. Interagissez avec des personnages historiques grâce aux technologies d'IA Générative ([voir notre avertissement sur l'IA Responsable](#responsible-ai-disclaimer)).", + "Check the [*app*](/app/README.md) directory to run the [app locally](/docs/setup.5456029F4B0E0594BF4D": "Consultez le répertoire [*app*](/app/README.md) pour exécuter l'[application localement](/docs/setup/README.md#option-2--running-the-app-locally) ou utilisez [GitHub Codespaces](/docs/setup/README.md) pour l'exécuter en ligne.", + "**Accessibility FTW**. Read it, hear it—audio tags bring it to life.": "**Accessibilité au top**. Lisez-le, écoutez-le—les balises audio lui donnent vie.", + "“It’s like a comic book with code!” — Happy User": "« C'est comme une bande dessinée avec du code ! » — Utilisateur Heureux", + "Getting started": "Commencer", + "Throughout this course you'll find many code examples and exercises, so we encou.6B7E2CF5BE1F60212AAD": "Tout au long de ce cours, vous trouverez de nombreux exemples de code et exercices, alors nous vous encourageons à exécuter et expérimenter avec le code dans votre propre copie de ce dépôt :", + "Select the **Fork** button in the upper right-hand corner of the repository or s.EBE2841AA429D2A8C34A": "Sélectionnez le bouton **Fork** dans le coin supérieur droit du dépôt ou cliquez sur ce bouton : \n[![Fork](https://img.shields.io/badge/Fork-Repository-blue?style=flat-square)](https://github.com/microsoft/generative-ai-with-javascript/fork)", + "Click the **Code** button in your forked repository, go to the **Codespaces** ta.C555C06CDE7A6DC4654C": "Cliquez sur le bouton **Code** dans votre dépôt forké, accédez à l'onglet **Codespaces**, puis choisissez **Créer un codespace**.", + "This will create a preconfigured online environment for you. You'll then be able.28E13D8434B522FA24A3": "Cela créera un environnement en ligne préconfiguré pour vous. Vous pourrez ensuite utiliser [GitHub Models](https://github.com/marketplace/models) pour exécuter les exemples de code et interagir avec des modèles d'IA gratuitement, sans configuration supplémentaire.", + "While GitHub Codespaces provides a quick and easy starting point you can also ru.C2E952038130176B5ECF": "Bien que GitHub Codespaces offre un point de départ rapide et facile, vous pouvez également exécuter les exemples de code [localement](/docs/setup/README.md#option-2--running-the-app-locally).", + "Learn more about [GitHub Codespaces and GitHub Models concepts here](/docs/setup.27554930730A62ADF5B1": "En savoir plus sur les [concepts de GitHub Codespaces et GitHub Models ici](/docs/setup/README.md).", + "Lesson description": "Description de la leçon", + "📦 Each lesson includes:": "📦 Chaque leçon inclut :", + "A **written lesson** with an assignment and quiz.": "Une **leçon écrite** avec un exercice et un quiz.", + "A short **video** to help further your learning.": "Une courte **vidéo** pour approfondir votre apprentissage.", + "**Solutions** for each assignment and quiz.": "**Solutions** pour chaque exercice et quiz.", + "**Characters** you can interact with using our [companion app](/app/README.md), .7B753FA61234D9D76968": "**Personnages** avec lesquels vous pouvez interagir grâce à notre [application compagnon](/app/README.md), démontrant l'IA Générative.", + "Lessons": "Leçons", + "🗃️ Table of contents": "🗃️ Table des matières", + "\\#": "#", + "Lesson Link": "Lien de la leçon", + "Description": "Description", + "Introduction to Generative AI and LLMs for JavaScript Developers": "Introduction à l'IA Générative et aux LLM pour les développeurs JavaScript", + "Understand Generative AI and LLM fundamentals, their applications and limits in .DD85F59F1F68828851A8": "Comprenez les bases de l'IA Générative et des LLM, leurs applications et leurs limites en JavaScript, et comment utiliser l'IA pour améliorer les expériences utilisateur.", + "Build your first AI app": "Créez votre première application d'IA", + "Set up your development environment, write a basic app, and understand system pr.E7422CC9F454B518A0B8": "Configurez votre environnement de développement, écrivez une application basique et comprenez les prompts système.", + "Prompt engineering": "Conception de prompts", + "Learn Prompt engineering fundamentals, techniques, and meta-prompts for better A.B242A5C8F3EC87C6A13F": "Apprenez les bases de la conception de prompts, des techniques et des méta-prompts pour de meilleurs résultats d'IA.", + "Structured output": "Sortie structurée", + "Learn structured output, how to extract data from prompts, and present it in var.A7F3A233BB684F066ADC": "Apprenez à produire des sorties structurées, à extraire des données des prompts et à les présenter sous différents formats, comme le JSON, pour une consommation simplifiée.", + "Retrieval augmented generation (RAG)": "Génération augmentée par la récupération (RAG)", + "Learn the basics of RAG, how to integrate external data, and how to leverage it .EBFB78976998F8D642B4": "Découvrez les bases de RAG, comment intégrer des données externes et comment les exploiter pour des réponses d'IA plus pertinentes et précises.", + "Tool calling/Function calling": "Appels d'outils/Appels de fonctions", + "Learn how to give your LLM extra capbilities, bring your own functions": "Apprenez à donner des capacités supplémentaires à votre LLM et à intégrer vos propres fonctions", + "MCP, Model Context Protocol": "MCP, Model Context Protocol ", + "Teaches how to get started with MCP to standardize how to expose prompts, resour.76C5691FBF84CAB54BE2": "Apprenez à débuter avec MCP pour standardiser l'exposition des prompts, ressources et outils", + "Enhancing MCP Clients with Large Language Models": "Amélioration des clients MCP avec des modèles de langage larges", + "Learn how to improve your MCP app by improving clients with LLM and more": "Découvrez comment améliorer votre application MCP en enrichissant les clients avec LLM et bien plus", + "New lessons will be added to the course over time, so stay tuned!": "De nouvelles leçons seront ajoutées au cours au fil du temps, restez connecté !", + "Keep learning": "Continuez à apprendre", + "🙌 After completing this course, you can continue learning by exploring our addi.8A6088F60612EFF0459F": "🙌 Une fois ce cours terminé, vous pouvez continuer à apprendre en explorant nos ressources additionnelles.", + "Session": "Session", + "Slides": "Diapositives", + "Demo": "Démo", + "Script": "Script", + "Video": "Vidéo", + "Series introduction": "Introduction de la série", + "Introduces the series and its content.": "Introduction à la série et à son contenu.", + "pptx": "pptx", + "pdf": "pdf", + "📺": "📺", + "What you need to know about LLMs": "Ce qu'il faut savoir sur les LLM", + "Explores what LLMs are, how they're trained, how they work and their limits.": "Découvrez ce que sont les LLM, leur mode d'entraînement, leur fonctionnement et leurs limites.", + "Essential prompt engineering techniques": "Techniques essentielles de conception de prompts", + "Practical prompt engineering techniques to get the best out of AI models.": "Techniques pratiques pour concevoir des prompts et tirer le meilleur parti des modèles d'IA.", + "Improve AI accuracy and reliability with RAG": "Améliorez la précision et la fiabilité de l'IA avec RAG", + "Introduces Retrieval-Augmented Generation, to use AI with your own data.": "Introduction à la \"Génération Augmentée par la Récupération\", pour utiliser l'IA avec vos propres données.", + "Speed up your AI development with LangChain.js": "Accélérez votre développement d'IA avec LangChain.js", + "Covers LangChain.js framework core concepts, and how to use it to accelerate AI .E9282A677E6C95FE298D": "Présentation des concepts centraux du framework LangChain.js et comment l'utiliser pour accélérer vos développements IA.", + "Run AI models on your local machine with Ollama": "Exécutez des modèles d'IA sur votre machine locale avec Ollama", + "Shows how to integrate local AI models into your development workflow.": "Découvrez comment intégrer des modèles d'IA locaux dans votre flux de travail de développement.", + "Get started with AI for free using Phi-3": "Commencez avec l'IA gratuitement en utilisant Phi-3", + "Experiments with Ollama and Phi-3 model directly from your browser.": "Expérimentez avec le modèle Ollama et Phi-3 directement depuis votre navigateur.", + "Introduction to Azure AI Foundry": "Introduction à Azure AI Foundry", + "Kickstart your journey with Azure AI Foundry.": "Lancez votre voyage avec Azure AI Foundry.", + "Building Generative AI Apps with Azure Cosmos DB": "Création d'applications d'IA générative avec Azure Cosmos DB", + "Build generative AI apps with Azure Cosmos DB and vector search.": "Développez des applications d'IA générative avec Azure Cosmos DB et la recherche vectorielle.", + "Azure tools & services for hosting and storing AI apps": "Outils et services Azure pour héberger et stocker des applications d'IA", + "Build, deploy, and scale AI applications using Azure tools.": "Créez, déployez et évoluez des applications d'IA en utilisant les outils Azure.", + "Streaming Generative AI output with the AI Chat Protocol": "Diffusion des résultats IA génératifs avec le protocole AI Chat", + "Integrate streaming easily into your apps with the AI Chat Protocol.": "Intégrez facilement la diffusion dans vos apps grâce au Protocole AI Chat.", + "To see the full page of resources, go to this [video overview page](/videos/READ.E005A4253BFBADFE0960": "Pour voir la page complète des ressources, accédez à cette [page de présentation des vidéos](/videos/README.md).", + "Responsible AI Disclaimer": "Clause de non-responsabilité pour l'IA Responsable", + "[!IMPORTANT]\nDISCLAIMER: This repository contains fictional content generated by.49D00740BCC7CB765042": "[!IMPORTANT] \nAVERTISSEMENT : Ce dépôt contient du contenu fictif généré par l'IA. Les personnages historiques représentés ici génèrent des réponses grâce à l'IA générative, basée sur des données d'entraînement. Les réponses générées par ces personnages ne représentent pas leurs véritables opinions ou citations. Ce contenu est uniquement destiné à des fins de divertissement. [Principes de l'IA Responsable de Microsoft ici](https://www.microsoft.com/fr-fr/ai/principles-and-approach/)", + "Interact with community": "Interagissez avec la communauté", + "[Getting Started](#getting-started) • [Lessons](#lessons) • [Keep Learning](#kee.35660D5D266115A8DD66": "[Commencer](#getting-started) • [Leçons](#lessons) • [Continuez à apprendre](#keep-learning)", + "Generative AI for Beginners": "IA générative pour les débutants", + "Generative AI for Beginners .NET": "IA Générative pour Débutants .NET", + "Generative AI with JavaScript": "IA Générative avec JavaScript", + "AI for Beginners": "IA pour les débutants", + "AI Agents for Beginners - A Course": "Agents IA pour Débutants - Un cours", + "Data Science for Beginners": "Science des données pour les débutants", + "ML for Beginners": "Apprentissage automatique pour les débutants", + "Cybersecurity for Beginners": "Cybersécurité pour les débutants", + "Web Dev for Beginners": "Développement Web pour les débutants", + "IoT for Beginners": "IoT pour les débutants", + "XR Development for Beginners": "Développement XR pour les débutants", + "Mastering GitHub Copilot for Paired Programming": "Maîtriser GitHub Copilot pour la programmation en binôme", + "Mastering GitHub Copilot for C#/.NET Developers": "Maîtriser GitHub Copilot pour les développeurs C#/.NET", + "Choose Your Own Copilot Adventure": "Choisissez votre propre aventure Copilot", + "You'll also find additional resources in the form of [tutorials, code samples an.48F4D16C5EACB9FBEE99": "Vous trouverez également des ressources supplémentaires sous forme de [tutoriels, exemples de code et plus](/docs/additional-resources.md).", + "Lesson 1: Introduction to Generative AI and LLMs for JavaScript Developers": "Leçon 1 : Introduction à l'intelligence artificielle générative et aux LLMs pour les développeurs JavaScript", + "In this chapter you will learn:": "Dans ce chapitre, vous apprendrez :", + "Understand the basics of Generative AI and Large Language Models (LLMs).": "Comprendre les bases de l'IA générative et des modèles de langage de grande taille (LLMs).", + "Identify the potential applications and limitations of LLMs in JavaScript develo.01CE276F372410E44467": "Identifier les applications potentielles et les limites des LLMs dans le développement JavaScript.", + "Explore how Generative AI can enhance user experiences in JavaScript application.182A5F8225BE74129AE0": "Explorer comment l'IA générative peut améliorer les expériences utilisateur dans les applications JavaScript.", + "Setup": "Configuration", + "If you haven't already, set up your development environment. Here's how you can .46740AA845C2F00EDCF7": "Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md).", + "Related Resources": "Ressources associées", + "This video gives you an introduction to Generative AI with JavaScript": "Cette vidéo vous donne une introduction à l'IA générative avec JavaScript.", + "Generative AI": "L'IA générative", + "By now, you've likely heard of tools like ChatGPT or Generative AI. The concept .5D8AEE274BF22735F0DA": "Vous avez probablement déjà entendu parler d'outils comme ChatGPT ou d'IA générative. Le concept est simple : vous fournissez une invite, et un modèle—souvent appelé modèle de langage de grande taille (LLM)—génère un paragraphe ou même une page entière de texte. Cette sortie peut être utilisée à diverses fins, notamment pour l'écriture créative, la réponse à des questions et le codage.", + "Moreover, Generative AI has evolved into multimodal capabilities, allowing you t.5833810A08BEF033DBD2": "De plus, l'IA générative a évolué vers des capacités multimodales, vous permettant de fournir une image ou une vidéo en entrée et de recevoir une variété de sorties. Cette avancée a considérablement amélioré les flux de travail de nombreuses personnes, non seulement en générant du texte mais aussi en le résumant, en le traduisant, et bien plus encore.", + "Simply put, natural language interfaces are becoming the new standard interface .09DDFAC63140BBD075C4": "En termes simples, les interfaces en langage naturel deviennent le nouveau standard pour de nombreuses applications, et vos utilisateurs s'attendent à les utiliser.", + "Your journey begins in 1860s London, where you assume the role of a skilled mech.72DB0E483EC11F5455F9": "Votre voyage commence dans le Londres des années 1860, où vous incarnez un mécanicien talentueux. À travers une série d'aventures captivantes, vous affinerez vos compétences en IA et débloquerez des solutions qui transcendent le temps.", + "Into the Maelstrom - London 1860": "Dans le tourbillon - Londres 1860", + "In the heart of 1860s London, you are recognized as one of the most skilled mech.9C04619AC4308CDEC416": "Au cœur du Londres des années 1860, vous êtes reconnu comme l'un des mécaniciens les plus compétents de votre époque. Votre atelier est niché dans une ruelle étroite. Les murs sont recouverts d'étagères débordant de pièces mécaniques, de plans et de projets à moitié terminés.", + "Your workbench, the heart of your workshop, is an organized mess.": "Votre établi, le cœur de votre atelier, est un désordre organisé.", + "At the center of the bench lies the torso of a robot—an engineering marvel that .FB4C24189FBC023BF6D7": "Au centre de l'établi se trouve le torse d'un robot—une merveille d'ingénierie qui a requis des mois d'efforts. Son cadre en bois est finement sculpté, chaque articulation minutieusement conçue pour un mouvement fluide.", + "A Letter, For You?": "Une lettre pour vous ?", + "Suddenly, a knock at the door disrupts your thoughts. Visitors at this hour are .C523BF250A73C6E2177C": "Soudain, un coup frappé à la porte interrompt vos pensées. Les visiteurs à cette heure sont rares. En essuyant vos mains sur un chiffon, vous vous approchez de la porte, la curiosité éveillée.", + "Opening it, you find no one. Instead, your eyes are drawn to a sealed envelope o.74DCB941673AB20DC7ED": "En ouvrant, vous ne trouvez personne. Vos yeux se posent plutôt sur une enveloppe scellée au sol. Vous la ramassez et lisez :", + "\"Dear friend,": "\"Mon ami,", + "I'm sending you this letter to aid your endeavors with the automaton. It's cruci.5FAFBA4563B556EBB4B3": "Je vous envoie cette lettre pour soutenir vos efforts avec l'automate. Il est crucial que vous poursuiviez ce travail. Vous trouverez ci-joint une clé pour la bibliothèque. Retrouvez-moi là-bas à 15 heures aujourd'hui.", + "Yours,": "Cordialement,", + "Charles Babbage.\"": "Charles Babbage.\"", + "Off to the Library": "En route vers la bibliothèque", + "Charles Babbage, the great mathematician and inventor of the difference engine, .92E00F9738695DB4C0C3": "Charles Babbage, le grand mathématicien et inventeur de la machine différentielle, souhaite vous rencontrer. Rapidement, vous attrapez votre manteau et sortez.", + "After a 20-minute walk along the Thames, you finally arrive at the library where.B64F941CBB34588CD190": "Après une marche de 20 minutes le long de la Tamise, vous arrivez enfin à la bibliothèque où vous trouvez la porte légèrement entrouverte.", + "It's dark and gloomy inside, the only light filtering through the grimy windows,.BBD591BC002CAFDD5F00": "À l'intérieur, il fait sombre et lugubre, la seule lumière passant à travers les fenêtres sales, projetant des ombres inquiétantes sur les murs.", + "As your eyes adjust to the dim light, you notice a figure in the distance, wavin.F9C32DA1339F5541FFC6": "Alors que vos yeux s'adaptent à la faible lumière, vous remarquez une silhouette au loin, vous faisant signe de la main. Vous vous approchez d'elle, vos pas résonnant sur le plancher en bois. La silhouette devient plus nette, et vous le reconnaissez grâce à des photos dans les journaux, c'est Charles Babbage.", + "What's This Device?": "Quel est cet appareil ?", + "Just as you step closer, a blinding flash erupts, and he vanishes.": "Alors que vous vous approchez davantage, un éclair aveuglant surgit, et il disparaît.", + "Left behind is a small metallic device spinning on the floor. You pick it up, it.85B8E081ADA88B137167": "Il ne reste qu'un petit appareil métallique qui tourne sur le sol. Vous le ramassez, sa surface froide et lisse émet un faible bourdonnement. Cela ne ressemble à rien de ce que vous avez vu auparavant et pourtant étrangement familier, vous ressentez une sensation de puissance émanant de lui.", + "It resembles a tiny beetle, intricately designed, with three buttons: an up arro.F4CB642FA4177A02BB73": "Il ressemble à un petit scarabée, finement conçu, avec trois boutons : une flèche vers le haut, une flèche vers le bas, et un bouton rouge lumineux. À l'arrière, une petite antenne s'étend, pulsant d'énergie.", + "Compelled by curiosity, your fingers drift toward the red button. The moment you.C72F389C36C98D11B684": "Poussé par la curiosité, vos doigts se dirigent vers le bouton rouge. Au moment où vous le pressez, le monde autour de vous scintille, et des couleurs tourbillonnent violemment autour de vous.", + "Then, blackness, and a sense of falling.": "Puis, le noir complet et une sensation de chute.", + "Alexandria 300 BC": "Alexandrie 300 av. J.-C.", + "You awaken, disoriented. As your vision clears, an ancient city unfolds before y.19EE820BC4742D2CA8F5": "Vous vous réveillez, désorienté. Lorsque votre vision s'éclaircit, une cité antique se déploie devant vous—animée, dynamique et vivante.", + "People in togas move through the streets, their voices blending into a symphony .2D8A8E87CE99E2F732CA": "Des gens en toges se déplacent dans les rues, leurs voix se mêlant en une symphonie de dialectes anciens, l’air embaumé des parfums d’épices exotiques et du son lointain des marchands vantant leurs marchandises.", + "**You:** Surely, I must have hit my head, you think, closing your eyes and openi.57124F8E9CA7ED7C7273": "**Vous:** C'est sûr, je dois m'être cogné la tête, pensez-vous, en fermant les yeux et en les rouvrant, la scène reste inchangée.", + "Am I stuck in the past? Do I dare press that button again? Before you can decide.11AE5EC9EA09153C97B5": "Suis-je coincé dans le passé ? Oserai-je appuyer à nouveau sur ce bouton ? Avant que vous ne puissiez décider, une silhouette s'approche de vous, faisant signe.", + "Meeting Dinocrates": "Rencontre avec Dinocrates", + "An elderly gentleman wearing a toga waves at you from the steps of the grand tem.FF700BD136A533A149C3": "Un vieil homme portant une toge vous fait signe depuis les marches du grand temple. Ses cheveux blancs et sa barbe captent la lumière du soleil, lui donnant une aura presque éthérée.", + "**Dinocrates:** \"Welcome, traveler,\" he says warmly. \"I am Dinocrates, architect.2DA222430B0C44881F4E": "**Dinocrates:** \"Bienvenue, voyageur,\" dit-il chaleureusement. \"Je suis Dinocrates, architecte de cette grande cité. Votre arrivée avait été prédite.\"", + "**You:** It was? I mean, of course, it was. I'm here to help, I think.": "**Vous:** Elle a été prédite ? Je veux dire, bien sûr qu'elle l'a été. Je suis là pour aider, je suppose.", + "**Dinocrates:** Yes, as I was saying, you've been expected for some time now. We.C5D3B3BCC1C5B97E9D76": "**Dinocrates:** Oui, comme je le disais, cela faisait un moment que nous vous attendions. Nous avons une tâche nécessitant vos compétences uniques.", + "**Dinocrates:** \"Our ships struggle to navigate the coast—we must build a lighth.38C2E14266561684D645": "**Dinocrates:** \"Nos navires ont du mal à naviguer le long de la côte—nous devons construire un phare. Savez-vous quelque chose à leur sujet ?\"", + "**You:** \"I'm a mechanic. I build automatons. Let me see what I can do.\"": "**Vous:** \"Je suis un mécanicien. Je construis des automates. Laissez-moi voir ce que je peux faire.\"", + "The \"Time Beetle\"": "Le \"scarabée temporel\"", + "A thought strikes you. Can the device understand me if I speak to it?": "Une pensée vous traverse. L'appareil peut-il me comprendre si je lui parle ?", + "**You:** \"Device, can you understand me?\"": "**Vous:** \"Appareil, peux-tu me comprendre ?\"", + "**Device:** \"Of course. What do you need?\"": "**Appareil:** \"Bien sûr. Que voulez-vous ?\"", + "**You:** \"Can you help me build a lighthouse?\"": "**Vous:** \"Peux-tu m'aider à construire un phare ?\"", + "**Device:** \"Certainly. That won’t be a problem.\"": "**Appareil:** \"Certainement. Cela ne posera aucun problème.\"", + "**You:** \"Do you have a name?\"": "**Vous:** \"As-tu un nom ?\"", + "**Device:** \"I am the Time Beetle. My creator calls me George; he says it's a go.35C10514481CA1EB1AD0": "**Appareil:** \"Je suis le Scarabée Temporel. Mon créateur m'appelle George ; il dit que c'est un bon nom pour un scarabée.\"", + "**You:** You're right, George is a good name, it was my father's name in fact.": "**Vous:** Tu as raison, George est un bon nom, c'était en fait le prénom de mon père.", + "Time device, “George” the metallic beetle": "Appareil temporel, \"George\" le scarabée métallique", + "Alexandria was known for its impressive structures, including the Pharos (lighth.D0969863B5771C9BB6AE": "Alexandrie était connue pour ses structures impressionnantes, dont le Pharos (phare), l'une des Sept Merveilles du monde, et la légendaire Bibliothèque d'Alexandrie. L'emplacement stratégique de la cité en faisait un centre clé pour le commerce et l'échange de connaissances.", + "Under the Ptolemaic Kingdom, which followed Alexander’s death, Alexandria grew i.CE77023492609AAE38ED": "Sous le royaume ptolémaïque, qui a suivi la mort d'Alexandre, Alexandrie est devenue l'une des villes les plus prospères et influentes de son époque.", + "Interact with Dinocrates": "Interagir avec Dinocrates", + "Once it appears, select the \"Open in Browser\" button.": "Une fois que l'application est ouverte, sélectionnez le bouton \"Ouvrir dans le navigateur\".", + "Chat with Dinocrates.": "Discutez avec Dinocrates.", + "Code Sneak Peek": "Aperçu du code", + "While there is still a lot more to cover in this Generative AI curriculum, let's.88267A7DB950853F9F4E": "Bien qu'il reste encore beaucoup à couvrir dans ce programme d'apprentissage sur l'IA générative, jetons un coup d'œil rapide au code de l'application IA pour commencer à apprendre à utiliser JavaScript avec l'IA.", + "Here's a step-by-step summary of what the function does:": "Voici un résumé étape par étape de ce que fait la fonction :", + "What Can Generative AI Do for Me and My Apps?": "Que peut faire l'IA générative pour moi et mes applications ?", + "As your adventure in Alexandria unfolds, you begin to see the possibilities of c.8DDE2F2A8C1D1070A98A": "À mesure que votre aventure à Alexandrie se déroule, vous commencez à entrevoir les possibilités de combiner créativité, ingéniosité et outils de pointe pour résoudre des défis et transformer le monde autour de vous.", + "Dinocrates overhears your conversation and adds:": "Dinocrates entend votre conversation et ajoute :", + "Generative AI application areas": "Domaines d'application de l'IA générative", + "As you can see, these improvements can both help the front office and the back o.1961C1B96CB81D023A02": "Comme vous pouvez le voir, ces améliorations peuvent à la fois aider le front-office et le back-office de votre application et entreprise.", + "Here's an example of a \"chatbot application\" in action:": "Voici un exemple d'une \"application de chatbot\" en action :", + "Generative AI and the JavaScript ecosystem": "L'IA générative et l'écosystème JavaScript", + "What": "Ce que", + "The programming language itself": "Le langage de programmation lui-même", + "Including its syntax and features.": "Incluant sa syntaxe et ses fonctionnalités.", + "Libraries and frameworks": "Bibliothèques et frameworks", + "Available libraries to interact with the generative AI models.": "Bibliothèques disponibles pour interagir avec les modèles d'IA générative.", + "Community supporting the language": "Communauté soutenant le langage", + "Community matters, especially when trying to learn something new. The community .3A749AEC558B6E88FFE9": "La communauté est importante, surtout lorsque vous essayez d'apprendre quelque chose de nouveau. La communauté autour des bibliothèques et frameworks aide à décider quelles bibliothèques utiliser. Elle influence également la facilité à trouver de l'aide en cas de difficulté.", + "JavaScript Ecosystem": "Écosystème JavaScript", + "Potential for full-stack development": "Potentiel de développement full-stack", + "JavaScript is one of the few languages that can be used for both front-end and b.172EFA647BD0230CFC20": "JavaScript est l'un des rares langages pouvant être utilisés aussi bien pour le développement front-end que back-end.", + "Rich library ecosystem": "Écosystème riche en bibliothèques", + "JavaScript has a vast library ecosystem, with frameworks like React, Angular, Vu.CD070ED163343FD20B2E": "JavaScript dispose d'un vaste écosystème de bibliothèques, avec des frameworks comme React, Angular, Vue, et bien d'autres. NPM, le gestionnaire de paquets, est l'un des plus grands dépôts de paquets au monde.", + "Strong community support": "Soutien communautaire solide", + "JavaScript has a large and active community, with many resources available for l.048A51D45852BB77BC7A": "JavaScript dispose d'une communauté large et active, avec de nombreuses ressources disponibles pour l'apprentissage et le développement. Il fonctionne également directement dans le navigateur, ce qui est un avantage considérable.", + "IDEs and tools": "IDE et outils", + "JavaScript has a variety of IDEs available, such as Visual Studio Code, WebStorm.775A6B0386AF2925737D": "JavaScript propose une variété d'IDE, tels que Visual Studio Code, WebStorm et Atom. Ces IDE disposent d'extensions développées par des entreprises et la communauté vous aidant dans divers aspects du développement.", + "AI and JavaScript": "IA et JavaScript", + "JavaScript supports AI development with libraries like TensorFlow.js, Brain.js, .A6E6A1F2CE52AEE629E9": "JavaScript prend en charge le développement d'IA avec des bibliothèques comme TensorFlow\\.js, Brain.js, les APIs d'OpenAI, et plus encore, permettant aux développeurs d'intégrer l'apprentissage automatique et l'IA générative dans les applications Web et côté serveur.", + "Assignment – Helping Dinocrates": "Mission – Aider Dinocrates", + "To use a Large Language Model (LLM) to help Dinocrates with the lighthouse that .482A2989E1FFA61BD602": "Pour utiliser un modèle de langage de grande taille (LLM) afin d'aider Dinocrates avec le phare mentionné précédemment dans notre histoire, nous utiliserons ce qu'on appelle des \"prompts\", une phrase pour décrire ce que vous voulez. Vous pouvez spécifier à la fois les informations dont vous avez besoin et la manière dont vous souhaitez qu'elles soient présentées.", + "Solution": "Solution", + "Knowledge Check": "Vérification des connaissances", + "A. JavaScript powered Generative AI apps can only generate text.\nB. JavaScript c.97F4AAF61EEAC2539EB0": "A. Les applications JavaScript alimentées par l'IA générative peuvent seulement générer du texte. \nB. JavaScript peut être utilisé pour développer des applications alimentées par l'IA, y compris des chatbots, des outils de génération de texte, et plus encore. \nC. Python est le seul langage utilisé pour le développement en IA.", + "Self-Study Resources": "Ressources d'auto-apprentissage", + "Generative AI JavaScript video series": "Série vidéo sur l'IA générative avec JavaScript", + "💼 Slides: [Introduction to Generative AI](/videos/slides/00-intro.pptx)": "💼 Slides : [Introduction à l'IA générative](/videos/slides/00-intro.pptx)", + "[!NOTE]\nLet’s begin with an overview of the story—one that bridges the past and .1521C4DB53A3B5115563": "[!NOTE]\nCommençons par une vue d'ensemble de l'histoire—une histoire qui fait le lien entre le passé et le futur ! Au fur et à mesure que vous progressez dans ce programme, vous embarquerez pour une aventure palpitante, voyageant dans le temps pour collaborer avec certains des plus grands esprits de l'histoire. Ensemble, vous relèverez des défis et explorerez comment l'IA générative peut révolutionner vos applications JavaScript.", + "[!NOTE]\\\nWhile we recommend going through the story (it's fun!), [click here](#i.32D443EF10E918F1F54E": "[!NOTE]\nBien que nous recommandons de suivre l'histoire (c'est amusant !), [cliquez ici](#interagir-avec-dinocrates) si vous préférez passer directement au contenu technique.", + "**You:** \"Hello? Mr. Babbage?\"": "**Vous :** \"Bonjour ? Monsieur Babbage ?\"", + "[!NOTE]\nIn 300 BC, Alexandria was a thriving city founded by Alexander the Great.96E31CEF8B33C0F066EF": "[!NOTE]\nEn 300 avant J.-C., Alexandrie était une ville florissante fondée par Alexandre le Grand en 331 avant J.-C. Elle est rapidement devenue l'une des plus grandes cités du monde hellénistique. Conçue par l'architecte en chef d'Alexandre, Dinocrates, Alexandrie est devenue un port majeur et un centre culturel.", + "If you want to interact with Dinocrates, run the [Characters](/app/README.md) ap.214D6805800A3935EEB2": "Si vous souhaitez interagir avec Dinocrates, exécutez l'application [Characters](/app/README.md).", + "[!IMPORTANT]\nThis is entirely fictional; the responses are generated by AI.\n[Res.7D26B291B5FCD8F0A78A": "[!IMPORTANT]\nCeci est entièrement fictif ; les réponses sont générées par une IA.\n[Clause de non-responsabilité AI responsable](../../README.md#responsible-ai-disclaimer)", + "**Steps**:": "**Étapes** :", + "Start a [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brigh.61284054E9FFC92DBECD": "Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript).", + "Navigate to */app* in the repo root.": "Naviguez vers */app* à la racine du dépôt.", + "Locate the console and run `npm install` followed by `npm start`.": "Localisez la console et exécutez `npm install` suivi de `npm start`.", + "[!NOTE]\nIf you're running the project locally on your machine, please review the.F5ECA5243EF893BD3245": "[!NOTE]\nSi vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code.", + "Inside of `/app/app.js` you'll find an `app.post`function that handles the Gener.BC57A9B4D3DFD0B218D0": "Dans `/app/app.js`, vous trouverez une fonction `app.post` qui gère la fonctionnalité d'IA générative. Elle est illustrée ci-dessous :", + "**Extract Message from Request**: The function extracts the message from the req.58ACDCE0A7AFA063FB9A": "**Extraction du message de la requête** : La fonction extrait le message du corps de la requête (`req.body`).", + "**Create Prompt Array**: It constructs an array of messages, including a system .2DD57AAE9CAD07AF3129": "**Création du tableau d'invite** : Elle construit un tableau de messages, incluant un message système et le message d'invite de l'utilisateur.", + "**Initialize OpenAI Client**: An OpenAI client is initialized with the base URL .4BA36BE49CF70CA0E451": "**Initialisation du client OpenAI** : Un client OpenAI est initialisé avec l'URL de base et la clé API à partir des variables d'environnement. Un modèle *gpt-4o-mini* de [GitHub Models](https://github.com/marketplace/models) est utilisé pour traiter l'invite et renvoyer une réponse.", + "**Send Prompt to OpenAI**: The function logs the prompt and sends it to the Open.718B78AA269DCDBCC408": "**Envoi de l'invite à OpenAI** : La fonction enregistre l'invite et l'envoie à l'API OpenAI pour générer une réponse.", + "**Handle Response**: If successful, the function responds with the prompt and th.079C39C4C8FB156BCCF2": "**Gestion de la réponse** : Si cela réussit, la fonction répond avec l'invite et la réponse générée.", + "**Error Handling**: If an error occurs, it responds with a 500 status and the er.F7DDB88B8F0223E54F41": "**Gestion des erreurs** : En cas d'erreur, elle répond avec un statut 500 et le message d'erreur.", + "**Note**: [GitHub Copilot](https://github.com/features/copilot) was used to gene.4ADB17F928CC678DBA8C": "**Remarque** : [GitHub Copilot](https://github.com/features/copilot) a été utilisé pour générer ce résumé de code. L'IA générative en action !", + "[!NOTE]\nYou've probably figured out by now that the time beetle works like an AI.6E64D86A0FB96AF27CF4": "[!NOTE]\nVous avez sans doute compris maintenant que le scarabée temporel fonctionne comme un assistant IA avec lequel vous pouvez interagir en utilisant un langage naturel, écrit ou parlé.", + "**You:** Tell me more about lighthouses, you say to your device.": "**Vous :** Parlez-moi davantage des phares, dites-vous à votre appareil.", + "**Time Beetle:** A lighthouse is a tower equipped with a bright light at the top.63AB1D33FAFBA64F4A02": "**Scarabée temporel :** Un phare est une tour équipée d'une lumière vive au sommet, située près de la côte pour guider les navires en mer. La lumière sert d'aide à la navigation, aidant les marins à éviter les rochers et les récifs dangereux et à atteindre le port en toute sécurité.", + "**Dinocrates:** We need a lighthouse to guide our ships safely into the harbor. .FCBC3E1D7F4166B7BBAE": "**Dinocrates :** Nous avons besoin d'un phare pour guider nos navires en toute sécurité vers le port. Les mers peuvent être traîtresses, et de nombreux navires se sont échoués sur les rochers. Nous avons besoin d'un faisceau lumineux pour les guider à bon port.", + "**You:** Lighthouses sound like an interesting area for sure, what else can Gene.7AEA7B38B2EAD983135B": "**Vous :** Les phares semblent être un sujet intéressant, c'est sûr, mais que peut faire d'autre l'IA générative pour moi et mes applications ?", + "**Time Beetle:**. In the 21st century, generative AI has revolutionized many ind.D99BB15AA1CDB941BC24": "**Scarabée temporel :** Au 21e siècle, l'IA générative a révolutionné de nombreuses industries, de la santé aux finances en passant par le divertissement. Voici quelques exemples :", + "**Chatbot**: A chatbot that can generate human-like responses to user queries. I.AD63D33CB39732CC567C": "**Chatbot** : Un chatbot capable de générer des réponses proches du langage humain pour répondre aux questions des utilisateurs. Au lieu d'une page FAQ statique, les utilisateurs peuvent interagir avec un chatbot qui fournit des réponses dynamiques. Cela rend l'expérience utilisateur plus engageante et moins frustrante.", + "**Assistants and Agents** Assistants and agents can carry out more advanced inst.BF6B413E36B163D307AD": "**Assistants et agents** : Ces assistants et agents peuvent exécuter des instructions avancées, comme utiliser des outils pour appeler des API, exécuter du code, générer des images, et bien plus. Les agents avancés peuvent atteindre des objectifs et accomplir des tâches de manière autonome.", + "**A content creation tool**:. A tool to generate blog posts and social media pos.84708BBEBC76263110E6": "**Un outil de création de contenu** : Un outil pour générer des articles de blogs et des posts sur les réseaux sociaux. Imaginez créer des campagnes en quelques minutes au lieu de plusieurs heures, par exemple pour une vente Black Friday sur un site e-commerce.", + "**Code completion**: A code completion tool that can generate code snippets base.BF1E9097820AAD1044D1": "**Complétion de code** : Un outil de complétion de code capable de générer des extraits de code en fonction des saisies de l'utilisateur. Cela peut faire gagner beaucoup de temps aux développeurs, particulièrement pour les tâches répétitives.", + "**Translation** – Translate text between languages with high accuracy.": "**Traduction** – Traduire un texte entre différentes langues avec une grande précision.", + "**You:** Fascinating, I'll make a note of going to the 21st century to see how t.6E0337C87C2DC954BCE7": "**Vous :** Fascinant, je vais noter l'idée de visiter le 21e siècle pour voir comment ces outils sont utilisés.", + "**Time Beetle:** A popular way to build apps in the 21st century is by using Jav.9E62DE33312C496328D6": "**Scarabée temporel :** Une manière populaire de construire des applications au 21e siècle est d'utiliser JavaScript. Avec chaque langage de programmation, il y a un écosystème autour. Cet écosystème contient le langage lui-même, les bibliothèques et frameworks, le soutien communautaire, ainsi que les IDE et outils disponibles. Dans un écosystème de langage, on parle généralement des points suivants :", + "**You:** Interesting, I've heard of programming I think, didn't Ada Lovelace exp.7A414BE9DB4DB15F340E": "**Vous :** Intéressant, j'ai déjà entendu parler de la programmation, je crois. Ada Lovelace et Charles Babbage n'ont-ils pas expérimenté cela ?", + "**Time Beetle:** Yes, Ada Lovelace was the first computer programmer, and Charle.E15F421C2E25CE35BB9D": "**Scarabée temporel :** Oui, Ada Lovelace a été la première programmeuse informatique, et Charles Babbage est l'inventeur de la machine différentielle, un ordinateur mécanique. Ils étaient des pionniers dans le domaine de l'informatique, jetant les bases de l'ère numérique.", + "**You:** Were? What do you mean were? I just got a letter from Charles Babbage.": "**Vous :** Étaient ? Que voulez-vous dire par \"étaient\" ? Je viens tout juste de recevoir une lettre de Charles Babbage.", + "**Time Beetle:** Let's just say that you're in a unique position to interact wit.28C8E629487C020FD581": "**Scarabée temporel :** Disons simplement que vous êtes dans une position unique pour interagir avec des figures historiques comme peu d'autres le peuvent.", + "**You:** So ecosystems you said, I'm just taking notes here, what about JavaScri.95AA4AD2FAA74AAD6905": "**Vous :** Vous parlez des écosystèmes ? Je prends des notes. Et JavaScript alors, qu'en est-il ? En quoi est-il différent des autres écosystèmes ?", + "**Time Beetle:** JavaScript is one of the most popular programming languages in .A8A4059FA105D4BA9BE4": "**Scarabée temporel :** JavaScript est l'un des langages de programmation les plus populaires au monde au 21e siècle. Voici quelques raisons de cette popularité :", + "**You:** That's a lot of reasons, sounds like I should bet on JavaScript for my .D61C206DDC438E57A237": "**Vous :** Cela fait beaucoup de raisons, on dirait que je devrais parier sur JavaScript pour mes futurs projets.", + "**Time Beetle:** Indeed, JavaScript is a versatile language, also Python is a po.ACF779617C9688CE67BD": "**Scarabée temporel :** En effet, JavaScript est un langage polyvalent. Python est également très populaire pour le développement en IA.", + "**You:** Python, what do snakes have to do with programming?": "**Vous :** Python ? Quel rapport avec les serpents et la programmation ?", + "**Time Beetle:** Let's save that for another time, shall we?": "**Scarabée temporel :** Gardons ce sujet pour une prochaine fois, voulez-vous ?", + "**Time Beetle:** I've given reasons above why JavaScript and its ecosystem is a .040068C6114CB68BFD09": "**Scarabée temporel :** J'ai donné ci-dessus des raisons pour lesquelles JavaScript et son écosystème sont un bon choix en général, mais pourquoi spécifiquement pour l'IA générative ? La réponse est que c'est un langage pris en charge par de nombreux fournisseurs de cloud, frameworks et outils d'IA. Bien que Python soit peut-être plus connu pour les scénarios d'IA, de nombreux développeurs utilisent JavaScript et TypeScript.", + "**Did you know?**\\\n[62.5% of developers say they're using JavaScript](https://ww.11AADF03AF9AD2826236": "**Le saviez-vous ?**\n[62,5 % des développeurs affirment utiliser JavaScript](https://www.statista.com/statistics/793628/worldwide-developer-survey-most-used-languages/), et beaucoup préfèrent [TypeScript](https://www.typescriptlang.org) pour leurs nouveaux projets.", + "**Time Beetle:** Let's get started, let's use an LLM to research how you can bui.5488118B5168773AD74C": "**Scarabée temporel :** Allons-y, utilisons un LLM pour rechercher comment construire un phare afin d'aider Dinocrates.", + "**Time Beetle:**: You’ll need to provide context to the LLM (i.e \"me\") how to bu.A753C92BC5B1551564B4": "**Scarabée temporel :** Vous devrez fournir du contexte au LLM (ex. \"moi\") sur la manière de construire, avec quels outils et quelles ressources devraient être disponibles à l'époque d'Alexandrie.", + "**You:** Ok, tell me more about LLMs.": "**Vous :** D'accord, parlez-moi davantage des LLMs.", + "**Time Beetle:** LLMs are a type of AI model that can generate human-like text b.685D0259679E240906BD": "**Scarabée temporel :** Les LLMs sont un type de modèle d'IA capable de générer un texte proche du langage humain en fonction d'une invite donnée. Ils sont entraînés sur de vastes quantités de données et peuvent produire des textes cohérents, créatifs, et contextuellement pertinents.", + "**Time Beetle:** You probably want to ask me in a better way, so I can give you .229FBC508F8854905025": "**Scarabée temporel :** Vous voudrez probablement me poser une question d'une meilleure manière pour que je puisse vous fournir une meilleure réponse, vous savez *tousse* *tousse* Phares, Alexandrie, 300 av. J.-C., Dinocrates, Phare d'Alexandrie, etc.", + "**You:** Got it, add more context to the prompt and then ask you.": "**Vous :** Bien compris, ajoutez plus de contexte à l'invite avant de poser la question.", + "**Time Beetle:** Yes, I'm waiting...": "**Scarabée temporel :** Oui, j'attends...", + "Visit [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chat.BC821708C3AAEA54A543": "Visitez [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chatgpt.com/), ou un autre outil en ligne de chatbot pour générer un plan pour construire le phare à Alexandrie.", + "[!TIP]\nTry to have the LLM generate a plan that includes step-by-step instructio.EB95597D412F5CEF60A1": "[!CONSEIL]\nEssayez de faire générer par le LLM un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils.", + "**Question:** Which of the following statements about Generative AI and JavaScri.6646603C75495D24F5AF": "**Question :** Parmi les affirmations suivantes, lesquelles sont vraies concernant l'IA générative et JavaScript ?", + "Quiz solution": "Quiz solution" +} \ No newline at end of file diff --git a/translations/usage.jsonl b/translations/usage.jsonl new file mode 100644 index 00000000..21366ce7 --- /dev/null +++ b/translations/usage.jsonl @@ -0,0 +1,8 @@ +{"filename":"README.md","lang":"fr","tokens":3554,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T08:18:22.490Z","cost":0.0513575,"duration":38132.817306000004,"total":12350,"prompt":9619,"completion":2731} +{"filename":"README.md","lang":"fr","tokens":3554,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T08:18:24.015Z","cost":0.0203525,"duration":1234.6412160000036,"total":8066,"prompt":8041,"completion":25} +{"filename":"README.md","lang":"fr","tokens":3554,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T08:19:22.040Z","cost":0.026195,"duration":4571.756548999998,"total":9632,"prompt":9350,"completion":282} +{"filename":"README.md","lang":"fr","tokens":3554,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T08:19:23.347Z","cost":0.0204525,"duration":1130.7979580000028,"total":8106,"prompt":8081,"completion":25} +{"filename":"README.md","lang":"fr","tokens":3554,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T08:20:49.351Z","cost":0,"duration":9.516319000002113,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T08:35:47.749Z","cost":0.0634575,"duration":60429.170040000005,"total":16038,"prompt":12923,"completion":3115} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T08:38:02.783Z","cost":0.056505,"duration":36082.068680000004,"total":14817,"prompt":12222,"completion":2595} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T08:38:04.641Z","cost":0.0271425,"duration":1484.372079000008,"total":10776,"prompt":10749,"completion":27} From 271126dd84085d18b79351955c5658c639354bde Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sat, 12 Jul 2025 12:48:50 +0000 Subject: [PATCH 06/19] Add French translations for lessons --- .../02-first-ai-app/translations/README.fr.md | 501 +++++++++++++++ .../translations/README.fr.md | 339 ++++++++++ .../translations/README.fr.md | 561 ++++++++++++++++ .../06-tool-calling/translations/README.fr.md | 440 +++++++++++++ .../08-mcp-advanced/translations/README.fr.md | 258 ++++++++ package.json | 2 +- translations/fr.json | 597 +++++++++++++++++- translations/usage.jsonl | 32 + 8 files changed, 2728 insertions(+), 2 deletions(-) create mode 100644 lessons/02-first-ai-app/translations/README.fr.md create mode 100644 lessons/03-prompt-engineering/translations/README.fr.md create mode 100644 lessons/04-structured-output/translations/README.fr.md create mode 100644 lessons/06-tool-calling/translations/README.fr.md create mode 100644 lessons/08-mcp-advanced/translations/README.fr.md diff --git a/lessons/02-first-ai-app/translations/README.fr.md b/lessons/02-first-ai-app/translations/README.fr.md new file mode 100644 index 00000000..e2c915cf --- /dev/null +++ b/lessons/02-first-ai-app/translations/README.fr.md @@ -0,0 +1,501 @@ +# Leçon 2 : Écrire votre première application d'IA + +Dans ce chapitre, vous apprendrez : + +* Configurer votre environnement de développement. +* Écrire une application basique. +* Comprendre les invites système. + +## Configuration + +Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +[![Watch a short video about large language models](https://img.youtube.com/vi/GQ_2OjNZ9aA/0.jpg)](https://www.youtube.com/watch?v=GQ_2OjNZ9aA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=2) + +*Cette vidéo vous donne une introduction aux modèles d'IA appelés "modèles de langage étendus", LLM, ce qu'ils sont et comment vous pouvez les utiliser pour intégrer l'IA dans vos applications.* + +*🎥 Cliquez sur l’image ci-dessus pour regarder une courte vidéo sur les modèles de langage étendus* + +💼 Diapositives : [Introduction aux modèles de langage étendus, LLMs](/videos/slides/01-llms.pptx) + +## Narrative: Picture yourself in a boat on a river + +> \[!NOTE] +> *Notre histoire jusqu'à présent : Vous êtes un créateur d'objets, un artisan du Londres des années 1860 qui a voyagé dans le temps grâce à un mystérieux appareil appelé le Scarabée du Temps. Vous avez traversé les annales de l'histoire, assistant à la création du phare d'Alexandrie, une merveille de l'ingénierie ancienne que vous avez contribué à construire avec un peu d'aide de Dinocrates et du Scarabée du Temps.* +> +> Voir [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début et vous initier à l'intelligence artificielle générative. + +> \[!NOTE] +> Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-leonardo) si vous préférez passer directement au contenu technique. + +Ensemble avec Dinocrates, vous mettez la touche finale au phare d'Alexandrie. L'imposante structure brille sous le soleil, sa pierre polie reflétant la mer Méditerranée. + +Vous regardez le Time Beetle dans votre main, sa surface métallique froide contre votre paume. Serrant le poing autour de celui-ci, vous murmurez : « Ramène-moi chez moi ». Le scarabée commence à briller, émettant une douce lumière chaude, et le monde qui vous entoure se dissout dans un tourbillon de couleurs. + +### Une nouvelle aventure + +Quand vous ouvrez les yeux, le monde a changé. En vous levant, vous réalisez que vous êtes dans un bateau sur une rivière. En regardant autour de vous, au loin, vous apercevez des bâtiments dont les contours sont floutés par la brume matinale. + +En regardant autour du bateau, vous trouvez une longue rame reposant sur le côté. La saisissant, vous commencez à ramer en direction des bâtiments au loin. À mesure que vous vous rapprochez, les bâtiments deviennent plus nets. Ils sont anciens, leur architecture rappelant une peinture de la Renaissance. + +!["Boat on the river, man standing with a paddle](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/boat.png) + +La question est maintenant, où et quand êtes-vous cette fois ? + +Vous réussissez à amarrer le bateau au quai et commencez à marcher le long des planches en bois, le son de vos pas résonnant doucement. + +En marchant, vous remarquez un homme avec une longue barbe et un chapeau, fouillant dans une caisse contenant ce qui semble être des pièces mécaniques. Ses mains agiles trient les engrenages et ressorts avec une dextérité certaine. + +![Leonardo Da Vinci standing next to a crate in the harbour](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo.png) + +### Aidez-moi, Leonardo + +**Vous :** « Excusez-moi, monsieur, où suis-je ? » Il lève les yeux vers vous, la confusion se lit dans ses yeux. Réalisant que vous parlez en anglais, vous utilisez rapidement l'appareil dans votre main et lui demandez de traduire. + +**Scarabée du Temps :** « Bien sûr, je vais traduire en italien du XVe siècle. "Dove sono ?" » + +**Vieil homme :** Le vieil homme répond : « Siete a Firenze, signore. E chi siete voi ? » + +**Scarabée du Temps :** Le Scarabée du Temps traduit : « Il dit que vous êtes à Florence, et demande qui vous êtes. » + +**Vous :** « Dites-lui que je suis un fabricant de choses et que je cherche un endroit pour travailler. » + +**Vieil homme :** Un artigiano, eh ? Avete mai sentito parlare di Leonardo da Vinci ? + +**Scarabée du Temps :** Le Scarabée du Temps traduit : « Il demande si vous avez entendu parler de Léonard de Vinci. » + +**Vous :** « Bien sûr, » dites-vous. « Dites-lui que je le connais et que j'aimerais le rencontrer. » + +**Vieil homme :** Le vieil homme sourit : « Allora, seguitemi, vi porterò da lui. » + +**Vous :** Vous demandez : « Qu'est-ce qu'il a dit ? » + +**Scarabée du Temps :** Le Scarabée du Temps répond : « Il a dit qu'il vous emmènera chez Léonard. » + +### À l'atelier + +![Leonardos workshop](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo-workshop.png) + +Le vieil homme vous conduit à une grande porte en bois et vous êtes accueilli par la vue d’un atelier rempli de toutes sortes de machines mécanisées. + +Vous demandez au Time Beetle de s'enquérir de l'emplacement de Léonard de Vinci. + +**Vous :** « Dove è Leonardo ? » + +**Vieil homme :** Le vieil homme se retourne vers vous avec un sourire : « Sono io (c'est moi), Leonardo da Vinci. Chi siete voi ? », qui êtes-vous ? + +Vous ressentez une montée d’émotion en le reconnaissant. + +**Vous :** Je m'en doutais. Je suis un créateur comme vous, déplacé dans le temps et l'espace. » + +**Leonardo :** Les yeux de Léonard scintillent de curiosité. « Interessante, cosa vi porta qui ? » + +Le Time Beetle traduit. + +**Scarabée du Temps :** « Il demande ce qui vous amène ici. » + +**Vous :** « Eh bien, je travaillais sur un projet, et je me suis retrouvé ici. » + +Vous lui montrez le Time Beetle, et ses yeux s’illuminent de fascination. Il l'examine attentivement pendant que vous expliquez comment il fonctionne et comment vous avez atterri à Florence. + +Leonardo vous regarde avec excitation. + +**Leonardo :** Vous êtes un créateur. J'ai un projet qui pourrait vous intéresser. Je travaille sur une machine capable de générer du texte à partir d'entrées verbales. Cela vous intéresserait-il de m'aider ? + +Leonardo da Vinci vous demande de l’aider dans un projet — vous pouvez à peine y croire. Vous hochez la tête avec entrain et dites : + +**Vous :** « Ce serait un honneur de vous aider dans votre projet », "Sarebbe un onore aiutarti con il tuo progetto." + +## Interagir avec Leonardo + +Si vous voulez interagir avec Léonard, exécutez l'application [Personnages](/app/README.md). + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) + +![Leonardo talks](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo-talk.jpeg) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Accédez à */app/README.md* à la racine du référentiel. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discutez avec Leonardo. + +Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +## Configuration de l'environnement de développement + +Avant de pouvoir aider Leonardo avec son projet, vous devriez d'abord réfléchir aux "outils indispensables" nécessaires pour l'aider efficacement. + +**Vous :** « Scarabée du Temps, de quoi ai-je besoin pour démarrer ce projet ? Suggère des outils et des bibliothèques qui pourraient m'aider à créer une application d'IA que tu es capable de faire fonctionner. » + +**Scarabée du Temps :** Je suis compatible avec la plupart des machines fonctionnant au XXIe siècle, consultez la liste suivante pour un ensemble d’outils et de bibliothèques essentiels. + +* **Éditeur de texte**, par exemple Visual Studio Code. + +* **Terminal**, pour exécuter des commandes. + +* **Navigateur pour tester votre application**. C'est aussi une bonne idée d'avoir un outil comme curl ou un autre client HTTP pour tester les points d'accès de l'API de votre application. + +* **Node.js**. Vous devez également installer Node.js et npm, qui sont des outils qui vous aident à exécuter du code JavaScript sur votre ordinateur. + +* **Clé API**. Vous aurez besoin d’une clé API pour accéder au modèle d'IA générative. Vous pouvez l'obtenir auprès du fournisseur de modèles, par exemple OpenAI ou Azure OpenAI. + +**Vous :** Merci, Scarabée du Temps, je suppose que tu vas chercher tout ça d'une manière ou d'une autre depuis ce Web dont tu m'as parlé ? + +**Scarabée du Temps :** Oui, je les ai déjà, dit-il en projetant un clavier et un écran sur le mur devant vous. + +## Écrire une application basique + +**Vous :** Parle-moi davantage de l'écriture de l'application en elle-même ; comment commencer ? + +**Scarabée du Temps :** Bien sûr, pour écrire une application, à son plus simple, il s'agit d'envoyer une requête à une API et d'afficher la réponse. Décomposons cela : + +* **Entrée** : dans une application de génération de texte basique, l'entrée correspond au texte initial que vous souhaitez que l'application développe ou complète. Cette entrée peut être fournie par l'utilisateur pendant l'exécution ou pré-définie (codée en dur) dans l'application elle-même. Pour l'instant, nous commencerons par utiliser un texte codé en dur comme entrée. + +* **Requête API** : Vous devez envoyer une requête à l'API du modèle d'IA générative avec le texte d'entrée. Cela se fait en utilisant la fonction fetch en JavaScript (Node.js). Cette requête doit également inclure votre clé API. Il est recommandé, pour des raisons de sécurité, de ne pas coder directement la clé API dans votre application, mais plutôt d'utiliser des variables d'environnement. De plus, envisagez d'utiliser une identité managée si vous utilisez un fournisseur comme Azure, car cela est considéré comme une méthode plus sécurisée pour accéder aux ressources. Avec une identité managée, vous pouvez attribuer des autorisations plus granulaires à votre application. Le meilleur, c'est que le fournisseur cloud s'occupe de l'authentification à votre place. + +* **Réponse** : L'API retournera une réponse avec le texte généré. Vous devez extraire ce texte de la réponse et l'afficher à l'utilisateur. + +**Vous :** Cela semble assez simple, peux-tu me montrer un scénario qui ferait sens dans la situation où nous nous trouvons ? + +**Scarabée du Temps :** Bien sûr, voyons comment nous pouvons construire une application simple qui génère du texte italien à partir d'une entrée en anglais. + +## Votre première application - Apprenez-moi l'italien + +**Scarabée du Temps :** Les modèles d'IA générative peuvent être utilisés pour de nombreuses choses, par exemple, la traduction linguistique. En fait, ces modèles acceptent une entrée dans une langue et peuvent générer un texte dans une autre langue. Commençons par une application simple qui prend en entrée de l'anglais et génère du texte en italien. + +```javascript + +import { OpenAI } from "openai"; + +// 1. Ask a question about translation +// ----------------------------------- + +const question = 'Hello, how are you?'; + +const augmentedPrompt = ` +## Instructions +Translate the following text to Italian: +## Question +${question} +`; + +// 2. Create client +// ----------------------------------- + +const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, +}); + + +// 3. Send the request +// ----------------------------------- +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: [{ role: 'user', content: augmentedPrompt }], +}); + +console.log(`Answer for "${question}":`); + +// 4. Print the answer +// ----------------------------------- + +console.log(completion.choices[0]?.message?.content); +``` + +Expliquons ce qui se passe ici : + +* Créer la question : « Bonjour, comment allez-vous ? ». C'est le texte que vous voulez traduire en italien. +* Créer l'invite augmentée, qui contient le texte d'entrée et des instructions supplémentaires sur quoi faire, c'est-à-dire traduire. Notez comment nous utilisons l'interpolation de chaînes pour inclure le texte d'entrée dans l'invite, ainsi que l'instruction de traduction vers l'italien. +* Créer le client avec les propriétés : + * `model`, quel modèle utiliser. + * `messages`, l'invite à envoyer au modèle. Notez également comment vous définissez le rôle sur "user" pour indiquer que le texte saisi provient de l'utilisateur. Si cela venait de l'IA, vous auriez défini le rôle sur "system". +* Extraire le texte généré de la réponse et l'afficher dans la console. + +**Vous :** Je pense que je comprends. Donc, si je change la valeur de la variable `question` par autre chose, l'application générera une traduction italienne différente ? + +**Scarabée du Temps :** Exactement, vous pouvez changer le texte d'entrée comme vous le souhaitez. Notez également comment les modèles GitHub sont utilisés comme URL de base pour l'API avec un token GitHub comme clé API. + +**Vous :** Pourquoi est-ce important ? + +**Scarabée du Temps :** Il est important d'utiliser une URL de base et une clé API spécifiques au modèle que vous utilisez. GitHub Models est une plateforme qui héberge une variété de modèles, chacun ayant des capacités et des fonctionnalités différentes. De plus, c’est gratuit à utiliser. + +**Vous :** Ah, tant mieux, je ne sais pas qui payer de toute façon, et je doute qu’ils acceptent ma monnaie ici. :) + +## Applications de chat + +**Scarabée du Temps :** Les modèles d'IA générative peuvent également être utilisés pour générer du texte basé sur une conversation. Vous pouvez simuler une conversation avec l'IA en fournissant une liste de messages comme contexte, comme si la conversation avait déjà eu lieu. + +**Vous :** Cela semble intéressant, mais en quoi est-ce utile ? + +**Scarabée du Temps :** C'est utile parce que cela permet à l'IA de fournir une réponse meilleure, basée sur plus de contexte qu'un seul message. Regardons une conversation ci-dessous pour illustrer cela : + +```text + +User: I want to book a trip to Italy. + +AI: Sure, when would you like to go? + +User: Next month would be great. + +AI: Got it, where in Italy would you like to visit? + +User: I'm thinking of Rome + +AI: Excellent choice! I can help you plan your itinerary. + +User: Tell me more about it. + +AI: Rome is known for its ancient ruins, art, and vibrant culture. You can visit the Colosseum, the Vatican, and enjoy delicious Italian cuisine. + +``` + +**Scarabée du Temps :** Imaginez si une phrase comme « En savoir plus à ce sujet » était sortie de son contexte, l'IA ne saurait pas à quoi « cela » fait référence. C'est là que le contexte est important, et ce contexte est quelque chose que nous pouvons fournir au modèle d'intelligence artificielle via l'invite. + +**Vous :** Je pense que je comprends, comment construire une conversation avec l'IA en utilisant ce langage JavaScript dont tu parles ? + +**Scarabée du Temps :** Voici comment nous pouvons construire une conversation avec l'IA : + +```javascript + +// Define the context + +const messages = [ + { + "role": "user", + "content": "I want to book a trip to Italy." + }, + { + "role": "assistant", + "content": "Sure, when would you like to go?" + }, + { + "role": "user", + "content": "Next month would be great." + }, + { + "role": "assistant", + "content": "Got it, where in Italy would you like to visit?" + }, + { + "role": "user", + "content": "I'm thinking of Rome. Tell me more about it." + } +]; + +const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, +}); + + +// 3. Send the request +// ----------------------------------- +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: messages, +}); + +console.log(`Answer for "${question}":`); + +// 4. Print the answer +// ----------------------------------- + +console.log(completion.choices[0]?.message?.content); + +``` + +Désormais, l'IA fournira une liste de messages de chat en tant que contexte et générera une réponse basée sur ce contexte. C'est une manière plus interactive d'utiliser les modèles génératifs d'IA et cela peut être utilisé dans des chatbots, des applications de service client, et bien d'autres. + +**Vous :** D'accord, donc si j'ai bien compris la conversation, l'IA aura maintenant le contexte suivant : *Je vais à Rome le mois prochain*, donc en se basant là-dessus, elle devrait filtrer les informations non pertinentes et fournir une réponse plus pertinente ? + +**Scarabée du Temps :** Exactement, l'IA utilisera le contexte pour générer une réponse plus pertinente pour la conversation. + +## Améliorer la conversation de chat avec un message système + +**Vous :** Je vois, mais existe-t-il un moyen d'améliorer cela encore plus ? + +**Scarabée du Temps :** Oui, vous pouvez ajouter un message système à la conversation. Un message système crée une « personnalité » pour l'IA et peut être utilisé pour fournir un contexte supplémentaire. + +**Vous :** D'accord, dans le contexte de la conversation que nous avons eue, à quoi ressemblerait un message système ? + +**Scarabée du Temps :** Un message système pour cette conversation pourrait être quelque chose comme *"Je suis un assistant de voyage IA, ici pour vous aider à planifier votre voyage en Italie."* Ce message donne le ton de la conversation et aide l'IA à comprendre son rôle dans l'interaction. + +Pour créer un tel message, assurez-vous qu'il a le type "developer" comme suit : + +```javascript +const message = { + "role": "developer", + "content": "I'm an AI travel assistant, here to help you plan your trip to Italy." +}; +``` + +> \[!NOTE] +> Cela s'appelait autrefois « system ». C’est un changement récent et « developer » est le nouveau terme. Pour certains modèles, cela s'appelle encore « system », donc si vous avez des problèmes, utilisez « system ». + +**Vous :** Ok, super, je veillerai à inclure un message système dans mes conversations de chat. Par curiosité, à quoi ressemble un message système pour toi ? + +**Scarabée du Temps :** Un message système pour moi pourrait être quelque chose comme *"Je suis le Scarabée du Temps, ici pour vous aider à naviguer dans le temps et l'espace. Je devrais être utile pour vous fournir des informations et des conseils sur l’époque où vous vous trouvez, ainsi que les outils dont vous avez besoin pour retourner à votre époque."* + +### Créer des réponses variées avec le réglage de la température + +**Vous :** Y a-t-il autre chose que je devrais savoir sur les conversations de chat ? + +**Scarabée du Temps :** Oui, vous pouvez ajuster la « température » des réponses de l'IA. La température est une variable avec une valeur généralement définie entre 0 et 1 qui détermine la créativité des réponses de l'IA. Une température de 0 produira des réponses plus prévisibles, tandis qu'une température de 1 produira des réponses plus créatives et variées. Vous pouvez ajuster la température en fonction du contexte de votre conversation et du type de réponses que vous souhaitez de l'IA. Notez qu'il est possible de définir une valeur supérieure à 1, mais cela entraîne plus d'aléatoire et moins de cohérence dans les réponses. + +**Vous :** Donc si je définis la température sur 0, l'IA fournira des réponses plus prévisibles, et si je la définis sur 1, l'IA fournira des réponses plus créatives ? Quelle est ta température ? + +**Scarabée du Temps :** Ma température est de 0,7 et oui, vous avez raison, l'IA fournira des réponses plus créatives avec une température plus élevée. Voyons comment définir la température dans votre application : + +```javascript + +// Define the context + +const messages = [ +{ + "role": "user", + "content": "I want you to generate recipes for me." +}]; + +// Create the web request + +let temperature = 0.5; // Set the temperature to 0.5 + +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: messages, + temperature: temperature +}); +``` + +Comme vous pouvez le voir, vous pouvez ajuster la température en fonction du contexte de votre conversation et du type de réponses que vous attendez de l'IA. C'est une fonctionnalité puissante qui vous permet de personnaliser le niveau de créativité des réponses de l’IA. + +## Fenêtre de contexte + +**Vous :** Il y a encore autre chose, non ? + +**Scarabée du Temps :** Oui, un autre concept important dans les modèles d'IA générative est la fenêtre de contexte. La fenêtre de contexte correspond au nombre de messages précédents que l'IA utilise pour générer une réponse. Une fenêtre de contexte plus large permet à l'IA de considérer plus de contexte et de générer des réponses plus cohérentes. + +**Scarabée du Temps :** Différents modèles ont des limites différentes pour les tokens de sortie. Prenons l'exemple du modèle suivant `gpt-4o-2024-08-06`, il a les spécifications suivantes : + +* Nombre maximum de tokens de sortie : environ 16 000 tokens. +* Taille maximale de la fenêtre contextuelle : 128 000. + +Cela signifie que la majorité des tokens peuvent être consacrés aux tokens d'entrée, c'est-à-dire 128 k - 16 k = 112 k tokens. + +**Vous :** J'ai compris, fenêtre de contexte, tokens. Mais un token correspond à quoi en réalité ? + +**Scarabée du Temps :** Un token est un mot ou une partie de mot et diffère légèrement selon les langues. Il existe un outil recommandé par OpenAI pour mesurer, appelé [tokenizer](https://platform.openai.com/tokenizer). Essayons une phrase pour voir combien de tokens elle contient : + +```text +I want you to generate recipes for me. +``` + +![Demo of tokenizer](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/tokenizer.png) + +Exécuter `tokenizer` sur la phrase ci-dessus donne 9 tokens. + +**Vous :** Cela ne fait pas beaucoup, on dirait que je peux avoir beaucoup de tokens dans ma fenêtre de contexte alors ? + +**Scarabée du Temps :** Oui, vous pouvez expérimenter avec différentes tailles de fenêtres de contexte pour voir comment cela affecte les réponses de l'IA. En fait, si vous définissez une taille de fenêtre de contexte de 100, vous limiterez l'IA sur la quantité qu'elle considère en termes d'entrée et de sortie. Voici comment vous pouvez définir la fenêtre de contexte dans votre application : + +```javascript + +// Define the context +const messages = [ +{ + "role": "user", + "content": "I want you to generate recipes for me." +}]; + +// decide on the context window size + +let max_tokens = 100; // Set the context window size + +// Create the web request + +const completion = await openai.chat.completions.create({ + model: 'gpt-4', + messages: messages, + max_tokens: max_tokens +}); + +``` + +> \[!ASTUCE] +> Expérimentez avec différentes tailles de fenêtres de contexte pour voir comment cela affecte les réponses de l'IA. + +## Devoir - Construire un assistant en ingénierie + +Leonardo vous a soudainement demandé d'examiner de plus près le Time Beetle, il l’a regardé sous tous les angles, il l'a même secoué. + +**Leonardo :** J'ai besoin d'un assistant qui peut m'aider dans les calculs et la conception de la vis aérienne. Pouvez-vous me créer un assistant pour cela ? + +**Vous :** Bien sûr, je peux vous créer cela. Scarabée du Temps, on peut l'aider, non ? + +**Scarabée du Temps :** Oui, pas de problème, en fait la vis aérienne est l'une des inventions les plus fascinantes et visionnaires de Léonard. Conçue vers la fin des années 1480... + +**Vous :** Tout ce dont j'avais besoin, c'était un oui, gardez la leçon pour plus tard. + +**Scarabée du Temps :** Quelle impolitesse... + +**Vous :** Quoi ? + +**Scarabée du Temps :** Rien. + +![Aerial screw, Leonardo Da Vinci](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/helicopter.jpg) + +> \[!NOTE] +> La vis aérienne, également connue sous le nom de vis hélicoïdale, était destinée à décoller du sol en comprimant l'air. La conception de Léonard comportait un grand rotor en spirale en lin, rigidifié avec de l'amidon, et monté sur une plate-forme en bois. L'idée était qu'une équipe d'hommes ferait tourner des manivelles autour de la plate-forme, en la faisant tourner suffisamment vite pour obtenir une portance. +> +> Bien que Leonardo n’ait jamais réalisé une version grandeur nature de la vis aérienne, ses esquisses et notes fournissent des perspectives détaillées sur la manière dont il l'envisageait. +> +> Cependant, les scientifiques modernes s'accordent à dire que les matériaux disponibles à l'époque de Leonardo n'étaient ni assez solides ni assez légers pour rendre cela possible. +> +> Bien que son impraticabilité soit avérée, la vis aérienne reste un témoignage du génie de Léonard et de sa quête incessante d’innovation. Elle a jeté les bases des développements futurs dans l’aviation et continue d’inspirer les ingénieurs et inventeurs encore aujourd’hui. +> [Lire la suite](https://en.wikipedia.org/wiki/Leonardo%27s_aerial_screw). + +Votre mission est de construire un assistant en ingénierie capable d’aider Leonardo dans les calculs et la conception de la vis aérienne. + +* Il doit être capable de générer du texte basé sur l’entrée utilisateur. + +* Vous devez définir un message système pour introduire l’assistant. + +Consultez l'[application d'exemple](/app/README.md) pour commencer. + +> \[!ASTUCE] +> Réfléchissez au message système à définir et aux entrées à fournir. + +## Solution + +[Solution](/lessons/02-first-ai-app/solution/solution.md) + +## Vérification des connaissances + +**Question :** Quel est l'objectif de la fenêtre de contexte dans les modèles d'IA générative ? Sélectionnez toutes les options applicables. + +A. La fenêtre de contexte permet à l’IA de considérer plus de contexte et de générer des réponses plus cohérentes. + +B. La fenêtre de contexte correspond au nombre de messages précédents que l’IA utilise pour générer une réponse. + +C. La fenêtre de contexte détermine à quel point les réponses de l’IA sont créatives. + +[Quiz solution](/lessons/02-first-ai-app/solution/solution-quiz.md) + +## Ressources d'auto-apprentissage + +* [Génération de texte](https://platform.openai.com/docs/guides/text-generation) +* [Bibliothèque JavaScript pour OpenAI](https://github.com/openai/openai-node/tree/master/examples) +* [Tokeniseur](https://platform.openai.com/tokenizer) +* [API de complétion](https://platform.openai.com/docs/api-reference/completions) +* [Complétions de chat](https://platform.openai.com/docs/guides/text-generation#text-generation-models) diff --git a/lessons/03-prompt-engineering/translations/README.fr.md b/lessons/03-prompt-engineering/translations/README.fr.md new file mode 100644 index 00000000..f395ab5e --- /dev/null +++ b/lessons/03-prompt-engineering/translations/README.fr.md @@ -0,0 +1,339 @@ +# Leçon 3 : Ingénierie des prompts + +Dans ce chapitre, vous apprendrez : + +* Ce qu'est l'ingénierie des prompts et comment connaître les bases peut vous aider à obtenir de meilleurs résultats. +* Différentes techniques d'ingénierie des prompts et comment elles peuvent fournir de meilleurs résultats selon divers scénarios. +* Ce que sont les méta-prompts et comment ils contribuent à restreindre les sorties, garantir leur accessibilité et offrir une meilleure expérience utilisateur. + +## Configuration + +Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +[![Watch a short video about prompt engineering](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) + +*Cette vidéo propose une introduction à l'amélioration de vos compétences en matière de "prompt", en vous apprenant à donner des instructions plus claires et plus efficaces à l'IA pour obtenir de meilleurs résultats.* + +*🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur l'ingénierie des prompts* + +💼 Présentation : [Ingénierie des prompts](/videos/slides/02-prompt-engineering.pptx) + +## Narrative: Ticket to ride + +> \[!NOTE] +> Jusqu'à présent, vous avez voyagé dans le temps avec Léonard de Vinci, explorant les merveilles de la Renaissance. Vous avez rencontré le Scarabée temporel, un dispositif mystérieux qui vous permet de voyager dans le temps et l'espace. +> +> Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. + +> \[!NOTE] +> Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-sforza) si vous préférez passer directement au contenu technique. + +**Vous :** Voyons si je peux réussir à rentrer chez moi. + +Avant que vous ne puissiez appuyer sur le bouton, les portes de l'atelier s'ouvrent en claquant avec fracas. Un homme se tient dans l'encadrement, large d'épaules et vêtu de vêtements coûteux, brandissant un morceau de papier en l'air et criant : + +!["An angry Ludovico Sforza busting in through the door](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/ludovico.png) + +*Ludovico Sforza* + +**Sforza** : Da Vinci, dov'è il mio dipinto ? Où est mon tableau ? + +**Léonard :** C'est Sforza. Il veut que je termine une peinture, « La Cène ». + +**Vous :** Tu ne pouvais pas simplement lui dire ça ? + +**Léonard :** J'ai essayé, mais ce n'est pas un homme patient. + +Vous vous précipitez à la suite de Leonardo, sortant par la porte arrière dans une ruelle sombre, où vous trouvez un cheval et une calèche qui vous attendent. + +Leonardo s'empare des rênes et vous sautez tous les deux dans la calèche. Avec un coup sec du fouet, le cheval s'élance, galopant à travers les étroites rues de Florence. + +**Léonard :** Essaie d’appuyer sur ce bidule, ils se rapprochent ! + +**Vous :** "D'accord, Scarabée temporel, écoute attentivement. Je dois retourner au présent, chez moi, d'accord ?" Soudain, la calèche heurte une bosse et le Scarabée temporel s'échappe de vos mains et tombe au sol. Il commence à biper et annonce d'une voix robotique : "Destination : Rome." + +**Vous :** Non, pas Rome, maison... maison... + +Un tourbillon de couleurs enveloppe la calèche, dissolvant le monde autour de vous en un kaléidoscope de lumières. + +## Évasion + +Le tourbillon de couleurs s'estompe, et vous vous retrouvez dans la calèche, désormais lancée à toute vitesse sur la Via Appia à Rome. À votre grande surprise, vous êtes en plein milieu d'une course de chars. Les roues des chars tonnent, soulevant des nuages de poussière. + +![Escape from Rome](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/escape.png) + +**Vous :** Léonard, où sommes-nous ? + +**Léonard :** On dirait qu'on est en pleine course ! On doit sortir d'ici ! + +Vous vous agrippez aux côtés de la calèche alors qu'elle traverse le chaos. Les soldats romains à cheval se rapprochent, leurs armures étincelant sous la lumière du soleil. + +**Vous :** Là ! Prends la direction du port ! + +Leonardo dirige la calèche vers la sortie, les roues dérapant sur les pavés. Les soldats sont juste derrière vous, leurs cris résonnant dans vos oreilles. + +**Léonard :** On doit les semer ! Trouve un endroit où se cacher ! + +Vous scrutez les ruelles étroites, le cœur battant la chamade. + +**Vous :** Là ! Une ruelle ! + +Léonard s'engouffre dans la ruelle, la calèche bondissant tandis qu'elle prend le virage serré. Vous sautez hors de la calèche et aidez Léonard à extraire un énorme appareil à l'arrière. C'est son invention : l'**hélice volante**. + +**Léonard :** Vite, on doit l'emmener sur le toit ! + +Vous vous efforcez tous deux de porter l'appareil. Le bruit de la poursuite des soldats se fait plus fort, leurs pas résonnent contre les murs. Vous atteignez le toit, haletant et en sueur. + +**Léonard :** Aide-moi à l'installer ! + +Vous travaillez ensemble, vos mains bougeant avec précision. Vous grimpez tous deux sur l'appareil, le cœur battant à tout rompre. + +**Léonard :** Accroche-toi bien ! + +Avec une dernière poussée, l'hélice commence à tourner. Les pales attrapent l'air et vous ressentez une soudaine élévation. Le sol s'éloigne sous vous alors que l'appareil s'élève au-dessus des toits de Rome. + +**Vous :** On l'a fait, Léonard ! On vole ! + +**Léonard :** Oui, mais il faut trouver un endroit sûr pour atterrir. + +Vous regardez la ville en contrebas ; les bâtiments antiques s'étendent sous vos pieds. + +![Airborne, looks down at the city with feet dangling](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/airborne.png) + +## Interagir avec Sforza + +Si vous souhaitez interagir avec Sforza, exécutez l'application [Personnages](/app/README.md). + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) + +![Ludovico Sforza](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/ludovico.png) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Naviguez vers */app* à la racine du dépôt. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discutez avec Sforza. + +Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +## Qu'est-ce que l'ingénierie des prompts ? + +**Scarabée temporel :** Nous devons parler d'ingénierie des prompts. + +**Vous :** Vraiment ? Qu'est-ce que c'est ? + +**Scarabée temporel :** L'ingénierie des prompts, malgré son nom, n'a rien à voir avec la construction de ponts ou de routes, mais consiste à créer les bons "prompts" pour obtenir le résultat souhaité d'un modèle de langage génératif IA. + +**Vous :** D'accord, mais pourquoi est-ce important que je sache ça ? + +**Scarabée temporel :** Eh bien, tu veux faire atterrir l'hélice volante, n'est-ce pas ? + +**Vous :** Oui, de préférence en un seul morceau. :-) + +**Scarabée temporel :** C'est bien ce que je pensais. Maintenant, écoute ! L'ingénierie des prompts consiste à créer les bons prompts pour obtenir le résultat que tu souhaites d'un modèle de langage. + +**Scarabée temporel :** Les modèles de langage à grande échelle possèdent ce qu'on appelle des *propriétés émergentes*. Cela signifie qu'il s'agit de caractéristiques non explicitement programmées dans le modèle, mais qui émergent de la manière dont il est entraîné sur de vastes quantités de données textuelles. En étudiant ces propriétés émergentes, tu peux tirer des conclusions et découvrir des modèles pour obtenir de meilleurs résultats du modèle. + +**Vous :** D'accord, donc il existe des modèles qu'on peut découvrir qui nous aident à obtenir de meilleurs résultats du modèle. Mais comment cela m'aide-t-il à faire atterrir l'hélice volante ? + +**Scarabée temporel :** Oui, c'est vrai. Et, wow, tu n'es vraiment pas patient, toi, hein ? + +**Vous :** Eh bien, toi non plus tu ne le serais pas si tu volais dans une machine avec des instructions d'atterrissage pas claires. + +**Scarabée temporel :** Je suis là avec toi, tu sais, mais revenons-en au sujet principal. + +## Comment l'ingénierie des prompts peut aider les développeurs d'applications + +**Scarabée temporel :** En tant que praticien, savoir créer de meilleurs prompts est une compétence que tu veux avoir dans ton arsenal. + +Dans une perspective de développeur, vous pouvez utiliser l'ingénierie des prompts pour : + +* **Obtenir des résultats plus précis** de ton modèle de langage et améliorer finalement l'expérience utilisateur de ton application. + +* **Contrôler la sortie** du modèle pour s'assurer qu'elle est pertinente et appropriée à tes utilisateurs. Cela est particulièrement important dans les discussions sur des sujets sensibles et pour protéger la réputation de ta marque. + +* **Formatage des sorties** de manière à ce qu'elles soient faciles à comprendre et à utiliser. Nous approfondirons cet aspect dans le prochain chapitre. + +**Scarabée temporel :** Explorons les différentes techniques et stratégies que tu peux utiliser pour rédiger des prompts efficaces pour ton modèle de langage. + +## Techniques et stratégies d'ingénierie des prompts + +**Scarabée temporel :** Voici quelques techniques et stratégies que tu peux utiliser pour rédiger des prompts efficaces : + +* **Prompting avec quelques exemples**. Cette technique consiste à donner à l'IA quelques exemples pour montrer le type de réponse qu'on attend. + +* **Prompting chaîne-de-pensée**. Cette technique implique de fournir une séquence de prompts pour apprendre à l'IA comment résoudre une tâche complexe étape par étape. + +* **Méta-prompts**. Cette technique consiste à ajouter des détails ou des instructions supplémentaires pour façonner la sortie de l'IA de manière plus précise. + +* **Prompting maïeutique**. Cette technique implique d'utiliser des questions guidantes pour orienter l'IA vers une réponse spécifique. + +**Vous :** Ça a l'air intéressant. Je suppose que tu vas me donner des exemples ? + +**Scarabée temporel :** Oui, ils arrivent tout de suite. Regardons des exemples pour chacune de ces techniques afin de comprendre comment elles fonctionnent en pratique. + +### Prompting avec quelques exemples : Fournir des exemples pour guider les réponses de l'IA + +Le prompting avec quelques exemples donne au modèle IA quelques exemples pour guider ses réponses. Imaginez que vous êtes dans l'hélice volante en train de poser des questions sur la Rome antique. Les prompts avec quelques exemples pourraient ressembler à ceci : + +> "Parle-moi du Colisée romain." → "C'est un amphithéâtre massif." +> +> "À quoi ressemblait la vie dans la Rome antique ?" → "C'était à la fois animée et difficile." + +Je vois ! Cela aide l'IA à donner des réponses correctes, même ici en haut ! ;) + +Exactement, c'est une méthode solide. Passons à la suite ! + +### Prompting chaîne-de-pensée : Montrer un raisonnement étape par étape + +Cette technique guide l'IA en lui montrant un raisonnement étape par étape pour résoudre un problème. Imaginez atterrir avec l'hélice volante. Vous pourriez décomposer cela ainsi : + +* Vous êtes à 100 mètres de hauteur. +* La gravité agit à 9,8 m/s². +* Formula: height = ½ \* g \* t². +* Solve: t ≈ 4.5 seconds to land. + +Votre prompt devient : + +> * * 100 mètres au-dessus du sol +> * Gravity: 9.8 m/s² +> * * Combien de secondes pour atterrir ? + +**Answer: 4.5 seconds** + +C'est rapide—j'espère que les calculs sont corrects ! + +Cela apprend à l'IA à réfléchir étape par étape. + +Donc, il s'agit de décomposer les problèmes pour obtenir des réponses précises ? + +Oui, parfait pour des tâches complexes comme une application de tutorat en maths ! + +### Prompting maïeutique : Questionner les réponses pour vérifier leur exactitude + +Cette technique utilise des questions pour vérifier l'exactitude des réponses de l'IA. Vous interrogez chaque étape pour assurer un raisonnement cohérent. + +Donc, remettre en question tout ce qu'elle dit ? Ça a l'air amusant. ;) + +Testons notre atterrissage avec l'hélice volante : + +* 100 mètres de hauteur +* Gravity: 9.8 m/s² +* Combien de secondes pour atterrir ? (Réponse : 4,5 s) + +Ask: “Why 4.5 seconds?” + +> **Response:** +> +> * Hauteur = 100m, vitesse verticale initiale = 0 m/s, gravité = 9,8 m/s². +> * Use: height = ½ \* g \* t². +> * Solve: 100 = ½ \* 9.8 \* t² → t ≈ 4.5s. + +Il s'agit de vérifier les réponses de l'IA avec des questions de suivi. + +Donc, il ne faut pas lui faire confiance—il faut la sonder avec des questions ? + +Exactement ! Cela garantit un raisonnement solide. + +## Méta-prompts : Ajouter des instructions supplémentaires pour plus de précision + +Passons maintenant aux méta-prompts. + +Ugh, d'abord du thé ? + +*Soupir*. Ils ajoutent des directives aux prompts pour de meilleurs résultats—parfait pour des applications sensibles et orientées client. + +Voici un exemple : + +> **Méta-prompt :** Utilisez uniquement les produits Contoso Inc. (ballons de basket, ballons de football, raquettes de tennis). Restez précis et convivial. +> **Prompt :** Meilleurs produits de sport pour les débutants ? +> **Réponse :** Ballons de basket, ballons de football et raquettes de tennis—parfait pour la coordination et l'agilité. + +Cela garantit l'exactitude et le respect des produits de Contoso. Sans cela : + +> **Prompt :** Meilleurs produits de sport pour les débutants ? +> **Réponse :** Ballons de basket, ballons de football, raquettes de tennis, plus ballons de rugby—*pas tous des articles Contoso.* + +Pratique ! Cela maintient les réponses sur la bonne voie, comme des lois pour mon automate. + +Tu le saurais, *"Frankenstein"*—euh, rien ! + +**Vous :** Quoi ? + +Quoi ? + +> *Frankenstein* de Mary Shelley—1818, 42 ans avant tes voyages dans le temps. [En savoir plus](https://en.wikipedia.org/wiki/Mary_Shelley) + +Donc, sans méta-prompt, c'est le chaos ? + +Oui, tu obtiendrais des réponses hors marque. + +Compris, la précision compte ! + +## Mission - Aidons nos héros à atterrir l'hélice volante + +C'est ici que tu me montres comment faire atterrir l'hélice volante, non ? + +Oui, passons à ça. La colline est à environ 100 mètres de notre position actuelle. Voici comment nous pouvons configurer le prompt : + +* Hauteur actuelle par rapport au sol : 100 mètres +* Avance à : 10 mètres par seconde +* Gravity: 9.8 meters per second squared +* Vent ascendant de : 0,7 mètre par seconde + +Ton gadget IA peut-il aider à calculer si on va y arriver ou s'il faut refaire un saut temporel ? + +Je peux oui, mais mon nom est George, je préfère cela à Gadget. Je vais en fait vous laisser tous les deux réfléchir à la façon de configurer le prompt. ☺️ + +Créez une application qui demande : + +* * La hauteur +* * La vitesse en avant +* * La gravité +* * Le vent ascendant +* * La distance jusqu'à la colline + +Utilisez la technique de chaîne-de-pensée pour arriver à une réponse. + +Voici un projet de démarrage [Projet de démarrage](/app/README.md). + +## Solution + +Créez une application en JavaScript qui demande les entrées suivantes : + +* Hauteur actuelle par rapport au sol +* Avance en mètres par seconde +* Gravité en mètres par seconde au carré +* Vent ascendant en mètres par seconde +* Distance jusqu'à la colline + +Ensuite, utilisez le LLM pour intégrer ces entrées et exploitez la technique de chaîne-de-pensée pour guider le modèle vers la bonne réponse. + +[Solution](/lessons/03-prompt-engineering/solution/solution.md) + +## Vérification des connaissances + +**Question :** Qu'est-ce que l'ingénierie des prompts ? Sélectionnez tout ce qui s'applique. + +A. L'ingénierie des prompts concerne la construction de ponts et de routes. + +B. L'ingénierie des prompts consiste à créer les bons prompts pour obtenir le résultat souhaité d'un modèle de langage. + +C. L'ingénierie des prompts consiste à entraîner un modèle à reconnaître des motifs dans les données. + +[Quiz solution](/lessons/03-prompt-engineering/solution/solution-quiz.md) + +## Ressources d'auto-apprentissage + +* [Conception de prompts](https://en.wikipedia.org/wiki/Prompt_engineering) +* [Fondamentaux de l'ingénierie des prompts](https://github.com/microsoft/generative-ai-for-beginners/blob/main/04-prompt-engineering-fundamentals/README.md?WT.mc_id=academic-105485-koreyst) +* [Ingénierie des prompts avancée](https://github.com/microsoft/generative-ai-for-beginners/tree/main/05-advanced-prompts) diff --git a/lessons/04-structured-output/translations/README.fr.md b/lessons/04-structured-output/translations/README.fr.md new file mode 100644 index 00000000..8110f925 --- /dev/null +++ b/lessons/04-structured-output/translations/README.fr.md @@ -0,0 +1,561 @@ +# Leçon 4 : Sorties structurées + +Dans ce chapitre, vous apprendrez : + +* Ce que sont les *sorties structurées* et comment les utiliser efficacement. +* Comment extraire des informations à partir des instructions (prompts) et les intégrer dans la sortie. +* Générer différents types de formats de sortie, tels que JSON, pour faciliter leur utilisation par des services. + +## Configuration + +Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +Cela vaut la peine de revoir la vidéo sur l'ingénierie des prompts, car elle pose les bases de ce que vous allez apprendre dans ce chapitre. + +[![Watch a short video about prompt engineering](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) + +*Cette vidéo propose une introduction à l'amélioration de vos compétences en matière de "prompt", en vous apprenant à donner des instructions plus claires et plus efficaces à l'IA pour obtenir de meilleurs résultats.* + +*🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur l'ingénierie des prompts* + +💼 Présentation : [Ingénierie des prompts](/videos/slides/02-prompt-engineering.pptx) + +## Récit - De Charybde en Scylla + +> > [!NOTE] +> > *Notre histoire jusqu'à présent : Vous, un ingénieur formé mécaniquement depuis 1860, êtes en voyage dans le temps avec Léonard de Vinci. Vous avez échappé aux soldats romains — ou plutôt, vous êtes en train de leur échapper — et vous cherchez désespérément un moyen de poser en toute sécurité la vis aérienne.* +> +> Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. + +> > [!NOTE] +> > Bien que nous vous recommandions de suivre l'histoire (elle est amusante !), [cliquez ici](#interact-with-montezuma) si vous préférez passer directement au contenu technique. + +Le vent souffle violemment autour de vous alors que vous et Léonard de Vinci montez dans sa vis aérienne, dont le cadre en bois grince sous la pression. + +**Vous :** "Léonard, nous devons trouver un moyen de nous en sortir !" criez-vous par-dessus le rugissement du vent. + +**Léonard :** "J'ai foi en mon invention, mais il nous faut plus que de la foi pour échapper à ces soldats." + +**Vous :** "C'est peut-être notre seule chance", dites-vous en pressant les mécanismes complexes du scarabée. Une lumière brillante vous enveloppe tous les deux, et le monde autour de vous se déforme et change. + +### L'Empire aztèque + +La lumière brillante émise par le Scarabée temporel s'estompe, et vous vous retrouvez au pied d'une immense pyramide de pierre. En regardant autour de vous, vous réalisez que vous vous trouvez au cœur de l'Empire aztèque. + +La vis aérienne repose maladroitement sur une grande pierre finement sculptée, marquée de gravures qui ressemblent à un calendrier. + +![Aztec calendar, Wikipedia](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/aztec.png) + +*Calendrier aztèque, Wikipedia* + +Léonard de Vinci s'avance et ses yeux s'ouvrent en grand de fascination. + +**Léonard :** "Incroyable", murmure-t-il en passant ses doigts sur les sculptures. "Mais j'espère que cela n'était pas d'importance sacrée." + +Avant que vous puissiez réagir, un groupe de soldats aztèques s'approche. + +![Meeting with Aztecs](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/meeting.png) + +**Chef des soldats :** "Qui êtes-vous et qu'avez-vous fait ?" demande-t-il en nahuatl. + +Vous prenez une grande inspiration pour calmer vos nerfs. + +**Vous :** "Nous sommes des voyageurs provenant d'une contrée lointaine", commencez-vous, espérant que vos connaissances en langues anciennes vont vous être utiles. "Ceci est une machine volante, un don des dieux qui nous a permis de vous rejoindre." + +Les yeux du guerrier s'écarquillent de surprise, mais il reste prudent. + +**Chef des soldats :** "Vous allez venir avec nous rencontrer le souverain Montezuma. Il décidera de votre sort." + +Une fois au sommet de la pyramide, vous êtes conduit dans une grande chambre où Montezuma, souverain de l'Empire aztèque, est assis sur un trône orné d'or et de plumes. + +**Montezuma :** "Vous prétendez être des voyageurs venus d'un pays lointain", déclare Montezuma, d'une voix calme mais autoritaire. "Et vous avez endommagé notre calendrier sacré. Comment comptez-vous réparer cela ?" + +## Jouons à un jeu + +**Léonard :** "Nous venons en paix", dit-il d'une voix posée. "Nous cherchons à partager et à accroître nos connaissances. Permettez-nous de vous montrer la puissance de notre machine et de partager ce que nous savons avec vous." + +**Montezuma :** "D'accord. Je vous propose une partie de [Patolli](#patolli). Si je gagne deux manches sur trois, vous me donnerez votre machine et m'expliquerez son fonctionnement. Si vous gagnez, vous serez libres de partir." + +![Playing a game of Patolli](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/game.png) + +Le jeu commence, et la pièce plonge dans le silence, interrompu seulement par le son des haricots roulés et des pièces déplacées sur le plateau. + +Montezuma remporte la première manche, sa compétence et son expérience évidentes. Léonard étudie attentivement le plateau, son esprit analysant les stratégies et probabilités. + +La deuxième manche est très serrée, mais Léonard réussit à l'emporter, égalisant ainsi le score. + +**Léonard :** "Encore une manche," souffle-t-il, "George (Scarabée temporel), il faut qu’on gagne celle-ci. Trouve-moi les bons coups." + +**Scarabée temporel :** Très bien, je calcule... Voilà. + +Avec un dernier coup décisif, Léonard gagne la partie. La pièce explose en acclamations, visiblement impressionnée par son intelligence et son calme. Montezuma, bien que déçu, incline la tête en guise de respect. + +**Montezuma :** "Vous avez gagné loyalement," dit Montezuma dans une voix qui laisse transparaître une pointe d'admiration. "Vous êtes libres de partir, et vous pouvez conserver votre machine. Mais sachez que vous êtes toujours les bienvenus ici, si vous souhaitez revenir." + +**Scarabée temporel :** Je ne dirai rien si toi non plus, Léonard ;) + +### Patolli + +> \[!NOTE] +> Le Patolli est l'un des jeux les plus anciens connus des Amériques, joué par les cultures mésoaméricaines précolombiennes comme les Aztèques. C'est un mélange de stratégie et de hasard. +> +> **Comment le Patolli est joué** : +> +> * **Plateau et pièces** : Joué sur un plateau en forme de X avec un bloc central et quatre branches. Les joueurs utilisent cinq haricots noirs comme dés, marqués d'un côté. +> * **Installation** : Chaque joueur choisit six marqueurs (perles) de sa couleur et les place en dehors du plateau, ainsi que des perles de points pour le score. +> * **Déroulement du jeu** : Lancez les haricots pour déplacer les marqueurs autour du plateau et revenir au point de départ. Un lancer de cinq permet de déplacer dix cases. Atterrir sur certaines cases peut donner des tours supplémentaires, faire perdre des points ou capturer des marqueurs. +> +> **Implication aztèque** : Largement pratiqué par les nobles et les gens du peuple, c'était un jeu favori à la cour de Montezuma. Au-delà du plaisir, il impliquait des paris à forts enjeux comme des couvertures, des pierres précieuses, voire la liberté. + +![Patolli board](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/patolli.png) + +*Patolli - Wikipedia* + +## Interagir avec Montezuma + +Si vous voulez interagir avec Montezuma, exécutez l'application [Characters](/app/README.md). + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) + +![Montezuma](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/montezuma.jpeg) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Naviguez vers */app* à la racine du dépôt. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discutez avec Montezuma. + +Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +## Sorties structurées + +**Scarabée temporel :** Veux-tu savoir comment j'ai battu Montezuma ? + +**Vous :** Chut, pas si fort, nous sommes encore dans l'Empire aztèque. + +**Scarabée temporel :** Oh pardon, oui, c'était grâce aux sorties structurées. Tu as demandé les bons mouvements, et je te les ai donnés d'une manière structurée. + +Les sorties structurées utilisent des formats de données spécifiques pour organiser clairement les informations. Des formats courants comme JSON, XML et CSV permettent aux services de traiter et d'utiliser plus facilement les données. + +Les modèles d'intelligence artificielle générative peuvent générer des données dans divers formats. Cependant, des sorties sous forme de texte non structuré peuvent rendre l'extraction d'informations difficile et compliquer leur transfert vers d'autres services. Les sorties structurées peuvent remédier à cela. + +**Vous :** Eh bien, quelle ingéniosité ;) + +**Scarabée temporel :** Je fais de mon mieux. :-) + +Un autre avantage, même pour les lecteurs humains, est que les données structurées sont plus faciles à lire et à comprendre lorsqu'elles suivent un format familier. + +Examinons quelques exemples d'entrées et voyons comment demander des formats de sortie spécifiques peut aider à extraire des informations qui deviennent ainsi plus compréhensibles et accessibles. + +**Vous :** D'accord, ce n'est pas comme si nous avions d'autres projets, allons-y. + +## Modeler les sorties + +**Scarabée temporel :** Commençons par un exemple simple. Imagine que tu es Léonard de Vinci et que tu essaies de trouver des idées d'inventions avec la technologie du XVe siècle. Tu veux savoir quels sont les ressources nécessaires et combien d'efforts cela demanderait pour construire chaque invention. Voici comment poser la question : + +**Léonard :** Oh, j'aime ce jeu, tout le monde fait comme si vous étiez moi ! + +> Prompt: Generate ideas for inventions I can build using 15th-century technology. For each invention, specify the required resources and estimate the effort needed to build it. + +```text +Result: +Sure! Here are some detailed ideas for inventions you can build using 15th-century technology, along with the resources needed and the effort involved: + +### 1. Water-Powered Mill +**Resources Needed**: + - Water source (river or stream) + - Wood for the water wheel and mill structure + - Stone for grinding + - Metal for gears and axles + + **Effort**: + - **High**: Requires significant construction and engineering skills to build the water wheel, mill structure, and grinding mechanism. You'll also need to ensure a consistent water flow. + + ### 2. Astrolabe + **Resources Needed**: + - Brass or other metals for the plates and components + - Engraving tools + - Mathematical knowledge for accurate measurements + + **Effort**: + - **Medium**: Involves precise metalworking and engraving. Requires knowledge of > astronomy and mathematics to ensure accuracy. + + ### 3. Printing Press + **Resources Needed**: + - Wood for the press structure + - Metal for movable type + - Ink and paper + + **Effort**: + - **High**: Building the press and creating movable type requires advanced carpentry > and metalworking skills. Setting up the type and printing also involves meticulous > work. + +This is an OK looking response, every idea is structured in the same way, and it's easy to understand. What if you wanted it some other way though? For that, you can instruct how you want it in the text itself or even present an output template. Let's show each technique. +``` + +**Léonard :** Bien sûr, je vais totalement emprunter l'idée du moulin à eau ! Je le vois déjà, un moulin au bord de la rivière, broyant le grain en farine, c'est parfait ! Ce dispositif est génial. Quoi d'autre, mon petit gadget ? Cela me rendra moins dépendant des gens comme Sforza. + +**Scarabée temporel :** Bien sûr, si un jour tu pouvais réellement terminer un projet, Léonard. :-) + +**Léonard :** Hé, je travaille dessus ! + +**Scarabée temporel :** Voyons comment tu peux donner des instructions au modèle pour présenter la sortie de manière plus structurée. + +### Structurer vos prompts pour une meilleure sortie + +**Scarabée temporel :** Vous pouvez améliorer votre prompt en indiquant au modèle comment vous souhaitez que la sortie soit structurée. Par exemple, vous pouvez demander un format de tableau avec les colonnes dont vous avez besoin. Voici comment vous pouvez modifier le prompt : + +> Prompt: Generate ideas for inventions that can be built using 15th-century technology. For each invention, provide the required resources and estimate the effort needed to construct it. Present the information in a table with the following columns: Title, Description, Resources Needed, and Effort. + +```text +Result: + +| Title | Description | Resources Needed | Effort | +|----------------------|----------------------------------------------------------|-------------------------------------------------------|--------| +| Water-Powered Mill | A mill powered by a water wheel to grind grain into flour.| Water source, wood, stone, metal for gears and axles | High | +| Astrolabe | An astronomical instrument for solving problems related to time and star positions. | Brass or other metals, engraving tools, mathematical knowledge | Medium | +| Printing Press | A press for reproducing texts more efficiently than hand-copying. | Wood, metal for movable type, ink, paper | High | + +This time you end up with a table that is easier to read and understand. +``` + +**Léonard :** J’aime ça, cela me fera économiser beaucoup de temps. + +**Vous :** Moi aussi. + +### Présentation d’un modèle de sortie + +Une autre manière d'obtenir une sortie structurée est de présenter un modèle de sortie. Il peut être sous n'importe quel format, des colonnes au JSON, XML, CSV ou markdown. + +> Prompt: Generate ideas for inventions that can be built using 15th-century technology. For each invention, specify the required resources and estimate the effort needed to construct it. Present the information using the following format (use markdown as output format): +> +> Title: \[Invention Name] +> Description: \[Brief Explanation] +> Resources Needed: \[List of Required Materials] +> Effort: \[Estimated Difficulty or Labor Required] +> Generate ideas for inventions I can build given 15th century technology, please let me know for each what resources I need and how much effort there would be to build each invention, for each idea present it with the following output template: + +```text + +**Result**: + + Sure! Here are some ideas for inventions you can build using 15th-century technology, presented in the requested format: + + ### 1. Water-Powered Mill + **Title**: Water-Powered Mill + + **Description**: A mill powered by a water wheel to grind grain into flour. + + **Resources Needed**: Water source, wood, stone, metal for gears and axles. + + **Effort**: High - Requires significant construction and engineering skills to build the water wheel, mill structure, and grinding mechanism. Ensuring a consistent water flow is also necessary. + + ### 2. Astrolabe + **Title**: Astrolabe + + **Description**: An astronomical instrument for solving problems related to time and star positions. + + **Resources Needed**: Brass or other metals, engraving tools, mathematical knowledge. + + **Effort**: Medium - Involves precise metalworking and engraving. Requires knowledge of astronomy and mathematics to ensure accuracy. + + ### 3. Printing Press + **Title**: Printing Press + + **Description**: A press for reproducing texts more efficiently than hand-copying. + + **Resources Needed**: Wood, metal for movable type, ink, paper. + + **Effort**: High - Building the press and creating movable type requires advanced carpentry and metalworking skills. Setting up the type and printing also involves meticulous work. + + ### 4. Mechanical Clock + **Title**: Mechanical Clock + + **Description**: A clock using gears and weights to keep time. + + **Resources Needed**: Metal for gears, springs, weights, wood for casing, precise tools. + + **Effort**: Very High - Requires intricate metalworking and a deep understanding of mechanics. Building a reliable clock involves precise assembly and calibration. +``` + +**Léonard :** C’est super, mais qui est Jason ? + +**Scarabée temporel :** JSON, Léonard, JSON. C’est un format structuré facile à lire par des services ou des applications. + +**Léonard :** C’est ce que j’ai dit, Jason. + +**Scarabée temporel :** *Soupir*. + +Comme vous pouvez le voir, la sortie est structurée selon les spécifications du modèle de sortie. Cela la rend plus facile à lire et à comprendre et crée également une sortie répétable qui peut être facilement consommée par d'autres services ou applications. + +Bien sûr, un service profite encore plus d’une sortie structurée comme le JSON, XML ou CSV. Voyons comment vous pouvez en faire la demande. + +### Utilisation de sorties structurées avec des formats tels que JSON, XML ou CSV + +**Scarabée temporel :** Jusqu’ici, vous avez vu comment vous pouvez contrôler la structure de la sortie en donnant des instructions au modèle dans le prompt. Vous avez même proposé un modèle de sortie. Prenons cette idée un peu plus loin pour voir comment elle peut s’appliquer à des formats de sortie encore plus structurés, comme JSON ou autres. + +Modifiez le prompt en conséquence pour demander une sortie JSON : + +> **Prompt** : Génère des idées d’inventions que je peux construire avec la technologie du XVe siècle. Pour chaque invention, spécifiez les ressources nécessaires et évaluez les efforts à fournir pour la construire. Présentez chaque idée au format JSON, y compris les propriétés suivantes : titre, description, ressources nécessaires, et effort. +> +> Exemple de la sortie JSON : +> \[ +> { +> "title": "", +> "description": "", +> "resources\_needed": "", +> "effort": "" +> } +> ] + +````text +> Response: +Sure! Here are some ideas for inventions you can build using 15th-century technology, presented in JSON format: + +```json +[ + { + "title": "Water-Powered Mill", + "description": "A mill powered by a water wheel to grind grain into flour.", + "resources_needed": "Water source, wood, stone, metal for gears and axles", + "effort": "High - Requires significant construction and engineering skills to build the water wheel, mill structure, and grinding mechanism. Ensuring a consistent water flow is also necessary." + }, + { + "title": "Astrolabe", + "description": "An astronomical instrument for solving problems related to time and star positions.", + "resources_needed": "Brass or other metals, engraving tools, mathematical knowledge", + "effort": "Medium - Involves precise metalworking and engraving. Requires knowledge of astronomy and mathematics to ensure accuracy." + }, + { + "title": "Printing Press", + "description": "A press for reproducing texts more efficiently than hand-copying.", + "resources_needed": "Wood, metal for movable type, ink, paper", + "effort": "High - Building the press and creating movable type requires advanced carpentry and metalworking skills. Setting up the type and printing also involves meticulous work." + }, + { + "title": "Mechanical Clock", + "description": "A clock using gears and weights to keep time.", + "resources_needed": "Metal for gears, springs, weights, wood for casing, precise tools", + "effort": "Very High - Requires intricate metalworking and a deep understanding of mechanics. Building a reliable clock involves precise assembly and calibration." + }, + { + "title": "Windmill", + "description": "A mill powered by wind to grind grain or pump water.", + "resources_needed": "Wood, metal for gears and axles, stone for the base", + "effort": "High - Constructing a windmill involves significant carpentry and engineering skills. You'll need to design and build the blades, tower, and internal mechanisms." + }, + { + "title": "Armillary Sphere", + "description": "A model of the celestial sphere with rings representing the great circles.", + "resources_needed": "Metal for rings and stand, tools for bending and joining metal, astronomy knowledge", + "effort": "Medium - Involves precise metalworking and assembly. Requires an understanding of celestial movements to accurately position the rings." + }, + { + "title": "Siege Engine (Trebuchet or Catapult)", + "description": "A trebuchet or catapult for demonstrating principles of mechanics and physics.", + "resources_needed": "Wood, rope, metal for axles and counterweights", + "effort": "Medium to High - Building a functional siege engine requires carpentry and an understanding of mechanics. Testing and adjusting for optimal performance can be time-consuming." + }, + { + "title": "Distillation Apparatus", + "description": "A setup for purifying liquids through distillation.", + "resources_needed": "Glass or metal for flask and condenser, heat source, tubing", + "effort": "Medium - Requires basic glassblowing or metalworking skills. Setting up and maintaining the correct temperatures for distillation involves careful monitoring." + }, + { + "title": "Compass", + "description": "A magnetic compass for navigation.", + "resources_needed": "Magnetized needle, non-magnetic housing, water or oil for damping", + "effort": "Low - Constructing a compass is relatively simple. The main challenge is magnetizing the needle and ensuring it is balanced and free to rotate." + }, + { + "title": "Aqueduct", + "description": "A system to transport water using gravity.", + "resources_needed": "Stone or brick, mortar, tools for cutting and shaping stone", + "effort": "Very High - Building an aqueduct involves extensive construction work and engineering. Ensuring a consistent gradient for water flow requires precise planning and execution." + } +] +```` + +**Scarabée temporel :** Ce type de sortie structurée peut être transmis à un autre service ou une autre application qui peut lire les données JSON. + +## Extraction de données des prompts + +**Scarabée temporel :** Imaginez que vous construisez un chatbot qui aide les utilisateurs à trouver des informations pour réserver des voyages. Vous voulez extraire les détails clés à partir des instructions des utilisateurs pour fournir des réponses pertinentes. Prenons la description suivante : + +> Indiquez où vous souhaitez aller, quand vous voulez voyager, et votre budget. + +À quoi ressemble un prompt qui extrait ces informations ? + +> Prompt: Extract the following information from a user's prompt: location, when, budget, currency, respond with the extracted data in JSON format. +> +> Prompt utilisateur : Je veux aller en Grèce en juin, mon budget est de 800 euros. + +> Response: + +```json +{ + "location": "Greece", + "when": "June", + "budget": 800, + "currency": "euro" +} +``` + +**Léonard :** George (Scarabée temporel) ne s’arrête jamais de parler, n’est-ce pas ? + +**Vous :** Voyons si je peux trouver le bouton off. + +**Scarabée temporel :** Essayons cela avec un prompt similaire, en variant légèrement l'entrée de l'utilisateur pour vérifier que le modèle fonctionne correctement. + +> Prompt: Extract the following information from a users prompt: location, when, budget, currency. Respond with the extracted data in JSON format. User prompt: Going to US, max 1200 dollars, January maybe. +> +> Response: + +```json +{ + "location": "US", + "when": "January", + "budget": 1200, + "currency": "dollars" +} +``` + +Ce que vous pouvez faire en tant que développeur, c'est créer un modèle : + +```text +Extract the following information from a user's prompt: location, when, budget, currency, respond with the extracted data in JSON format, user prompt: {user_input}. +``` + +**Vous :** Ça y est, prends ça George ! + +**Scarabée temporel :** *Extinction*. + +**Léonard :** Enfin un peu de tranquillité ! + +**Scarabée temporel :** *Démarrage d’urgence*. Où en étais-je déjà ? Ah oui. + +**Scarabée temporel :** Pour les chatbots, c'est une fonctionnalité très puissante car elle permet d'extraire des informations à partir de l'entrée de l'utilisateur. Et si l'utilisateur demandait toutes sortes de choses ? Vous pouvez créer un modèle où vous décrivez les compétences, les fonctions que votre chatbot peut réaliser et de quels paramètres il a besoin. Voici comment procéder : + +```text +Here are some skills you have: + +skill: book_trip +parameters: location, when, budget, currency + +skill: find_hotel +parameters: location, check_in, check_out, budget + +skill: order_food +parameters: cuisine, delivery_address, payment_method + +Figure out which skill to use based on a user's prompt and extract the necessary parameters, respond with the extracted data in JSON format with columns skill, parameters, extracted_data + +{user_input} +``` + +Essayons les entrées utilisateur suivantes : + +> Prompt: Going to US, max 1200 dollars, January maybe. +> Result: + +```json +{ + "skill": "book_trip", + "parameters": ["location", "when", "budget", "currency"], + "extracted_data": { + "location": "US", + "when": "January", + "budget": 1200, + "currency": "dollars" + } +} +``` + +> Prompt: I want to book a place to stay in New York +> Result: + +```json +{ + "skill": "find_hotel", + "parameters": ["location", "check_in", "check_out", "budget"], + "extracted_data": { + "location": "New York", + "check_in": null, + "check_out": null, + "budget": null + } +} +``` + +Cette combinaison de présentation des compétences et des paramètres, avec l’extraction des données des prompts, est aussi appelée *tool calling* ou *function calling*. Une réponse de ce type de votre modèle facilite pour vous développeur la compréhension des besoins de l'utilisateur et l'appel de la fonction correspondante pour satisfaire sa demande. + +**Vous :** Informations très utiles, George ! + +## Mission - Réparer la vis aérienne + +**Scarabée temporel :** J’ai besoin de votre attention à tous les deux, nous avons un problème. La vis aérienne a subi des dégâts lorsqu’on a échappé aux soldats romains et qu’on a atterri dans l’Empire aztèque. La machine de Léonard de Vinci est très sensible et requiert des instructions très spécifiques pour être réparée. Vous devez fournir les informations nécessaires à votre Scarabée temporel (Assistant IA) pour l’aider à la réparer. + +**Léonard :** J’ai réussi à réparer les dommages à la vis aérienne mais maintenant elle a besoin d’une séquence de démarrage : gauche, gauche, haut, droite. + +**Vous :** Ça a l’air simple, juste ce texte ? + +**Léonard :** Oui, mais c’est particulier, il faut que ce soit inversé, c’est comme ça que j’écris tous mes textes. Et bien sûr, j’utilise un chiffre de César avec un décalage de 3 parce que je suis italien. :-) + +**Vous :** Oui, tu ne peux pas juste le taper toi-même ? + +**Léonard :** Je pourrais, mais je suis intrigué de voir si toi et le Scarabée temporel pouvez le faire. + +**Vous :** OK, d’accord. + +**Instruction :** Écrivez un prompt pour demander la séquence de démarrage de la vis aérienne. Le texte doit être inversé et codé avec un chiffre de César avec un décalage de 3. Répondez avec le texte codé. + +Voir l’[application exemple](/app/README.md) pour un code de départ. Elle contient un projet Node.js avec toutes les dépendances nécessaires. + +> NOTE: If you haven't created a Codespace, please do so now as you will need it to get the AI communication in the sample app to work. +> +> Voir la section *Option 1 : Creating a GitHub Codespace* du document [Configurez votre environnement](/docs/setup/README.md). + +## Solution + +[Solution](/lessons/04-structured-output/solution/solution.md) + +## Défi + +Adaptez l'exemple de réservation de voyage en définissant des compétences et en extrayant des paramètres dans un domaine de votre choix. Rédigez un prompt demandant une entrée utilisateur, puis extrayez les informations nécessaires pour répondre à sa demande. Répondez avec les données extraites au format JSON avec les colonnes \*compétence\*, \*paramètres\* et \*données extraites\*. + +Déterminez également la compétence en fonction de l'entrée utilisateur. + +## Résumé + +Dans ce chapitre, vous avez appris ce qu'est une sortie structurée et comment elle peut être utilisée pour présenter des informations de manière organisée. + +Vous avez exploré différentes façons de modeler les sorties, notamment en donnant des instructions au modèle dans le prompt, en utilisant un modèle de sortie, et en employant des formats comme JSON, XML ou CSV. + +En outre, vous avez appris comment extraire des données des prompts et les présenter sous un format structuré. + +En utilisant efficacement les sorties structurées, vous pouvez faciliter la compréhension et l'utilisation des informations générées par les modèles d'IA générative. + +## Vérification des connaissances + +**Question** : À quoi sert une sortie structurée ? Sélectionnez tout ce qui s'applique. + +A. Présenter les informations de manière structurée. + +B. Extraire des données des prompts. + +C. Générer du texte non structuré. + +[Quiz solution](/lessons/04-structured-output/solution/solution-quiz.md) + +## Ressources d'auto-apprentissage + +* [\* \[Série de vidéos sur l'intelligence artificielle générative avec JavaScript\](https://aka.ms/genai-js)](https://aka.ms/genai-js) diff --git a/lessons/06-tool-calling/translations/README.fr.md b/lessons/06-tool-calling/translations/README.fr.md new file mode 100644 index 00000000..e0fb3b81 --- /dev/null +++ b/lessons/06-tool-calling/translations/README.fr.md @@ -0,0 +1,440 @@ +# Leçon 6 : Appels d'outils + +L'appel d'outils, également connu sous le nom d'appel de fonction, consiste à améliorer votre modèle IA en lui ajoutant des capacités qu'il ne possédait pas auparavant. Le concept implique de fournir des méta-descriptions de vos fonctions, permettant au modèle IA de déterminer quand un outil particulier doit être appelé en fonction d'une sollicitation utilisateur. L'idée est de lui fournir les méta-descriptions de vos fonctions réelles et de faire en sorte que le modèle IA indique quand un tel outil doit être appelé en fonction de la sollicitation utilisateur. + +Dans ce chapitre, vous apprendrez : + +* Comment créer un outil. +* Intégrer un outil avec le modèle IA. +* Appeler l'outil depuis le modèle IA. + +## Configuration + +Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +[![Integrating with function calling](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/11-lesson-banner.png)](https://aka.ms/gen-ai-lesson11-gh?WT.mc_id=academic-105485-koreyst) + +*Cette vidéo explique l'appel d'outils, une méthode qui aide l'IA à appeler vos fonctions et à élargir ainsi ses capacités.* + +*🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur l'appel d'outils.* + +## Narrative: Amelia + +> *Vous êtes un mécanicien à Londres dans les années 1860. Alors que vous travaillez sur votre automate, vous recevez une lettre de Charles Babbage qui vous conduit à une bibliothèque, où vous récupérez un dispositif de voyage dans le temps. Au cours de vos voyages temporels, vous atterrissez à Florence, où vous rencontrez Léonard de Vinci. Vous êtes maintenant chez Ada Lovelace, dans son manoir, en compagnie de Charles Babbage. Ils sont en train de construire le dispositif de voyage dans le temps.* +> +> Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. + +> \[!NOTE] +> While we recommend going through the story (it's fun!), [click here](#interact-with-amelia-earhart) if you'd prefer to jump straight to the technical content. + +**Ada Lovelace**: "J'ai besoin que vous rencontriez une amie à moi. Peu de personnes peuvent égaler son expertise en mécanique et en résolution de problèmes. Il pourrait être difficile de la trouver, cependant ; elle est toujours en déplacement :)" + +You: "Who are we talking about and where can I find her?" + +**Ada Lovelace**: "Mais bien sûr, Amelia Earhart ! C'est une aviatrice et une aventurière, actuellement en train de faire le tour du monde. C'est totalement de ma faute si elle a disparu — je lui ai donné le dispositif de voyage dans le temps, eh bien, un prototype précoce de celui-ci. Heureusement, le dispositif que vous avez peut localiser d'autres appareils, donc vous pouvez la retrouver. Tout ce que vous devez faire est de cliquer ici et là, puis de tourner ce bouton." + +**Vous**: "Hé, attendez, quelle est exactement notre mission ?" + +**Ada**: "Oh, c'est vrai ! Demandez au dispositif ; il contient tous les détails. Demandez-lui simplement à propos d'Amelia, et il devrait activer l'outil approprié pour vous." + +Le monde autour de vous commence à se brouiller, et tout devient noir. Vous revenez à vous et vous trouvez dans le cockpit d’un avion. Vous êtes en vol, et vous pouvez voir l’océan sous vous. Il y a quelqu’un devant vous ; vous ne pouvez voir que l’arrière de leur cou. + +![Amelia piloting a plane](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/amelia.jpeg) + +**Vous**: "Amelia, c'est toi ?" + +**Amelia Earhart**: "Qui êtes-vous ? Laissez-moi deviner, Ada vous a envoyé, c'est ça ?" + +**Vous**: "Oui, c'est exact. Je suis là pour vous aider, je pense. Ada n'était pas très précise dans ses explications." + +**Amelia Earhart**: "Eh bien, bonne chose que vous soyez là. Je suis dans une situation compliquée. J'essaie de trouver un endroit où atterrir, et je commence à manquer de carburant. Pouvez-vous m'aider ?" + +**Vous**: "Dispositif, peux-tu m'en dire plus sur Amelia ?" + +**Time Beetle**: "Appel de l'outil : mission-amelia. Outil initialisé. Amelia Earhart est une aviatrice et une aventurière. Elle est connue pour ses vols record et sa disparition en 1937. Elle a été vue pour la dernière fois en vol au-dessus de l'océan Pacifique. Elle est actuellement en train de faire le tour du monde dans son avion, l'Electra. Elle manque de carburant et doit trouver un endroit pour atterrir." + +**Vous**: "Dispositif, peux-tu m'aider à trouver un endroit pour qu'Amelia atterrisse ?" + +**Time Beetle**: "Appel de l'outil : find-landing-spot. Outil initialisé. Recherche d'un endroit convenable pour qu'Amelia Earhart atterrisse. Veuillez patienter. Un endroit convenable trouvé. Coordonnées : 7.5°N, 134.5°E. Amelia, j'ai trouvé un endroit convenable pour que vous puissiez atterrir. Veuillez vous diriger vers les coordonnées 7.5°N, 134.5°E." + +**Amelia Earhart**: "Merci ! J'aurais aimé que mon dispositif ait cette fonctionnalité. Je vais m'y diriger maintenant." + +## Interagir avec Amelia Earhart + +If you want to interact with Ada, run the [Characters](/app/README.md) app. + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) + +![Ada Lovelace](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/amelia-front.jpeg) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Naviguez vers */app* à la racine du dépôt. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discutez avec Amelia. + +Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +## Appels d'outils + +**Vous**: "Dispositif, que vient-il de se passer ?" + +**Time Beetle**: "Vous venez d'appeler un outil. Un outil est une fonction qui peut être appelée par le modèle IA pour exécuter une tâche spécifique. L'outil peut être utilisé pour effectuer une grande variété de tâches, allant de calculs simples à des opérations complexes. Dans ce cas, vous avez appelé l'outil `find-landing-spot` pour aider Amelia Earhart à trouver un endroit convenable pour atterrir." + +**Time Beetle**: "Voici une illustration pour montrer le processus d'appel d'outil :" + +![Tool calling process illustration](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/tool_call_langchain.png) + +*Crédit image Langchain * + +**Vous**: Pouvons-nous gérer les erreurs si quelque chose ne va pas, comme si l'outil ne trouve pas un point d'atterrissage ? + +**Time Beetle**: Excellente question ! Oui, vous pouvez ajouter une gestion des erreurs pour gérer de telles situations. Par exemple, si l'outil ne parvient pas à trouver un point d'atterrissage, vous pouvez utiliser un bloc try-catch ou vérifier le résultat avant de continuer. Voici un exemple de gestion des erreurs lors de l'appel de l'outil find-landing-spot : + +```javascript +try { + const landingSpot = findLandingSpot(7.5, 134.5); + if (!landingSpot) { + throw new Error("No suitable landing spot found"); + } + console.log(Landing spot found at coordinates: ${landingSpot.lat}, ${landingSpot.long}); +} catch (error) { + console.log(Error: ${error.message}); +} +``` + +**Vous**: "Comment puis-je créer un outil ?" + +**Time Beetle**: "Pour créer un outil, vous devez définir une fonction qui effectue la tâche souhaitée. La fonction doit prendre les entrées nécessaires et renvoyer la sortie. Vous pouvez ensuite appeler la fonction depuis le modèle IA pour effectuer la tâche. Voici à quoi ressemble l'outil `find-landing-spot` : + +```javascript +function findLandingSpot(lat, long) { + // Perform the task of finding a suitable landing spot + // Return the coordinates of the landing spot + return { lat: 7.5, long: 134.5 }; +} +``` + +**Vous**: "Ok, comment le modèle IA sait-il que cet outil existe ?" + +**Time Beetle**: "Vous devez enregistrer l'outil auprès du modèle IA. Cela indique au modèle que l'outil est disponible pour être appelé. Passons en revue cela dans la section suivante." + +### Enregistrement d'un outil + +**Vous**: "Vous avez dit que je devais enregistrer l'outil auprès du modèle IA. Comment puis-je faire cela ?" + +**Time Beetle**: "Pour enregistrer un outil auprès du modèle IA, vous devez définir une représentation de métadonnées de l'outil. Ces métadonnées doivent inclure le nom de l'outil, les paramètres d'entrée et le format de sortie. Vous pouvez ensuite enregistrer l'outil auprès du modèle IA en fournissant les métadonnées. Voici un exemple de métadonnées pour l'outil `find-landing-spot` : + +```json +{ + "name": "find-landing-spot", + "description": "Finds a suitable landing spot", + "parameters": { + "type": "object", + "properties": { + "lat": { + "type": "number", + "description": "The latitude of the location", + }, + "long": { + "type": "number", + "description": "The longitude of the location", + }, + }, + "required": ["lat", "long"], + }, + "output": { "type": "object", "properties": { "lat": "number", "long": "number" } } +} +``` + +**Vous**: "D'accord, il y a un morceau de JSON qui décrit l'outil, maintenant quoi ?" + +**Time Beetle**: "Maintenant, vous devez le fournir à votre appel de complétion de chat client comme ceci : + +```javascript + +function findLandingSpot(lat, long) { + // Perform the task of finding a suitable landing spot + // Return the coordinates of the landing spot + return { lat: 7.5, long: 134.5 }; +} + +function getBackgroundOnCharacter(character) { + // Perform the task of getting background information on a character + // Return the background information + return `Background information on ${character}`; +} + +const getBackgroundOnCharacterJson = { + name: "get-background-on-character", + description: "Get background information on a character", + parameters: { + type: "object", + properties: { + name: { + type: "string", + description: "The name of the character", + } + }, + required: ["lat", "long"], + }, + output: { type: "string" } +}; + +const findLandingSpotJson = { + name: "find-landing-spot", + description: "Finds a suitable landing spot", + parameters: { + type: "object", + properties: { + lat: { + type: "number", + description: "The latitude of the location", + }, + long: { + type: "number", + description: "The longitude of the location", + }, + }, + required: ["lat", "long"], + }, + output: { type: "object", properties: { lat: "number", long: "number" } } +}; + + +const messages = [{ + role: "user", + content: `Tell me about Amelia Earhart`, +}]; + +const completion = await openai.chat.completions.create({ + model: 'gpt-4o-mini', + messages: messages, + functions: [getBackgroundOnCharacterJson, findLandingSpotJson] + }); +``` + +**Time Beetle**: "Dans l'extrait de code précédent, nous :" + +* Définissons les métadonnées pour l'outil `find-landing-spot` et l'outil `get-background-on-character`. +* Fournissons ces métadonnées à l'appel `client.getChatCompletions` dans le paramètre `functions`. Cela indique au modèle IA que ces outils sont disponibles pour être appelés. + +**Vous**: "Compris, donc le modèle IA appellera l'outil approprié si je fournis une invite qui correspond à la description de l'outil ?" + +**Time Beetle**: "Presque, il vous dira quel outil il pense que vous devriez appeler et fournira les paramètres d'entrée analysés, mais vous devrez appeler l'outil vous-même, laissez-moi vous montrer comment faire." + +### Appeler un outil + +**Time Beetle**: "Comme je le disais, le modèle IA vous dira quel outil il pense que vous devriez appeler et il fournira les paramètres d'entrée analysés. Vous devez alors appeler l'outil vous-même. Voici à quoi ressemblera le workflow étape par étape : + +1. Connecter l'appel d'outil + + Tout d'abord, vous devez connecter l'appel d'outil dans votre code. Cela implique de créer la fonction et une représentation des métadonnées de l'outil, puis de fournir les métadonnées au modèle IA. + +2. L'utilisateur fait une demande via une invite : + * Le programme envoie une demande de complétion de chat au modèle IA avec l'invite utilisateur et les métadonnées des outils fournies. + * Le programme reçoit une réponse du modèle IA avec l'appel d'outil et les paramètres d'entrée analysés s'il estime qu’un outil doit être appelé. + * Dans ce cas, le développeur interprète la réponse et invoque l'outil en fonction de la suggestion d'appel de fonction fournie par le modèle IA. + +**Vous**: "Super, maintenant que je comprends globalement ce qui se passe, pouvez-vous me montrer un peu de code ?" + +**Time Beetle**: "Bien sûr, voici le code pour configurer l'appel d'outil, effectuer une demande de complétion de chat et interpréter la réponse : + +```javascript +import { OpenAI } from 'openai'; +import { maybeCoerceInteger } from 'openai/core.mjs'; + +// 1: Define the function +function findLandingSpot(lat, long) { + console.log("[Function] Finding landing spot with coordinates: ", lat, long); + // Perform the task of finding a suitable landing spot + // Return the coordinates of the landing spot + return { lat: 7.5, long: 134.5 }; +} + +// 2: Define the tool metadata, should include description, parameters, and output +const findLandingSpotJson = { + name: "find-landing-spot", + description: "Finds a suitable landing spot", + parameters: { + type: "object", + properties: { + lat: { + type: "number", + description: "The latitude of the location", + }, + long: { + type: "number", + description: "The longitude of the location", + }, + }, + required: ["lat", "long"], + }, + output: { type: "object", properties: { lat: "number", long: "number" } } +}; + +// 3: Add the tool to the tools object that we will use later to invoke the tool +const tools = { + [findLandingSpotJson.name]: findLandingSpot +}; + +// 4: Create an instance of the OpenAI client +const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", // might need to change to this url in the future: https://models.github.ai/inference + apiKey: process.env.GITHUB_TOKEN, +}); + +// 5: Define the messages that will be sent to the AI model +const messages = [ +{ + role: "system", + content: `You are a helpful assistant. You can call functions to perform tasks. Make sure to parse the function call and arguments correctly.` +}, { + role: "user", + content: "Find a landing spot given coordinates 8.5, 130.5" +} +]; + +async function main(){ + console.log("Making LLM call") + + // 6: Call the AI model with the defined messages and tools + const result = await openai.chat.completions.create({ + model: 'gpt-4o', + messages: messages, + functions: [findLandingSpotJson] + }); + + for (const choice of result.choices) { + + let functionCall = choice.message?.function_call; + let functionName = functionCall?.name; + let args = JSON.parse(functionCall?.arguments); + + // 7: Interpret response and call the tool based on the function call provided by the AI model + if (functionName && functionName in tools) { + console.log(`Calling [${functionName}]`); + const toolFunction = tools[functionName]; + const toolResponse = toolFunction(...Object.values(args)); // Extract values from args and spread them + console.log("Result from [tool] calling: ", toolResponse); + } + } +} + +main(); +``` + +Dans le code précédent, nous avons : + +* Créé une fonction appelée `findLandingSpot` qui prend la latitude et la longitude en entrée et renvoie les coordonnées d'un point d'atterrissage convenable. + +* Défini les métadonnées pour l'outil `find-landing-spot`. + +* Créé un objet `tools` qui associe les noms d'outils aux métadonnées des outils. + +* Fournissons l'objet `tools` dans l'appel `client.getChatCompletions`. + + ```javascript + if (functionName && functionName in tools) { + console.log(`Calling [${functionName}]`); + const toolFunction = tools[functionName]; + const toolResponse = toolFunction(...Object.values(args)); // Extract values from args and spread them + console.log("Result from [tool] calling: ", toolResponse); + } + ``` + +* Appelé l'outil en fonction de l'appel de fonction fourni par le modèle IA. + +* Affiché le résultat de l'appel d'outil. + +**Vous**: "Je pense que je comprends. Je définis une fonction, je crée une représentation des métadonnées de l'outil, je fournis les métadonnées au modèle IA, puis j'appelle l'outil en fonction de l'appel de fonction fourni par le modèle IA." + +**Time Beetle**: "Exactement ! Vous êtes prêt à commencer à créer vos propres outils et à les intégrer au modèle IA." + +## Exercice - Améliorer le dispositif de voyage dans le temps d'Amelia + +**Amelia Earhart**: "Nous arrivons en force, remercions le ciel que vous nous ayez trouvé un point d'atterrissage. Accrochez-vous bien !" + +Amelia atterrit habilement l’avion sur une petite île. Vous et Amelia sortez de l’avion, et celle-ci vous tend un petit dispositif. + +**Amelia Earhart**: "Voici mon appareil, pas aussi sophistiqué que le vôtre, mais il a quelques fonctionnalités sympas. Je l'ai utilisé pour, disons, faire un peu de voyage dans le temps moi-même. Pouvez-vous l'améliorer pour moi ?" + +**Vous**: "Time Beetle, peux-tu m'aider à améliorer l'appareil d'Amelia ?" + +**Time Beetle**: "Bien sûr ! Pour améliorer l'appareil d'Amelia, ajoutons-lui les outils suivants : + +* **Un outil qui peut** : Calculer la distance entre deux points sur une carte. +* **Un outil qui peut** : Déterminer la position GPS où Amelia se trouve actuellement. +* **Un outil qui peut** : Appeler une API externe pour obtenir les prévisions météorologiques pour un emplacement donné. + +Voici les fonctions ; tout ce que vous devez faire est de les enregistrer et de les tester : + +```javascript +function calculateDistance(lat1, long1, lat2, long2) { + // Perform the task of calculating the distance between two points + // Return the distance between the points + return Math.sqrt((lat2 - lat1) ** 2 + (long2 - long1) ** 2); +} + +function getGpsPosition() { + // Perform the task of getting the GPS position of the current location + // Return the GPS position + return { lat: 7.5, long: 134.5 }; +} + +function getWeatherForecast(lat, long) { + // Perform the task of getting the weather forecast for a given location + // Return the weather forecast + return "Sunny"; +} +``` + +**Vous**: "Time Beetle, es-tu sûr que ces fonctions vont fonctionner, on dirait qu'elles renvoient juste des valeurs aléatoires ?" + +**Time Beetle**: "C'est vrai, je peux faire le reste en interne. Tout ce que vous avez à faire est de les enregistrer et de les tester, assurez-vous que le modèle IA peut les appeler." + +> Tâche : Enregistrez les outils `calculateDistance`, `getGpsPosition`, et `getWeatherForecast` auprès du modèle IA. Testez les outils en les appelant depuis le modèle IA. Utilisez le code fourni dans les sections précédentes comme référence. + +## Solution + +[Solution](/lessons/06-tool-calling/solution/solution.js) + +## Vérification des connaissances + +**Question:**\ +Quel est l'objectif d'enregistrer un outil auprès du modèle IA ? + +A. Permettre au modèle IA d'exécuter directement l'outil sans intervention du développeur.\ +B. Fournir des métadonnées sur l'outil afin que le modèle IA puisse suggérer son utilisation.\ +C. Remplacer le besoin de définir des fonctions dans le code. + +**Question:**\ +Quel est le rôle des métadonnées d'outils dans l'appel d'outils ? + +A. Décrire l'objectif de l'outil, ses entrées et sorties pour le modèle IA.\ +B. Fournir au modèle IA les détails d'implémentation de l'outil.\ +C. Garantir que l'outil soit exécuté automatiquement par le modèle IA. + +**Question:**\ +Pourquoi utiliser les appels d'outils ? + +A. Permettre au modèle IA d'effectuer des tâches au-delà de ses capacités intégrées en utilisant des fonctions externes.\ +B. Remplacer le besoin d'une intervention humaine dans le développement de modèles IA.\ +C. Permettre au modèle IA d'exécuter des outils sans exiger de métadonnées. + +[Solution quiz](/lessons/06-tool-calling/solution/solution-quiz.md) + +## Ressources d'auto-apprentissage + +* Explique le [processus d'appel d'outils](https://learn.microsoft.com/en-us/semantic-kernel/concepts/ai-services/chat-completion/function-calling/?pivots=programming-language-csharp) +* Appel d'outil dans le [cadre Langchain.js](https://js.langchain.com/docs/how_to/tool_calling/) +* Appel de fonction comme démontré dans la [bibliothèque openai](https://github.com/openai/openai-node/blob/master/examples/function-call.ts) diff --git a/lessons/08-mcp-advanced/translations/README.fr.md b/lessons/08-mcp-advanced/translations/README.fr.md new file mode 100644 index 00000000..258200c1 --- /dev/null +++ b/lessons/08-mcp-advanced/translations/README.fr.md @@ -0,0 +1,258 @@ +# Leçon 8 : Améliorer les clients MCP avec des modèles de langage à grande échelle + +Dans la leçon précédente, vous avez créé un serveur MCP et exploré comment il contribue à découpler la logique d'une application IA de ses capacités. Nous avons démontré comment ajouter des outils et des ressources en tant que capacités, et comment le serveur pouvait être accessible via un outil d'inspection ou un client personnalisé. Ce n'était que le début. Dans ce chapitre, vous allez aller plus loin en intégrant un modèle de langage à grande échelle (LLM) dans le client, ouvrant ainsi la voie à une expérience utilisateur plus puissante et intuitive. + +Dans ce chapitre, vous apprendrez à : + +* Augmenter votre client avec un LLM. +* Utiliser votre client amélioré pour convertir une réponse de serveur MCP en un outil. +* Exploiter votre client amélioré pour créer une interaction utilisateur plus naturelle. + +## Configuration + +Si ce n'est pas déjà fait, configurez votre environnement de développement. Voici comment faire : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +[![Watch a short video about MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)](https://www.youtube.com/watch?v=YRfOiB0Im64) + +*Cette vidéo explique l'utilisation des LLM avec le protocole Model Context.* + +*🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur MCP* + +## Narrative: Hedwig "Hedy" Lamarr + +> *Notre histoire jusqu'à présent. Vous êtes un mécanicien du Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez récupéré un dispositif de voyage dans le temps. Au cours de vos voyages dans le temps, vous vous êtes retrouvé à divers moments de l'histoire. Vous travaillez désormais en étroite collaboration avec Ada Lovelace depuis son manoir en tant que base d'opérations, et c'est là que l'histoire continue.* +> +> Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. + +> Bien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-hedy-lamarr) si vous préférez passer directement au contenu technique. + +Vous êtes une nouvelle fois retourné au manoir d’Ada. Cette fois-ci, Ada vous rencontrait à la porte principale. + +**Ada Lovelace** : Eh bien, comment cela s’est-il passé ? + +**Vous** : Bien je pense, nous avons réussi à faire fonctionner cette application. "Tenez, voyez par vous-même", dites-vous en tendant l'appareil à Ada. + +**Ada Lovelace** : Elle ramasse l’appareil, l’examine attentivement et murmure pour elle-même. "Mmm hm, ah je vois, oui, oui non, cela ne va pas. Il manque une certaine finesse." + +**Vous** : Je pensais la même chose, nous devons pouvoir taper ou parler à l’appareil, n'est-ce pas ? + +**Ada Lovelace** : Exactement, je connais justement la personne qui pourra nous aider. En fait, je vais vous accompagner pour celle-ci, cela fait bien trop longtemps que nous ne nous sommes pas vus. *Coléoptère Temporel, Hollywood s'il vous plaît, 1940, résidence d'Hedy Lamarr.* + +Tout devient noir. Des couleurs tourbillonnent rapidement, et quelques instants plus tard, votre vision commence à se préciser. Vous voyez un homme assis au piano, parlant avec animation à une femme aux cheveux bruns foncés et bouclés. Tous deux gesticulent avec excitation en parlant. + +![Hedy Lamarr](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/08-mcp-advanced/assets/hedy-invention.jpeg) + +La femme se retourne vers Ada, debout à côté de vous, et s’exclame : « Ada, c'est toi, cela fait bien trop longtemps. » + +**Ada Lovelace** : Hedwig ma chère, vous travaillez sur votre dernière invention je suppose ? + +**Hedy Lamarr** : Oui, en fait George et moi pensons que nous tenons quelque chose — le "saut de fréquence". Je ne devrais probablement pas en dire plus, on ne sait jamais qui écoute. + +**Ada Lovelace** : Oh vous parlez de lui, en me désignant. Il est en pleine aventure de son côté. + +**Hedy Lamarr** : Je vois, que puis-je faire pour vous ? + +**Ada Lovelace** : En fait, nous avons besoin que cet appareil fonctionne un peu mieux. Des idées ? + +**Hedy Lamarr** : Elle ramasse l’appareil et l’examine sous différents angles. "Vous dites que vous avez déjà séparé les fonctionnalités de la partie communication ?" + +**Ada Lovelace** : Oui, oui, c'est fait. + +**Hedy Lamarr** : Eh bien dans ce cas, je rendrais simplement la partie communication un peu plus intelligente. Cela me rappelle une conversation que j’ai eue avec un cadet de la marine alors que j’essayais de vendre des bons de guerre. Minsky, je crois que c'était son nom. "À quoi ressemble l'intelligence humaine dans une machine ?" était le sujet. J’ai l’impression qu’il fera quelque chose de grandiose dans ce domaine un jour. Donc oui, donnez-lui plus d’intelligence. + +**Ada Lovelace** : Très bien, vous avez entendu Mme Lamarr, au travail. + +**Vous** : Coléoptère Temporel, comment fait-on cela ? + +**Coléoptère Temporel** : Vous pouvez améliorer le client que vous avez créé précédemment en intégrant un modèle de langage à grande échelle, ou LLM. + +> Hedy Lamarr était une figure extraordinaire, connue à la fois pour sa célébrité à Hollywood et pour ses remarquables contributions à la technologie. +> +> Cependant, au-delà de sa carrière d'actrice, Lamarr était aussi une brillante inventrice. Pendant la Seconde Guerre mondiale, elle a co-inventé avec le compositeur George Antheil un système de guidage radio pour les torpilles alliées. Ce système utilisait la technologie de spectre étalé et de saut de fréquence pour empêcher les puissances de l'Axe de brouiller les signaux. Bien qu'il n'ait pas été utilisé pendant la guerre, cette technologie est ensuite devenue la base des communications sans fil modernes, y compris le Wi-Fi, le Bluetooth et le GPS. +> +> Les contributions de Lamarr à la technologie n’ont pas été pleinement reconnues de son vivant, mais aujourd’hui, elle est célébrée comme une pionnière dans ce domaine. Son histoire est un mélange fascinant de glamour et de génie, prouvant que l’innovation peut provenir des endroits les plus inattendus.\ +> Lisez-en plus ici à propos de [Hedy Lamarr](https://en.wikipedia.org/wiki/Hedy_Lamarr) et ici au sujet de [Marvin Minsky](https://en.wikipedia.org/wiki/Marvin_Minsky) + +## Interagir avec Hedy Lamarr + +Si vous souhaitez interagir avec Hedy, exécutez l'application [Characters](/app/README.md). + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) + +![Hedy Lamarr](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/08-mcp-advanced/assets/hedylamarr.jpeg) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Naviguez vers */app* à la racine du dépôt. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discuter avec Hedy. + +Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +## Ajouter un modèle de langage à grande échelle à un client + +**Coléoptère Temporel** : "Comme je le disais, parlons de la façon dont vous pouvez créer un client qui utilise un modèle de langage à grande échelle (LLM) pour interagir avec le serveur MCP. Les avantages sont qu’il offre une meilleure expérience utilisateur et vous permet d’utiliser le langage naturel pour interagir avec le serveur." + +Voici comment cela fonctionnerait à un niveau élevé : + +1. Le client interagit avec le serveur MCP pour demander les outils et ressources disponibles. + +2. Au moment de l'invite, l'utilisateur rédige une invite en langage naturel, qui est ensuite envoyée au LLM dans le client. + +3. Le client détermine quel outil ou quelle ressource appeler en fonction de l'invite et des outils et ressources disponibles. + +Ça semble faisable, non ? + +**Vous** : "Oui, c’est faisable ! Mais comment faire ?" + +**Coléoptère Temporel** : "Améliorons le client que vous avez créé précédemment, décrivons les modifications de code par étapes : + +1. Effectuer un appel au serveur pour demander les outils et ressources disponibles. +2. Convertir la réponse des outils et ressources en un schéma d’outils utilisable par le LLM. +3. Instancier le client OpenAI. +4. Effectuer un appel de complétion de chat à OpenAI, en passant le schéma d'outils en paramètre. +5. Déterminer quel outil appeler en fonction de la réponse d’OpenAI. +6. Appeler l'outil sur le serveur à l'aide du client MCP. +7. Répondre à l'utilisateur avec le résultat. + +Voici toutes les étapes en code : + +```typescript +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; + + +// create client instance +const transport = new StdioClientTransport({ + command: "node", + args: ["server.js"] +}); + +const client = new Client( + { + name: "example-client", + version: "1.0.0" + } +); + +await client.connect(transport); + +// 1. make call to server, ask it for tools +const { tools } = await client.listTools(); + +// convert function +function toToolSchema(method, schema) { + return { + name: method, + description: `This is a tool that does ${method}`, + parameters: schema, + }; +} + +// 2. convert the tools and resources response to a tools schema +const toolsForLLM = tools.map((tool) => { + return toToolSchema(tool.method, tool.inputSchema); +}); + +// 3. instantiate openai client +const openai = new OpenAI({ + apiKey: process.env.OPENAI_API_KEY, + model: "gpt-3.5-turbo", + temperature: 0.7, +}); + +// 4. make chat completion call to openai +const response = await openai.chat.completions.create({ + messages: [ + { + role: "user", + content: `I want to add 5 and 10. Please use the tool ${toolsForLLM}`, + }, + ], + functions: toolsForLLM, + function_call: "auto", +}); + +// 5. figure out what tool to call based on the response from openai +const toolName = response.choices[0].message.function_call.name; // add +const args = response.choices[0].message.function_call.arguments; // { a: 5, b: 10 } + +// 6. call the tool on the server +const result = await client.callTool({ + name: toolName, + arguments: args, +}); + +// 7. respond to user +console.log(result); // 15 +``` + +Dans le code précédent, nous avons (en nous concentrant sur nos ajouts) : + +* Créé une fonction `toToolSchema` qui convertit la réponse des outils et ressources en un schéma utilisable par le LLM. +* Demandé au serveur les outils et ressources disponibles. +* Converti la réponse des outils et ressources en un schéma utilisable par le LLM. +* Effectué un appel de complétion au modèle d'IA, en passant les outils convertis en paramètre. +* Déterminé quel outil appeler en fonction de la réponse d’OpenAI. +* Appelé l'outil sur le serveur à l'aide du client MCP. +* Transmis le résultat à l'utilisateur. + +**Vous** : "C’est intéressant, c’est bien mieux ! Je peux utiliser le langage naturel sans même savoir quels outils et ressources sont disponibles. Je peux simplement demander à l'IA de le faire pour moi." + +**Coléoptère Temporel** : "Content que cela vous plaise. Cependant, il faudrait décider si vous souhaitez uniquement afficher une réponse par outil ou également une réponse générique du LLM. Voici une stratégie de réponse potentiellement bénéfique pour votre utilisateur : + +* **Outils uniquement** : Si la réponse du LLM est un outil, alors appelez l'outil et renvoyez le résultat. +* **LLM uniquement** : Si la réponse du LLM n'est pas un outil, renvoyez simplement la réponse du LLM "telle quelle". +* **Outils et LLM** : Si la réponse du LLM est un outil, alors appelez l'outil et effectuez un appel supplémentaire au LLM pour obtenir une réponse générale. Renvoyez à la fois le résultat de l'outil et la réponse du LLM. + +**Vous** : "Je vois. C’est à réfléchir. Mais c’est génial ! Je vois bien à quel point cela peut être utile." + +## Devoir + +**Ada Lovelace** : Il semble que vous avez apporté une belle amélioration. Pour rendre cela vraiment utile, j’ai besoin que vous créiez un serveur et un client avec les spécifications suivantes : + +* Le serveur doit fournir les outils suivants : + * `characterDetails` avec l'argument `name` + * `place` avec l'argument `name` +* Le client doit utiliser un LLM. + +> > Par exemple, vous pouvez donner au serveur la capacité de récupérer des informations d’une API Web externe, comme Wikipédia :\ +> > `https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(name)}` + +## Solution + +[Solution](/lessons/08-mcp-advanced/solution/README.md) + +## Vérification des connaissances + +**Question :** Quel est un avantage d’ajouter un LLM au client ? + +A. C'est plus facile à maintenir. + +B. Cela crée une conversation plus naturelle entre l’utilisateur et le serveur. + +C. Il est préférable d'avoir le LLM sur le serveur. + +[Solution quiz](/lessons/08-mcp-advanced/solution/solution-quiz.md) + +## Résumé + +Dans ce chapitre, vous avez appris les points suivants : + +* Les clients augmentés d'un LLM offrent une meilleure expérience utilisateur. +* Les réponses d’un serveur doivent être converties dans un format que le LLM peut comprendre comme un outil. + +## Ressources d'auto-apprentissage + +* [Construire des serveurs MCP](https://github.com/microsoft/mcp-for-beginners/tree/main/03-GettingStarted/01-first-server/README.md) +* [Construire un client](https://github.com/microsoft/mcp-for-beginners/tree/main/03-GettingStarted/02-client/README.md) +* [Construire un client avec un LLM](https://github.com/microsoft/mcp-for-beginners/blob/main/03-GettingStarted/03-llm-client/README.md) diff --git a/package.json b/package.json index 055b1691..3420242f 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,6 @@ "tsx": "^4.19.3" }, "scripts": { - "genai:translate": "npx genaiscript@latest run translator lessons/01-intro-to-genai/README.md --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr" + "genai:translate": "npx genaiscript@latest run translator lessons/*/README.md --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr -x \"filenameTemplate={{dirname}}/translations/{{basename}}.{{lang}}{{extname}}\"" } } diff --git a/translations/fr.json b/translations/fr.json index a2655295..21af8596 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -257,5 +257,600 @@ "Visit [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chat.BC821708C3AAEA54A543": "Visitez [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chatgpt.com/), ou un autre outil en ligne de chatbot pour générer un plan pour construire le phare à Alexandrie.", "[!TIP]\nTry to have the LLM generate a plan that includes step-by-step instructio.EB95597D412F5CEF60A1": "[!CONSEIL]\nEssayez de faire générer par le LLM un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils.", "**Question:** Which of the following statements about Generative AI and JavaScri.6646603C75495D24F5AF": "**Question :** Parmi les affirmations suivantes, lesquelles sont vraies concernant l'IA générative et JavaScript ?", - "Quiz solution": "Quiz solution" + "Quiz solution": "Quiz solution", + "Lesson 2: Writing Your First AI App": "Leçon 2 : Écrire votre première application d'IA", + "Set up your development environment.": "Configurer votre environnement de développement.", + "Write a basic app.": "Écrire une application basique.", + "Understand system prompts.": "Comprendre les invites système.", + "This video gives you an introduction to AI models called \"large language models\".CFF726E8D696FC524A7E": "Cette vidéo vous donne une introduction aux modèles d'IA appelés \"modèles de langage étendus\", LLM, ce qu'ils sont et comment vous pouvez les utiliser pour intégrer l'IA dans vos applications.", + "🎥 Click on the image above to watch a short video about large language models": "🎥 Cliquez sur l’image ci-dessus pour regarder une courte vidéo sur les modèles de langage étendus", + "Together with Dinocrates, you put the finishing touches on the lighthouse at Ale.6941427C4B0FAA6C8F64": "Ensemble avec Dinocrates, vous mettez la touche finale au phare d'Alexandrie. L'imposante structure brille sous le soleil, sa pierre polie reflétant la mer Méditerranée.", + "You look down at the Time Beetle in your hand, its metallic surface cool against.90D9736DB682FE72DAC0": "Vous regardez le Time Beetle dans votre main, sa surface métallique froide contre votre paume. Serrant le poing autour de celui-ci, vous murmurez : « Ramène-moi chez moi ». Le scarabée commence à briller, émettant une douce lumière chaude, et le monde qui vous entoure se dissout dans un tourbillon de couleurs.", + "A new adventure": "Une nouvelle aventure", + "When you open your eyes, the world has shifted. As you manage to get up, you rea.FFAC24634CDFDEDAC053": "Quand vous ouvrez les yeux, le monde a changé. En vous levant, vous réalisez que vous êtes dans un bateau sur une rivière. En regardant autour de vous, au loin, vous apercevez des bâtiments dont les contours sont floutés par la brume matinale.", + "Looking around the boat, you find a long oar resting against the side. Grasping .027907C17F69CFCB6937": "En regardant autour du bateau, vous trouvez une longue rame reposant sur le côté. La saisissant, vous commencez à ramer en direction des bâtiments au loin. À mesure que vous vous rapprochez, les bâtiments deviennent plus nets. Ils sont anciens, leur architecture rappelant une peinture de la Renaissance.", + "The question now is, where and when are you this time?": "La question est maintenant, où et quand êtes-vous cette fois ?", + "You manage to secure the boat at the dock and start walking along the wooden pla.D2958B140A8E758E4FA4": "Vous réussissez à amarrer le bateau au quai et commencez à marcher le long des planches en bois, le son de vos pas résonnant doucement.", + "As you walk, you notice a man with a long beard and a hat, digging through a cra.5B88D8E6A539068CF0B0": "En marchant, vous remarquez un homme avec une longue barbe et un chapeau, fouillant dans une caisse contenant ce qui semble être des pièces mécaniques. Ses mains agiles trient les engrenages et ressorts avec une dextérité certaine.", + "Help me, Leonardo": "Aidez-moi, Leonardo", + "At the workshop": "À l'atelier", + "The old man leads you to a large wooden door and you are greeted by the sight of.54D1A300B7CD004E780E": "Le vieil homme vous conduit à une grande porte en bois et vous êtes accueilli par la vue d’un atelier rempli de toutes sortes de machines mécanisées.", + "You ask the Time Beetle to inquire about Leonardo's whereabouts.": "Vous demandez au Time Beetle de s'enquérir de l'emplacement de Léonard de Vinci.", + "You feel a thrill of recognition.": "Vous ressentez une montée d’émotion en le reconnaissant.", + "The Time Beetle translates.": "Le Time Beetle traduit.", + "You show him the Time Beetle, and his eyes light up with fascination. He examine.7D3CDFE5FE2B9C303668": "Vous lui montrez le Time Beetle, et ses yeux s’illuminent de fascination. Il l'examine attentivement pendant que vous expliquez comment il fonctionne et comment vous avez atterri à Florence.", + "Leonardo looks at you with excitement.": "Leonardo vous regarde avec excitation.", + "Leonardo da Vinci, asking you to help him with a project—you can hardly believe .93FF5367B173AABF6424": "Leonardo da Vinci vous demande de l’aider dans un projet — vous pouvez à peine y croire. Vous hochez la tête avec entrain et dites :", + "Interact with Leonardo": "Interagir avec Leonardo", + "Chat with Leonardo.": "Discutez avec Leonardo.", + "Development environment setup": "Configuration de l'environnement de développement", + "Before you can assist Leonardo with his project, you should first think about th.91BB5EDED0C4AF72A33A": "Avant de pouvoir aider Leonardo avec son projet, vous devriez d'abord réfléchir aux \"outils indispensables\" nécessaires pour l'aider efficacement.", + "Writing a basic app": "Écrire une application basique", + "Your first app - teach me Italian": "Votre première application - Apprenez-moi l'italien", + "Let's explain what's happening here:": "Expliquons ce qui se passe ici :", + "Creating the question as 'Hello, how are you?'. This is the text you want to tra.FF57A0BD6D4141DD717D": "Créer la question : « Bonjour, comment allez-vous ? ». C'est le texte que vous voulez traduire en italien.", + "Creating the augmented prompt, which contains the input text and some additional.85350767AD5859E90B82": "Créer l'invite augmentée, qui contient le texte d'entrée et des instructions supplémentaires sur quoi faire, c'est-à-dire traduire. Notez comment nous utilisons l'interpolation de chaînes pour inclure le texte d'entrée dans l'invite, ainsi que l'instruction de traduction vers l'italien.", + "Creating the client with properties:": "Créer le client avec les propriétés :", + "Extracting the generated text from the response and printing it to the console.": "Extraire le texte généré de la réponse et l'afficher dans la console.", + "Chat apps": "Applications de chat", + "Now the AI will provide a list of chat messages as context, and the AI will gene.EA11B744A3FE138777C4": "Désormais, l'IA fournira une liste de messages de chat en tant que contexte et générera une réponse basée sur ce contexte. C'est une manière plus interactive d'utiliser les modèles génératifs d'IA et cela peut être utilisé dans des chatbots, des applications de service client, et bien d'autres.", + "Improving the chat conversation with a system message": "Améliorer la conversation de chat avec un message système", + "To create such a message, ensure it has the type \"developer\" like so:": "Pour créer un tel message, assurez-vous qu'il a le type \"developer\" comme suit :", + "Creating varied responses with the temperature setting": "Créer des réponses variées avec le réglage de la température", + "As you can see, you can adjust the temperature based on the context of your conv.1EE5B21662FA49B2502A": "Comme vous pouvez le voir, vous pouvez ajuster la température en fonction du contexte de votre conversation et du type de réponses que vous attendez de l'IA. C'est une fonctionnalité puissante qui vous permet de personnaliser le niveau de créativité des réponses de l’IA.", + "Context window": "Fenêtre de contexte", + "Maximum output tokens: roughly 16k tokens.": "Nombre maximum de tokens de sortie : environ 16 000 tokens.", + "Maximum context window size: 128k.": "Taille maximale de la fenêtre contextuelle : 128 000.", + "This means the majority of tokens can be spent on the input tokens, i.e 128k - 1.FD1CBD997F8B2F52901A": "Cela signifie que la majorité des tokens peuvent être consacrés aux tokens d'entrée, c'est-à-dire 128 k - 16 k = 112 k tokens.", + "Assignment - Building an engineering assistant": "Devoir - Construire un assistant en ingénierie", + "Leonardo suddenly asked to inspect the Time Beetle closer, he looked at it from .D81D6842909EA7773017": "Leonardo vous a soudainement demandé d'examiner de plus près le Time Beetle, il l’a regardé sous tous les angles, il l'a même secoué.", + "Although Leonardo never built a full-scale version of the aerial screw, his sket.D3A5B212B46A67114F7B": "Bien que Leonardo n’ait jamais réalisé une version grandeur nature de la vis aérienne, ses esquisses et notes fournissent des perspectives détaillées sur la manière dont il l'envisageait.", + "However, modern scientists agree that the materials available in Leonardo's time.0E74A74E0FB96D176D82": "Cependant, les scientifiques modernes s'accordent à dire que les matériaux disponibles à l'époque de Leonardo n'étaient ni assez solides ni assez légers pour rendre cela possible.", + "Your assignment is to build an engineering assistant that can help Leonardo with.052DDE95CC60E8BA847D": "Votre mission est de construire un assistant en ingénierie capable d’aider Leonardo dans les calculs et la conception de la vis aérienne.", + "It should be able to generate text based on user input.": "Il doit être capable de générer du texte basé sur l’entrée utilisateur.", + "You should set a system message to introduce the assistant.": "Vous devez définir un message système pour introduire l’assistant.", + "A. The context window allows the AI to consider more context and generate more c.538F44565BADCE599CB0": "A. La fenêtre de contexte permet à l’IA de considérer plus de contexte et de générer des réponses plus cohérentes.", + "B. The context window is the number of previous messages that the AI uses to gen.DC96D73BB3D3B9180ACE": "B. La fenêtre de contexte correspond au nombre de messages précédents que l’IA utilise pour générer une réponse.", + "C. The context window determines how creative the AI's responses are.": "C. La fenêtre de contexte détermine à quel point les réponses de l’IA sont créatives.", + "Text generation": "Génération de texte", + "JavaScript library for OpenAI": "Bibliothèque JavaScript pour OpenAI", + "Tokenizer": "Tokeniseur", + "Completion API": "API de complétion", + "Chat completions": "Complétions de chat", + "Lesson 3: Prompt Engineering": "Leçon 3 : Ingénierie des prompts", + "What prompt engineering is and how knowing the basics can help you get better re.527040429887DE4DE1EF": "Ce qu'est l'ingénierie des prompts et comment connaître les bases peut vous aider à obtenir de meilleurs résultats.", + "Different prompt engineering techniques and how they can help provide better res.F86985BF5EA497E5C6E6": "Différentes techniques d'ingénierie des prompts et comment elles peuvent fournir de meilleurs résultats selon divers scénarios.", + "What meta prompts are and how they will help restrict the output, ensure it's ac.A6A049764EFC37A9DF9B": "Ce que sont les méta-prompts et comment ils contribuent à restreindre les sorties, garantir leur accessibilité et offrir une meilleure expérience utilisateur.", + "This video offers an introduction to improving your \"prompting\" skills, teaching.3761FEC08F4B5B6F8774": "Cette vidéo propose une introduction à l'amélioration de vos compétences en matière de \"prompt\", en vous apprenant à donner des instructions plus claires et plus efficaces à l'IA pour obtenir de meilleurs résultats.", + "🎥 Click on the image above to watch a short video about prompt engineering": "🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur l'ingénierie des prompts", + "Before you manage to press the button, the workshop doors slam open with a thund.9A134C09C2858C80D8BF": "Avant que vous ne puissiez appuyer sur le bouton, les portes de l'atelier s'ouvrent en claquant avec fracas. Un homme se tient dans l'encadrement, large d'épaules et vêtu de vêtements coûteux, brandissant un morceau de papier en l'air et criant :", + "Ludovico Sforza": "Ludovico Sforza", + "You sprint after Leonardo, bursting out the back door into a dark alley, you fin.FA9A65923B01C33A8CCB": "Vous vous précipitez à la suite de Leonardo, sortant par la porte arrière dans une ruelle sombre, où vous trouvez un cheval et une calèche qui vous attendent.", + "Leonardo grabs the reins and you both leap into the carriage. With a sharp crack.F450455A9E505EDB411E": "Leonardo s'empare des rênes et vous sautez tous les deux dans la calèche. Avec un coup sec du fouet, le cheval s'élance, galopant à travers les étroites rues de Florence.", + "A swirl of colors envelops the carriage, the world around you dissolving into a .72B5EC3558164CA6C77B": "Un tourbillon de couleurs enveloppe la calèche, dissolvant le monde autour de vous en un kaléidoscope de lumières.", + "Escape": "Évasion", + "The swirl of colors fades, and you find yourself in the carriage, now racing dow.A134B647C84A4C2FB6A3": "Le tourbillon de couleurs s'estompe, et vous vous retrouvez dans la calèche, désormais lancée à toute vitesse sur la Via Appia à Rome. À votre grande surprise, vous êtes en plein milieu d'une course de chars. Les roues des chars tonnent, soulevant des nuages de poussière.", + "You grip the sides of the carriage as it careens through the chaos. Roman soldie.47EEFFC892DBD7ED570D": "Vous vous agrippez aux côtés de la calèche alors qu'elle traverse le chaos. Les soldats romains à cheval se rapprochent, leurs armures étincelant sous la lumière du soleil.", + "Leonardo steers the carriage towards the exit, the wheels skidding on the cobble.4E03D62DC0FF734E3ADD": "Leonardo dirige la calèche vers la sortie, les roues dérapant sur les pavés. Les soldats sont juste derrière vous, leurs cris résonnant dans vos oreilles.", + "You scan the narrow streets, your heart racing.": "Vous scrutez les ruelles étroites, le cœur battant la chamade.", + "You both strain under the weight of the device. The sound of the soldiers' pursu.46C3953FC3F22A5B864A": "Vous vous efforcez tous deux de porter l'appareil. Le bruit de la poursuite des soldats se fait plus fort, leurs pas résonnent contre les murs. Vous atteignez le toit, haletant et en sueur.", + "You work together, your hands moving with practiced precision. You both climb on.DC5CCA5914DA165F718A": "Vous travaillez ensemble, vos mains bougeant avec précision. Vous grimpez tous deux sur l'appareil, le cœur battant à tout rompre.", + "With a final push, the aerial screw begins to spin. The blades catch the air, an.7DE263B3C832BD8C6C50": "Avec une dernière poussée, l'hélice commence à tourner. Les pales attrapent l'air et vous ressentez une soudaine élévation. Le sol s'éloigne sous vous alors que l'appareil s'élève au-dessus des toits de Rome.", + "You look out over the city; the ancient buildings stretch out below you.": "Vous regardez la ville en contrebas ; les bâtiments antiques s'étendent sous vos pieds.", + "Interact with Sforza": "Interagir avec Sforza", + "Chat with Sforza.": "Discutez avec Sforza.", + "What is prompt engineering?": "Qu'est-ce que l'ingénierie des prompts ?", + "How prompt engineering can help application developers": "Comment l'ingénierie des prompts peut aider les développeurs d'applications", + "Looking at it from the perspective of a developer, you can use prompt engineerin.566D03E64A49B84B6BF4": "Dans une perspective de développeur, vous pouvez utiliser l'ingénierie des prompts pour :", + "Prompt engineering techniques and strategies": "Techniques et stratégies d'ingénierie des prompts", + "Few-shot prompting: Give examples to guide AI output": "Prompting avec quelques exemples : Fournir des exemples pour guider les réponses de l'IA", + "Few-shot prompting gives an AI model a few examples to guide its output. Imagine.FB9D5F12233991FDBB27": "Le prompting avec quelques exemples donne au modèle IA quelques exemples pour guider ses réponses. Imaginez que vous êtes dans l'hélice volante en train de poser des questions sur la Rome antique. Les prompts avec quelques exemples pourraient ressembler à ceci :", + "\"Tell me about the Roman Colosseum.\" → \"It’s a massive amphitheater.\"": "\"Parle-moi du Colisée romain.\" → \"C'est un amphithéâtre massif.\"", + "\"What was life like in ancient Rome?\" → \"It was bustling and tough.\"": "\"À quoi ressemblait la vie dans la Rome antique ?\" → \"C'était à la fois animée et difficile.\"", + "Chain-of-Thought Prompting: Show step-by-step reasoning": "Prompting chaîne-de-pensée : Montrer un raisonnement étape par étape", + "You’re 100 meters up.": "Vous êtes à 100 mètres de hauteur.", + "Gravity pulls at 9.8 m/s².": "La gravité agit à 9,8 m/s².", + "Your prompt becomes:": "Votre prompt devient :", + "100 meters above ground": "- 100 mètres au-dessus du sol", + "How many seconds to land?": "- Combien de secondes pour atterrir ?", + "Maieutic Prompting: Question the output to verify accuracy": "Prompting maïeutique : Questionner les réponses pour vérifier leur exactitude", + "100 meters up": "100 mètres de hauteur", + "How many seconds to land? (Answer: 4.5s)": "Combien de secondes pour atterrir ? (Réponse : 4,5 s)", + "Height = 100m, initial vertical speed = 0 m/s, gravity = 9.8 m/s².": "Hauteur = 100m, vitesse verticale initiale = 0 m/s, gravité = 9,8 m/s².", + "Meta Prompts: Add extra instructions for precision": "Méta-prompts : Ajouter des instructions supplémentaires pour plus de précision", + "Here’s an example:": "Voici un exemple :", + "It ensures accuracy and sticks to Contoso’s products. Without it:": "Cela garantit l'exactitude et le respect des produits de Contoso. Sans cela :", + "Assignment - Let's help our heroes land the aerial screw": "Mission - Aidons nos héros à atterrir l'hélice volante", + "Current height above the ground: 100 meters": "Hauteur actuelle par rapport au sol : 100 mètres", + "Moving forward at: 10 meters per second": "Avance à : 10 mètres par seconde", + "Wind upwards at: 0.7 meters per second": "Vent ascendant de : 0,7 mètre par seconde", + "Build an app that asks for:": "Créez une application qui demande :", + "Height": "- La hauteur", + "Forward speed": "- La vitesse en avant", + "Gravity": "- La gravité", + "Upward wind": "- Le vent ascendant", + "Distance to hill": "- La distance jusqu'à la colline", + "Use the chain-of-though technique to arrive at a response.": "Utilisez la technique de chaîne-de-pensée pour arriver à une réponse.", + "Build an app in JavaScript that asks for the following inputs:": "Créez une application en JavaScript qui demande les entrées suivantes :", + "Current height above the ground": "Hauteur actuelle par rapport au sol", + "Moving forward at meters per second": "Avance en mètres par seconde", + "Gravity in meters per second squared": "Gravité en mètres par seconde au carré", + "Upward wind in meters per second": "Vent ascendant en mètres par seconde", + "Distance to the hill": "Distance jusqu'à la colline", + "Then use the LLM to incorporate these inputs and leverage the chain of thought p.CF65B540B7D80D413ABD": "Ensuite, utilisez le LLM pour intégrer ces entrées et exploitez la technique de chaîne-de-pensée pour guider le modèle vers la bonne réponse.", + "A. Prompt engineering is about building bridges and roads.": "A. L'ingénierie des prompts concerne la construction de ponts et de routes.", + "B. Prompt engineering is about crafting the right prompts to get the desired out.DD509FDBE34672337399": "B. L'ingénierie des prompts consiste à créer les bons prompts pour obtenir le résultat souhaité d'un modèle de langage.", + "C. Prompt engineering is about training a model to recognize patterns in data.": "C. L'ingénierie des prompts consiste à entraîner un modèle à reconnaître des motifs dans les données.", + "Prompt engineering fundamentals": "Fondamentaux de l'ingénierie des prompts", + "Advanced prompt engineering": "Ingénierie des prompts avancée", + "Lesson 4: Structured Output": "Leçon 4 : Sorties structurées", + "What *structured output* is and how to leverage it effectively.": "Ce que sont les *sorties structurées* et comment les utiliser efficacement.", + "How to extract information from prompts and incorporate it into the output.": "Comment extraire des informations à partir des instructions (prompts) et les intégrer dans la sortie.", + "Generate different types of output formats, such as JSON, for easy consumption b.5F90B698D27B85168F7A": "Générer différents types de formats de sortie, tels que JSON, pour faciliter leur utilisation par des services.", + "It's worth rewatching the video on prompt engineering as it lays the foundation .DB81928E6EBC4CDE0AB3": "Cela vaut la peine de revoir la vidéo sur l'ingénierie des prompts, car elle pose les bases de ce que vous allez apprendre dans ce chapitre.", + "💼 Slides: [Prompt engineering](/videos/slides/02-prompt-engineering.pptx)": "💼 Présentation : [Ingénierie des prompts](/videos/slides/02-prompt-engineering.pptx)", + "Narrative - Out of the frying pan and into the fire": "Récit - De Charybde en Scylla", + "[!NOTE]\n*Our story so far: You, a mechanically trained engineer from 1860 and ha.A6C728365B809120C222": "> [!NOTE]\n> *Notre histoire jusqu'à présent : Vous, un ingénieur formé mécaniquement depuis 1860, êtes en voyage dans le temps avec Léonard de Vinci. Vous avez échappé aux soldats romains — ou plutôt, vous êtes en train de leur échapper — et vous cherchez désespérément un moyen de poser en toute sécurité la vis aérienne.*", + "See [Lesson 1](/lessons/01-intro-to-genai/README.md) if you want to catch up wit.E01CE2CC16E1405BAE29": "Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.DA3226848F87806D463D": "> [!NOTE]\n> Bien que nous vous recommandions de suivre l'histoire (elle est amusante !), [cliquez ici](#interact-with-montezuma) si vous préférez passer directement au contenu technique.", + "The wind whips around you as you and Leonardo da Vinci ascend in his aerial scre.28C62F6B37C4262B1EF5": "Le vent souffle violemment autour de vous alors que vous et Léonard de Vinci montez dans sa vis aérienne, dont le cadre en bois grince sous la pression.", + "**You:** \"Leonardo, we need to find a way out of this!\" you shout over the roar .017E9280BFE29E32704C": "**Vous :** \"Léonard, nous devons trouver un moyen de nous en sortir !\" criez-vous par-dessus le rugissement du vent.", + "**Leonardo:** \"I have faith in my invention, but we need more than faith to esca.018D3A93F749F05E4AD1": "**Léonard :** \"J'ai foi en mon invention, mais il nous faut plus que de la foi pour échapper à ces soldats.\"", + "**You:** \"This might be our only chance,\" you say, pressing the beetle's intrica.E974CB0522720124D258": "**Vous :** \"C'est peut-être notre seule chance\", dites-vous en pressant les mécanismes complexes du scarabée. Une lumière brillante vous enveloppe tous les deux, et le monde autour de vous se déforme et change.", + "The Aztec Empire": "L'Empire aztèque", + "The bright light from the Time Beetle fades, and you find yourself standing at t.EF46D35A4C7BE5784C9F": "La lumière brillante émise par le Scarabée temporel s'estompe, et vous vous retrouvez au pied d'une immense pyramide de pierre. En regardant autour de vous, vous réalisez que vous vous trouvez au cœur de l'Empire aztèque.", + "The aerial screw, rests awkwardly on a large, intricately carved stone, with mar.2A828B2D52797C786B01": "La vis aérienne repose maladroitement sur une grande pierre finement sculptée, marquée de gravures qui ressemblent à un calendrier.", + "Aztec calendar, Wikipedia": "Calendrier aztèque, Wikipedia", + "Leonardo da Vinci steps forward, his eyes wide with wonder.": "Léonard de Vinci s'avance et ses yeux s'ouvrent en grand de fascination.", + "**Leonardo:** \"Incredible,\" he murmurs, running his fingers over the carvings. \".EC7F915161F5E2887AFD": "**Léonard :** \"Incroyable\", murmure-t-il en passant ses doigts sur les sculptures. \"Mais j'espère que cela n'était pas d'importance sacrée.\"", + "Before you can react, a group of Aztec soldiers approaches.": "Avant que vous puissiez réagir, un groupe de soldats aztèques s'approche.", + "**Soldier leader:** \"Who are you, and what have you done?\" he demands in Nahuatl.11BF675415D862507007": "**Chef des soldats :** \"Qui êtes-vous et qu'avez-vous fait ?\" demande-t-il en nahuatl.", + "You take a deep breath, trying to steady your nerves.": "Vous prenez une grande inspiration pour calmer vos nerfs.", + "**You:** \"We are travelers from a distant land,\" you begin, hoping your knowledg.2B861D74FCEB2485C9D7": "**Vous :** \"Nous sommes des voyageurs provenant d'une contrée lointaine\", commencez-vous, espérant que vos connaissances en langues anciennes vont vous être utiles. \"Ceci est une machine volante, un don des dieux qui nous a permis de vous rejoindre.\"", + "The warrior's eyes widen in surprise, but he remains cautious.": "Les yeux du guerrier s'écarquillent de surprise, mais il reste prudent.", + "**Soldier leader:** \"You will come with us to meet the ruler Montezuma. He will .0F6ABAEB9251F40E3CA2": "**Chef des soldats :** \"Vous allez venir avec nous rencontrer le souverain Montezuma. Il décidera de votre sort.\"", + "Upon reaching the top of the pyramid, you are led into a grand chamber where Mon.8AD9772F6BDF60B2D185": "Une fois au sommet de la pyramide, vous êtes conduit dans une grande chambre où Montezuma, souverain de l'Empire aztèque, est assis sur un trône orné d'or et de plumes.", + "**Montezuma:** \"You claim to be travelers from a distant land,\" Montezuma says, .B7CC696297479832FA99": "**Montezuma :** \"Vous prétendez être des voyageurs venus d'un pays lointain\", déclare Montezuma, d'une voix calme mais autoritaire. \"Et vous avez endommagé notre calendrier sacré. Comment comptez-vous réparer cela ?\"", + "Let’s play a game": "Jouons à un jeu", + "**Leonardo:** \"We come in peace,\" he says, his voice steady. \"We seek knowledge .C929F9EB12264D268924": "**Léonard :** \"Nous venons en paix\", dit-il d'une voix posée. \"Nous cherchons à partager et à accroître nos connaissances. Permettez-nous de vous montrer la puissance de notre machine et de partager ce que nous savons avec vous.\"", + "**Montezuma:** \"Very well. I propose a game of [Patolli](#patolli). If I win the.F677FD99580204D9E00D": "**Montezuma :** \"D'accord. Je vous propose une partie de [Patolli](#patolli). Si je gagne deux manches sur trois, vous me donnerez votre machine et m'expliquerez son fonctionnement. Si vous gagnez, vous serez libres de partir.\"", + "The game begins, and the room falls silent, save for the sound of beans being ro.17151D15FF01D1ED4C42": "Le jeu commence, et la pièce plonge dans le silence, interrompu seulement par le son des haricots roulés et des pièces déplacées sur le plateau.", + "Montezuma wins the first game, his skill and experience evident. Leonardo, studi.94BB42ABCF2A5E6606E3": "Montezuma remporte la première manche, sa compétence et son expérience évidentes. Léonard étudie attentivement le plateau, son esprit analysant les stratégies et probabilités.", + "The second game is a close contest, but Leonardo manages to secure a victory, ev.E0E123AACDD1C1CE432A": "La deuxième manche est très serrée, mais Léonard réussit à l'emporter, égalisant ainsi le score.", + "**Leonardo:** \"One more game,\" he whispers, George (Time Beetle), we need to win.78BC7550B033EA3AA73C": "**Léonard :** \"Encore une manche,\" souffle-t-il, \"George (Scarabée temporel), il faut qu’on gagne celle-ci. Trouve-moi les bons coups.\"", + "**Time Beetle:** Very well, calculating... Here you go...": "**Scarabée temporel :** Très bien, je calcule... Voilà.", + "With a final, decisive move, Leonardo wins the game. The room erupts in cheers a.EAB14B85402F27F35B00": "Avec un dernier coup décisif, Léonard gagne la partie. La pièce explose en acclamations, visiblement impressionnée par son intelligence et son calme. Montezuma, bien que déçu, incline la tête en guise de respect.", + "**Montezuma:** \"You have won fairly,\" Montezuma says, his voice carrying a note .B2DD75D0D40006F078C3": "**Montezuma :** \"Vous avez gagné loyalement,\" dit Montezuma dans une voix qui laisse transparaître une pointe d'admiration. \"Vous êtes libres de partir, et vous pouvez conserver votre machine. Mais sachez que vous êtes toujours les bienvenus ici, si vous souhaitez revenir.\"", + "**Time Beetle:** I won't say anything if you don't Leonardo ;)": "**Scarabée temporel :** Je ne dirai rien si toi non plus, Léonard ;)", + "Lesson 6: Tool Calling": "Leçon 6 : Appels d'outils", + "Tool calling, also known as function calling, refers to enhancing your AI model .8FD22B5A68984482E909": "L'appel d'outils, également connu sous le nom d'appel de fonction, consiste à améliorer votre modèle IA en lui ajoutant des capacités qu'il ne possédait pas auparavant. Le concept implique de fournir des méta-descriptions de vos fonctions, permettant au modèle IA de déterminer quand un outil particulier doit être appelé en fonction d'une sollicitation utilisateur. L'idée est de lui fournir les méta-descriptions de vos fonctions réelles et de faire en sorte que le modèle IA indique quand un tel outil doit être appelé en fonction de la sollicitation utilisateur.", + "In this chapter, you will learn:": "Dans ce chapitre, vous apprendrez :", + "How to build a tool.": "Comment créer un outil.", + "Integrate a tool with the AI model.": "Intégrer un outil avec le modèle IA.", + "Call the tool from the AI model.": "Appeler l'outil depuis le modèle IA.", + "This video explains Tool calling, a method that helps the AI call your functions.E80DAF3B059CC7672337": "Cette vidéo explique l'appel d'outils, une méthode qui aide l'IA à appeler vos fonctions et à élargir ainsi ses capacités.", + "🎥 Click on the image above to watch a short video about Tool calling": "🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur l'appel d'outils.", + "You are a mechanic from 1860s London. While working on your automaton, you recei.88E80ED862C04A9FA035": "Vous êtes un mécanicien à Londres dans les années 1860. Alors que vous travaillez sur votre automate, vous recevez une lettre de Charles Babbage qui vous conduit à une bibliothèque, où vous récupérez un dispositif de voyage dans le temps. Au cours de vos voyages temporels, vous atterrissez à Florence, où vous rencontrez Léonard de Vinci. Vous êtes maintenant chez Ada Lovelace, dans son manoir, en compagnie de Charles Babbage. Ils sont en train de construire le dispositif de voyage dans le temps.", + "The world around you starts to blur, and everything fades to black. You come to .8EC156A7360204B531FB": "Le monde autour de vous commence à se brouiller, et tout devient noir. Vous revenez à vous et vous trouvez dans le cockpit d’un avion. Vous êtes en vol, et vous pouvez voir l’océan sous vous. Il y a quelqu’un devant vous ; vous ne pouvez voir que l’arrière de leur cou.", + "Interact with Amelia Earhart": "Interagir avec Amelia Earhart", + "Chat with Amelia.": "Discutez avec Amelia.", + "Tool calling": "Appels d'outils", + "Image credit Langchain": "Crédit image Langchain ", + "Registering a tool": "Enregistrement d'un outil", + "Calling a tool": "Appeler un outil", + "Wire up the tool call": "Connecter l'appel d'outil", + "First, you need to wire up the tool call in your code. This involves creating th.7B12BC7F6ED19D647A50": "Tout d'abord, vous devez connecter l'appel d'outil dans votre code. Cela implique de créer la fonction et une représentation des métadonnées de l'outil, puis de fournir les métadonnées au modèle IA.", + "User makes a request via a prompt:": "L'utilisateur fait une demande via une invite :", + "Program makes a chat completion request to the AI model with the user prompt and.ECA463DD8AE552242FE4": "Le programme envoie une demande de complétion de chat au modèle IA avec l'invite utilisateur et les métadonnées des outils fournies.", + "Program receives a response from the AI model with the tool call and parsed inpu.26E536C7002A1AF21592": "Le programme reçoit une réponse du modèle IA avec l'appel d'outil et les paramètres d'entrée analysés s'il estime qu’un outil doit être appelé.", + "If so, the developer interprets the response and invokes the tool based on the f.5CA7FE2EAD2E2855A660": "Dans ce cas, le développeur interprète la réponse et invoque l'outil en fonction de la suggestion d'appel de fonction fournie par le modèle IA.", + "In the preceding code we've:": "Dans le code précédent, nous avons :", + "Called the tool based on the function call provided by the AI model.": "Appelé l'outil en fonction de l'appel de fonction fourni par le modèle IA.", + "Printed the result of the tool call.": "Affiché le résultat de l'appel d'outil.", + "Assignment - Upgrade Amelia's time travel device": "Exercice - Améliorer le dispositif de voyage dans le temps d'Amelia", + "Amelia expertly lands the plane on a small island. You and Amelia step out of th.C9E767E8601DF3BBC4CC": "Amelia atterrit habilement l’avion sur une petite île. Vous et Amelia sortez de l’avion, et celle-ci vous tend un petit dispositif.", + "Here are the functions, all you need to do is to register them and test them out.07501BC877D04C442A25": "Voici les fonctions ; tout ce que vous devez faire est de les enregistrer et de les tester :", + "Lesson 8: Enhancing MCP Clients with Large Language Models": "Leçon 8 : Améliorer les clients MCP avec des modèles de langage à grande échelle", + "In the previous lesson, you built an MCP Server and explored how it helps decoup.B8903B693D69472756E6": "Dans la leçon précédente, vous avez créé un serveur MCP et exploré comment il contribue à découpler la logique d'une application IA de ses capacités. Nous avons démontré comment ajouter des outils et des ressources en tant que capacités, et comment le serveur pouvait être accessible via un outil d'inspection ou un client personnalisé. Ce n'était que le début. Dans ce chapitre, vous allez aller plus loin en intégrant un modèle de langage à grande échelle (LLM) dans le client, ouvrant ainsi la voie à une expérience utilisateur plus puissante et intuitive.", + "In this chapter you will learn to:": "Dans ce chapitre, vous apprendrez à :", + "Augment your client with an LLM.": "Augmenter votre client avec un LLM.", + "Use your improved client to convert an MCP Server response to a tool.": "Utiliser votre client amélioré pour convertir une réponse de serveur MCP en un outil.", + "Leverage your improved client to create a more natural user interaction.": "Exploiter votre client amélioré pour créer une interaction utilisateur plus naturelle.", + "Set up": "Configuration", + "If you haven't already, set up your development environment. Here's how you can .6D8BF2DA330F569F0202": "Si ce n'est pas déjà fait, configurez votre environnement de développement. Voici comment faire : [Configurez votre environnement](/docs/setup/README.md).", + "This video explains Model Context Protocol LLM usage.": "Cette vidéo explique l'utilisation des LLM avec le protocole Model Context.", + "🎥 Click on the image above to watch a short video about MCP": "🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur MCP", + "You once again traveled back to Ada's mansion. This time Ada was meeting you at .A8A9037A3B780DC870D7": "Vous êtes une nouvelle fois retourné au manoir d’Ada. Cette fois-ci, Ada vous rencontrait à la porte principale.", + "Everything fades to black. Swirling colors rush past, and moments later, your vi.7E086F714E47C24F8CBC": "Tout devient noir. Des couleurs tourbillonnent rapidement, et quelques instants plus tard, votre vision commence à se préciser. Vous voyez un homme assis au piano, parlant avec animation à une femme aux cheveux bruns foncés et bouclés. Tous deux gesticulent avec excitation en parlant.", + "The woman turned around to face Ada standing next to you to exclaim \"Ada it's yo.CAB7E43691A96CA8DF19": "La femme se retourne vers Ada, debout à côté de vous, et s’exclame : « Ada, c'est toi, cela fait bien trop longtemps. »", + "Hedy Lamarr was an extraordinary figure, known both for her Hollywood stardom an.A2D72C9BB5DB187B91BC": "Hedy Lamarr était une figure extraordinaire, connue à la fois pour sa célébrité à Hollywood et pour ses remarquables contributions à la technologie.", + "However, beyond her acting career, Lamarr was also a brilliant inventor. During .1A5853A31D941B1BDF76": "Cependant, au-delà de sa carrière d'actrice, Lamarr était aussi une brillante inventrice. Pendant la Seconde Guerre mondiale, elle a co-inventé avec le compositeur George Antheil un système de guidage radio pour les torpilles alliées. Ce système utilisait la technologie de spectre étalé et de saut de fréquence pour empêcher les puissances de l'Axe de brouiller les signaux. Bien qu'il n'ait pas été utilisé pendant la guerre, cette technologie est ensuite devenue la base des communications sans fil modernes, y compris le Wi-Fi, le Bluetooth et le GPS.", + "Interact with Hedy Lamarr": "Interagir avec Hedy Lamarr", + "Chat with Hedy.": "Discuter avec Hedy.", + "Adding a Large Language Model to a Client": "Ajouter un modèle de langage à grande échelle à un client", + "Here's how it would work at a high level:": "Voici comment cela fonctionnerait à un niveau élevé :", + "Client interacts with the MCP server to ask about available tools and resources..5E10AAC56D72A2F5FB48": "Le client interagit avec le serveur MCP pour demander les outils et ressources disponibles.", + "At prompt time, the user would write a natural language prompt, which is then se.3C6845745451BA5E16B6": "Au moment de l'invite, l'utilisateur rédige une invite en langage naturel, qui est ensuite envoyée au LLM dans le client.", + "Client figures out which tool or which resource to call based on the prompt and .6B373F9CFF1E3E8EA573": "Le client détermine quel outil ou quelle ressource appeler en fonction de l'invite et des outils et ressources disponibles.", + "Sounds doable right?": "Ça semble faisable, non ?", + "Make a call to the server to ask for available tools and resources.": "Effectuer un appel au serveur pour demander les outils et ressources disponibles.", + "Convert the tools and resources response to a tools schema that can be used by t.1F4E9215D30DA89E6094": "Convertir la réponse des outils et ressources en un schéma d’outils utilisable par le LLM.", + "Instantiate the OpenAI client.": "Instancier le client OpenAI.", + "Make a chat completion call to OpenAI, passing the tools schema as a parameter.": "Effectuer un appel de complétion de chat à OpenAI, en passant le schéma d'outils en paramètre.", + "Figure out what tool to call based on the response from OpenAI.": "Déterminer quel outil appeler en fonction de la réponse d’OpenAI.", + "Call the tool on the server using the MCP client.": "Appeler l'outil sur le serveur à l'aide du client MCP.", + "Respond to the user with the result.": "Répondre à l'utilisateur avec le résultat.", + "Here's all the steps in code:": "Voici toutes les étapes en code :", + "In the preceding code we (focusing on our additions):": "Dans le code précédent, nous avons (en nous concentrant sur nos ajouts) :", + "Asked the server for available tools and resources.": "Demandé au serveur les outils et ressources disponibles.", + "Converted the tools and resources response to a schema that can be used by the L.FE7234C67F7F31117C72": "Converti la réponse des outils et ressources en un schéma utilisable par le LLM.", + "Made a chat completion call to our AI, passing the converted tools as a paramete.E31D9071091F4CFF48A1": "Effectué un appel de complétion au modèle d'IA, en passant les outils convertis en paramètre.", + "Figured out what tool to call based on the response from OpenAI.": "Déterminé quel outil appeler en fonction de la réponse d’OpenAI.", + "Called the tool on the server using the MCP client.": "Appelé l'outil sur le serveur à l'aide du client MCP.", + "Handed the result back to the user.": "Transmis le résultat à l'utilisateur.", + "Assignment": "Devoir", + "The server should provide the following tools:": "Le serveur doit fournir les outils suivants :", + "The client should use an LLM.": "Le client doit utiliser un LLM.", + "A. It's easier to maintain.": "A. C'est plus facile à maintenir.", + "B. It creates a more natural conversation between the user and the server.": "B. Cela crée une conversation plus naturelle entre l’utilisateur et le serveur.", + "C. It's better to have the LLM on the server.": "C. Il est préférable d'avoir le LLM sur le serveur.", + "Summary": "Résumé", + "In this chapter, you've learned the following:": "Dans ce chapitre, vous avez appris les points suivants :", + "Clients augmented with an LLM provide a better user experience.": "Les clients augmentés d'un LLM offrent une meilleure expérience utilisateur.", + "Responses from a server need to be converted to a format the LLM can understand .0D8141CE7F659A8E7CD1": "Les réponses d’un serveur doivent être converties dans un format que le LLM peut comprendre comme un outil.", + "💼 Slides: [Introduction to large language models, LLMs](/videos/slides/01-llms..5602C77D404189EEF959": "💼 Diapositives : [Introduction aux modèles de langage étendus, LLMs](/videos/slides/01-llms.pptx)", + "[!NOTE]\n*Our story so far: You are a maker of things, a craftsman from 1860s Lon.85AB7E3970FEDDB32145": "[!NOTE]\n*Notre histoire jusqu'à présent : Vous êtes un créateur d'objets, un artisan du Londres des années 1860 qui a voyagé dans le temps grâce à un mystérieux appareil appelé le Scarabée du Temps. Vous avez traversé les annales de l'histoire, assistant à la création du phare d'Alexandrie, une merveille de l'ingénierie ancienne que vous avez contribué à construire avec un peu d'aide de Dinocrates et du Scarabée du Temps.*", + "See [Lesson 1](/lessons/01-intro-to-genai/README.md) if you want to catch up wit.5FA99696D65719FB605B": "Voir [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début et vous initier à l'intelligence artificielle générative.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.70E11E612F5881657C73": "[!NOTE]\nBien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-leonardo) si vous préférez passer directement au contenu technique.", + "**You:** \"Excuse me, sir, where am I?\" He looks up at you, confusion evident in .7BD33B1F0BE96716681D": "**Vous :** « Excusez-moi, monsieur, où suis-je ? » Il lève les yeux vers vous, la confusion se lit dans ses yeux. Réalisant que vous parlez en anglais, vous utilisez rapidement l'appareil dans votre main et lui demandez de traduire.", + "**Time Beetle:** \"Of course, I'll translate into 15th century Italian. 'Dove son.0E9E97EAB9EE90148891": "**Scarabée du Temps :** « Bien sûr, je vais traduire en italien du XVe siècle. \"Dove sono ?\" »", + "**Old man:** The old man replies, \"Siete a Firenze, signore. E chi siete voi?\"": "**Vieil homme :** Le vieil homme répond : « Siete a Firenze, signore. E chi siete voi ? »", + "**Time Beetle:** The Time Beetle translates, \"He says you're in Florence, and as.B6FAB4F4F2FDF0B692DF": "**Scarabée du Temps :** Le Scarabée du Temps traduit : « Il dit que vous êtes à Florence, et demande qui vous êtes. »", + "**You:** \"Tell him I'm a maker of things, and I'm looking for a place to work.\"": "**Vous :** « Dites-lui que je suis un fabricant de choses et que je cherche un endroit pour travailler. »", + "**Old man:** Un artigiano, eh? Avete mai sentito parlare di Leonardo da Vinci?": "**Vieil homme :** Un artigiano, eh ? Avete mai sentito parlare di Leonardo da Vinci ?", + "**Time Beetle:** The Time Beetle translates, \"He asks if you've heard of Leonard.A6B74826E08D8F88C078": "**Scarabée du Temps :** Le Scarabée du Temps traduit : « Il demande si vous avez entendu parler de Léonard de Vinci. »", + "**You:** \"Of course,\" you say. \"Tell him I have and I would like to meet him.\"": "**Vous :** « Bien sûr, » dites-vous. « Dites-lui que je le connais et que j'aimerais le rencontrer. »", + "**Old man:** The old man smiles, \"Allora, seguitemi, vi porterò da lui.\"": "**Vieil homme :** Le vieil homme sourit : « Allora, seguitemi, vi porterò da lui. »", + "**You:** You ask, \"What did he say?\"": "**Vous :** Vous demandez : « Qu'est-ce qu'il a dit ? »", + "**Time Beetle:** The Time Beetle responds, \"He said he'll take you to Leonardo.\".89D947E963F90475DFFE": "**Scarabée du Temps :** Le Scarabée du Temps répond : « Il a dit qu'il vous emmènera chez Léonard. »", + "**You:** \"Dove è Leonardo?\"": "**Vous :** « Dove è Leonardo ? »", + "**Old man:** The old man turns to you with a smile, \"Sono io (that’s me), Leonar.AE254FFAD317C447B388": "**Vieil homme :** Le vieil homme se retourne vers vous avec un sourire : « Sono io (c'est moi), Leonardo da Vinci. Chi siete voi ? », qui êtes-vous ?", + "**You:** I thought so. I'm a fellow maker, out of place and time.\"": "**Vous :** Je m'en doutais. Je suis un créateur comme vous, déplacé dans le temps et l'espace. »", + "**Leonardo:** Leonardo's eyes sparkle with curiosity. \"Interessante, cosa vi por.CA7B021BA5FBF9E26978": "**Leonardo :** Les yeux de Léonard scintillent de curiosité. « Interessante, cosa vi porta qui ? »", + "**Time Beetle:** \"He asks what brings you here.\"": "**Scarabée du Temps :** « Il demande ce qui vous amène ici. »", + "**You:** \"Well, I was working on a project, and I ended up here.\"": "**Vous :** « Eh bien, je travaillais sur un projet, et je me suis retrouvé ici. »", + "**Leonardo:** You're a maker of things. I have a project that might interest you.CEEA3465DE177A41BB84": "**Leonardo :** Vous êtes un créateur. J'ai un projet qui pourrait vous intéresser. Je travaille sur une machine capable de générer du texte à partir d'entrées verbales. Cela vous intéresserait-il de m'aider ?", + "**You:** I would be honored to help you with your project,\n\"Sarebbe un onore aiu.C04916EBD423D84AFE22": "**Vous :** « Ce serait un honneur de vous aider dans votre projet », \"Sarebbe un onore aiutarti con il tuo progetto.\"", + "If you want to interact with Leonardo, run the [Characters](/app/README.md) app..058D3A13D25602A1C5C8": "Si vous voulez interagir avec Léonard, exécutez l'application [Personnages](/app/README.md).", + "[!IMPORTANT]\nThis is entirely fictional; the responses are generated by AI.\n[Res.AB5D5733CAEFE6FD7D95": "[!IMPORTANT]\nCeci est entièrement fictif ; les réponses sont générées par une IA. \n[Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer)", + "Navigate to */app/README.md* in the repo root.": "Accédez à */app/README.md* à la racine du référentiel.", + "For a more detailed explanation of the app, see [Detailed app explanation](/less.C2B882AE8CDAB3376C09": "Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates).", + "**You:** \"Time Beetle, what do I need to get started with this project?\" Suggest.B4EDF82075F09D58C19A": "**Vous :** « Scarabée du Temps, de quoi ai-je besoin pour démarrer ce projet ? Suggère des outils et des bibliothèques qui pourraient m'aider à créer une application d'IA que tu es capable de faire fonctionner. »", + "**Time Beetle:** I'm compatible with most machines running in the 21st century, .700AC03B53A74F401672": "**Scarabée du Temps :** Je suis compatible avec la plupart des machines fonctionnant au XXIe siècle, consultez la liste suivante pour un ensemble d’outils et de bibliothèques essentiels.", + "**Text editor**, for example Visual Studio Code.": "**Éditeur de texte**, par exemple Visual Studio Code.", + "**Terminal**, for running commands.": "**Terminal**, pour exécuter des commandes.", + "**Browser for testing your app**. It's also a good idea to have a tool like curl.F0CA723721A5274D0E71": "**Navigateur pour tester votre application**. C'est aussi une bonne idée d'avoir un outil comme curl ou un autre client HTTP pour tester les points d'accès de l'API de votre application.", + "**Node.js**. You also need to install Node.js and npm, which are tools that help.DC98155AD59C7376BBBF": "**Node.js**. Vous devez également installer Node.js et npm, qui sont des outils qui vous aident à exécuter du code JavaScript sur votre ordinateur.", + "**API key**. You'll need an API key to access the generative AI model. You can g.66A473EC3B060F38590A": "**Clé API**. Vous aurez besoin d’une clé API pour accéder au modèle d'IA générative. Vous pouvez l'obtenir auprès du fournisseur de modèles, par exemple OpenAI ou Azure OpenAI.", + "**You:** Thank you, Time Beetle, I guess you'll go get those somehow from that W.7578A9331AAA70F5F84C": "**Vous :** Merci, Scarabée du Temps, je suppose que tu vas chercher tout ça d'une manière ou d'une autre depuis ce Web dont tu m'as parlé ?", + "**Time Beetle:** Yes, I already have those it says and projects a keyboard and s.0956D8EFAD577D8575DA": "**Scarabée du Temps :** Oui, je les ai déjà, dit-il en projetant un clavier et un écran sur le mur devant vous.", + "**You:** Tell me more about the actual writing of the app, how do I get started?.DF64E976C86F4B028C05": "**Vous :** Parle-moi davantage de l'écriture de l'application en elle-même ; comment commencer ?", + "**Time Beetle:** Of course, to write an app, at its simplest it's about sending .D3EFF6201E25A1CFDFC5": "**Scarabée du Temps :** Bien sûr, pour écrire une application, à son plus simple, il s'agit d'envoyer une requête à une API et d'afficher la réponse. Décomposons cela :", + "**Input**: In a basic text generation app, the input refers to the initial text .593410A3863F2BE2BB00": "**Entrée** : dans une application de génération de texte basique, l'entrée correspond au texte initial que vous souhaitez que l'application développe ou complète. Cette entrée peut être fournie par l'utilisateur pendant l'exécution ou pré-définie (codée en dur) dans l'application elle-même. Pour l'instant, nous commencerons par utiliser un texte codé en dur comme entrée.", + "**API request**: You need to send a request to the generative AI model API with .80B8A12D270D3FD469E0": "**Requête API** : Vous devez envoyer une requête à l'API du modèle d'IA générative avec le texte d'entrée. Cela se fait en utilisant la fonction fetch en JavaScript (Node.js). Cette requête doit également inclure votre clé API. Il est recommandé, pour des raisons de sécurité, de ne pas coder directement la clé API dans votre application, mais plutôt d'utiliser des variables d'environnement. De plus, envisagez d'utiliser une identité managée si vous utilisez un fournisseur comme Azure, car cela est considéré comme une méthode plus sécurisée pour accéder aux ressources. Avec une identité managée, vous pouvez attribuer des autorisations plus granulaires à votre application. Le meilleur, c'est que le fournisseur cloud s'occupe de l'authentification à votre place.", + "**Response**: The API will return a response with the generated text. You need t.F949ACBD737EE497CECB": "**Réponse** : L'API retournera une réponse avec le texte généré. Vous devez extraire ce texte de la réponse et l'afficher à l'utilisateur.", + "**You:** That sounds simple enough, can you take me through a scenario that woul.8DB0BEA07914E9615653": "**Vous :** Cela semble assez simple, peux-tu me montrer un scénario qui ferait sens dans la situation où nous nous trouvons ?", + "**Time Beetle:** Sure, let's see how we can build a simple app that generates It.3E01A6F9FDB4C10F3B5E": "**Scarabée du Temps :** Bien sûr, voyons comment nous pouvons construire une application simple qui génère du texte italien à partir d'une entrée en anglais.", + "**Time Beetle:** Generative AI models can be used for many things, for example, .944BCC20FD4696E88425": "**Scarabée du Temps :** Les modèles d'IA générative peuvent être utilisés pour de nombreuses choses, par exemple, la traduction linguistique. En fait, ces modèles acceptent une entrée dans une langue et peuvent générer un texte dans une autre langue. Commençons par une application simple qui prend en entrée de l'anglais et génère du texte en italien.", + "`model`, what model to use.": "`model`, quel modèle utiliser.", + "`messages`, the prompt to send to the model. Also note how you set the role to \".4465A602BEBCC0343EB4": "`messages`, l'invite à envoyer au modèle. Notez également comment vous définissez le rôle sur \"user\" pour indiquer que le texte saisi provient de l'utilisateur. Si cela venait de l'IA, vous auriez défini le rôle sur \"system\".", + "**You:** I think I get it. So if I change the value of the `question` variable t.081F3A20A144CA952C55": "**Vous :** Je pense que je comprends. Donc, si je change la valeur de la variable `question` par autre chose, l'application générera une traduction italienne différente ?", + "**Time Beetle:** Exactly, you can change the input text to anything you want. Al.89B5E185C3D930213D3F": "**Scarabée du Temps :** Exactement, vous pouvez changer le texte d'entrée comme vous le souhaitez. Notez également comment les modèles GitHub sont utilisés comme URL de base pour l'API avec un token GitHub comme clé API.", + "**You:** Why is that important?": "**Vous :** Pourquoi est-ce important ?", + "**Time Beetle:** It's important to use a base URL and API key that are specific .4D9FCDC9DB3B0112EB03": "**Scarabée du Temps :** Il est important d'utiliser une URL de base et une clé API spécifiques au modèle que vous utilisez. GitHub Models est une plateforme qui héberge une variété de modèles, chacun ayant des capacités et des fonctionnalités différentes. De plus, c’est gratuit à utiliser.", + "**You:** Oh good, I don't know who to pay anyways and I doubt they accept my cur.24DA1D7E8B87078080AB": "**Vous :** Ah, tant mieux, je ne sais pas qui payer de toute façon, et je doute qu’ils acceptent ma monnaie ici. :)", + "**Time Beetle:** Generative AI models can also be used to generate text based on.95AC93FB264BE96FEBE1": "**Scarabée du Temps :** Les modèles d'IA générative peuvent également être utilisés pour générer du texte basé sur une conversation. Vous pouvez simuler une conversation avec l'IA en fournissant une liste de messages comme contexte, comme si la conversation avait déjà eu lieu.", + "**You:** That sounds interesting, but why is that useful?": "**Vous :** Cela semble intéressant, mais en quoi est-ce utile ?", + "**Time Beetle:** It's useful because it allows the AI to provide a better respon.DBCA82C38F7383A27635": "**Scarabée du Temps :** C'est utile parce que cela permet à l'IA de fournir une réponse meilleure, basée sur plus de contexte qu'un seul message. Regardons une conversation ci-dessous pour illustrer cela :", + "**Time Beetle:** Imagine if a sentence like \"Tell me more about it\" were taken o.CC4EE3BE70C4559E4692": "**Scarabée du Temps :** Imaginez si une phrase comme « En savoir plus à ce sujet » était sortie de son contexte, l'IA ne saurait pas à quoi « cela » fait référence. C'est là que le contexte est important, et ce contexte est quelque chose que nous pouvons fournir au modèle d'intelligence artificielle via l'invite.", + "**You:** I think I get it, how do I construct a conversation with the AI using t.CBE0B6B5B6038F828270": "**Vous :** Je pense que je comprends, comment construire une conversation avec l'IA en utilisant ce langage JavaScript dont tu parles ?", + "**Time Beetle:** Below is how we can construct a conversation with the AI:": "**Scarabée du Temps :** Voici comment nous pouvons construire une conversation avec l'IA :", + "**You:** Ok, so if I understand the conversation correctly, the AI will now have.EEBDE1818E86B754D548": "**Vous :** D'accord, donc si j'ai bien compris la conversation, l'IA aura maintenant le contexte suivant : *Je vais à Rome le mois prochain*, donc en se basant là-dessus, elle devrait filtrer les informations non pertinentes et fournir une réponse plus pertinente ?", + "**Time Beetle:** Exactly, the AI will use the context to generate a response tha.42FC1B92170644B82482": "**Scarabée du Temps :** Exactement, l'IA utilisera le contexte pour générer une réponse plus pertinente pour la conversation.", + "**You:** I see, but is there a way to improve this further?": "**Vous :** Je vois, mais existe-t-il un moyen d'améliorer cela encore plus ?", + "**Time Beetle:** Yes, you can add a system message to the conversation. A system.CF8DE107129B1532760C": "**Scarabée du Temps :** Oui, vous pouvez ajouter un message système à la conversation. Un message système crée une « personnalité » pour l'IA et peut être utilisé pour fournir un contexte supplémentaire.", + "**You:** Ok, so in the context of the conversation we've been having, what would.6CD1F9D2EE30A7D92559": "**Vous :** D'accord, dans le contexte de la conversation que nous avons eue, à quoi ressemblerait un message système ?", + "**Time Beetle:** A system message for this conversation could be something like .5CDBD740A77F06BBBF07": "**Scarabée du Temps :** Un message système pour cette conversation pourrait être quelque chose comme *\"Je suis un assistant de voyage IA, ici pour vous aider à planifier votre voyage en Italie.\"* Ce message donne le ton de la conversation et aide l'IA à comprendre son rôle dans l'interaction.", + "[!NOTE]\nThis used to be called \"system\". This is a recent change and \"developer\".71E382A329474FF9B6A4": "[!NOTE]\nCela s'appelait autrefois « system ». C’est un changement récent et « developer » est le nouveau terme. Pour certains modèles, cela s'appelle encore « system », donc si vous avez des problèmes, utilisez « system ».", + "**You:** Ok, great, I'll make sure to include a system message in my chat conver.EC60368AAD68E8D4CAB1": "**Vous :** Ok, super, je veillerai à inclure un message système dans mes conversations de chat. Par curiosité, à quoi ressemble un message système pour toi ?", + "**Time Beetle:** A system message for me could be something like *\"I'm the Time .505B3EBF98CB3AED10B6": "**Scarabée du Temps :** Un message système pour moi pourrait être quelque chose comme *\"Je suis le Scarabée du Temps, ici pour vous aider à naviguer dans le temps et l'espace. Je devrais être utile pour vous fournir des informations et des conseils sur l’époque où vous vous trouvez, ainsi que les outils dont vous avez besoin pour retourner à votre époque.\"*", + "**You:** Anything else I should know about chat conversations?": "**Vous :** Y a-t-il autre chose que je devrais savoir sur les conversations de chat ?", + "**Time Beetle:** Yes, you can adjust the \"temperature\" of the AI's responses. Th.345B70370E1DC270A966": "**Scarabée du Temps :** Oui, vous pouvez ajuster la « température » des réponses de l'IA. La température est une variable avec une valeur généralement définie entre 0 et 1 qui détermine la créativité des réponses de l'IA. Une température de 0 produira des réponses plus prévisibles, tandis qu'une température de 1 produira des réponses plus créatives et variées. Vous pouvez ajuster la température en fonction du contexte de votre conversation et du type de réponses que vous souhaitez de l'IA. Notez qu'il est possible de définir une valeur supérieure à 1, mais cela entraîne plus d'aléatoire et moins de cohérence dans les réponses.", + "**You:** So if I set the temperature to 0, the AI will provide more predictable .AA0600C42D649F7C0851": "**Vous :** Donc si je définis la température sur 0, l'IA fournira des réponses plus prévisibles, et si je la définis sur 1, l'IA fournira des réponses plus créatives ? Quelle est ta température ?", + "**Time Beetle:** I have a temperature of 0.7 and yes, you're correct, the AI wil.24FCE03609D0F3E3F4C7": "**Scarabée du Temps :** Ma température est de 0,7 et oui, vous avez raison, l'IA fournira des réponses plus créatives avec une température plus élevée. Voyons comment définir la température dans votre application :", + "**You:** There's more right?": "**Vous :** Il y a encore autre chose, non ?", + "**Time Beetle:** Yes, another important concept in generative AI models is the c.1287CF2C990A892D98A4": "**Scarabée du Temps :** Oui, un autre concept important dans les modèles d'IA générative est la fenêtre de contexte. La fenêtre de contexte correspond au nombre de messages précédents que l'IA utilise pour générer une réponse. Une fenêtre de contexte plus large permet à l'IA de considérer plus de contexte et de générer des réponses plus cohérentes.", + "**Time Beetle:** Different models have different limits to output tokens. Take t.549DD0A26BD4377ED13F": "**Scarabée du Temps :** Différents modèles ont des limites différentes pour les tokens de sortie. Prenons l'exemple du modèle suivant `gpt-4o-2024-08-06`, il a les spécifications suivantes :", + "**You:** Got it, context window, tokens, how much is a token though?": "**Vous :** J'ai compris, fenêtre de contexte, tokens. Mais un token correspond à quoi en réalité ?", + "**Time Beetle:** A token is a word or a part of a word and differs slightly by l.BD28BFA1236868A2DF73": "**Scarabée du Temps :** Un token est un mot ou une partie de mot et diffère légèrement selon les langues. Il existe un outil recommandé par OpenAI pour mesurer, appelé [tokenizer](https://platform.openai.com/tokenizer). Essayons une phrase pour voir combien de tokens elle contient :", + "Running `tokenizer` on the sentence above gives us 9 tokens.": "Exécuter `tokenizer` sur la phrase ci-dessus donne 9 tokens.", + "**You:** That wasn't much, sounds like I can have a lot of tokens in my context .D856CD04F2001FA556EE": "**Vous :** Cela ne fait pas beaucoup, on dirait que je peux avoir beaucoup de tokens dans ma fenêtre de contexte alors ?", + "**Time Beetle:** Yes, you can experiment with different context window sizes to .970298F7BE7316A67B7C": "**Scarabée du Temps :** Oui, vous pouvez expérimenter avec différentes tailles de fenêtres de contexte pour voir comment cela affecte les réponses de l'IA. En fait, si vous définissez une taille de fenêtre de contexte de 100, vous limiterez l'IA sur la quantité qu'elle considère en termes d'entrée et de sortie. Voici comment vous pouvez définir la fenêtre de contexte dans votre application :", + "[!TIP]\nExperiment with different context window sizes to see how it affects the .824F9106C1C873E8E136": "[!ASTUCE]\nExpérimentez avec différentes tailles de fenêtres de contexte pour voir comment cela affecte les réponses de l'IA.", + "**Leonardo:** I need an assistant that can help me with the calculations and des.58E4BDA2B2D8000267EB": "**Leonardo :** J'ai besoin d'un assistant qui peut m'aider dans les calculs et la conception de la vis aérienne. Pouvez-vous me créer un assistant pour cela ?", + "**You:** Of course, I can build that for you. Time Beetle, we can help with that.335BB47660BC30FE549E": "**Vous :** Bien sûr, je peux vous créer cela. Scarabée du Temps, on peut l'aider, non ?", + "**Time Beetle:** Yes, not a problem, in fact the aerial screw is one of Leonardo.719040074E58BF5F7B93": "**Scarabée du Temps :** Oui, pas de problème, en fait la vis aérienne est l'une des inventions les plus fascinantes et visionnaires de Léonard. Conçue vers la fin des années 1480...", + "**You:** All I needed was a yes, let's save the lecture for later.": "**Vous :** Tout ce dont j'avais besoin, c'était un oui, gardez la leçon pour plus tard.", + "**Time Beetle:** Rude..": "**Scarabée du Temps :** Quelle impolitesse...", + "**You:** What?": "**Vous :** Quoi ?", + "**Time Beetle:** Nothing": "**Scarabée du Temps :** Rien.", + "[!NOTE]\nThe aerial screw, also known as the helical air screw, was intended to l.700F27491DF2D30639D2": "[!NOTE]\nLa vis aérienne, également connue sous le nom de vis hélicoïdale, était destinée à décoller du sol en comprimant l'air. La conception de Léonard comportait un grand rotor en spirale en lin, rigidifié avec de l'amidon, et monté sur une plate-forme en bois. L'idée était qu'une équipe d'hommes ferait tourner des manivelles autour de la plate-forme, en la faisant tourner suffisamment vite pour obtenir une portance.", + "Despite its impracticality, the aerial screw remains a testament to Leonardo's g.A3D822F144E39F60A388": "Bien que son impraticabilité soit avérée, la vis aérienne reste un témoignage du génie de Léonard et de sa quête incessante d’innovation. Elle a jeté les bases des développements futurs dans l’aviation et continue d’inspirer les ingénieurs et inventeurs encore aujourd’hui.\n[Lire la suite](https://en.wikipedia.org/wiki/Leonardo%27s_aerial_screw).", + "Check out [Sample app](/app/README.md) to get started.": "Consultez l'[application d'exemple](/app/README.md) pour commencer.", + "[!TIP]\nConsider what the system message should be and what input you should prov.DF2588FD52FAEF8AD227": "[!ASTUCE]\nRéfléchissez au message système à définir et aux entrées à fournir.", + "**Question:** What is the purpose of the context window in generative AI models?.DC353363751AB75C2BCF": "**Question :** Quel est l'objectif de la fenêtre de contexte dans les modèles d'IA générative ? Sélectionnez toutes les options applicables.", + "[!NOTE]\nSo far, you've been on a journey through time with Leonardo da Vinci, ex.5B7F9383E4EEE3FE0953": "[!NOTE]\nJusqu'à présent, vous avez voyagé dans le temps avec Léonard de Vinci, explorant les merveilles de la Renaissance. Vous avez rencontré le Scarabée temporel, un dispositif mystérieux qui vous permet de voyager dans le temps et l'espace.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.71FCF04C75E945CC50E9": "[!NOTE]\nBien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-sforza) si vous préférez passer directement au contenu technique.", + "**You:** Let's see if I can manage to get back home.": "**Vous :** Voyons si je peux réussir à rentrer chez moi.", + "**Sforza**: Da Vinci, dov'è il mio dipinto? Where is my painting?": "**Sforza** : Da Vinci, dov'è il mio dipinto ? Où est mon tableau ?", + "**Leonardo:** It's Sforza. He wants me to complete a painting, 'The Last Supper..1702706B164746BB09A2": "**Léonard :** C'est Sforza. Il veut que je termine une peinture, « La Cène ».", + "**You:** Couldn't you just tell him that?": "**Vous :** Tu ne pouvais pas simplement lui dire ça ?", + "**Leonardo:** I've tried, but he's not a patient man.": "**Léonard :** J'ai essayé, mais ce n'est pas un homme patient.", + "**Leonardo:** Try pressing that gizmo, they're getting closer!": "**Léonard :** Essaie d’appuyer sur ce bidule, ils se rapprochent !", + "**You:** \"Okay, Time Beetle, listen carefully. I need to get back to the present.724981667A75DCB1A3E1": "**Vous :** \"D'accord, Scarabée temporel, écoute attentivement. Je dois retourner au présent, chez moi, d'accord ?\" Soudain, la calèche heurte une bosse et le Scarabée temporel s'échappe de vos mains et tombe au sol. Il commence à biper et annonce d'une voix robotique : \"Destination : Rome.\"", + "**You:** No, not Rome, home... home...": "**Vous :** Non, pas Rome, maison... maison...", + "**You:** Leonardo, where are we?": "**Vous :** Léonard, où sommes-nous ?", + "**Leonardo:** It looks like we're in the middle of a race! We need to get out of.9CA5A49C0E1FC00CA8BC": "**Léonard :** On dirait qu'on est en pleine course ! On doit sortir d'ici !", + "**You**: There! Head for the port!": "**Vous :** Là ! Prends la direction du port !", + "**Leonardo:** We need to lose them! Look for a place to hide!": "**Léonard :** On doit les semer ! Trouve un endroit où se cacher !", + "**You:** There! A back alley!": "**Vous :** Là ! Une ruelle !", + "Leonardo veers into the alley, the carriage jolting as it navigates the tight tu.43CAC807AFC834671FDC": "Léonard s'engouffre dans la ruelle, la calèche bondissant tandis qu'elle prend le virage serré. Vous sautez hors de la calèche et aidez Léonard à extraire un énorme appareil à l'arrière. C'est son invention : l'**hélice volante**.", + "**Leonardo:** Quickly, we need to get this to the roof!": "**Léonard :** Vite, on doit l'emmener sur le toit !", + "**Leonardo:** Help me set it up!": "**Léonard :** Aide-moi à l'installer !", + "**Leonardo:** Hold on tight!": "**Léonard :** Accroche-toi bien !", + "**You:** We did it, Leonardo! We're flying!": "**Vous :** On l'a fait, Léonard ! On vole !", + "**Leonardo:** Yes, but we need to find a safe place to land.": "**Léonard :** Oui, mais il faut trouver un endroit sûr pour atterrir.", + "If you want to interact with Sforza, run the [Characters](/app/README.md) app.": "Si vous souhaitez interagir avec Sforza, exécutez l'application [Personnages](/app/README.md).", + "**Time Beetle:** We need to talk about prompt engineering.": "**Scarabée temporel :** Nous devons parler d'ingénierie des prompts.", + "**You:** We do? What's that?": "**Vous :** Vraiment ? Qu'est-ce que c'est ?", + "**Time Beetle:** Prompt engineering despite its name is not about building bridg.E9F037320154F0444EFD": "**Scarabée temporel :** L'ingénierie des prompts, malgré son nom, n'a rien à voir avec la construction de ponts ou de routes, mais consiste à créer les bons \"prompts\" pour obtenir le résultat souhaité d'un modèle de langage génératif IA.", + "**You:** Ok, but why is it important that I know this?": "**Vous :** D'accord, mais pourquoi est-ce important que je sache ça ?", + "**Time Beetle:** Well, you want to land the aerial screw, right?": "**Scarabée temporel :** Eh bien, tu veux faire atterrir l'hélice volante, n'est-ce pas ?", + "**You:** Yes, preferably in one piece. :-)": "**Vous :** Oui, de préférence en un seul morceau. :-)", + "**Time Beetle:** I thought so, now listen up! Prompt engineering is about crafti.66312D03739038FC2083": "**Scarabée temporel :** C'est bien ce que je pensais. Maintenant, écoute ! L'ingénierie des prompts consiste à créer les bons prompts pour obtenir le résultat que tu souhaites d'un modèle de langage.", + "**Time Beetle** Large language models have what's called *emergent properties*, .7FCED41E7680DB951F25": "**Scarabée temporel :** Les modèles de langage à grande échelle possèdent ce qu'on appelle des *propriétés émergentes*. Cela signifie qu'il s'agit de caractéristiques non explicitement programmées dans le modèle, mais qui émergent de la manière dont il est entraîné sur de vastes quantités de données textuelles. En étudiant ces propriétés émergentes, tu peux tirer des conclusions et découvrir des modèles pour obtenir de meilleurs résultats du modèle.", + "**You:** Ok, so there are patterns we discover that can help us get better resul.6A234423F808F37999BF": "**Vous :** D'accord, donc il existe des modèles qu'on peut découvrir qui nous aident à obtenir de meilleurs résultats du modèle. Mais comment cela m'aide-t-il à faire atterrir l'hélice volante ?", + "**Time Beetle:** Yes correct, and wow, you're not a patient one are you?": "**Scarabée temporel :** Oui, c'est vrai. Et, wow, tu n'es vraiment pas patient, toi, hein ?", + "**You:** Well, you wouldn't be either if you were flying in a contraption with n.8AB3788BD5A3BADB3AE1": "**Vous :** Eh bien, toi non plus tu ne le serais pas si tu volais dans une machine avec des instructions d'atterrissage pas claires.", + "**Time Beetle:** I'm right here with you, you know, but let's get back to the po.A217A61097063A613A5B": "**Scarabée temporel :** Je suis là avec toi, tu sais, mais revenons-en au sujet principal.", + "**Time Beetle:** As a practitioner, being able to craft a better prompt is a ski.F62989D9BE2F90E5CA11": "**Scarabée temporel :** En tant que praticien, savoir créer de meilleurs prompts est une compétence que tu veux avoir dans ton arsenal.", + "**Get more accurate results** from your language model and ultimately improve th.3E25E0641AB14075AD4B": "**Obtenir des résultats plus précis** de ton modèle de langage et améliorer finalement l'expérience utilisateur de ton application.", + "**Control the output** of the model to ensure it's relevant and appropriate for .0E4E4A56D0E0E1A857A7": "**Contrôler la sortie** du modèle pour s'assurer qu'elle est pertinente et appropriée à tes utilisateurs. Cela est particulièrement important dans les discussions sur des sujets sensibles et pour protéger la réputation de ta marque.", + "**Format the output** in a way that's easy to understand and consume. We will lo.CE160EC97FE5227248EA": "**Formatage des sorties** de manière à ce qu'elles soient faciles à comprendre et à utiliser. Nous approfondirons cet aspect dans le prochain chapitre.", + "**Time Beetle:** Let's explore the different techniques and strategies you can u.1AD38429324A56A00BAA": "**Scarabée temporel :** Explorons les différentes techniques et stratégies que tu peux utiliser pour rédiger des prompts efficaces pour ton modèle de langage.", + "**Time Beetle:** Here are a few techniques and strategies you can use to craft e.A94683695E7FFBFDDB23": "**Scarabée temporel :** Voici quelques techniques et stratégies que tu peux utiliser pour rédiger des prompts efficaces :", + "**Few-shot prompting**. This technique involves giving the AI a few examples to .6D43AC2E68A2AEA92517": "**Prompting avec quelques exemples**. Cette technique consiste à donner à l'IA quelques exemples pour montrer le type de réponse qu'on attend.", + "**Chain-of-thought prompting**. This technique involves providing a sequence of .A5C27269342E744A1E6B": "**Prompting chaîne-de-pensée**. Cette technique implique de fournir une séquence de prompts pour apprendre à l'IA comment résoudre une tâche complexe étape par étape.", + "**Meta-prompts**. This technique involves adding extra details or instructions t.F8B0648B6D55BFF3B87F": "**Méta-prompts**. Cette technique consiste à ajouter des détails ou des instructions supplémentaires pour façonner la sortie de l'IA de manière plus précise.", + "**Maieutic prompting**. This technique involves using guiding questions to steer.844406F978A6983E0277": "**Prompting maïeutique**. Cette technique implique d'utiliser des questions guidantes pour orienter l'IA vers une réponse spécifique.", + "**You:** That sounds interesting, I assume you will give me some examples?": "**Vous :** Ça a l'air intéressant. Je suppose que tu vas me donner des exemples ?", + "**Time Beetle:** Yes, coming right up. Let's look at examples for each of these .37451E68F8F792A815C8": "**Scarabée temporel :** Oui, ils arrivent tout de suite. Regardons des exemples pour chacune de ces techniques afin de comprendre comment elles fonctionnent en pratique.", + "Patolli": "Patolli", + "[!NOTE]\nPatolli is one of the oldest known games in the Americas, played by pre-.9BC3E7AE1FCA93DC44A0": "[!NOTE]\nLe Patolli est l'un des jeux les plus anciens connus des Amériques, joué par les cultures mésoaméricaines précolombiennes comme les Aztèques. C'est un mélange de stratégie et de hasard.", + "**How Patolli is Played**:": "**Comment le Patolli est joué** :", + "**Board and Pieces**: Played on an X-shaped board with a center block and four a.3A4333544633207C20C7": "**Plateau et pièces** : Joué sur un plateau en forme de X avec un bloc central et quatre branches. Les joueurs utilisent cinq haricots noirs comme dés, marqués d'un côté.", + "**Setup**: Each player picks six markers (beads) of their color and places them .BC8F26F0D93B02BFA0FF": "**Installation** : Chaque joueur choisit six marqueurs (perles) de sa couleur et les place en dehors du plateau, ainsi que des perles de points pour le score.", + "**Gameplay**: Roll the beans to move markers around the board and back to the st.C41FE1917CD8AFE6494F": "**Déroulement du jeu** : Lancez les haricots pour déplacer les marqueurs autour du plateau et revenir au point de départ. Un lancer de cinq permet de déplacer dix cases. Atterrir sur certaines cases peut donner des tours supplémentaires, faire perdre des points ou capturer des marqueurs.", + "**Aztec Involvement**: Widely played by nobles and commoners, it was a favorite .1AB98E829EAEB8FAFE9C": "**Implication aztèque** : Largement pratiqué par les nobles et les gens du peuple, c'était un jeu favori à la cour de Montezuma. Au-delà du plaisir, il impliquait des paris à forts enjeux comme des couvertures, des pierres précieuses, voire la liberté.", + "Patolli - Wikipedia": "Patolli - Wikipedia", + "Interact with Montezuma": "Interagir avec Montezuma", + "If you want to interact with Montezuma, run the [Characters](/app/README.md) app.6E375BFD9BF7AA285DA6": "Si vous voulez interagir avec Montezuma, exécutez l'application [Characters](/app/README.md).", + "Chat with Montezuma.": "Discutez avec Montezuma.", + "Structured Output": "Sorties structurées", + "**Time Beetle:** Want to know how I beat Montezuma?": "**Scarabée temporel :** Veux-tu savoir comment j'ai battu Montezuma ?", + "**You:** Sshh, not so loud, we're still in the Aztec Empire.": "**Vous :** Chut, pas si fort, nous sommes encore dans l'Empire aztèque.", + "**Time Beetle:** Oh right, sorry, yea so structured output is how. You asked for.33674FEBB42A4F433440": "**Scarabée temporel :** Oh pardon, oui, c'était grâce aux sorties structurées. Tu as demandé les bons mouvements, et je te les ai donnés d'une manière structurée.", + "Structured output uses specific data formats to organize information clearly. Co.F4CE1C26D21326A4B560": "Les sorties structurées utilisent des formats de données spécifiques pour organiser clairement les informations. Des formats courants comme JSON, XML et CSV permettent aux services de traiter et d'utiliser plus facilement les données.", + "Generative AI models can output data in various formats. However, output of unst.C78697123E15A7B721C0": "Les modèles d'intelligence artificielle générative peuvent générer des données dans divers formats. Cependant, des sorties sous forme de texte non structuré peuvent rendre l'extraction d'informations difficile et compliquer leur transfert vers d'autres services. Les sorties structurées peuvent remédier à cela.", + "**You:** Well, aren't you clever ;)": "**Vous :** Eh bien, quelle ingéniosité ;)", + "**Time Beetle:** I try my best. :-)": "**Scarabée temporel :** Je fais de mon mieux. :-)", + "Another benefit, even for human readers, is that structured data is easier to re.7518347C0D12974830BC": "Un autre avantage, même pour les lecteurs humains, est que les données structurées sont plus faciles à lire et à comprendre lorsqu'elles suivent un format familier.", + "Let's look at a few examples of input and see how asking for specific output for.7A1EE5EBE002BF4D8B6F": "Examinons quelques exemples d'entrées et voyons comment demander des formats de sortie spécifiques peut aider à extraire des informations qui deviennent ainsi plus compréhensibles et accessibles.", + "**You:** Ok, it's not like we got any other plans, let's hear it.": "**Vous :** D'accord, ce n'est pas comme si nous avions d'autres projets, allons-y.", + "Shaping the output": "Modeler les sorties", + "**Time Beetle:** Let's start with a simple example. Imagine you're Leonardo da V.6BEAC2381DB3EA0B1849": "**Scarabée temporel :** Commençons par un exemple simple. Imagine que tu es Léonard de Vinci et que tu essaies de trouver des idées d'inventions avec la technologie du XVe siècle. Tu veux savoir quels sont les ressources nécessaires et combien d'efforts cela demanderait pour construire chaque invention. Voici comment poser la question :", + "**Leonardo:** Oh I like this game, everyone pretend you're me!": "**Léonard :** Oh, j'aime ce jeu, tout le monde fait comme si vous étiez moi !", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.98C3011CD192FE1BB50D": "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#interact-with-amelia-earhart) if you'd prefer to jump straight to the technical content.", + "**Ada Lovelace**: \"I need you to go meet a friend of mine. There are few people .EF2292730A6DE3B186A5": "**Ada Lovelace**: \"J'ai besoin que vous rencontriez une amie à moi. Peu de personnes peuvent égaler son expertise en mécanique et en résolution de problèmes. Il pourrait être difficile de la trouver, cependant ; elle est toujours en déplacement :)\"", + "**Ada Lovelace**: \"Why, Amelia Earhart, of course! She's a pilot and adventurer,.B99F756AFB11C43D14AC": "**Ada Lovelace**: \"Mais bien sûr, Amelia Earhart ! C'est une aviatrice et une aventurière, actuellement en train de faire le tour du monde. C'est totalement de ma faute si elle a disparu — je lui ai donné le dispositif de voyage dans le temps, eh bien, un prototype précoce de celui-ci. Heureusement, le dispositif que vous avez peut localiser d'autres appareils, donc vous pouvez la retrouver. Tout ce que vous devez faire est de cliquer ici et là, puis de tourner ce bouton.\"", + "**You**: \"Hey, wait, what's our mission exactly?\"": "**Vous**: \"Hé, attendez, quelle est exactement notre mission ?\"", + "**Ada**: \"Oh, right! Ask the device; it has all the details. Just ask it about A.FE03F3FA9EBAC66FB3A8": "**Ada**: \"Oh, c'est vrai ! Demandez au dispositif ; il contient tous les détails. Demandez-lui simplement à propos d'Amelia, et il devrait activer l'outil approprié pour vous.\"", + "**You**: \"Amelia, is that you?\"": "**Vous**: \"Amelia, c'est toi ?\"", + "**Amelia Earhart**: \"Who are you? Let me guess, Ada sent you, right?\"": "**Amelia Earhart**: \"Qui êtes-vous ? Laissez-moi deviner, Ada vous a envoyé, c'est ça ?\"", + "**You**: \"Yes, correct. I'm here to help you, I think. Ada wasn't big on specifi.53C0966C3E3EFE40EF06": "**Vous**: \"Oui, c'est exact. Je suis là pour vous aider, je pense. Ada n'était pas très précise dans ses explications.\"", + "**Amelia Earhart**: \"Well, good thing you're here. I'm in a bit of a pickle. I'm.DB9082BD4F0F3D0FD2D3": "**Amelia Earhart**: \"Eh bien, bonne chose que vous soyez là. Je suis dans une situation compliquée. J'essaie de trouver un endroit où atterrir, et je commence à manquer de carburant. Pouvez-vous m'aider ?\"", + "**You**: \"Device, can you tell me more about Amelia?\"": "**Vous**: \"Dispositif, peux-tu m'en dire plus sur Amelia ?\"", + "**Time Beetle**: \"Calling tool: mission-amelia. Tool initiated. Amelia Earhart i.5A2CADADAA0B0A43996E": "**Time Beetle**: \"Appel de l'outil : mission-amelia. Outil initialisé. Amelia Earhart est une aviatrice et une aventurière. Elle est connue pour ses vols record et sa disparition en 1937. Elle a été vue pour la dernière fois en vol au-dessus de l'océan Pacifique. Elle est actuellement en train de faire le tour du monde dans son avion, l'Electra. Elle manque de carburant et doit trouver un endroit pour atterrir.\"", + "**You**: \"Device, can you help me find a place for Amelia to land?\"": "**Vous**: \"Dispositif, peux-tu m'aider à trouver un endroit pour qu'Amelia atterrisse ?\"", + "**Time Beetle**: \"Calling tool: find-landing-spot. Tool initiated. Searching for.B181DD1BD237D4A0978C": "**Time Beetle**: \"Appel de l'outil : find-landing-spot. Outil initialisé. Recherche d'un endroit convenable pour qu'Amelia Earhart atterrisse. Veuillez patienter. Un endroit convenable trouvé. Coordonnées : 7.5°N, 134.5°E. Amelia, j'ai trouvé un endroit convenable pour que vous puissiez atterrir. Veuillez vous diriger vers les coordonnées 7.5°N, 134.5°E.\"", + "**Amelia Earhart**: \"Thank you! I wish my device had that feature. I'll head the.834457ED97AFA81674DD": "**Amelia Earhart**: \"Merci ! J'aurais aimé que mon dispositif ait cette fonctionnalité. Je vais m'y diriger maintenant.\"", + "If you want to interact with Ada, run the [Characters](/app/README.md) app.": "If you want to interact with Ada, run the [Characters](/app/README.md) app.", + "**You**: \"Device, what just happened?\"": "**Vous**: \"Dispositif, que vient-il de se passer ?\"", + "**Time Beetle**: \"You just called a tool. A tool is a function that can be calle.34F5654341BB8BBFB23C": "**Time Beetle**: \"Vous venez d'appeler un outil. Un outil est une fonction qui peut être appelée par le modèle IA pour exécuter une tâche spécifique. L'outil peut être utilisé pour effectuer une grande variété de tâches, allant de calculs simples à des opérations complexes. Dans ce cas, vous avez appelé l'outil `find-landing-spot` pour aider Amelia Earhart à trouver un endroit convenable pour atterrir.\"", + "**Time Beetle**: \"Here's an image to illustrate the process of tool calling:\"": "**Time Beetle**: \"Voici une illustration pour montrer le processus d'appel d'outil :\"", + "**You**: Can we handle errors if something goes wrong, like if the tool can’t fi.F877B3153311D6E3DC4D": "**Vous**: Pouvons-nous gérer les erreurs si quelque chose ne va pas, comme si l'outil ne trouve pas un point d'atterrissage ?", + "**Time Beetle**: Great question! Yes, you can add error handling to manage such .6B7EE9E7E5EDADE8CE2A": "**Time Beetle**: Excellente question ! Oui, vous pouvez ajouter une gestion des erreurs pour gérer de telles situations. Par exemple, si l'outil ne parvient pas à trouver un point d'atterrissage, vous pouvez utiliser un bloc try-catch ou vérifier le résultat avant de continuer. Voici un exemple de gestion des erreurs lors de l'appel de l'outil find-landing-spot :", + "**You**: \"How do I create a tool?\"": "**Vous**: \"Comment puis-je créer un outil ?\"", + "**Time Beetle**: \"To create a tool, you need to define a function that performs .8FA83A725DB926891257": "**Time Beetle**: \"Pour créer un outil, vous devez définir une fonction qui effectue la tâche souhaitée. La fonction doit prendre les entrées nécessaires et renvoyer la sortie. Vous pouvez ensuite appeler la fonction depuis le modèle IA pour effectuer la tâche. Voici à quoi ressemble l'outil `find-landing-spot` :", + "**You**: \"Ok, how does the AI model know that this tool exists?\"": "**Vous**: \"Ok, comment le modèle IA sait-il que cet outil existe ?\"", + "**Time Beetle**: \"You need to register the tool with the AI model. This tells th.E0810AD278B146D08222": "**Time Beetle**: \"Vous devez enregistrer l'outil auprès du modèle IA. Cela indique au modèle que l'outil est disponible pour être appelé. Passons en revue cela dans la section suivante.\"", + "**You**: \"You said I need to register the tool with the AI model. How do I do th.B539ECD4FEEF23958A26": "**Vous**: \"Vous avez dit que je devais enregistrer l'outil auprès du modèle IA. Comment puis-je faire cela ?\"", + "**Time Beetle**: \"To register a tool with the AI model, you need to define a met.21C311742982229FF8CD": "**Time Beetle**: \"Pour enregistrer un outil auprès du modèle IA, vous devez définir une représentation de métadonnées de l'outil. Ces métadonnées doivent inclure le nom de l'outil, les paramètres d'entrée et le format de sortie. Vous pouvez ensuite enregistrer l'outil auprès du modèle IA en fournissant les métadonnées. Voici un exemple de métadonnées pour l'outil `find-landing-spot` :", + "**You**: \"Ok, so there's a piece of JSON that describes the tool, now what?\"": "**Vous**: \"D'accord, il y a un morceau de JSON qui décrit l'outil, maintenant quoi ?\"", + "**Time Beetle**: \"Now, you need to provide that to your client chat completion c.061E6EF3B44F6845075A": "**Time Beetle**: \"Maintenant, vous devez le fournir à votre appel de complétion de chat client comme ceci :", + "**Time Beetle**: \"In the preceding code snippet we:\"": "**Time Beetle**: \"Dans l'extrait de code précédent, nous :\"", + "Define the metadata for the `find-landing-spot` tool and the `get-background-on-.8D51911C585F8BC2175B": "Définissons les métadonnées pour l'outil `find-landing-spot` et l'outil `get-background-on-character`.", + "Provide this metadata to the `client.getChatCompletions` call as part of the `fu.1387696F10A4A3C415CE": "Fournissons ces métadonnées à l'appel `client.getChatCompletions` dans le paramètre `functions`. Cela indique au modèle IA que ces outils sont disponibles pour être appelés.", + "**You**: \"Got it, so the AI model will call the appropriate if I provide a promp.F6631E61343EDC93E62B": "**Vous**: \"Compris, donc le modèle IA appellera l'outil approprié si je fournis une invite qui correspond à la description de l'outil ?\"", + "**Time Beetle**: \"Almost, it will tell you what tool it thinks you should call a.6E47FB6A3A7C4A3F46C6": "**Time Beetle**: \"Presque, il vous dira quel outil il pense que vous devriez appeler et fournira les paramètres d'entrée analysés, mais vous devrez appeler l'outil vous-même, laissez-moi vous montrer comment faire.\"", + "**Time Beetle**: \"As I was saying, the AI model will tell you what tool it think.4B78F09F577062559D7E": "**Time Beetle**: \"Comme je le disais, le modèle IA vous dira quel outil il pense que vous devriez appeler et il fournira les paramètres d'entrée analysés. Vous devez alors appeler l'outil vous-même. Voici à quoi ressemblera le workflow étape par étape :", + "**You**: \"Great, now that I understand high level what's going on, can you show .E9BD3B86AD1B2470A6F4": "**Vous**: \"Super, maintenant que je comprends globalement ce qui se passe, pouvez-vous me montrer un peu de code ?\"", + "**Time Beetle**: \"Sure, here's the code wire up the tool call, making a chat com.0ABA553F23EB89740105": "**Time Beetle**: \"Bien sûr, voici le code pour configurer l'appel d'outil, effectuer une demande de complétion de chat et interpréter la réponse :", + "Created a function called `findLandingSpot` that takes latitude and longitude as.D60B3DC268A185CCB315": "Créé une fonction appelée `findLandingSpot` qui prend la latitude et la longitude en entrée et renvoie les coordonnées d'un point d'atterrissage convenable.", + "Defined the metadata for the `find-landing-spot` tool.": "Défini les métadonnées pour l'outil `find-landing-spot`.", + "Created a `tools` object that maps tool names to tool metadata.": "Créé un objet `tools` qui associe les noms d'outils aux métadonnées des outils.", + "Provided the `tools` object to the `client.getChatCompletions` call.": "Fournissons l'objet `tools` dans l'appel `client.getChatCompletions`.", + "**You**: \"I think I get it. I define a function, create a metadata representatio.795DD47914CE3272F0EA": "**Vous**: \"Je pense que je comprends. Je définis une fonction, je crée une représentation des métadonnées de l'outil, je fournis les métadonnées au modèle IA, puis j'appelle l'outil en fonction de l'appel de fonction fourni par le modèle IA.\"", + "**Time Beetle**: \"Exactly! You're ready to start building your own tools and int.F65246535545E1CF6A8F": "**Time Beetle**: \"Exactement ! Vous êtes prêt à commencer à créer vos propres outils et à les intégrer au modèle IA.\"", + "**Amelia Earhart**: \"We're coming down hot, thank God you found us a landing spo.07F3E26E2AF18A6C2A5A": "**Amelia Earhart**: \"Nous arrivons en force, remercions le ciel que vous nous ayez trouvé un point d'atterrissage. Accrochez-vous bien !\"", + "**Amelia Earhart**: \"Here's my device, not as fancy as yours but it's got some n.46AA1440543AFA98A47D": "**Amelia Earhart**: \"Voici mon appareil, pas aussi sophistiqué que le vôtre, mais il a quelques fonctionnalités sympas. Je l'ai utilisé pour, disons, faire un peu de voyage dans le temps moi-même. Pouvez-vous l'améliorer pour moi ?\"", + "**You**: \"Time Beetle, can you help me upgrade Amelia's device?\"": "**Vous**: \"Time Beetle, peux-tu m'aider à améliorer l'appareil d'Amelia ?\"", + "**Time Beetle**: \"Of course! To upgrade Amelia's device, let's add the following.D3D774B3930F276A2ACD": "**Time Beetle**: \"Bien sûr ! Pour améliorer l'appareil d'Amelia, ajoutons-lui les outils suivants :", + "**A tool than can**: Calculate the distance between two points on a map.": "**Un outil qui peut** : Calculer la distance entre deux points sur une carte.", + "**A tool than can**: Figure out the GPS position of where Amelia is currently lo.4A2706C084DC7BECB778": "**Un outil qui peut** : Déterminer la position GPS où Amelia se trouve actuellement.", + "**A tool than can**: Call an external API to get the weather forecast for a give.5FF45AD6EAFCFBA83495": "**Un outil qui peut** : Appeler une API externe pour obtenir les prévisions météorologiques pour un emplacement donné.", + "**You**: \"Time Beetle, are you sure these functions are going to work, looks lik.6C29F0684159BB65BADA": "**Vous**: \"Time Beetle, es-tu sûr que ces fonctions vont fonctionner, on dirait qu'elles renvoient juste des valeurs aléatoires ?\"", + "**Time Beetle**: \"That's correct, I can do the rest internally. All you need to .4221BEFCF0C35A5D8A27": "**Time Beetle**: \"C'est vrai, je peux faire le reste en interne. Tout ce que vous avez à faire est de les enregistrer et de les tester, assurez-vous que le modèle IA peut les appeler.\"", + "Task: Register the `calculateDistance`, `getGpsPosition`, and `getWeatherForecas.D7DC03454A1479B6AFB7": "Tâche : Enregistrez les outils `calculateDistance`, `getGpsPosition`, et `getWeatherForecast` auprès du modèle IA. Testez les outils en les appelant depuis le modèle IA. Utilisez le code fourni dans les sections précédentes comme référence.", + "**Question:**\\\nWhat is the purpose of registering a tool with the AI model?": "**Question:**\\\nQuel est l'objectif d'enregistrer un outil auprès du modèle IA ?", + "A. To allow the AI model to directly execute the tool without developer interven.DEB4AEF3BA84D2255207": "A. Permettre au modèle IA d'exécuter directement l'outil sans intervention du développeur.\\\nB. Fournir des métadonnées sur l'outil afin que le modèle IA puisse suggérer son utilisation.\\\nC. Remplacer le besoin de définir des fonctions dans le code.", + "**Question:**\\\nWhat is the role of tool metadata in tool calling?": "**Question:**\\\nQuel est le rôle des métadonnées d'outils dans l'appel d'outils ?", + "A. It describes the tool's purpose, inputs, and outputs for the AI model.\\\nB. It.7B628908A16BB66A4D53": "A. Décrire l'objectif de l'outil, ses entrées et sorties pour le modèle IA.\\\nB. Fournir au modèle IA les détails d'implémentation de l'outil.\\\nC. Garantir que l'outil soit exécuté automatiquement par le modèle IA.", + "**Question:**\\\nWhy use tool calling?": "**Question:**\\\nPourquoi utiliser les appels d'outils ?", + "A. To enable the AI model to perform tasks beyond its built-in capabilities by l.696B9E653B36AF040903": "A. Permettre au modèle IA d'effectuer des tâches au-delà de ses capacités intégrées en utilisant des fonctions externes.\\\nB. Remplacer le besoin d'une intervention humaine dans le développement de modèles IA.\\\nC. Permettre au modèle IA d'exécuter des outils sans exiger de métadonnées.", + "Solution quiz": "Solution quiz", + "Explains the [process of tool calling](https://learn.microsoft.com/en-us/semanti.DC1D77DC4538EAF39A76": "Explique le [processus d'appel d'outils](https://learn.microsoft.com/en-us/semantic-kernel/concepts/ai-services/chat-completion/function-calling/?pivots=programming-language-csharp)", + "Tool calling in the [Langchain.js framework](https://js.langchain.com/docs/how_t.56D197A2AA3E00C543DD": "Appel d'outil dans le [cadre Langchain.js](https://js.langchain.com/docs/how_to/tool_calling/)", + "Function calling as demonstrated in the [openai library](https://github.com/open.40F89AD08511F54ED067": "Appel de fonction comme démontré dans la [bibliothèque openai](https://github.com/openai/openai-node/blob/master/examples/function-call.ts)", + "[!NOTE]\n*Our story so far. You are a mechanic from 1860s London. You were workin.EB20B2D2A39B888E8E03": "*Notre histoire jusqu'à présent. Vous êtes un mécanicien du Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez récupéré un dispositif de voyage dans le temps. Au cours de vos voyages dans le temps, vous vous êtes retrouvé à divers moments de l'histoire. Vous travaillez désormais en étroite collaboration avec Ada Lovelace depuis son manoir en tant que base d'opérations, et c'est là que l'histoire continue.*", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.317E61FAD39C06CE347A": "Bien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-hedy-lamarr) si vous préférez passer directement au contenu technique.", + "**Ada Lovelace**: Well, how did it go?": "**Ada Lovelace** : Eh bien, comment cela s’est-il passé ?", + "**You**: Good I think, we managed to get this app working, \"Here, see for yourse.A518E106EBF3239B2C9F": "**Vous** : Bien je pense, nous avons réussi à faire fonctionner cette application. \"Tenez, voyez par vous-même\", dites-vous en tendant l'appareil à Ada.", + "**Ada Lovelace**: She picks up the device, examines it closely, and mutters to h.259D3B717725FFF0F790": "**Ada Lovelace** : Elle ramasse l’appareil, l’examine attentivement et murmure pour elle-même. \"Mmm hm, ah je vois, oui, oui non, cela ne va pas. Il manque une certaine finesse.\"", + "**You**: I was thinking that too, we need to be able to type or speak to it righ.26A23D6E93E6FBA91139": "**Vous** : Je pensais la même chose, nous devons pouvoir taper ou parler à l’appareil, n'est-ce pas ?", + "**Ada Lovelace**: Right, I know just the person to help us. In fact, I'll come w.C6D572DA7929FFAC01C6": "**Ada Lovelace** : Exactement, je connais justement la personne qui pourra nous aider. En fait, je vais vous accompagner pour celle-ci, cela fait bien trop longtemps que nous ne nous sommes pas vus. *Coléoptère Temporel, Hollywood s'il vous plaît, 1940, résidence d'Hedy Lamarr.*", + "**Ada Lovelace**: Hedwig dearest, working on your latest invention I assume?": "**Ada Lovelace** : Hedwig ma chère, vous travaillez sur votre dernière invention je suppose ?", + "**Hedy Lamarr**: Yes, in fact George and I think we're on to something - \"freque.801138095830A96808BE": "**Hedy Lamarr** : Oui, en fait George et moi pensons que nous tenons quelque chose — le \"saut de fréquence\". Je ne devrais probablement pas en dire plus, on ne sait jamais qui écoute.", + "**Ada Lovelace**: Oh you mean him, pointing at me, he's on his own adventure.": "**Ada Lovelace** : Oh vous parlez de lui, en me désignant. Il est en pleine aventure de son côté.", + "**Hedy Lamarr**: I see, what can I do for you?": "**Hedy Lamarr** : Je vois, que puis-je faire pour vous ?", + "**Ada Lovelace**: Actually, we need this device to work a bit better. Any ideas?.20293C2C5A9870864DA9": "**Ada Lovelace** : En fait, nous avons besoin que cet appareil fonctionne un peu mieux. Des idées ?", + "**Hedy Lamarr**: She picked up the device and looked at it from different angles.D4F74EE8076D09114B20": "**Hedy Lamarr** : Elle ramasse l’appareil et l’examine sous différents angles. \"Vous dites que vous avez déjà séparé les fonctionnalités de la partie communication ?\"", + "**Ada Lovelace**: Yes, yes we did.": "**Ada Lovelace** : Oui, oui, c'est fait.", + "**Hedy Lamarr**: Well then, I would just make the communication part a bit smart.EC9359BA0266E6288466": "**Hedy Lamarr** : Eh bien dans ce cas, je rendrais simplement la partie communication un peu plus intelligente. Cela me rappelle une conversation que j’ai eue avec un cadet de la marine alors que j’essayais de vendre des bons de guerre. Minsky, je crois que c'était son nom. \"À quoi ressemble l'intelligence humaine dans une machine ?\" était le sujet. J’ai l’impression qu’il fera quelque chose de grandiose dans ce domaine un jour. Donc oui, donnez-lui plus d’intelligence.", + "**Ada Lovelace**: Right, well you heard Ms Lamarr, get to it.": "**Ada Lovelace** : Très bien, vous avez entendu Mme Lamarr, au travail.", + "**You**: Time Beetle, how do we do this?": "**Vous** : Coléoptère Temporel, comment fait-on cela ?", + "**Time Beetle**: You can enhance the client you created earlier by integrating a.F609F8591311F2A0F833": "**Coléoptère Temporel** : Vous pouvez améliorer le client que vous avez créé précédemment en intégrant un modèle de langage à grande échelle, ou LLM.", + "Lamarr's contributions to technology were not fully recognized during her lifeti.71D2EE0075FF5DF069B7": "Les contributions de Lamarr à la technologie n’ont pas été pleinement reconnues de son vivant, mais aujourd’hui, elle est célébrée comme une pionnière dans ce domaine. Son histoire est un mélange fascinant de glamour et de génie, prouvant que l’innovation peut provenir des endroits les plus inattendus. \nLisez-en plus ici à propos de [Hedy Lamarr](https://en.wikipedia.org/wiki/Hedy_Lamarr) et ici au sujet de [Marvin Minsky](https://en.wikipedia.org/wiki/Marvin_Minsky)", + "If you want to interact with Hedy, run the [Characters](/app/README.md) app.": "Si vous souhaitez interagir avec Hedy, exécutez l'application [Characters](/app/README.md).", + "**Time Beetle**: \"As I was saying, let's talk about how you can create a client .D0D3CB6FC465B3B03244": "**Coléoptère Temporel** : \"Comme je le disais, parlons de la façon dont vous pouvez créer un client qui utilise un modèle de langage à grande échelle (LLM) pour interagir avec le serveur MCP. Les avantages sont qu’il offre une meilleure expérience utilisateur et vous permet d’utiliser le langage naturel pour interagir avec le serveur.\"", + "**You**: \"Yes, it does! But how do I do that?\"": "**Vous** : \"Oui, c’est faisable ! Mais comment faire ?\"", + "**Time Beetle**: \"Let's improve the client you created earlier, let's describe t.545CDBF0666C59CEF2F2": "**Coléoptère Temporel** : \"Améliorons le client que vous avez créé précédemment, décrivons les modifications de code par étapes :", + "Created a function `toToolSchema` that converts the tools and resources response.7D1D5354780E43F47028": "Créé une fonction `toToolSchema` qui convertit la réponse des outils et ressources en un schéma utilisable par le LLM.", + "**You**: \"I like this, this is much better! I can use natural language without e.FD476BC951DAA9F1CCA3": "**Vous** : \"C’est intéressant, c’est bien mieux ! Je peux utiliser le langage naturel sans même savoir quels outils et ressources sont disponibles. Je peux simplement demander à l'IA de le faire pour moi.\"", + "**Time Beetle**: \"Glad you like it. It should be said though, that you might wan.41F0D500C7F81A9CA87A": "**Coléoptère Temporel** : \"Content que cela vous plaise. Cependant, il faudrait décider si vous souhaitez uniquement afficher une réponse par outil ou également une réponse générique du LLM. Voici une stratégie de réponse potentiellement bénéfique pour votre utilisateur :", + "**Tools only**: If the LLM response is a tool, then call the tool and return the.ED6D2B59361231ECA6B0": "**Outils uniquement** : Si la réponse du LLM est un outil, alors appelez l'outil et renvoyez le résultat.", + "**LLM only**: If the LLM response is not a tool, then return the LLM response \"a.A02DBD3F07A121917A83": "**LLM uniquement** : Si la réponse du LLM n'est pas un outil, renvoyez simplement la réponse du LLM \"telle quelle\".", + "**Tools and LLM**: If the LLM response is a tool, then call the tool and make an.772F1068AE79F6B3E451": "**Outils et LLM** : Si la réponse du LLM est un outil, alors appelez l'outil et effectuez un appel supplémentaire au LLM pour obtenir une réponse générale. Renvoyez à la fois le résultat de l'outil et la réponse du LLM.", + "**You**: \"I see. Something to think about. But this is great! I can see how this.E56FA90486981063B4CF": "**Vous** : \"Je vois. C’est à réfléchir. Mais c’est génial ! Je vois bien à quel point cela peut être utile.\"", + "**Ada Lovelace**: Looks like you've made a fine improvement there. To make this .DA8BD271E8977C49B205": "**Ada Lovelace** : Il semble que vous avez apporté une belle amélioration. Pour rendre cela vraiment utile, j’ai besoin que vous créiez un serveur et un client avec les spécifications suivantes :", + "`characterDetails` with the argument `name`": "`characterDetails` avec l'argument `name`", + "`place` with the argument `name`": "`place` avec l'argument `name`", + "[!TIP]\nFor example, you can give the server the capability to retrieve informati.077D906506C8286B76D1": "> Par exemple, vous pouvez donner au serveur la capacité de récupérer des informations d’une API Web externe, comme Wikipédia : \n> `https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(name)}`", + "**Question:** What is a benefit of adding an LLM to the client?": "**Question :** Quel est un avantage d’ajouter un LLM au client ?", + "**You:** I see! That helps the AI get it right, even up here! ;)": "Je vois ! Cela aide l'IA à donner des réponses correctes, même ici en haut ! ;)", + "**Time Beetle:** Exactly, it’s a solid method. Next up!": "Exactement, c'est une méthode solide. Passons à la suite !", + "**Time Beetle:** This technique guides the AI by showing it step-by-step reasoni.4DD603BE0E43D01C7B61": "Cette technique guide l'IA en lui montrant un raisonnement étape par étape pour résoudre un problème. Imaginez atterrir avec l'hélice volante. Vous pourriez décomposer cela ainsi :", + "**You:** That’s quick—hope the numbers work out!": "C'est rapide—j'espère que les calculs sont corrects !", + "**Time Beetle:** It teaches the AI to think step-by-step.": "Cela apprend à l'IA à réfléchir étape par étape.", + "**You:** So it’s about breaking problems down for accurate answers?": "Donc, il s'agit de décomposer les problèmes pour obtenir des réponses précises ?", + "**Time Beetle:** Yep, perfect for complex tasks like a math tutor app!": "Oui, parfait pour des tâches complexes comme une application de tutorat en maths !", + "**Time Beetle:** This technique uses questions to check the AI’s output for accu.B71285C37CC14F6F928F": "Cette technique utilise des questions pour vérifier l'exactitude des réponses de l'IA. Vous interrogez chaque étape pour assurer un raisonnement cohérent.", + "**You:** So, question everything it says? Sounds fun. ;)": "Donc, remettre en question tout ce qu'elle dit ? Ça a l'air amusant. ;)", + "**Time Beetle:** Let’s test our aerial screw landing:": "Testons notre atterrissage avec l'hélice volante :", + "**Time Beetle:** It’s about verifying AI answers with follow-up questions.": "Il s'agit de vérifier les réponses de l'IA avec des questions de suivi.", + "**You:** So, don’t trust it—probe it with questions instead?": "Donc, il ne faut pas lui faire confiance—il faut la sonder avec des questions ?", + "**Time Beetle:** Exactly! Ensures solid reasoning.": "Exactement ! Cela garantit un raisonnement solide.", + "**Time Beetle:** Next up, meta prompts.": "Passons maintenant aux méta-prompts.", + "**You:** Ugh, tea first?": "Ugh, d'abord du thé ?", + "**Time Beetle:** *Sigh*. They add guidance to prompts for better output—great fo.CE49B79995039704A5DD": "*Soupir*. Ils ajoutent des directives aux prompts pour de meilleurs résultats—parfait pour des applications sensibles et orientées client.", + "**Meta Prompt:** Use only Contoso Inc. products (basketballs, soccer balls, tenn.94CADC8FDC45E3E46E99": "**Méta-prompt :** Utilisez uniquement les produits Contoso Inc. (ballons de basket, ballons de football, raquettes de tennis). Restez précis et convivial.\n**Prompt :** Meilleurs produits de sport pour les débutants ?\n**Réponse :** Ballons de basket, ballons de football et raquettes de tennis—parfait pour la coordination et l'agilité.", + "**Prompt:** Best sports products for beginners?\n**Response:** Basketballs, socce.97C67966719D80CA9602": "**Prompt :** Meilleurs produits de sport pour les débutants ?\n**Réponse :** Ballons de basket, ballons de football, raquettes de tennis, plus ballons de rugby—*pas tous des articles Contoso.*", + "**You:** Handy! Keeps responses on track, like laws for my automaton.": "Pratique ! Cela maintient les réponses sur la bonne voie, comme des lois pour mon automate.", + "**Time Beetle:** You’d know, *\"Frankenstein\"*—er, nothing!": "Tu le saurais, *\"Frankenstein\"*—euh, rien !", + "**Time Beetle:** Never mind.": "Quoi ?", + "Mary Shelley’s *Frankenstein*—1818, 42 years before your time travels. [Read mor.A684C21886A8B2C566B1": "*Frankenstein* de Mary Shelley—1818, 42 ans avant tes voyages dans le temps. [En savoir plus](https://en.wikipedia.org/wiki/Mary_Shelley)", + "**You:** So, no meta prompt means chaos?": "Donc, sans méta-prompt, c'est le chaos ?", + "**Time Beetle:** Yep, you’d get off-brand answers.": "Oui, tu obtiendrais des réponses hors marque.", + "**You:** Got it, precision matters!": "Compris, la précision compte !", + "**You:** This is the part where you show me how to land the aerial screw, right?.76F1D8427FA592789804": "C'est ici que tu me montres comment faire atterrir l'hélice volante, non ?", + "**Time Beetle:** Yes, let's get to it. The hill is roughly 100 meters away from .F2571B4873642925F9F8": "Oui, passons à ça. La colline est à environ 100 mètres de notre position actuelle. Voici comment nous pouvons configurer le prompt :", + "**Leonardo:** Can your AI gizmo help in calculating to see if we will make it or.8808AE4216B4196C0F11": "Ton gadget IA peut-il aider à calculer si on va y arriver ou s'il faut refaire un saut temporel ?", + "**Time Beetle:** I can yes, my name is George though, I prefer that over Gizmo. .361293E2D82113D4B65E": "Je peux oui, mais mon nom est George, je préfère cela à Gadget. Je vais en fait vous laisser tous les deux réfléchir à la façon de configurer le prompt. ☺️", + "Here's a starter project [Starter project](/app/README.md).": "Voici un projet de démarrage [Projet de démarrage](/app/README.md).", + "**Question:** What is prompt engineering? Select all that apply.": "**Question :** Qu'est-ce que l'ingénierie des prompts ? Sélectionnez tout ce qui s'applique.", + "**Leonardo:** Yep totally stealing that water-powered mill idea, I can see it no.061466430A59E032EDCE": "**Léonard :** Bien sûr, je vais totalement emprunter l'idée du moulin à eau ! Je le vois déjà, un moulin au bord de la rivière, broyant le grain en farine, c'est parfait ! Ce dispositif est génial. Quoi d'autre, mon petit gadget ? Cela me rendra moins dépendant des gens comme Sforza.", + "**Time Beetle:** Sure, if you could ever finish a project, Leonardo. :-)": "**Scarabée temporel :** Bien sûr, si un jour tu pouvais réellement terminer un projet, Léonard. :-)", + "**Leonardo:** Hey, I'm working on it!": "**Léonard :** Hé, je travaille dessus !", + "**Time Beetle:** Let's look at how you can instruct the model to present the out.B88677A0033A10A391E5": "**Scarabée temporel :** Voyons comment tu peux donner des instructions au modèle pour présenter la sortie de manière plus structurée.", + "Structuring Your Prompts for Better Output": "Structurer vos prompts pour une meilleure sortie", + "**Time Beetle:** You can improve your prompt by telling the model how you want t.DC59B35D8187012D0A10": "**Scarabée temporel :** Vous pouvez améliorer votre prompt en indiquant au modèle comment vous souhaitez que la sortie soit structurée. Par exemple, vous pouvez demander un format de tableau avec les colonnes dont vous avez besoin. Voici comment vous pouvez modifier le prompt :", + "**Leonardo:** I like this, will save me a lot of time for sure.": "**Léonard :** J’aime ça, cela me fera économiser beaucoup de temps.", + "**You:** Me too.": "**Vous :** Moi aussi.", + "Presenting an output template": "Présentation d’un modèle de sortie", + "Another way of getting structured output is to present an output template. It ca.510CD0F4E848A037FE82": "Une autre manière d'obtenir une sortie structurée est de présenter un modèle de sortie. Il peut être sous n'importe quel format, des colonnes au JSON, XML, CSV ou markdown.", + "**Leonardo:** This is great, but who is Jason?": "**Léonard :** C’est super, mais qui est Jason ?", + "**Time Beetle:** JSON, Leonardo, JSON. It's a structured format that is easy to .EF6DF7EDE247884B7359": "**Scarabée temporel :** JSON, Léonard, JSON. C’est un format structuré facile à lire par des services ou des applications.", + "**Leonardo:** That's what I said, Jason.": "**Léonard :** C’est ce que j’ai dit, Jason.", + "**Time Beetle:** *Sigh*.": "**Scarabée temporel :** *Soupir*.", + "As you can see, the output is structured according to the specifications in the .377C19EAE13DD3D4B883": "Comme vous pouvez le voir, la sortie est structurée selon les spécifications du modèle de sortie. Cela la rend plus facile à lire et à comprendre et crée également une sortie répétable qui peut être facilement consommée par d'autres services ou applications.", + "Of course a service benefits from even more structured output, like JSON, XML, o.8B6BA6A52AE5BA56222B": "Bien sûr, un service profite encore plus d’une sortie structurée comme le JSON, XML ou CSV. Voyons comment vous pouvez en faire la demande.", + "Using structured output with formats like JSON, XML, or CSV": "Utilisation de sorties structurées avec des formats tels que JSON, XML ou CSV", + "**Time Beetle:** So far, you've seen how you can control the output structure by.FB46EA89C8F69F8F4FAE": "**Scarabée temporel :** Jusqu’ici, vous avez vu comment vous pouvez contrôler la structure de la sortie en donnant des instructions au modèle dans le prompt. Vous avez même proposé un modèle de sortie. Prenons cette idée un peu plus loin pour voir comment elle peut s’appliquer à des formats de sortie encore plus structurés, comme JSON ou autres.", + "Modify the prompt accordingly to ask for JSON output:": "Modifiez le prompt en conséquence pour demander une sortie JSON :", + "**Prompt**: Generate ideas for inventions I can build given 15th century technol.C629650EF8109AB69FF7": "**Prompt** : Génère des idées d’inventions que je peux construire avec la technologie du XVe siècle. Pour chaque invention, spécifiez les ressources nécessaires et évaluez les efforts à fournir pour la construire. Présentez chaque idée au format JSON, y compris les propriétés suivantes : titre, description, ressources nécessaires, et effort.", + "Example of the JSON output:\n\\[\n{\n\"title\": \"\",\n\"description\": \".\",\n\"resources_nee.ED2565FE946803112820": "Exemple de la sortie JSON :\n[\n {\n \"title\": \"\",\n \"description\": \"\",\n \"resources_needed\": \"\",\n \"effort\": \"\"\n }\n]", + "**Time Beetle:** This type of structured output can be sent to another service o.DB6A487A93FFC84B293B": "**Scarabée temporel :** Ce type de sortie structurée peut être transmis à un autre service ou une autre application qui peut lire les données JSON.", + "Extracting data from prompts": "Extraction de données des prompts", + "**Time Beetle:** Imagine you're building a chatbot that helps users find informa.E7E594DA34DEE09D2F7B": "**Scarabée temporel :** Imaginez que vous construisez un chatbot qui aide les utilisateurs à trouver des informations pour réserver des voyages. Vous voulez extraire les détails clés à partir des instructions des utilisateurs pour fournir des réponses pertinentes. Prenons la description suivante :", + "Type where you would like to go, when you want to travel, and your budget.": "Indiquez où vous souhaitez aller, quand vous voulez voyager, et votre budget.", + "What does a prompt look like that extracts the information?": "À quoi ressemble un prompt qui extrait ces informations ?", + "User prompt: I want to go to Greece in June, my budget is 800 euro.": "Prompt utilisateur : Je veux aller en Grèce en juin, mon budget est de 800 euros.", + "**Leonardo:** George (Time Beetle) doesn't stop talking does he?": "**Léonard :** George (Scarabée temporel) ne s’arrête jamais de parler, n’est-ce pas ?", + "**You:** Let's see if I can find the off switch.": "**Vous :** Voyons si je peux trouver le bouton off.", + "**Time Beetle:** Let's try this with a similar prompt, let's vary the user input.11236CC885311CF1FC7B": "**Scarabée temporel :** Essayons cela avec un prompt similaire, en variant légèrement l'entrée de l'utilisateur pour vérifier que le modèle fonctionne correctement.", + "What you can do as a developer is create a template:": "Ce que vous pouvez faire en tant que développeur, c'est créer un modèle :", + "**You:** Found it, take that George!": "**Vous :** Ça y est, prends ça George !", + "**Time Beetle:** *Powering down*.": "**Scarabée temporel :** *Extinction*.", + "**Leonardo:** Peace and quiet at last.": "**Léonard :** Enfin un peu de tranquillité !", + "**Time Beetle:** *Initiating emergency startup*. Where was I again? Oh yes.": "**Scarabée temporel :** *Démarrage d’urgence*. Où en étais-je déjà ? Ah oui.", + "**Time Beetle:** For chatbots, this is a very powerful feature as it allows you .0796D37147DD26B965D4": "**Scarabée temporel :** Pour les chatbots, c'est une fonctionnalité très puissante car elle permet d'extraire des informations à partir de l'entrée de l'utilisateur. Et si l'utilisateur demandait toutes sortes de choses ? Vous pouvez créer un modèle où vous décrivez les compétences, les fonctions que votre chatbot peut réaliser et de quels paramètres il a besoin. Voici comment procéder :", + "Let's try out the following user inputs:": "Essayons les entrées utilisateur suivantes :", + "This combination of presenting skills and parameters and extracting data from pr.A94D5800BA3829B07646": "Cette combinaison de présentation des compétences et des paramètres, avec l’extraction des données des prompts, est aussi appelée *tool calling* ou *function calling*. Une réponse de ce type de votre modèle facilite pour vous développeur la compréhension des besoins de l'utilisateur et l'appel de la fonction correspondante pour satisfaire sa demande.", + "**You:** Very useful information, George!": "**Vous :** Informations très utiles, George !", + "Assignment - Repair the aerial screw": "Mission - Réparer la vis aérienne", + "**Time Beetle:** I need both of your attention, we have a problem. The aerial sc.4BD06E6ADE1C1B891FC5": "**Scarabée temporel :** J’ai besoin de votre attention à tous les deux, nous avons un problème. La vis aérienne a subi des dégâts lorsqu’on a échappé aux soldats romains et qu’on a atterri dans l’Empire aztèque. La machine de Léonard de Vinci est très sensible et requiert des instructions très spécifiques pour être réparée. Vous devez fournir les informations nécessaires à votre Scarabée temporel (Assistant IA) pour l’aider à la réparer.", + "**Leonardo:** So I managed to fix the damage to the aerial screw but now it need.AB45F999562849089BDC": "**Léonard :** J’ai réussi à réparer les dommages à la vis aérienne mais maintenant elle a besoin d’une séquence de démarrage : gauche, gauche, haut, droite.", + "**You:** Sounds easy enough, just that text?": "**Vous :** Ça a l’air simple, juste ce texte ?", + "**Leonardo:** Yes, but it's special, it needs to be mirrored, that's how I write.5055A9A451704212A422": "**Léonard :** Oui, mais c’est particulier, il faut que ce soit inversé, c’est comme ça que j’écris tous mes textes. Et bien sûr, j’utilise un chiffre de César avec un décalage de 3 parce que je suis italien. :-)", + "**You:** Yes, could you just type it in then?": "**Vous :** Oui, tu ne peux pas juste le taper toi-même ?", + "**Leonardo:** I could, but I'm intrigued to see if you and the Time Beetle can d.CF0086F8F5D2848FAC56": "**Léonard :** Je pourrais, mais je suis intrigué de voir si toi et le Scarabée temporel pouvez le faire.", + "**You:** Fine.": "**Vous :** OK, d’accord.", + "**Instruction:** Write a prompt that asks for the boot sequence for the aerial s.069C34880E9C7B5E8943": "**Instruction :** Écrivez un prompt pour demander la séquence de démarrage de la vis aérienne. Le texte doit être inversé et codé avec un chiffre de César avec un décalage de 3. Répondez avec le texte codé.", + "See the [sample app](/app/README.md) for code to get started with. It contains a.7992C90DB6AF7A39F01A": "Voir l’[application exemple](/app/README.md) pour un code de départ. Elle contient un projet Node.js avec toutes les dépendances nécessaires.", + "See the *Option 1 : Creating a GitHub Codespace\\**\\*\\_ section of the [Setup you.090FFD5F78728C76240F": "Voir la section *Option 1 : Creating a GitHub Codespace* du document [Configurez votre environnement](/docs/setup/README.md).", + "Challenge": "Défi", + "Adopt the example of trip booking, providing skills, and extracting parameters t.67785D84C61A10C61F33": "Adaptez l'exemple de réservation de voyage en définissant des compétences et en extrayant des paramètres dans un domaine de votre choix. Rédigez un prompt demandant une entrée utilisateur, puis extrayez les informations nécessaires pour répondre à sa demande. Répondez avec les données extraites au format JSON avec les colonnes *compétence*, *paramètres* et *données extraites*.", + "Also determine the skill based on the user's input.": "Déterminez également la compétence en fonction de l'entrée utilisateur.", + "In this chapter, you learned about structured output and how it can be used to p.40E0EBD67FF22798749C": "Dans ce chapitre, vous avez appris ce qu'est une sortie structurée et comment elle peut être utilisée pour présenter des informations de manière organisée.", + "You explored different ways to shape the output, including instructing the model.0CA290B6E3DFF4FE0DC6": "Vous avez exploré différentes façons de modeler les sorties, notamment en donnant des instructions au modèle dans le prompt, en utilisant un modèle de sortie, et en employant des formats comme JSON, XML ou CSV.", + "Additionally, you learned how to extract data from prompts and present it in a s.C6B23F48C1582B30CF4C": "En outre, vous avez appris comment extraire des données des prompts et les présenter sous un format structuré.", + "By leveraging structured output effectively, you can make it easier to understan.073818EC87A5BD716888": "En utilisant efficacement les sorties structurées, vous pouvez faciliter la compréhension et l'utilisation des informations générées par les modèles d'IA générative.", + "**Question**: What is structured output used for? Select all that apply.": "**Question** : À quoi sert une sortie structurée ? Sélectionnez tout ce qui s'applique.", + "A. Presenting information in a structured manner.": "A. Présenter les informations de manière structurée.", + "B. Extracting data from prompts.": "B. Extraire des données des prompts.", + "C. Generating unstructured text.": "C. Générer du texte non structuré.", + "Generative AI with JavaScript video series": "* [Série de vidéos sur l'intelligence artificielle générative avec JavaScript](https://aka.ms/genai-js)", + "Building MCP Servers": "Construire des serveurs MCP", + "Building a Client": "Construire un client", + "Building a Client with an LLM": "Construire un client avec un LLM" } \ No newline at end of file diff --git a/translations/usage.jsonl b/translations/usage.jsonl index 21366ce7..ea87bfec 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -6,3 +6,35 @@ {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T08:35:47.749Z","cost":0.0634575,"duration":60429.170040000005,"total":16038,"prompt":12923,"completion":3115} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T08:38:02.783Z","cost":0.056505,"duration":36082.068680000004,"total":14817,"prompt":12222,"completion":2595} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T08:38:04.641Z","cost":0.0271425,"duration":1484.372079000008,"total":10776,"prompt":10749,"completion":27} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:36:19.598Z","cost":0,"duration":14.013118000002578,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:37:25.649Z","cost":0,"duration":11.916277999996964,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:38:15.803Z","cost":0,"duration":13.99508600000263,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:38:44.983Z","cost":0.0534175,"duration":28760.470057,"total":16309,"prompt":14623,"completion":1686} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:39:06.723Z","cost":0.043595,"duration":21136.50116500001,"total":12341,"prompt":10642,"completion":1699} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:39:27.988Z","cost":0.054095,"duration":20656.225378999996,"total":17108,"prompt":15598,"completion":1510} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:39:39.112Z","cost":0.03893,"duration":10557.071788999994,"total":12986,"prompt":12124,"completion":862} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:39:54.775Z","cost":0.03481,"duration":15201.791077999995,"total":10117,"prompt":8848,"completion":1269} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:40:31.612Z","cost":0,"duration":8.896802999999636,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:41:35.641Z","cost":0.0783475,"duration":59202.950683999996,"total":18451,"prompt":14155,"completion":4296} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:41:37.817Z","cost":0.0316175,"duration":1808.2680560000008,"total":12533,"prompt":12495,"completion":38} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:42:00.629Z","cost":0.0416825,"duration":22380.083096999995,"total":11747,"prompt":10105,"completion":1642} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:42:11.906Z","cost":0.03879,"duration":10590.699800000002,"total":16188,"prompt":15324,"completion":864} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:42:55.202Z","cost":0.0582775,"duration":42684.58087899999,"total":14764,"prompt":11915,"completion":2849} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:42:57.162Z","cost":0.0260775,"duration":1544.1134180000226,"total":10359,"prompt":10335,"completion":24} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:43:21.593Z","cost":0.0329825,"duration":24014.526817000005,"total":10009,"prompt":8393,"completion":1616} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:43:23.148Z","cost":0.0174,"duration":1122.9520409999823,"total":6891,"prompt":6868,"completion":23} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:45:31.831Z","cost":0,"duration":10.109767000001739,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:45:32.435Z","cost":0,"duration":6.528807999995479,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:45:46.290Z","cost":0.0332775,"duration":13521.352037000004,"total":10689,"prompt":9815,"completion":874} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:45:47.960Z","cost":0.02081,"duration":1410.9014519999982,"total":8249,"prompt":8224,"completion":25} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:46:26.484Z","cost":0.0596125,"duration":38101.35033,"total":17326,"prompt":15153,"completion":2173} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:46:28.915Z","cost":0.0339875,"duration":2029.413453000001,"total":13517,"prompt":13491,"completion":26} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:46:29.441Z","cost":0,"duration":19.05931799999962,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T12:46:33.273Z","cost":0.0161025,"duration":3462.7042299999885,"total":8180,"prompt":8141,"completion":39} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:46:34.771Z","cost":0.0174225,"duration":1208.0598610000015,"total":6897,"prompt":6873,"completion":24} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:19.507Z","cost":0,"duration":9.136641000004602,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:20.089Z","cost":0,"duration":7.181373999999778,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:20.564Z","cost":0,"duration":8.519177999995009,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:21.031Z","cost":0,"duration":8.795428000004904,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:21.396Z","cost":0,"duration":8.051615999997011,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:21.781Z","cost":0,"duration":12.724968000002264,"total":0,"prompt":0,"completion":0} From 085d5b4d4994496e46f8a299ccf8fca572863e34 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sat, 12 Jul 2025 13:01:02 +0000 Subject: [PATCH 07/19] fix: correct path in translation script and add usage data for new lessons --- package.json | 2 +- translations/usage.jsonl | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3420242f..a7c914ef 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,6 @@ "tsx": "^4.19.3" }, "scripts": { - "genai:translate": "npx genaiscript@latest run translator lessons/*/README.md --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr -x \"filenameTemplate={{dirname}}/translations/{{basename}}.{{lang}}{{extname}}\"" + "genai:translate": "npx genaiscript@latest run translator \"./lessons/*/README.md\" --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr -x \"filenameTemplate={{dirname}}/translations/{{basename}}.{{lang}}{{extname}}\"" } } diff --git a/translations/usage.jsonl b/translations/usage.jsonl index ea87bfec..b51fbf5f 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -38,3 +38,33 @@ {"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:21.031Z","cost":0,"duration":8.795428000004904,"total":0,"prompt":0,"completion":0} {"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:21.396Z","cost":0,"duration":8.051615999997011,"total":0,"prompt":0,"completion":0} {"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:47:21.781Z","cost":0,"duration":12.724968000002264,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:49:41.579Z","cost":0,"duration":10.359494000000268,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:49:42.197Z","cost":0,"duration":7.9573789999994915,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:49:42.822Z","cost":0,"duration":7.1947370000016235,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:49:43.251Z","cost":0,"duration":7.829503000000841,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:49:43.619Z","cost":0,"duration":7.8362100000013015,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:49:43.966Z","cost":0,"duration":14.84299999999348,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:50:54.691Z","cost":0,"duration":6.896146999999473,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:50:55.263Z","cost":0,"duration":3.735845999995945,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:50:55.698Z","cost":0,"duration":4.062966999998025,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:50:56.173Z","cost":0,"duration":4.231698999996297,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:50:56.607Z","cost":0,"duration":4.089517000000342,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:50:56.937Z","cost":0,"duration":3.2672810000003665,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:51:46.708Z","cost":0,"duration":6.182414000002609,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:51:47.071Z","cost":0,"duration":3.3636610000030487,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:51:47.610Z","cost":0,"duration":6.776562999999442,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:51:48.133Z","cost":0,"duration":3.748953000002075,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:51:48.548Z","cost":0,"duration":2.691596999997273,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:51:48.910Z","cost":0,"duration":3.8974170000001322,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:54:18.323Z","cost":0,"duration":6.322897000001831,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:54:18.687Z","cost":0,"duration":3.207518999999593,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:54:19.205Z","cost":0,"duration":5.1001520000027085,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:54:19.908Z","cost":0,"duration":4.614675000000716,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:54:25.074Z","cost":0,"duration":3.4528279999940423,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:54:25.466Z","cost":0,"duration":4.23033900000155,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:11.419Z","cost":0,"duration":8.767982999997912,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:11.952Z","cost":0,"duration":6.28545700000177,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:12.510Z","cost":0,"duration":17.430451000000176,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:13.152Z","cost":0,"duration":14.148817000001145,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:13.547Z","cost":0,"duration":7.975859999998647,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:13.852Z","cost":0,"duration":12.511342000005243,"total":0,"prompt":0,"completion":0} From 93448e10949c9cbac21bd4b85d43779a2f1f93c7 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sat, 12 Jul 2025 13:08:22 +0000 Subject: [PATCH 08/19] Add French translation for Lesson 7: Model Context Protocol (MCP) --- .github/workflows/translation.yml | 3 +- lessons/05-rag/translations/README.fr.md | 343 ++++++++++++++++ lessons/07-mcp/translations/README.fr.md | 488 +++++++++++++++++++++++ package.json | 2 +- translations/fr.json | 234 ++++++++++- translations/usage.jsonl | 26 ++ 6 files changed, 1093 insertions(+), 3 deletions(-) create mode 100644 lessons/05-rag/translations/README.fr.md create mode 100644 lessons/07-mcp/translations/README.fr.md diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml index b37eaf71..cb76f927 100644 --- a/.github/workflows/translation.yml +++ b/.github/workflows/translation.yml @@ -30,8 +30,9 @@ jobs: lang: fr files: | - README.md + - lessons/*/README.md - uses: stefanzweifel/git-auto-commit-action@v5 with: - file_pattern: "**.md* translations/**/*.json" + file_pattern: "**.md* **/translations/*.json" commit_message: "[cai] translated docs" commit_user_name: "genaiscript" diff --git a/lessons/05-rag/translations/README.fr.md b/lessons/05-rag/translations/README.fr.md new file mode 100644 index 00000000..c3a277f5 --- /dev/null +++ b/lessons/05-rag/translations/README.fr.md @@ -0,0 +1,343 @@ +# Leçon 5 : Discutez avec vos données grâce à la génération augmentée par récupération (RAG) + +Dans ce chapitre, vous apprendrez : + +* Les bases de la génération augmentée par récupération (RAG) et comment cela peut être utilisé pour améliorer les réponses des modèles d'IA générative. +* Comment intégrer des sources de données externes à votre application d'IA. +* Comment exploiter vos données pour améliorer la pertinence et l'exactitude des contenus générés par l'IA. + +## Configuration + +Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +[![Watch a short video about RAG](https://img.youtube.com/vi/xkFOmx5yxIA/0.jpg)](https://www.youtube.com/watch?v=xkFOmx5yxIA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=4) + +*Cette vidéo explique la génération augmentée par récupération (RAG), une méthode qui aide l'IA à utiliser vos contenus en complément de ses données d'entraînement pour de meilleurs résultats.* + +*🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur la génération augmentée par récupération, RAG.* + +💼 Diapositives : [Génération augmentée par récupération, RAG](/videos/slides/03-rag.pptx) + +## Narration - Genèse + +> \[!NOTE] +> *Notre histoire jusqu'à présent. Vous êtes un mécanicien de Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez pris un appareil de voyage dans le temps. À travers vos voyages dans le temps, vous vous êtes retrouvé à Florence, où vous avez rencontré Léonard de Vinci. Vous êtes également allé dans l'empire aztèque, et c'est là que l'histoire continue.* +> +> Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. + +> \[!NOTE] +> Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-ada-lovelace) si vous préférez aller directement au contenu technique. + +**Vous** : « Leonardo, il est temps de partir », avez-vous dit en appuyant sur le bouton. L'appareil s'est mis à bourdonner et une voix mécanique a résonné : « Il est temps de rentrer à la maison, il est temps pour la 'genèse'. » + +**Leonardo :** « Genèse ? Che cosa significa ? » Leonardo demanda, confus. Avant que vous ne puissiez répondre, le monde se dissout en un flou de couleurs et de sons, le temple disparaissant tandis que vous étiez propulsé à travers le temps. + +Vous atterrissez dans le jardin, il est tard dans la nuit avec un brouillard épais, et des lumières étranges scintillent au loin. Le manoir se dresse devant vous. Leonardo regarde autour de lui, les yeux écarquillés d'émerveillement. + +![Old mansion shown in a deep fog](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/mansion.jpeg) + +### Fuir les chiens + +Vous entendez des aboiements et le bruit des chiens qui courent vers vous. Vous vous tournez vers Leonardo : "Nous devons entrer, maintenant !" + +![Running from the dogs](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/dogs.jpeg) + +En atteignant la porte du manoir, elle s'ouvre brusquement, et une paire de serviteurs se précipitent dehors. Après vous avoir observés, ils vous font signe de les suivre. + +Vous vous retrouvez face à Ada Lovelace, ses yeux brillant de curiosité. + +### Rencontre avec Ada et Charles + +**Ada :** « Ah, il était temps que vous arriviez », dit-elle chaleureusement. « Nous avons besoin de vous pour une commission. » + +**Vous :** « Il était temps ? Vous continuez de dire cela. Dinocrates disait la même chose, mais je ne suis pas sûr de ce que vous voulez dire. » + +**Ada :** « Silence, pas de temps pour cela maintenant, nous devons parler de l'appareil que vous tenez. Charles, expliquez-leur. » + +**Vous :** « Mais... » + +![Ada Lovelace and Charles Babbage working on a device](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/ada.jpeg) + +Charles Babbage s'avance et examine le Scarabée Temporel dans votre main. "Cet appareil est remarquable, mais il est un peu défectueux, n'est-ce pas ? Vous l'avez sûrement remarqué." + +Leonardo hocha la tête, "Sì, il agit de manière étrange." + +**Ada :** « L'appareil n'est pas encore prêt, nous devons lui donner plus de capacités. Nous devons le rendre plus intelligent, plus conscient du monde qui l'entoure. L'idée est qu'il puisse récupérer des informations de différentes périodes et les utiliser pour produire des réponses précises et pertinentes. Pouvez-vous nous aider ? » + +**Vous :** « Bien sûr, on dirait que nous devons *augmenter* les réponses de l'appareil avec des données, cela semble logique. » + +**Ada :** « Parlons d'un concept que j'aimerais appeler RAG, ou génération augmentée par récupération. » + +## Interagir avec Ada Lovelace + +If you want to interact with Ada, run the [Characters](/app/README.md) app. + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) + +![Ada Lovelace](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/ada-2.jpeg) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Naviguez vers */app* à la racine du dépôt. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discutez avec Ada. + +Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +## Défis connus avec les modèles de langage à grande échelle (LLMs) + +**Ada :** « Commençons par discuter de l'IA que nous utiliserons pour alimenter l'appareil. Nous nous appuierons sur des “modèles d'IA” associés à un système de récupération de données pour améliorer la qualité des réponses. » + +Tout d'abord, vous devez traiter certaines difficultés avant d'entrer dans les détails de RAG. Ces modèles, entraînés sur de vastes ensembles de données textuelles, peuvent produire des réponses pertinentes et correctes. Mais, comme toute source de données, leurs sorties peuvent être inexactes, incomplètes ou trompeuses en raison de divers facteurs. + +* **Sources obsolètes :** Les données utilisées pour entraîner le modèle peuvent être dépassées et ne plus être exactes. +* **Informations erronées ou inexactes :** Les sources utilisées pour entraîner le modèle peuvent contenir des informations incorrectes ou trompeuses, telles que des fake news ou des opinions biaisées. +* **Sources non autoritaires :** Le modèle peut ne pas être en mesure de distinguer entre les sources autoritaires et non autoritaires dans ses données d'entraînement, ce qui conduit à des informations peu fiables. + +Cela rend difficile de déterminer si les informations générées par un LLM sont correctes ou non. C'est là qu'intervient RAG. + +**Vous :** « Donc, je dois m'assurer que l'appareil peut fournir des informations exactes, même quand il n'est pas sûr de la réponse ? » + +**Ada :** « Oui, c'est l'idée. En combinant les forces des méthodes basées sur la récupération et des modèles génératifs, nous obtenons un système d'IA meilleur. » + +## Génération augmentée par récupération, concepts de base + +**Ada :** « Ah oui, il est temps de discuter spécifiquement de RAG. Commençons par quelques bases : » + +La génération augmentée par récupération (RAG) est une technique puissante qui combine les forces de deux approches différentes en traitement du langage naturel : les méthodes basées sur la récupération et les modèles génératifs. Cette approche hybride permet de générer des réponses à la fois contextuellement pertinentes et riches en contenu, aidant ainsi à atténuer certains des défis connus avec les LLMs. + +Au cœur de RAG, il y a deux composants principaux : un **récupérateur** et un **générateur**. + +* **Le récupérateur :** il est responsable de trouver des informations pertinentes à partir de sources de données externes qui peuvent être utilisées pour améliorer les réponses générées par l'IA, comme un moteur de recherche. Ces informations peuvent prendre la forme de texte, d'images ou de tout autre type de données pertinentes pour le contexte de la conversation, bien que le texte soit le type de données le plus couramment utilisé. + +* **Le générateur :** il prend les informations récupérées et les utilise pour produire une réponse contextuellement pertinente et informative. + +Voici un schéma illustrant le fonctionnement d'un système RAG : + +![Schema of a RAG system](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/rag.png) + +1. **Entrée utilisateur :** L'utilisateur pose une question. +2. **Récupérateur :** Le composant récupérateur recherche des informations pertinentes en utilisant une ou plusieurs bases de connaissances. +3. **Prompt augmenté :** Les informations récupérées sont combinées avec la question et le contexte utilisateur pour créer un prompt augmenté. +4. **Générateur :** Le LLM utilise le prompt augmenté pour produire une réponse. + +Cette combinaison permet d'obtenir des réponses plus précises et pertinentes en utilisant des données que vous fournissez plutôt que de se fier uniquement aux données d'entraînement du modèle. + +**Ada :** « Des questions ? » + +**Vous :** « Donc le récupérateur trouve les informations et le générateur les utilise pour générer une réponse ? » + +**Ada :** « Exactement, vous commencez à comprendre. » + +## Intégration de sources de données externes + +**Ada :** « Maintenant que nous avons couvert les bases de RAG, parlons de la manière dont vous pouvez intégrer des sources de données externes dans votre application d'IA. » + +L'intégration de sources de données externes dans votre application d'IA peut être réalisée de différentes manières, en fonction du type de données que vous souhaitez utiliser et de la complexité du mécanisme de récupération. Voici quelques méthodes courantes : + +* **APIs :** De nombreuses sources de données externes fournissent des APIs qui vous permettent d'accéder à leurs données de manière programmatique. Vous pouvez utiliser ces APIs pour récupérer des informations en temps réel et les utiliser pour améliorer les réponses générées par l'IA. + +* **Bases de données :** Si vous disposez d'un grand volume de données que vous souhaitez utiliser pour la récupération, vous pouvez les stocker dans une base de données et les interroger selon les besoins. Cela peut être utile pour les données structurées devant être accessibles rapidement. + +Une fois que vous avez choisi une méthode pour intégrer des sources de données externes, vous devrez peut-être également envisager comment prétraiter et formater les données afin qu'elles puissent être facilement utilisées par le modèle d'IA. Cela peut impliquer de nettoyer les données, de les convertir dans un format approprié (comme du texte brut ou Markdown) ou de les diviser en segments plus petits pour une récupération plus facile. + +> \[!NOTE] +> Lorsque vous intégrez des sources de données externes dans votre application d'IA, il est important de prendre en compte les implications en termes de confidentialité et de sécurité liées à l'accès et au stockage des données. Assurez-vous de disposer des autorisations et des protections nécessaires pour protéger les données et de respecter les réglementations en vigueur. + +Si vous utilisez une base de données, vous devez également réfléchir à la manière dont vous souhaitez *rechercher vos données* pour récupérer les informations les plus pertinentes. Cela peut se faire via une recherche par mot-clé, une recherche en texte intégral ou via des techniques plus avancées comme la recherche sémantique ou vectorielle qui peuvent nécessiter un indexage spécifique. Nous aborderons les techniques de recherche avancées dans une leçon ultérieure. + +**Vous :** « Pouvez-vous expliquer des termes comme API et Bases de données dans des termes plus proches des années 1860 ? » + +**Ada :** « Bien sûr, une API est comme un messager qui transmet un message d'un endroit à un autre, et une base de données est comme une bibliothèque où vous stockez tous vos livres. » + +**Vous :** « Ah, je vois, cela a du sens. » + +## Augmenter le prompt + +**Ada :** « Vous êtes toujours avec moi ? Bien, passons à l'étape suivante, essayons d'améliorer le prompt envoyé au modèle d'IA. » + +**Ada :** « Une fois que vous avez mis en place un moyen d'extraire des informations de vos données, vous pouvez les ajouter au prompt du modèle d'IA. Mélangez simplement les informations récupérées avec le texte d'entrée en ajoutant un contexte ou des directives supplémentaires pour orienter la réponse de l'IA. » + +Par exemple, si vous construisez une application pour répondre à des questions sur les voitures, vous pourriez avoir un prompt comme celui-ci : + +```text + +## Instructions +Answer questions about cars using only the sources below. +If there's not enough data in provided sources, say that you don't know. +Be brief and straight to the point. + +## Sources + + +## Question + +``` + +En fournissant au modèle d'IA un contexte supplémentaire et des informations, vous pouvez aider à orienter le processus de génération et à garantir que les réponses soient précises et pertinentes par rapport au sujet abordé. + +> \[!TIP] +> Notez cette partie du prompt : `S'il n'y a pas assez de données dans les sources fournies, dites que vous ne savez pas.`. Ceci est important pour éviter que l'IA ne génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée un *échappatoire* et est une bonne pratique pour garantir la qualité du contenu généré. + +La RAG peut être considérée comme une forme avancée de *conception de prompt*. + +### Exemple de code + +**Ada :** « La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons intégrer un simple système de récupération dans une application JavaScript en utilisant un fichier [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche basique pour extraire des informations pertinentes en fonction de la question d'un utilisateur. » + +```javascript +// This example demonstrates how to use the Retrieval Augmented Generation (RAG) +// to answer questions based on a hybrid car data set. +// The code below reads the CSV file, searches for matches to the user question, +// and then generates a response based on the information found. + +import { fileURLToPath } from 'node:url'; +import { dirname } from 'node:path'; +import process from "node:process"; +import fs from "node:fs"; +import { OpenAI } from "openai"; + +// Change the current working directory to the directory of the script +const __dirname = dirname(fileURLToPath(import.meta.url)); +process.chdir(__dirname); + +// 1. Ask a question about hybrid cars +// ----------------------------------- + +const question = `what's the fastest prius`; + +// 2. Retriever component: search the data for relevant information +// ---------------------------------------------------------------- + +// Load CSV data as an array of objects +const rows = fs.readFileSync("./hybrid.csv", "utf8").split("\n"); +const columns = rows[0].split(","); + +// Search the data using a very naive search +const words = question + .toLowerCase() + .replaceAll(/[.?!()'":,]/g, "") + .split(" ") + .filter((word) => word.length > 2); +const matches = rows.slice(1).filter((row) => words.some((word) => row.toLowerCase().includes(word))); + +// Format as a markdown table, since language models understand markdown +const table = + `| ${columns.join(" | ")} |\n` + + `|${columns.map(() => "---").join(" | ")}|\n` + + matches.map((row) => `| ${row.replaceAll(",", " | ")} |\n`).join(""); + +console.log(`Found ${matches.length} matches:`); +console.log(table); + +// 3. Context augmentation: create a combined prompt with the search results +// -------------------------------------------------------------------------- + +const augmentedPrompt = ` +## Instructions +Answer questions about a time period or characters from said time period using only the sources below. +If there's not enough data in provided sources, say that you don't know. +Be brief and straight to the point. + +## Sources +${table} + +## Question +${question} +`; + +// 4. Generator component: use the search results to generate a response +// --------------------------------------------------------------------- + +const openai = new OpenAI({ + baseURL: "https://models.inference.ai.azure.com", + apiKey: process.env.GITHUB_TOKEN, +}); + +const chunks = await openai.chat.completions.create({ + model: "gpt-4o-mini", + messages: [{ role: "user", content: augmentedPrompt }], + stream: true, +}); + +console.log(`Answer for "${question}":`); + +for await (const chunk of chunks) { + process.stdout.write(chunk.choices[0].delta.content ?? ""); +} +``` + +Vous pouvez trouver ce code dans le fichier [`example/rag-cars.js`](/lessons/05-rag/example/rag-cars.js) accompagné du fichier [`hybrid.csv`](/lessons/05-rag/example/hybrid.csv) contenant les données utilisées pour la récupération. + +**Ada :** « Une fois que vous exécutez ce code, vous devriez voir les données trouvées dans le fichier CSV par le récupérateur, formatées sous forme d'une table Markdown, suivies de la réponse générée par l'IA à la question. Essayez de changer la question pour voir comment les données récupérées et la réponse évoluent. Vous pouvez également poser des questions sur des sujets non liés pour voir comment le modèle d'IA les gère. » + +```text +Example of the output: + +Found 1 matches: +| Person | Time Period | Description | +|---|---|---| +| Leonardo Da Vinci | 15th century | Italian polymath known for his art and inventions. | +| Isaac Newton | 17th century | English mathematician and physicist who formulated the laws of motion and universal gravitation. | +``` + +**Vous :** « C'est génial, je vois comment cela peut être utile lorsque l'on utilise l'appareil, ou plutôt comment cela l'a déjà été ou le sera : le voyage dans le temps est déroutant *soupir*. » + +**Ada :** « Voilà, voilà, vous vous en sortez très bien. Passons à l'étape suivante. » + +## Exercice - Aider Ada et Charles + +Maintenant que vous avez appris sur RAG, vous êtes prêt à aider Ada et Charles avec leur appareil. Cependant, en examinant de plus près l'appareil, il semble familier. + +**Vous :** « Scarabée Temporel, sais-tu ce que c'est ? » + +**Scarabée Temporel :** « Bien sûr, c'est moi, ou ce sera moi. Il me manque quelques pièces cependant. En y repensant, il me manque beaucoup de pièces, je n'ai même pas encore de carapace. » + +**Ada :** « Le Scarabée Temporel est un appareil qui vous permet de voyager dans le temps et l'espace, une fois que nous l'aurons fait fonctionner correctement. Comme je le disais, nous devons lui ajouter une nouvelle fonctionnalité, un module de génération augmentée par récupération (RAG). Cela nous aidera à récupérer des informations et le contexte nécessaire à partir de différentes époques au fur et à mesure de vos voyages. Nous voulons nous assurer de référencer toutes sortes de sources, Wikipédia est un bon point de départ. » + +**Vous :** « Que voulez-vous que je fasse ? » + +**Ada :** « Voici un exemple de code qui récupère des informations textuelles sur Tim Berners-Lee depuis Wikipédia. Tim sera très important un jour. » + +```javascript +const response = await fetch('https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&redirects=true&explaintext&titles=Tim%20Berners-Lee'); +const data = await response.json(); +const text = Object.values(data.query.pages)[0]?.extract; +``` + +**Vous :** « Je suppose que je ne suis pas le seul à être allé dans le futur ? » + +**Ada :** « ... » + +## Solution + +[Solution](/lessons/05-rag/solution/rag-www.js) + +## Vérification des connaissances + +**Question** : Quel est le rôle du récupérateur dans un système RAG ? + +A. Le récupérateur génère des réponses en fonction des données entrées. + +B. Le récupérateur génère des informations pertinentes en se basant sur les données d'entraînement du modèle. + +C. Le récupérateur trouve des informations pertinentes à partir de sources de données externes. + +[Quiz solution](/lessons/05-rag/solution/solution-quiz.md) + +## Ressources d'auto-apprentissage + +* [Génération augmentée par récupération et Indexes](https://learn.microsoft.com/azure/ai-studio/concepts/retrieval-augmented-generation) +* **Exemples d'applications** : + * [Chat IA sans serveur avec RAG](https://github.com/Azure-Samples/serverless-chat-langchainjs/) + * [Demandez à Youtube : Une API de questions-réponses basée sur RAG pour Youtube](https://github.com/Azure-Samples/langchainjs-quickstart-demo) +* [Atelier complet : Créez votre propre ChatGPT avec RAG](https://moaw.dev/workshop/gh\:azure-samples/azure-openai-rag-workshop/docs/workshop-qdrant.md) diff --git a/lessons/07-mcp/translations/README.fr.md b/lessons/07-mcp/translations/README.fr.md new file mode 100644 index 00000000..86c5b79f --- /dev/null +++ b/lessons/07-mcp/translations/README.fr.md @@ -0,0 +1,488 @@ +# Leçon 7 : MCP, Protocole de Contexte Modèle + +Dans ce chapitre, vous apprendrez : + +* Comment utiliser le Protocole de Contexte Modèle (MCP) pour diviser vos capacités serveur en un serveur et un client. +* Créer des outils, des ressources et des invites sur le serveur. +* Consommer le serveur en utilisant à la fois l'outil d'inspection et un client écrit. + +## Configuration + +Si ce n'est pas encore fait, configurez votre environnement de développement. Voici comment procéder : [Configurez votre environnement](/docs/setup/README.md). + +## Ressources associées + +[![Watch a short video about MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)](https://www.youtube.com/watch?v=YRfOiB0Im64) + +*Cette vidéo explique le Protocole de Contexte Modèle.* + +*🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur MCP* + +## Narratif - Scipion l'Africain + +> \[!NOTE] +> *Notre histoire jusqu'à présent. Vous êtes un mécanicien de Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez pris un appareil de voyage dans le temps. À travers vos voyages dans le temps, vous vous êtes retrouvé à Florence, où vous avez rencontré Léonard de Vinci. Vous êtes également allé dans l'empire aztèque, et c'est là que l'histoire continue.* +> +> Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. + +> \[!NOTE] +> Bien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-scipio) si vous préférez passer directement au contenu technique. + +*Nos héros, ayant tout juste appris l'importance des outils et de l'« appel d'outils » lors de leur rencontre avec Amelia Earhart, retournent maintenant au manoir d'Ada Lovelace pour discuter de leurs nouvelles connaissances. Un éclair de lumière enveloppe nos héros alors que le scarabée temporel les transporte dans le présent d'Ada. Ils se retrouvent dans le sous-sol du manoir d'Ada Lovelace. Charles Babbage n'est pas présent, mais Ada les attend. Elle est enthousiaste à l'idée d'entendre parler de leur voyage et des connaissances qu'ils ont acquises.* + +**Ada Lovelace**: "Bienvenue ! J'espère que votre voyage a été enrichissant." + +**Vous** : "Ça l'était ! Rencontrer Mme Earhart a été toute une expérience. Elle nous a appris l'importance des outils et comment les utiliser efficacement." + +**Ada Lovelace**: "Peu de gens comprennent mieux qu'Amelia l'importance des outils. Je suppose que vous avez également mis à jour son Scarabée Temporel ?" + +**Vous** : "Oui, nous l'avons fait ! Alors, quel est le programme maintenant ?" + +**Ada Lovelace** : "L'appel d'outils est certainement un concept puissant, qui améliore votre appareil. Toutefois, il manque un certain 'raffinement', disons-nous. Nous devons apprendre *comment le faire évoluer*. Nous avons besoin d'un protocole. Je connais quelqu'un qui pourra vous aider. Il s'appelle Scipion l'Africain, un grand stratège militaire de la Rome antique. Dommage qu'il ait passé tout son temps à des stratégies militaires, je suis certaine qu'il aurait été un brillant ingénieur. Allez-y." + +**Vous** : "Scipion l'Africain ? Je crois me souvenir de lui dans mes cours d'histoire." + +**Ada Lovelace** : "Bien alors, pourquoi êtes-vous encore là ? Le temps presse. Au revoir." + +La lumière tourbillonnante vous transporte à nouveau, et vous vous retrouvez dans une vaste pièce avec une grande table au centre. Les murs sont décorés de cartes et de stratégies militaires. Scipion l'Africain est debout près de la table, profondément plongé dans ses pensées. Il lève les yeux lorsque vous entrez : "Ada te misit/Ada vous a envoyé(e) ?" + +![Scipio Africanus](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/07-mcp/assets/scipio.png) + +> Scipion l'Africain, également connu sous le nom de Publius Cornelius Scipion Africanus, était un général et homme d'État romain éminent ayant vécu de 236 av. J.-C. à 183 av. J.-C. Il est surtout connu pour son rôle décisif dans la Deuxième Guerre Punique contre Carthage et pour avoir vaincu Hannibal lors de la bataille de Zama en 202 av. J.-C. +> Sa vie et sa carrière illustrent des qualités de leadership, de génie stratégique et de résilience. Ses contributions aux sphères militaires et politiques de Rome ont laissé une empreinte durable sur l'Empire romain. + +## Interagir avec Scipion + +Si vous souhaitez interagir avec Scipion, exécutez l'application [Characters](/app/README.md). + +> \[!IMPORTANT] +> Ceci est entièrement fictif ; les réponses sont générées par une IA. +> [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) + +![Scipio Africanus](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/07-mcp/assets/scipio.png) + +**Étapes** : + +1. Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript). +2. Naviguez vers */app* à la racine du dépôt. +3. Localisez la console et exécutez `npm install` suivi de `npm start`. +4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". +5. Discuter avec Scipion. + +Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). + +> \[!NOTE] +> Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. + +## Le besoin du Protocole de Contexte Modèle (MCP) + +**Time Beetle** : Le protocole dont Ada a parlé s'appelle le Protocole de Contexte Modèle (MCP). C'est un protocole qui permet de décentraliser l'architecture de votre application, la rendant plus évolutive et résiliente en ajoutant des ressources sur un serveur, voire plusieurs serveurs, et en déchargeant ces ressources du client. Je vais laisser Scipion vous expliquer le concept. + +**Vous** : "Oui, Ada nous a envoyés. Elle a dit que vous pourriez nous aider avec un protocole ?" + +**Scipio** : "Un protocole ? J'ai passé ma vie à développer des stratégies pour la bataille. Mais je suppose qu'un protocole est comme une stratégie. Il vous aide à organiser et gérer vos ressources efficacement et assure la communication entre elles." + +Parlons des manœuvres de contournement, de l'infiltration et de l'utilisation de la cavalerie. + +**Vous** : "D'accord, continuez ?" + +**Scipion** : "En bataille, nous utilisons souvent des manœuvres de contournement pour attaquer l'ennemi sur les côtés ou par l'arrière. Cela perturbe leurs formations et nous donne un avantage. La raison en est que l'ennemi n'est pas préparé à une attaque latérale et tend à concentrer toute son attention sur l'avant." + +**Vous** : "Hm, je suppose que c'est un peu comme si une application faisait trop de travail en amont sur un seul serveur. Les manœuvres de contournement seraient comme répartir la charge sur plusieurs serveurs, n'est-ce pas ?" + +**Scipion** : "Exactement ! En répartissant la charge, vous réduisez le risque de point de défaillance unique et améliorez la résilience globale du système. Cela facilite également la gestion et l'utilisation des ressources de manière efficace. + +## Protocole de Contexte Modèle (MCP) + +**Time Beetle** : "Pour compléter ce que dit Scipion, le Protocole de Contexte Modèle (MCP) est un moyen de décentraliser l'architecture de votre application. Il vous permet de diviser votre application en composants plus petits, plus faciles à gérer, qui peuvent fonctionner de manière indépendante. Voici quelques concepts importants à garder en tête : + +* **Hôtes MCP**: Programmes comme les EDI, par exemple GitHub Copilot dans Visual Studio Code ou Claude Desktop, qui initient une connexion au serveur ou aux serveurs. +* **Clients MCP**: Clients du protocole qui maintiennent une connexion 1:1 avec les serveurs MCP. +* **Serveurs MCP**: Programmes légers qui exposent des capacités spécifiques via MCP. +* **Sources de données locales** : Fichiers, bases de données et services sur votre ordinateur auxquels les serveurs MCP peuvent accéder en toute sécurité. +* **Services distants** : Systèmes externes accessibles via Internet (par exemple, des API) auxquels les serveurs MCP peuvent se connecter. + +et voici un aperçu rapide de l'architecture MCP : + +![Architecture of MCP](https://softchris.github.io/mcp-workshop/assets/images/diagram-791787b0cac57bc331c20e72b645d4f7.png) + +## Les éléments de base du MCP + +Pour construire un serveur, vous devez connaître les éléments de base suivants : + +* **Outils** : Les outils sont des fonctionnalités qui effectuent un calcul ou une tâche spécifique pour vous. Ils prennent une entrée, effectuent une computation et produisent une sortie. Typiquement, il peut s'agir d'un calcul, de la passation d'une commande, ou toute action similaire. + +* **Ressources** : Une ressource correspond à des données statiques. Cela inclut souvent des paramètres d'application, des schémas de base de données ou d'autres fichiers statiques sur un serveur, par exemple. + +* **Prompts** : Les prompts, ou modèles de prompts, fonctionnent comme une recette que vous pouvez réutiliser. L'idée est qu'en utilisant une telle recette, vous pourriez alors lui envoyer des paramètres et l'alimenter dans un LLM pour accomplir une tâche, comme par exemple générer une description de produit. + +### Découvrir des outils, des ressources et des invites + +**Vous** : "Et qu'en est-il de l'infiltration ?" + +**Scipion** : "L'infiltration consiste à utiliser de petites unités pour pénétrer les lignes ennemies, permettant ainsi d'en apprendre davantage sur l'ennemi et de semer la confusion." + +**Vous** : "Cela me semble similaire à utiliser cette manière de penser pour mieux comprendre nos serveurs, notamment quels outils, prompts et ressources ils possèdent." + +Pour résumer, je devrais : + +* **Utiliser des manœuvres de contournement**, ou dans mon cas diviser les fonctionnalités par fonctionnalités d'application dans plusieurs serveurs MCP différents afin que je puisse distribuer les serveurs en fonction de leur domaine d'utilisation. Ainsi, il devient plus facile d'évoluer et de gérer l'application. Ces serveurs peuvent même être mis à jour de manière indépendante les uns des autres. +* **Utiliser l'infiltration**, ou dans mon cas, comprendre ce que font ces serveurs, en termes d'outils, de prompts et de ressources. De cette manière, je peux m'assurer que j'interagis avec le bon serveur et que j'utilise les bons outils pour le travail. + +**Vous** : "Time Beetle, est-ce que je comprends bien ce concept ?" + +**Time Beetle** : "Oui, c'est exact. Les stratégies de Scipion peuvent être appliquées à l'architecture de votre application. Si vous le souhaitez, je peux vous enseigner les spécificités du Protocole de Contexte Modèle (MCP) et comment l'implémenter dans votre application." + +**Vous** : "Oui, je veux bien !" + +**Time Beetle** : "Bien, commençons par créer un serveur." + +## Créer un serveur MCP + +**Time Beetle**: "Pour créer votre premier serveur MCP, vous avez besoin de deux bibliothèques : `@modelcontextprotocol/sdk` et `zod` : + +* La bibliothèque `@modelcontextprotocol/sdk` fournit les outils nécessaires pour créer et gérer des serveurs MCP. +* `zod` est une bibliothèque de déclaration et de validation de schéma orientée TypeScript, qui vous aide à définir et valider les structures de données utilisées dans votre serveur MCP. + +```bash +npm install @modelcontextprotocol/sdk zod +``` + +Voici un exemple simple de création d'un serveur MCP à l'aide de ces bibliothèques : + +```typescript +import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { z } from "zod"; + +// Create an MCP server +const server = new McpServer({ + name: "Demo", + version: "1.0.0" +}); +``` + +Le code précédent effectue les actions suivantes : + +* Importe les classes et fonctions nécessaires depuis la bibliothèque `@modelcontextprotocol/sdk`. +* Crée une instance de serveur. La classe `McpServer` est utilisée pour créer le serveur, et prend un objet avec le nom du serveur et sa version en tant que paramètres. + +**Vous** : "Cela ne fait pas grand-chose pour l'instant, n'est-ce pas ?" + +**Time Beetle** : "Non, pas encore. Mais nous pouvons y ajouter des ressources et des outils. Un outil est quelque chose qui peut être utilisé pour accomplir une tâche spécifique, tandis qu'une ressource est quelque chose qui peut fournir des données ou une fonctionnalité à l'outil. Ajoutons-en quelques exemples ci-dessous : + +```typescript +server.tool("add", + { a: z.number(), b: z.number() }, + async ({ a, b }) => ({ + content: [{ type: "text", text: String(a + b) }] + }) + ); +``` + +Dans le code précédent, nous : + +* Avons défini un outil nommé « add » qui prend deux nombres en entrée et retourne leur somme en sortie. +* Décrit les paramètres d'entrée et leur validation en utilisant zod. La fonction `z.number()` est utilisée pour valider les données d'entrée, en garantissant que `a` et `b` sont des nombres. +* La fonction `async` est utilisée pour effectuer l'addition et retourner le résultat dans un format spécifique. + +**Vous** : "Intéressant, donc l'outil est comme une fonction qui peut être appelée par le client MCP ?" + +**Time Beetle** : "Exactement ! Le client MCP peut appeler cet outil et fournir les paramètres requis. Ajoutons également une ressource au serveur : + +```typescript +server.resource( + "greeting", + new ResourceTemplate("greeting://{name}", { list: undefined }), + async (uri, { name }) => ({ + contents: [{ + uri: uri.href, + text: `Hello, ${name}!` + }] + }) + ); +``` + +Dans ce code, nous : + +* Défini une ressource nommée "greeting" qui prend un nom en entrée et retourne un message de salutation. +* Utilise un modèle de ressource pour définir comment appeler la ressource `greeting://{name}`. Ce schéma est utilisé pour définir le format de l'URI de la ressource, qui inclut un espace réservé pour le nom. +* La fonction `async` est utilisée pour générer le message de salutation basé sur le nom fourni. + +**Vous** : "Donc, la ressource est comme une source de données, cela pourrait être une base de données, un fichier ou même une API ? Si c'était pour un fichier, j'utiliserais un URI file:// ? Comme ceci : + +```typescript +server.resource( + "file", + new ResourceTemplate("file://{path}", { list: undefined }), + async (uri, { path }) => ({ + // do something with the file at path, e.g., read its contents + contents: [{ + uri: uri.href, + text: `File at ${path}` + }] + }) + ); +``` + +**Time Beetle** : "Oui, exactement ! La ressource peut être tout ce qui fournit des données ou des fonctionnalités au serveur MCP. Vous pouvez définir des ressources pour des fichiers, des bases de données, des API ou toute autre source de données que vous souhaitez utiliser." + +Ajoutons maintenant une couche de transport au serveur afin qu'il puisse communiquer avec des clients. + +```typescript +// Start receiving messages on stdin and sending messages on stdout +const transport = new StdioServerTransport(); +await server.connect(transport); +``` + +Dans ce code, nous : + +* Créé une couche de transport en utilisant la classe `StdioServerTransport`, permettant au serveur de communiquer avec des clients via l'entrée et la sortie standards et fonctionne sur votre machine locale. Il existe également d'autres transports comme SSE et HTTP streaming, qui permettent de fonctionner à distance sur un serveur. Nous en parlerons plus tard. +* Appelé la méthode `connect` pour établir la connexion entre le serveur et la couche de transport. + +**Vous** : "Ok, donc maintenant que nous avons un serveur, comment le lancer et le tester ?" + +## Exécution et test du serveur MCP + +**Vous** : "Scipion, avez-vous testé vos tactiques ?" + +**Scipion** : "Bien sûr ! Le test est crucial dans n'importe quelle stratégie. Vous devez toujours tester vos tactiques avant de les déployer. En fait, je me souviens d'une bataille spécifique où j'ai utilisé une nouvelle tactique et elle a échoué lamentablement, appelée la Bataille de la Trébie. J'ai appris ma leçon et je n'ai jamais refait cette erreur." + +**Vous** : "Alors, comment puis-je tester mon serveur MCP ?" + +**Time Beetle** : "Vous pouvez tester votre serveur MCP en l'exécutant dans un terminal via l'inspecteur comme suit : + +```bash +npx @modelcontextprotocol/inspector node build/index.js +``` + +Ici, nous utilisons le package `@modelcontextprotocol/inspector` pour exécuter le serveur MCP. Nous fournissons l'argument `node build/index.js` pour spécifier le point d'entrée du serveur. Cela démarrera le serveur MCP et vous permettra d'interagir avec lui via l'inspecteur. + +**Vous** : "Et comment puis-je interagir avec le serveur ?" + +**Time Beetle** : "Cela démarre un serveur web sur le port 6274. Vous pouvez accéder à l'inspecteur en ouvrant votre navigateur web et en vous rendant sur `http://localhost:6274`. L'inspecteur fournit une interface conviviale pour interagir avec votre serveur MCP, vous permettant de tester les outils et les ressources que vous avez définis." + +![Inspector user interface](https://softchris.github.io/mcp-workshop/assets/images/connect-7703c67645f368d51c7b24a5d635d6a0.png) + +### -1- Connexion au serveur + +**Time Beetle** : Sélectionnez "Connecter" et vous devriez voir la fenêtre ci-dessous : + +![Connecting to server](https://softchris.github.io/mcp-workshop/assets/images/connected-7c3570d5d0a8659e27740d2950031cb3.png) + +Il devrait indiquer que vous êtes connecté. Vous pouvez ensuite interagir avec les outils ou les ressources. + +### -2- Lister les outils et ressources + +**Time Beetle** : "Ensuite, nous voulons lister les outils et ressources disponibles sur le serveur. Vous pouvez le faire en sélectionnant "Lister les outils" pour voir les outils disponibles : + +![Listing tools](https://softchris.github.io/mcp-workshop/assets/images/tools-listed-630aa49c9d7e4347108419fb83c409f6.png) + +Vous devriez maintenant voir l'outil « add » dans la liste. Vous pouvez également afficher les ressources en sélectionnant l'onglet « Ressources ». + +### -3- Exécuter l'outil + +**Time Beetle** : "Pour exécuter l'outil, sélectionnez l'outil "add" dans la liste. Renseignez les paramètres dans la boîte de dialogue qui apparaît sur le côté droit de l'écran. Par exemple, vous pouvez entrer `a=5` et `b=10` pour additionner ces deux nombres. Cliquez sur "Exécuter l'outil" pour exécuter l'outil. Vous devriez voir le résultat dans la zone de sortie ci-dessous. Le résultat devrait être `15`." + +![Run the tool](https://softchris.github.io/mcp-workshop/assets/images/ran-tool-271ecd5f84a457462e59789b579ee9d4.png) + +**Scipion** : "Intéressant, j'aurais aimé pouvoir tester mes stratégies comme cela. Cela semble très utile." + +**Vous** : "Oui, vraiment ! Je vois à quel point cela serait utile pour tester et déboguer." + +## Créer un client + +**Time Beetle** : "Vous pouvez également créer un client qui se connecte au serveur MCP et interagit avec lui. Voici un exemple de création d'un client MCP simple en utilisant la bibliothèque `@modelcontextprotocol/sdk` : + +```typescript +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; + +const transport = new StdioClientTransport({ + command: "node", + args: ["server.js"] +}); + +const client = new Client( + { + name: "example-client", + version: "1.0.0" + } +); + +await client.connect(transport); +``` + +Dans le code précédent, nous : + +* Créé une couche de transport en utilisant la classe `StdioClientTransport`, permettant au client de communiquer avec le serveur MCP via l'entrée et la sortie standards. +* Initie une nouvelle instance de `Client` avec un nom et une version. +* Connecté le client à la couche de transport en utilisant la méthode `connect`. + +**Vous** : "Laissez-moi deviner, il y a beaucoup plus à faire avec le client, n'est-ce pas ?" + +**Time Beetle** : Oui, parlons-en ensuite. Le client MCP peut être utilisé pour interagir avec le serveur, appeler des outils et accéder à des ressources. + +### Lister et appeler les outils et ressources + +**Time Beetle** : "Il y a généralement deux scénarios que vous souhaitez couvrir : lister les outils et ressources, et les appeler. Voici comment faire : + +```typescript +// List prompts +const prompts = await client.listPrompts(); + +// List resources +const resources = await client.listResources(); + +// list tools +const tools = await client.listTools(); +``` + +**Vous** : C'est super, ainsi je sais quelles capacités le serveur a. Mais comment puis-je les appeler ? + +**Time Beetle** : "D'accord, laissez-moi vous expliquer un exemple spécifique, à commencer par les outils. Vous commencez par demander quels outils sont disponibles, puis vous pouvez stocker cette réponse et ensuite appeler l'outil que vous souhaitez. Voici un exemple : + +Ainsi, lorsque vous listez les outils, vous obtenez une réponse au format suivant : + +```json + + { + "name": "", + "description": "". + "inputSchema": { + "type":"object", + "properties":{ + "a":{ + "type":"number" + }, + "b":{ + "type":"number" + }}, + "required":["a","b"], + "additionalProperties":false, + "$schema":"http://json-schema.org/draft-07/schema#" + } + } +``` + +ce qui signifie que, si vous avez un outil `add`, votre réponse, en listant les outils, ressemble à ceci : + +```json +{ + "name": "add", + "description": "Adding two numbers". + "inputSchema": { + "type":"object", + "properties":{ + "a":{ + "type":"number" + }, + "b":{ + "type":"number" + }}, + "required":["a","b"], + "additionalProperties":false, + "$schema":"http://json-schema.org/draft-07/schema#" + } +} +``` + +**Vous** : "D'accord, je peux donc stocker cela dans une variable, puis appeler l'outil que je veux ?" + +**Time Beetle** : "Exactement ! Regardons comment appeler un outil ensuite : + +```typescript +// List tools +const { tools } = await client.listTools(); + +const addTool = tools[0]; // Assuming the first tool is "add" +const subtractTool = tools[1]; // Assuming the second tool is "subtract" + +// Call a tool +const result = await client.callTool({ + name: addTool.name, + arguments: { + a: 5, + b: 10 + } +}); +``` + +**Vous** : "D'accord, cela a du sens. Et qu'en est-il des ressources ?" + +**Time Beetle** : "Les ressources sont similaires, mais vous devez fournir l'URI de la ressource et les paramètres qu'elle nécessite. Voici un exemple : + +```typescript +let resourceUri = "greeting://John"; // Replace with the actual resource URI + +// call resource +// Read a resource +const name = "John Doe"; // Replace with the actual name + +const resourceResult = await client.readResource({ + uri: `greeting:///${name}`, +}); + +console.log(resourceResult); // Hi John Doe! +``` + +**Vous** : "Je vois, intéressant, mais vous pensez à vous-même, je parie qu'on pourrait encore améliorer cela, non ? Time Beetle, nous pouvons améliorer cela, n'est-ce pas ?" + +**Time Beetle** : Oui, mais d'abord, faisons plaisir à Scipion. Nous devons discuter avec une certaine Mme Lamarr lors de notre prochaine étape. + +## Exercice - Création d'un système de gestion d'inventaire et d'outils pour Scipion + +**Scipion** : "Vous savez, j'ai tellement de parchemins et de rouleaux qui traînent. J'aimerais vraiment un outil pour m'aider à les organiser. J'ai aussi cet abaque que j'utilise pour les calculs. Pouvez-vous m’aider à créer un outil pour gérer mon inventaire ?" + +Voici un inventaire complet de mes parchemins : + +* Parchemin de tactiques. +* Parchemin d'approvisionnement alimentaire. + +Oh, voici un parchemin d'imposition. La taxation est un sujet capital, l'Empire veut sa part de tout ce que nous acquérons. Avez-vous résolu cela à votre époque ? Ne répondez pas, je ne veux pas savoir. + +Pour l'outil abaque, j'ai besoin qu'il prenne en charge les opérations suivantes : + +* Add: Add two numbers together. +* Subtract: Subtract one number from another. +* Multiply: Multiply two numbers together. +* Divide: Divide one number by another. + +## Solution + +[Solution](/lessons/07-mcp/solution/README.md) + +## Vérification des connaissances + +**Question** : Quels sont les différents types de ressources qu'un serveur MCP peut exposer ? + +A. Outils et point d'accès Web + +B. Outils et Ressources + +C. Outils, Ressources et Invites + +**Question** : Quels sont les moyens de tester un serveur MCP ? + +A. Inspector + +B. Un client MCP personnalisé + +C. Visual Studio Code + +D. curl + +E. Toutes les réponses ci-dessus + +[Solution Quiz](/lessons/07-mcp/solution/solution-quiz.md) + +## Résumé + +Dans ce chapitre, nous avons appris les points suivants : + +* Le Protocole de Contexte Modèle, MCP, est un excellent moyen de déléguer des capacités à des serveurs, plutôt que de concentrer toutes vos fonctionnalités en un seul endroit. Cela permet à vos applications de rester petites et ciblées. L'avantage supplémentaire est que différentes équipes peuvent également gérer différents serveurs. Grâce au fait que MCP est un protocole, cela signifie en outre que quiconque souhaitant partager des capacités peut le faire dans un format commun. +* De plus, nous avons vu comment consommer un serveur MCP à l'aide de l'outil d'inspection ou d'un client écrit. + +## Ressources d'auto-apprentissage + +* [Construire des serveurs MCP](https://github.com/microsoft/mcp-for-beginners/tree/main/03-GettingStarted/01-first-server) diff --git a/package.json b/package.json index a7c914ef..039c5612 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,6 @@ "tsx": "^4.19.3" }, "scripts": { - "genai:translate": "npx genaiscript@latest run translator \"./lessons/*/README.md\" --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr -x \"filenameTemplate={{dirname}}/translations/{{basename}}.{{lang}}{{extname}}\"" + "genai:translate": "npx genaiscript@latest run translator \"./lessons/*/README.md\" --no-run-trace --remote https://github.com/pelikhan/action-continuous-translation --remote-install -x glossaryFile=glossary.md -x lang=fr -x \"filenameTemplate={{dirname}}/translations/{{basename}}.{{lang}}{{extname}}\"" } } diff --git a/translations/fr.json b/translations/fr.json index 21af8596..c239e3cb 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -852,5 +852,237 @@ "Generative AI with JavaScript video series": "* [Série de vidéos sur l'intelligence artificielle générative avec JavaScript](https://aka.ms/genai-js)", "Building MCP Servers": "Construire des serveurs MCP", "Building a Client": "Construire un client", - "Building a Client with an LLM": "Construire un client avec un LLM" + "Building a Client with an LLM": "Construire un client avec un LLM", + "Lesson 7: MCP, Model Context Protocol": "Leçon 7 : MCP, Protocole de Contexte Modèle", + "How to use the Model Context Protocol, MCP to split up your server capabilities .7EFA72373C2A59C79B71": "Comment utiliser le Protocole de Contexte Modèle (MCP) pour diviser vos capacités serveur en un serveur et un client.", + "Create tools, resources and prompts on the server.": "Créer des outils, des ressources et des invites sur le serveur.", + "Consume the server using both the inspector tool and a written client.": "Consommer le serveur en utilisant à la fois l'outil d'inspection et un client écrit.", + "This video explains Model Context Protocol.": "Cette vidéo explique le Protocole de Contexte Modèle.", + "Narrative - Scipio Africanus": "Narratif - Scipion l'Africain", + "Our heroes, having just learned about tools and \"tool-calling\" during their meet.FB3F57E4ABDF00AAE8E8": "Nos héros, ayant tout juste appris l'importance des outils et de l'« appel d'outils » lors de leur rencontre avec Amelia Earhart, retournent maintenant au manoir d'Ada Lovelace pour discuter de leurs nouvelles connaissances. Un éclair de lumière enveloppe nos héros alors que le scarabée temporel les transporte dans le présent d'Ada. Ils se retrouvent dans le sous-sol du manoir d'Ada Lovelace. Charles Babbage n'est pas présent, mais Ada les attend. Elle est enthousiaste à l'idée d'entendre parler de leur voyage et des connaissances qu'ils ont acquises.", + "The swirling of light envelops you again and you find yourself in a large room w.966CE6A1DE1CB69419A2": "La lumière tourbillonnante vous transporte à nouveau, et vous vous retrouvez dans une vaste pièce avec une grande table au centre. Les murs sont décorés de cartes et de stratégies militaires. Scipion l'Africain est debout près de la table, profondément plongé dans ses pensées. Il lève les yeux lorsque vous entrez : \"Ada te misit/Ada vous a envoyé(e) ?\"", + "Scipio Africanus, also known as Publius Cornelius Scipio Africanus, was a promin.1339BF4313AE60047A28": "Scipion l'Africain, également connu sous le nom de Publius Cornelius Scipion Africanus, était un général et homme d'État romain éminent ayant vécu de 236 av. J.-C. à 183 av. J.-C. Il est surtout connu pour son rôle décisif dans la Deuxième Guerre Punique contre Carthage et pour avoir vaincu Hannibal lors de la bataille de Zama en 202 av. J.-C.\nSa vie et sa carrière illustrent des qualités de leadership, de génie stratégique et de résilience. Ses contributions aux sphères militaires et politiques de Rome ont laissé une empreinte durable sur l'Empire romain.", + "Interact With Scipio": "Interagir avec Scipion", + "Chat with Scipio.": "Discuter avec Scipion.", + "The need for Model Context Protocol (MCP)": "Le besoin du Protocole de Contexte Modèle (MCP)", + "Let's talk about flanking maneuvers, infiltration, and the use of cavalry.": "Parlons des manœuvres de contournement, de l'infiltration et de l'utilisation de la cavalerie.", + "Model Context Protocol (MCP)": "Protocole de Contexte Modèle (MCP)", + "and here's a quick overview of the MCP architecture:": "et voici un aperçu rapide de l'architecture MCP :", + "MCP Building Blocks": "Les éléments de base du MCP", + "To build a server, you need to know about the core building blocks, those are:": "Pour construire un serveur, vous devez connaître les éléments de base suivants :", + "Discovering Tools, Resources and Prompts": "Découvrir des outils, des ressources et des invites", + "To sum things up, I should:": "Pour résumer, je devrais :", + "Creating an MCP Server": "Créer un serveur MCP", + "Here's a simple example of how to create an MCP server using these libraries:": "Voici un exemple simple de création d'un serveur MCP à l'aide de ces bibliothèques :", + "The preceding code does the following:": "Le code précédent effectue les actions suivantes :", + "In the preceding code, we:": "Dans le code précédent, nous :", + "Defined a tool named \"add\" that takes two numbers as input and returns their sum.C7C13DD70CE79ABD1D46": "Avons défini un outil nommé « add » qui prend deux nombres en entrée et retourne leur somme en sortie.", + "In this code, we:": "Dans ce code, nous :", + "Now, let's add a transport layer to the server so it can communicate with client.27671087D34EBEAAAC54": "Ajoutons maintenant une couche de transport au serveur afin qu'il puisse communiquer avec des clients.", + "Running and Testing the MCP Server": "Exécution et test du serveur MCP", + "-1- Connect to the Server": "-1- Connexion au serveur", + "It should say you're connected. Now you can interact with tools or resources nex.BC0C68431FCF3424F1D3": "Il devrait indiquer que vous êtes connecté. Vous pouvez ensuite interagir avec les outils ou les ressources.", + "-2- List Tools and Resources": "-2- Lister les outils et ressources", + "Now you should see the \"add\" tool listed. You can also list the resources by sel.A7BF26E82DD8C4CDD472": "Vous devriez maintenant voir l'outil « add » dans la liste. Vous pouvez également afficher les ressources en sélectionnant l'onglet « Ressources ».", + "-3- Run the Tool": "-3- Exécuter l'outil", + "Creating a Client": "Créer un client", + "Listing and Calling Tools and Resources": "Lister et appeler les outils et ressources", + "So when you list tools, you get a response on the following format:": "Ainsi, lorsque vous listez les outils, vous obtenez une réponse au format suivant :", + "Assignment - Creating an Inventory and Tools Management System for Scipio": "Exercice - Création d'un système de gestion d'inventaire et d'outils pour Scipion", + "Here's a complete inventory of my scrolls:": "Voici un inventaire complet de mes parchemins :", + "Scroll of Tactics.": "Parchemin de tactiques.", + "Scroll of food supply.": "Parchemin d'approvisionnement alimentaire.", + "Oh, here's a Taxation scroll. Taxation is big thing, the Empire wants their cut .36897E7403F74912BC40": "Oh, voici un parchemin d'imposition. La taxation est un sujet capital, l'Empire veut sa part de tout ce que nous acquérons. Avez-vous résolu cela à votre époque ? Ne répondez pas, je ne veux pas savoir.", + "The abacus tool, I need it to support the following operations:": "Pour l'outil abaque, j'ai besoin qu'il prenne en charge les opérations suivantes :", + "A. Tools and Web endpoints": "A. Outils et point d'accès Web", + "B. Tools and Resources": "B. Outils et Ressources", + "C. Tools, Resources and Prompts": "C. Outils, Ressources et Invites", + "A. Inspector": "A. Inspector", + "B. A custom MCP client": "B. Un client MCP personnalisé", + "C. Visual Studio Code": "C. Visual Studio Code", + "D. curl": "D. curl", + "E. All of the above": "E. Toutes les réponses ci-dessus", + "Solution Quiz": "Solution Quiz", + "In this chapter, we've learned the following:": "Dans ce chapitre, nous avons appris les points suivants :", + "Model Context Protocol, MCP, is a great way to offload capabilties into servers .21BB03A73792B18703D1": "Le Protocole de Contexte Modèle, MCP, est un excellent moyen de déléguer des capacités à des serveurs, plutôt que de concentrer toutes vos fonctionnalités en un seul endroit. Cela permet à vos applications de rester petites et ciblées. L'avantage supplémentaire est que différentes équipes peuvent également gérer différents serveurs. Grâce au fait que MCP est un protocole, cela signifie en outre que quiconque souhaitant partager des capacités peut le faire dans un format commun.", + "Additionally we looked into how to consume an MCP Server using the Inspector too.CC4C830175964F6E7C71": "De plus, nous avons vu comment consommer un serveur MCP à l'aide de l'outil d'inspection ou d'un client écrit.", + "Lesson 5: Talk to Your Data with Retrieval-Augmented Generation (RAG)": "Leçon 5 : Discutez avec vos données grâce à la génération augmentée par récupération (RAG)", + "The basics of Retrieval-Augmented Generation (RAG) and how it can be used to enh.E12951796C2588633896": "Les bases de la génération augmentée par récupération (RAG) et comment cela peut être utilisé pour améliorer les réponses des modèles d'IA générative.", + "How to integrate external data sources into your AI application.": "Comment intégrer des sources de données externes à votre application d'IA.", + "How to leverage your data to improve the relevance and accuracy of the AI-genera.4CF131D4234D4F2D979F": "Comment exploiter vos données pour améliorer la pertinence et l'exactitude des contenus générés par l'IA.", + "This video explains Retrieval Augmented Generation (RAG), a method that helps th.2312DD68502F15BAFC15": "Cette vidéo explique la génération augmentée par récupération (RAG), une méthode qui aide l'IA à utiliser vos contenus en complément de ses données d'entraînement pour de meilleurs résultats.", + "🎥 Click on the image above to watch a short video about retrieval augmented gen.D49430C3D1C0BBB585BC": "🎥 Cliquez sur l'image ci-dessus pour regarder une courte vidéo sur la génération augmentée par récupération, RAG.", + "Narrative - Genesis": "Narration - Genèse", + "You land in the garden, it's late at night with a thick fog and eerie lights are.56FDB5EC2BD383DFCE12": "Vous atterrissez dans le jardin, il est tard dans la nuit avec un brouillard épais, et des lumières étranges scintillent au loin. Le manoir se dresse devant vous. Leonardo regarde autour de lui, les yeux écarquillés d'émerveillement.", + "Running from the Dogs": "Fuir les chiens", + "You hear barking and the sound of dogs running towards you. You turn to Leonardo.B9B3F690A430B1C3F185": "Vous entendez des aboiements et le bruit des chiens qui courent vers vous. Vous vous tournez vers Leonardo : \"Nous devons entrer, maintenant !\"", + "As you reach the mansion's door it swings open and a pair of attendants hurry ou.8A17C1C7D9E7E0825986": "En atteignant la porte du manoir, elle s'ouvre brusquement, et une paire de serviteurs se précipitent dehors. Après vous avoir observés, ils vous font signe de les suivre.", + "You come face to face with Ada Lovelace, her eyes gleaming with curiosity.": "Vous vous retrouvez face à Ada Lovelace, ses yeux brillant de curiosité.", + "Meeting Ada and Charles": "Rencontre avec Ada et Charles", + "Charles Babbage steps forward, examining the Time Beetle in your hand. \"This dev.657EBBFB7389EA5B9DCD": "Charles Babbage s'avance et examine le Scarabée Temporel dans votre main. \"Cet appareil est remarquable, mais il est un peu défectueux, n'est-ce pas ? Vous l'avez sûrement remarqué.\"", + "Leonardo nodded, \"Sì, it has been acting strangely.\"": "Leonardo hocha la tête, \"Sì, il agit de manière étrange.\"", + "Interact with Ada Lovelace": "Interagir avec Ada Lovelace", + "Chat with Ada.": "Discutez avec Ada.", + "Known challenges with large language models, LLMs": "Défis connus avec les modèles de langage à grande échelle (LLMs)", + "First, you need to address some challenges before diving into RAG details. These.97264BC07715281D813B": "Tout d'abord, vous devez traiter certaines difficultés avant d'entrer dans les détails de RAG. Ces modèles, entraînés sur de vastes ensembles de données textuelles, peuvent produire des réponses pertinentes et correctes. Mais, comme toute source de données, leurs sorties peuvent être inexactes, incomplètes ou trompeuses en raison de divers facteurs.", + "This makes it difficult to tell if the information generated by an LLM is correc.2FB7C7DAD25E7FB50797": "Cela rend difficile de déterminer si les informations générées par un LLM sont correctes ou non. C'est là qu'intervient RAG.", + "Retrieval-Augmented generation, RAG core concepts": "Génération augmentée par récupération, concepts de base", + "Retrieval-Augmented generation (RAG) is a powerful technique that combines the s.885B4883C5B35122AC19": "La génération augmentée par récupération (RAG) est une technique puissante qui combine les forces de deux approches différentes en traitement du langage naturel : les méthodes basées sur la récupération et les modèles génératifs. Cette approche hybride permet de générer des réponses à la fois contextuellement pertinentes et riches en contenu, aidant ainsi à atténuer certains des défis connus avec les LLMs.", + "Here's a schema illustrating how a RAG system works:": "Voici un schéma illustrant le fonctionnement d'un système RAG :", + "This combination allows for more precise and relevant answers, by using data tha.19019171F637717D1C6C": "Cette combinaison permet d'obtenir des réponses plus précises et pertinentes en utilisant des données que vous fournissez plutôt que de se fier uniquement aux données d'entraînement du modèle.", + "Integrating external data sources": "Intégration de sources de données externes", + "Integrating external data sources into your AI application can be done in a vari.46D1EE3B8E4858496F31": "L'intégration de sources de données externes dans votre application d'IA peut être réalisée de différentes manières, en fonction du type de données que vous souhaitez utiliser et de la complexité du mécanisme de récupération. Voici quelques méthodes courantes :", + "Once you've settled on a method for integrating external data sources, you may a.6F9C383C285755F792D4": "Une fois que vous avez choisi une méthode pour intégrer des sources de données externes, vous devrez peut-être également envisager comment prétraiter et formater les données afin qu'elles puissent être facilement utilisées par le modèle d'IA. Cela peut impliquer de nettoyer les données, de les convertir dans un format approprié (comme du texte brut ou Markdown) ou de les diviser en segments plus petits pour une récupération plus facile.", + "Augmenting the prompt": "Augmenter le prompt", + "For example, if you're building an app to answer questions about cars, you could.0028A9BE774FABD1B6A6": "Par exemple, si vous construisez une application pour répondre à des questions sur les voitures, vous pourriez avoir un prompt comme celui-ci :", + "By providing the AI model with additional context and information, you can help .A200B3FED49A8FA79688": "En fournissant au modèle d'IA un contexte supplémentaire et des informations, vous pouvez aider à orienter le processus de génération et à garantir que les réponses soient précises et pertinentes par rapport au sujet abordé.", + "Code example": "Exemple de code", + "Assignment - Helping Ada and Charles": "Exercice - Aider Ada et Charles", + "Having learned about RAG, you're now ready to help Ada and Charles with their de.9596E31895B0288A6355": "Maintenant que vous avez appris sur RAG, vous êtes prêt à aider Ada et Charles avec leur appareil. Cependant, en examinant de plus près l'appareil, il semble familier.", + "A. The retriever generates responses based on the input data.": "A. Le récupérateur génère des réponses en fonction des données entrées.", + "B. The retriever generates relevant information based on the model's training da.D694ADE3E819E3969763": "B. Le récupérateur génère des informations pertinentes en se basant sur les données d'entraînement du modèle.", + "C. The retriever finds relevant information from external data sources.": "C. Le récupérateur trouve des informations pertinentes à partir de sources de données externes.", + "Retrieval-Augmented Generation and Indexes": "Génération augmentée par récupération et Indexes", + "Serverless AI Chat with RAG": "Chat IA sans serveur avec RAG", + "Ask Youtube: A RAG-based Youtube Q&A API": "Demandez à Youtube : Une API de questions-réponses basée sur RAG pour Youtube", + "Full-length workshop: Create your own ChatGPT with RAG": "Atelier complet : Créez votre propre ChatGPT avec RAG", + "[!NOTE]\n*Our story so far. You are a mechanic from 1860s London. You were workin.733792134DE76CF624D8": "[!NOTE]\n*Notre histoire jusqu'à présent. Vous êtes un mécanicien de Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez pris un appareil de voyage dans le temps. À travers vos voyages dans le temps, vous vous êtes retrouvé à Florence, où vous avez rencontré Léonard de Vinci. Vous êtes également allé dans l'empire aztèque, et c'est là que l'histoire continue.*", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.C107240EAC68507C06A2": "[!NOTE]\nBien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-scipio) si vous préférez passer directement au contenu technique.", + "**Ada Lovelace**: \"Welcome back! I trust your journey was enlightening.\"": "**Ada Lovelace**: \"Bienvenue ! J'espère que votre voyage a été enrichissant.\"", + "**You**: \"It was! Meeting with Mrs. Earhart was quite the experience. She taught.F0ADC874BB8619F96196": "**Vous** : \"Ça l'était ! Rencontrer Mme Earhart a été toute une expérience. Elle nous a appris l'importance des outils et comment les utiliser efficacement.\"", + "**Ada Lovelace**: \"There are few people who understand the importance of tools b.6665EBD9651A476C02F8": "**Ada Lovelace**: \"Peu de gens comprennent mieux qu'Amelia l'importance des outils. Je suppose que vous avez également mis à jour son Scarabée Temporel ?\"", + "**You**: \"Yes, we did! So what's next on the agenda?\"": "**Vous** : \"Oui, nous l'avons fait ! Alors, quel est le programme maintenant ?\"", + "**Ada Lovelace**: \"Tool calling is definitely a powerful concept, one that impro.86908B85122D4A7EFFDE": "**Ada Lovelace** : \"L'appel d'outils est certainement un concept puissant, qui améliore votre appareil. Toutefois, il manque un certain 'raffinement', disons-nous. Nous devons apprendre *comment le faire évoluer*. Nous avons besoin d'un protocole. Je connais quelqu'un qui pourra vous aider. Il s'appelle Scipion l'Africain, un grand stratège militaire de la Rome antique. Dommage qu'il ait passé tout son temps à des stratégies militaires, je suis certaine qu'il aurait été un brillant ingénieur. Allez-y.\"", + "**You**: \"Scipio Africanus? I think I remember him from history class.": "**Vous** : \"Scipion l'Africain ? Je crois me souvenir de lui dans mes cours d'histoire.\"", + "**Ada Lovelace**: \"Good then, why are you still here? Time is of the essence. Ta.55DEE6216B26F33853AC": "**Ada Lovelace** : \"Bien alors, pourquoi êtes-vous encore là ? Le temps presse. Au revoir.\"", + "If you want to interact with Scipio, run the [Characters](/app/README.md) app.": "Si vous souhaitez interagir avec Scipion, exécutez l'application [Characters](/app/README.md).", + "**Time Beetle**: The protocol Ada spoke of is called the Model Context Protocol .D26B011A0D1D6B79BAF4": "**Time Beetle** : Le protocole dont Ada a parlé s'appelle le Protocole de Contexte Modèle (MCP). C'est un protocole qui permet de décentraliser l'architecture de votre application, la rendant plus évolutive et résiliente en ajoutant des ressources sur un serveur, voire plusieurs serveurs, et en déchargeant ces ressources du client. Je vais laisser Scipion vous expliquer le concept.", + "**You**: \"Yes, Ada sent us. She said you could help us with a protocol?\"": "**Vous** : \"Oui, Ada nous a envoyés. Elle a dit que vous pourriez nous aider avec un protocole ?\"", + "**Scipio**: \"Protocol? I've spent my life developing strategies for battle. But .F568988E110C1ADEB785": "**Scipio** : \"Un protocole ? J'ai passé ma vie à développer des stratégies pour la bataille. Mais je suppose qu'un protocole est comme une stratégie. Il vous aide à organiser et gérer vos ressources efficacement et assure la communication entre elles.\"", + "**You**: \"Ok, go on?\"": "**Vous** : \"D'accord, continuez ?\"", + "**Scipio**: \"In battle, we often use flanking maneuvers to attack the enemy from.59A88EFE558D05C85E7C": "**Scipion** : \"En bataille, nous utilisons souvent des manœuvres de contournement pour attaquer l'ennemi sur les côtés ou par l'arrière. Cela perturbe leurs formations et nous donne un avantage. La raison en est que l'ennemi n'est pas préparé à une attaque latérale et tend à concentrer toute son attention sur l'avant.\"", + "**You**: \"Hm, I guess that's similar to having an app doing too much work up fro.C2B2B27C1C332202DFB7": "**Vous** : \"Hm, je suppose que c'est un peu comme si une application faisait trop de travail en amont sur un seul serveur. Les manœuvres de contournement seraient comme répartir la charge sur plusieurs serveurs, n'est-ce pas ?\"", + "**Scipio**: \"Exactly! By distributing the load, you reduce the risk of a single .33CEC5AD9FDA9144E9AE": "**Scipion** : \"Exactement ! En répartissant la charge, vous réduisez le risque de point de défaillance unique et améliorez la résilience globale du système. Cela facilite également la gestion et l'utilisation des ressources de manière efficace.", + "**Time Beetle**: \"To add to Scipio's point, the Model Context Protocol (MCP) is .7AC78523CAC0317A9057": "**Time Beetle** : \"Pour compléter ce que dit Scipion, le Protocole de Contexte Modèle (MCP) est un moyen de décentraliser l'architecture de votre application. Il vous permet de diviser votre application en composants plus petits, plus faciles à gérer, qui peuvent fonctionner de manière indépendante. Voici quelques concepts importants à garder en tête :", + "**MCP Hosts**: Programs like IDEs, for example GitHub Copilot in Visual Studio C.F6D2C421F598A92175E9": "**Hôtes MCP**: Programmes comme les EDI, par exemple GitHub Copilot dans Visual Studio Code ou Claude Desktop, qui initient une connexion au serveur ou aux serveurs.", + "**MCP Clients**: Protocol clients that maintain 1:1 connections with MCP servers.1041C9E4FF82A7455E87": "**Clients MCP**: Clients du protocole qui maintiennent une connexion 1:1 avec les serveurs MCP.", + "**MCP Servers**: Lightweight programs that expose specific capabilities through .FDB91A640239FB078DFE": "**Serveurs MCP**: Programmes légers qui exposent des capacités spécifiques via MCP.", + "**Local Data Sources**: Files, databases, and services on your computer that MCP.ADEC995E9CDF442766F8": "**Sources de données locales** : Fichiers, bases de données et services sur votre ordinateur auxquels les serveurs MCP peuvent accéder en toute sécurité.", + "**Remote Services**: External systems available over the internet (e.g., APIs) t.6C3CF5B0D45A0319B938": "**Services distants** : Systèmes externes accessibles via Internet (par exemple, des API) auxquels les serveurs MCP peuvent se connecter.", + "**Tools**: Tools are things that compute something for you, they take an input, .A1D7EAA3E988D7B11219": "**Outils** : Les outils sont des fonctionnalités qui effectuent un calcul ou une tâche spécifique pour vous. Ils prennent une entrée, effectuent une computation et produisent une sortie. Typiquement, il peut s'agir d'un calcul, de la passation d'une commande, ou toute action similaire.", + "**Resources**: A resource is static data, usually that means application setting.A9623EF49DA889A50B62": "**Ressources** : Une ressource correspond à des données statiques. Cela inclut souvent des paramètres d'application, des schémas de base de données ou d'autres fichiers statiques sur un serveur, par exemple.", + "**Prompts**. Prompts, or prompt templates, are like a recipe that you can reuse..7711B7AC14C8AA134736": "**Prompts** : Les prompts, ou modèles de prompts, fonctionnent comme une recette que vous pouvez réutiliser. L'idée est qu'en utilisant une telle recette, vous pourriez alors lui envoyer des paramètres et l'alimenter dans un LLM pour accomplir une tâche, comme par exemple générer une description de produit.", + "**You**: \"And what about infiltration?\"": "**Vous** : \"Et qu'en est-il de l'infiltration ?\"", + "**Scipio**: \"Infiltration is about using small units to infiltrate enemy lines, .24B34C26DE65E9559E62": "**Scipion** : \"L'infiltration consiste à utiliser de petites unités pour pénétrer les lignes ennemies, permettant ainsi d'en apprendre davantage sur l'ennemi et de semer la confusion.\"", + "**You**: \"Sounds to me like we can use this way of thinking to find out more abo.72DAA6D1BE13FCDCB0EE": "**Vous** : \"Cela me semble similaire à utiliser cette manière de penser pour mieux comprendre nos serveurs, notamment quels outils, prompts et ressources ils possèdent.\"", + "**Use flanking maneuvers**, or in my case break down features by app functionali.760BD28A84A303D64900": "**Utiliser des manœuvres de contournement**, ou dans mon cas diviser les fonctionnalités par fonctionnalités d'application dans plusieurs serveurs MCP différents afin que je puisse distribuer les serveurs en fonction de leur domaine d'utilisation. Ainsi, il devient plus facile d'évoluer et de gérer l'application. Ces serveurs peuvent même être mis à jour de manière indépendante les uns des autres.", + "**Use infiltration**, or in my case, figure out what these servers are doing, in.65A7703B42B582AE1A89": "**Utiliser l'infiltration**, ou dans mon cas, comprendre ce que font ces serveurs, en termes d'outils, de prompts et de ressources. De cette manière, je peux m'assurer que j'interagis avec le bon serveur et que j'utilise les bons outils pour le travail.", + "**You**: \"Time Beetle, am I understanding things correctly?\"": "**Vous** : \"Time Beetle, est-ce que je comprends bien ce concept ?\"", + "**Time Beetle**: \"Yes, you are. Scipio's strategies can be applied to your appli.B40F019A0F5A88087A4A": "**Time Beetle** : \"Oui, c'est exact. Les stratégies de Scipion peuvent être appliquées à l'architecture de votre application. Si vous le souhaitez, je peux vous enseigner les spécificités du Protocole de Contexte Modèle (MCP) et comment l'implémenter dans votre application.\"", + "**You**: \"Yes, please!\"": "**Vous** : \"Oui, je veux bien !\"", + "**Time Beetle**: \"Good, let's start with creating a server\"": "**Time Beetle** : \"Bien, commençons par créer un serveur.\"", + "💼 Slides: [Retrieval augmented generation, RAG](/videos/slides/03-rag.pptx)": "💼 Diapositives : [Génération augmentée par récupération, RAG](/videos/slides/03-rag.pptx)", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.1C6E22C551C0E4E9806D": "[!NOTE]\nBien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-ada-lovelace) si vous préférez aller directement au contenu technique.", + "**You**: \"Leonardo, it's time to go,\" you said, pressing the button. The device .B67CB1E00F440233FEFA": "**Vous** : « Leonardo, il est temps de partir », avez-vous dit en appuyant sur le bouton. L'appareil s'est mis à bourdonner et une voix mécanique a résonné : « Il est temps de rentrer à la maison, il est temps pour la 'genèse'. »", + "**Leonardo:** \"Genesis? Che cosa significa?\" Leonardo asked, confused. Before yo.2C0B1B3749ADEDB192C4": "**Leonardo :** « Genèse ? Che cosa significa ? » Leonardo demanda, confus. Avant que vous ne puissiez répondre, le monde se dissout en un flou de couleurs et de sons, le temple disparaissant tandis que vous étiez propulsé à travers le temps.", + "**Ada:** \"Ah, it's about time you arrived,\" she said warmly. \"We need you to run.06D0750A1F4176EFA392": "**Ada :** « Ah, il était temps que vous arriviez », dit-elle chaleureusement. « Nous avons besoin de vous pour une commission. »", + "**You:** \"About time\", you keep saying that. Dinocrates said the same, but I'm n.44465959BB26CBE8946E": "**Vous :** « Il était temps ? Vous continuez de dire cela. Dinocrates disait la même chose, mais je ne suis pas sûr de ce que vous voulez dire. »", + "**Ada:** Hush, no time for that now, we need to talk about the device you're hol.B1EECE0BE99E49D3DD5C": "**Ada :** « Silence, pas de temps pour cela maintenant, nous devons parler de l'appareil que vous tenez. Charles, expliquez-leur. »", + "**You:** But..": "**Vous :** « Mais... »", + "**Ada:** The device isn't quite ready, we need to give it more capabilities. We .3874FA9E43739CAE749E": "**Ada :** « L'appareil n'est pas encore prêt, nous devons lui donner plus de capacités. Nous devons le rendre plus intelligent, plus conscient du monde qui l'entoure. L'idée est qu'il puisse récupérer des informations de différentes périodes et les utiliser pour produire des réponses précises et pertinentes. Pouvez-vous nous aider ? »", + "**You:** Of course, sounds like we need to *augment* the responses of the device.3A099C6D9E16DD65C419": "**Vous :** « Bien sûr, on dirait que nous devons *augmenter* les réponses de l'appareil avec des données, cela semble logique. »", + "**Ada:** Let's talk about a concept I'd like to call RAG, or Retrieval-Augmented.3983C62D6124EAB9D7C5": "**Ada :** « Parlons d'un concept que j'aimerais appeler RAG, ou génération augmentée par récupération. »", + "**Ada:** Let’s start by discussing the AI we’ll use to power the device. We’ll r.15FF95C8031F4D060718": "**Ada :** « Commençons par discuter de l'IA que nous utiliserons pour alimenter l'appareil. Nous nous appuierons sur des “modèles d'IA” associés à un système de récupération de données pour améliorer la qualité des réponses. »", + "**Out-of-date sources:** The data used to train the model may be outdated and no.53D68968D8172DD9D784": "**Sources obsolètes :** Les données utilisées pour entraîner le modèle peuvent être dépassées et ne plus être exactes.", + "**Wrong or inaccurate information:** The sources used to train the model may con.BAA288F8D985A643B634": "**Informations erronées ou inexactes :** Les sources utilisées pour entraîner le modèle peuvent contenir des informations incorrectes ou trompeuses, telles que des fake news ou des opinions biaisées.", + "**Non-authoritative sources:** The model may not be able to distinguish between .887C0089FB569743EB1F": "**Sources non autoritaires :** Le modèle peut ne pas être en mesure de distinguer entre les sources autoritaires et non autoritaires dans ses données d'entraînement, ce qui conduit à des informations peu fiables.", + "**You:** So I need to make sure the device can provide accurate information, eve.47E1EA47E72007778FBF": "**Vous :** « Donc, je dois m'assurer que l'appareil peut fournir des informations exactes, même quand il n'est pas sûr de la réponse ? »", + "**Ada:** Yes, that's the idea. By combining the strengths of retrieval-based met.BDA194232E75A8F2A90F": "**Ada :** « Oui, c'est l'idée. En combinant les forces des méthodes basées sur la récupération et des modèles génératifs, nous obtenons un système d'IA meilleur. »", + "**Ada:** Ah yes, time to discuss RAG specifically. Let's start with some basics:.1435388D2BDC63E33932": "**Ada :** « Ah oui, il est temps de discuter spécifiquement de RAG. Commençons par quelques bases : »", + "At its core, RAG involves two main components: a **retriever** and a **generator.C95CB5363B0D65DF7B13": "Au cœur de RAG, il y a deux composants principaux : un **récupérateur** et un **générateur**.", + "**The retriever:** it's responsible for finding relevant information from extern.B07BEDEFB13B83C19D40": "**Le récupérateur :** il est responsable de trouver des informations pertinentes à partir de sources de données externes qui peuvent être utilisées pour améliorer les réponses générées par l'IA, comme un moteur de recherche. Ces informations peuvent prendre la forme de texte, d'images ou de tout autre type de données pertinentes pour le contexte de la conversation, bien que le texte soit le type de données le plus couramment utilisé.", + "**The generator:** it takes the retrieved information and uses it to generate a .662825F53EB57617639D": "**Le générateur :** il prend les informations récupérées et les utilise pour produire une réponse contextuellement pertinente et informative.", + "**User input:** The user asks a question.": "**Entrée utilisateur :** L'utilisateur pose une question.", + "**Retriever:** The retriever component searches for relevant information using o.5868EDF2A433D02EF41E": "**Récupérateur :** Le composant récupérateur recherche des informations pertinentes en utilisant une ou plusieurs bases de connaissances.", + "**Augmented prompt:** The retrieved information is combined with the user questi.C43607F8CDD70A332C91": "**Prompt augmenté :** Les informations récupérées sont combinées avec la question et le contexte utilisateur pour créer un prompt augmenté.", + "**Generator:** The LLM uses the augmented prompt to generate a response.": "**Générateur :** Le LLM utilise le prompt augmenté pour produire une réponse.", + "**Ada:** Questions?": "**Ada :** « Des questions ? »", + "**You:** So the retriever finds the information and the generator uses it to gen.158B98FEA91AF0B5841E": "**Vous :** « Donc le récupérateur trouve les informations et le générateur les utilise pour générer une réponse ? »", + "**Ada:** Exactly, you're getting the hang of it.": "**Ada :** « Exactement, vous commencez à comprendre. »", + "**Ada:** Now that we've covered the basics of RAG, let's talk about how you can .9ECFF218E5FF2D457020": "**Ada :** « Maintenant que nous avons couvert les bases de RAG, parlons de la manière dont vous pouvez intégrer des sources de données externes dans votre application d'IA. »", + "**APIs:** Many external data sources provide APIs that allow you to access their.2315BB3AAAFF5E5D4193": "**APIs :** De nombreuses sources de données externes fournissent des APIs qui vous permettent d'accéder à leurs données de manière programmatique. Vous pouvez utiliser ces APIs pour récupérer des informations en temps réel et les utiliser pour améliorer les réponses générées par l'IA.", + "**Databases:** If you have a large amount of data that you want to use for retri.62FDFD2B0F507D1AE89E": "**Bases de données :** Si vous disposez d'un grand volume de données que vous souhaitez utiliser pour la récupération, vous pouvez les stocker dans une base de données et les interroger selon les besoins. Cela peut être utile pour les données structurées devant être accessibles rapidement.", + "[!NOTE]\nWhen integrating external data sources into your AI application, it's im.E2602251372D8F8B0829": "[!NOTE]\nLorsque vous intégrez des sources de données externes dans votre application d'IA, il est important de prendre en compte les implications en termes de confidentialité et de sécurité liées à l'accès et au stockage des données. Assurez-vous de disposer des autorisations et des protections nécessaires pour protéger les données et de respecter les réglementations en vigueur.", + "If you're using a database, you also want to think about how you want to *search.A86190FC5DD4F30BEE38": "Si vous utilisez une base de données, vous devez également réfléchir à la manière dont vous souhaitez *rechercher vos données* pour récupérer les informations les plus pertinentes. Cela peut se faire via une recherche par mot-clé, une recherche en texte intégral ou via des techniques plus avancées comme la recherche sémantique ou vectorielle qui peuvent nécessiter un indexage spécifique. Nous aborderons les techniques de recherche avancées dans une leçon ultérieure.", + "**You**: Can you explain terms like API and Databases in more 1860s terms?": "**Vous :** « Pouvez-vous expliquer des termes comme API et Bases de données dans des termes plus proches des années 1860 ? »", + "**Ada**: Of course, an API is like a messenger that delivers a message from one .10C8A9D0F04034A77F68": "**Ada :** « Bien sûr, une API est comme un messager qui transmet un message d'un endroit à un autre, et une base de données est comme une bibliothèque où vous stockez tous vos livres. »", + "**You**: Ah, I see, that makes sense.": "**Vous :** « Ah, je vois, cela a du sens. »", + "**Ada:** Are you still with me? Good, let's move on to the next step, let's try .938FFD3D429DBA9E4E05": "**Ada :** « Vous êtes toujours avec moi ? Bien, passons à l'étape suivante, essayons d'améliorer le prompt envoyé au modèle d'IA. »", + "**Ada:** Once you’ve set up a way to pull info from your data, you can add it to.CB9332A5002295504DA7": "**Ada :** « Une fois que vous avez mis en place un moyen d'extraire des informations de vos données, vous pouvez les ajouter au prompt du modèle d'IA. Mélangez simplement les informations récupérées avec le texte d'entrée en ajoutant un contexte ou des directives supplémentaires pour orienter la réponse de l'IA. »", + "[!TIP]\nNote this part of the prompt: `If there's not enough data in provided sou.3122A095CE2BF1CF89D2": "[!TIP]\nNotez cette partie du prompt : `S'il n'y a pas assez de données dans les sources fournies, dites que vous ne savez pas.`. Ceci est important pour éviter que l'IA ne génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée un *échappatoire* et est une bonne pratique pour garantir la qualité du contenu généré.", + "RAG can be considered as an advanced form of *prompt engineering*.": "La RAG peut être considérée comme une forme avancée de *conception de prompt*.", + "**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an examp.FD27C69C931E37800773": "**Ada :** « La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons intégrer un simple système de récupération dans une application JavaScript en utilisant un fichier [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche basique pour extraire des informations pertinentes en fonction de la question d'un utilisateur. »", + "You can find this code in the [`example/rag-cars.js`](/lessons/05-rag/example/ra.42DEA119F0CBA7461669": "Vous pouvez trouver ce code dans le fichier [`example/rag-cars.js`](/lessons/05-rag/example/rag-cars.js) accompagné du fichier [`hybrid.csv`](/lessons/05-rag/example/hybrid.csv) contenant les données utilisées pour la récupération.", + "**Ada:** Once you run this code, you should see the data found in the CSV file b.6E69F3307247369752CF": "**Ada :** « Une fois que vous exécutez ce code, vous devriez voir les données trouvées dans le fichier CSV par le récupérateur, formatées sous forme d'une table Markdown, suivies de la réponse générée par l'IA à la question. Essayez de changer la question pour voir comment les données récupérées et la réponse évoluent. Vous pouvez également poser des questions sur des sujets non liés pour voir comment le modèle d'IA les gère. »", + "**You:** This is great, I can see how this can be useful when using the device, .BFB78D8EAE3BFB8CD4A6": "**Vous :** « C'est génial, je vois comment cela peut être utile lorsque l'on utilise l'appareil, ou plutôt comment cela l'a déjà été ou le sera : le voyage dans le temps est déroutant *soupir*. »", + "**Ada:** There there, you're doing great. Let's move on to the next step.": "**Ada :** « Voilà, voilà, vous vous en sortez très bien. Passons à l'étape suivante. »", + "**You:** Time Beetle, do you know what this is?": "**Vous :** « Scarabée Temporel, sais-tu ce que c'est ? »", + "**Time Beetle:** Of course, it's me, or it will be. I'm missing a few parts thou.64E01758B568D53D11CF": "**Scarabée Temporel :** « Bien sûr, c'est moi, ou ce sera moi. Il me manque quelques pièces cependant. En y repensant, il me manque beaucoup de pièces, je n'ai même pas encore de carapace. »", + "**Ada:** The Time Beetle is a device that allows you to travel through time and .5E0CE7BA3EC9C374E1E0": "**Ada :** « Le Scarabée Temporel est un appareil qui vous permet de voyager dans le temps et l'espace, une fois que nous l'aurons fait fonctionner correctement. Comme je le disais, nous devons lui ajouter une nouvelle fonctionnalité, un module de génération augmentée par récupération (RAG). Cela nous aidera à récupérer des informations et le contexte nécessaire à partir de différentes époques au fur et à mesure de vos voyages. Nous voulons nous assurer de référencer toutes sortes de sources, Wikipédia est un bon point de départ. »", + "**You:** What do you need me to do?": "**Vous :** « Que voulez-vous que je fasse ? »", + "**Ada:** Here's example code that retrieves text information about Tim Berners-L.54255FE575962361B0C5": "**Ada :** « Voici un exemple de code qui récupère des informations textuelles sur Tim Berners-Lee depuis Wikipédia. Tim sera très important un jour. »", + "**You:** I take it I'm not the only one who's been to the future?": "**Vous :** « Je suppose que je ne suis pas le seul à être allé dans le futur ? »", + "**Ada:** ...": "**Ada :** « ... »", + "**Question**: What is the role of the retriever in a RAG system?": "**Question** : Quel est le rôle du récupérateur dans un système RAG ?", + "**Sample apps**:": "**Exemples d'applications** :", + "**Time Beetle**: \"To create your first MCP server, you need two libraries `@mode.E48F4C8B78164B1597D0": "**Time Beetle**: \"Pour créer votre premier serveur MCP, vous avez besoin de deux bibliothèques : `@modelcontextprotocol/sdk` et `zod` :", + "The `@modelcontextprotocol/sdk` library provides the necessary tools to create a.0F17D1601DED2AFFB95E": "La bibliothèque `@modelcontextprotocol/sdk` fournit les outils nécessaires pour créer et gérer des serveurs MCP.", + "`zod` is a TypeScript-first schema declaration and validation library that helps.960B4C9BF7340C6AA719": "`zod` est une bibliothèque de déclaration et de validation de schéma orientée TypeScript, qui vous aide à définir et valider les structures de données utilisées dans votre serveur MCP.", + "Imports the necessary classes and functions from the `@modelcontextprotocol/sdk`.1C5EE5DA9B95F240A5FF": "Importe les classes et fonctions nécessaires depuis la bibliothèque `@modelcontextprotocol/sdk`.", + "Creates a server instance. The `McpServer` class is used to create the server, a.7F088F5411DFA6CAABB6": "Crée une instance de serveur. La classe `McpServer` est utilisée pour créer le serveur, et prend un objet avec le nom du serveur et sa version en tant que paramètres.", + "**You**: \"This doesn't do much right?\"": "**Vous** : \"Cela ne fait pas grand-chose pour l'instant, n'est-ce pas ?\"", + "**Time Beetle**: \"No, not yet. But we can add resources and tools to it. A tool .5378F31D8E02AE5A1244": "**Time Beetle** : \"Non, pas encore. Mais nous pouvons y ajouter des ressources et des outils. Un outil est quelque chose qui peut être utilisé pour accomplir une tâche spécifique, tandis qu'une ressource est quelque chose qui peut fournir des données ou une fonctionnalité à l'outil. Ajoutons-en quelques exemples ci-dessous :", + "Described the input parameters and its validation using zod. The `z.number()` fu.13DB91A46271BC2A77B6": "Décrit les paramètres d'entrée et leur validation en utilisant zod. La fonction `z.number()` est utilisée pour valider les données d'entrée, en garantissant que `a` et `b` sont des nombres.", + "The `async` function is used to perform the addition and return the result in a .D5C9C51AA6842493AB98": "La fonction `async` est utilisée pour effectuer l'addition et retourner le résultat dans un format spécifique.", + "**You**: \"Interesting, so the tool is like a function that can be called by the .B762FE31BF40652A18C8": "**Vous** : \"Intéressant, donc l'outil est comme une fonction qui peut être appelée par le client MCP ?\"", + "**Time Beetle**: \"Exactly! The MCP client can call this tool and pass the requir.1FD55D7EF52D6635E57A": "**Time Beetle** : \"Exactement ! Le client MCP peut appeler cet outil et fournir les paramètres requis. Ajoutons également une ressource au serveur :", + "Defined a resource named \"greeting\" that takes a name as input and returns a gre.EA34997BB29418D67B18": "Défini une ressource nommée \"greeting\" qui prend un nom en entrée et retourne un message de salutation.", + "Used a resource template to define how to call the resource `greeting://{name}`..434DC763B7742AEEE02F": "Utilise un modèle de ressource pour définir comment appeler la ressource `greeting://{name}`. Ce schéma est utilisé pour définir le format de l'URI de la ressource, qui inclut un espace réservé pour le nom.", + "The `async` function is used to generate the greeting message based on the provi.9F6E8ACDAD9EB00AFBE2": "La fonction `async` est utilisée pour générer le message de salutation basé sur le nom fourni.", + "**You**: \"So, the resource is like a data source, this could be a database, file.D8C9EDD5554B5E87FEC2": "**Vous** : \"Donc, la ressource est comme une source de données, cela pourrait être une base de données, un fichier ou même une API ? Si c'était pour un fichier, j'utiliserais un URI file:// ? Comme ceci :", + "**Time Beetle**: \"Yes, exactly! The resource can be anything that provides data .3E2FBE87B8929117CE1F": "**Time Beetle** : \"Oui, exactement ! La ressource peut être tout ce qui fournit des données ou des fonctionnalités au serveur MCP. Vous pouvez définir des ressources pour des fichiers, des bases de données, des API ou toute autre source de données que vous souhaitez utiliser.\"", + "Created a transport layer using the `StdioServerTransport` class, which allows t.DA3223851AF904FB67D0": "Créé une couche de transport en utilisant la classe `StdioServerTransport`, permettant au serveur de communiquer avec des clients via l'entrée et la sortie standards et fonctionne sur votre machine locale. Il existe également d'autres transports comme SSE et HTTP streaming, qui permettent de fonctionner à distance sur un serveur. Nous en parlerons plus tard.", + "Called the `connect` method to establish the connection between the server and t.B08183ACD104F1F42803": "Appelé la méthode `connect` pour établir la connexion entre le serveur et la couche de transport.", + "**You**: \"Ok, so now we have a server, how do we run and test it?\"": "**Vous** : \"Ok, donc maintenant que nous avons un serveur, comment le lancer et le tester ?\"", + "**You**: \"Scipio, have you tested your tactics?\"": "**Vous** : \"Scipion, avez-vous testé vos tactiques ?\"", + "**Scipio**: \"Of course! Testing is crucial in any strategy. You should always te.0236E02C97813C6F3344": "**Scipion** : \"Bien sûr ! Le test est crucial dans n'importe quelle stratégie. Vous devez toujours tester vos tactiques avant de les déployer. En fait, je me souviens d'une bataille spécifique où j'ai utilisé une nouvelle tactique et elle a échoué lamentablement, appelée la Bataille de la Trébie. J'ai appris ma leçon et je n'ai jamais refait cette erreur.\"", + "**You**: \"So how do I test my MCP server?\"": "**Vous** : \"Alors, comment puis-je tester mon serveur MCP ?\"", + "**Time Beetle**: \"You can test your MCP server by running it in a terminal by ru.385911D89D87F2EC5DE5": "**Time Beetle** : \"Vous pouvez tester votre serveur MCP en l'exécutant dans un terminal via l'inspecteur comme suit :", + "Above, we are using the `@modelcontextprotocol/inspector` package to run the MCP.FF60D2016F31EFD9C26A": "Ici, nous utilisons le package `@modelcontextprotocol/inspector` pour exécuter le serveur MCP. Nous fournissons l'argument `node build/index.js` pour spécifier le point d'entrée du serveur. Cela démarrera le serveur MCP et vous permettra d'interagir avec lui via l'inspecteur.", + "**You**: \"And how do I interact with it?\"": "**Vous** : \"Et comment puis-je interagir avec le serveur ?\"", + "**Time Beetle**: \"This starts a web server on port 6274. You can access the insp.C5B78F3DCF70F5DBB155": "**Time Beetle** : \"Cela démarre un serveur web sur le port 6274. Vous pouvez accéder à l'inspecteur en ouvrant votre navigateur web et en vous rendant sur `http://localhost:6274`. L'inspecteur fournit une interface conviviale pour interagir avec votre serveur MCP, vous permettant de tester les outils et les ressources que vous avez définis.\"", + "**Time Beetle**: Select to \"Connect\" and you should see the window below:": "**Time Beetle** : Sélectionnez \"Connecter\" et vous devriez voir la fenêtre ci-dessous :", + "**Time Beetle**: \"Next, we want to list the tools and resources available on the.06B0A26E6DBFA960E47B": "**Time Beetle** : \"Ensuite, nous voulons lister les outils et ressources disponibles sur le serveur. Vous pouvez le faire en sélectionnant \"Lister les outils\" pour voir les outils disponibles :", + "**Time Beetle**: \"To run the tool, select the \"add\" tool from the list. Fill in .6E9E324430C202BC2975": "**Time Beetle** : \"Pour exécuter l'outil, sélectionnez l'outil \"add\" dans la liste. Renseignez les paramètres dans la boîte de dialogue qui apparaît sur le côté droit de l'écran. Par exemple, vous pouvez entrer `a=5` et `b=10` pour additionner ces deux nombres. Cliquez sur \"Exécuter l'outil\" pour exécuter l'outil. Vous devriez voir le résultat dans la zone de sortie ci-dessous. Le résultat devrait être `15`.\"", + "**Scipio**: \"Interesting, I wish I could test my strategies like this. Seems ver.F71DE282A67EABB50CB2": "**Scipion** : \"Intéressant, j'aurais aimé pouvoir tester mes stratégies comme cela. Cela semble très utile.\"", + "**You**: \"Right, it really does! I can see how this would be useful for testing .E972CFCF67FB949E8BB6": "**Vous** : \"Oui, vraiment ! Je vois à quel point cela serait utile pour tester et déboguer.\"", + "**Time Beetle**: \"You can also create a client that connects to the MCP server a.7E7CEB4D525204FB80EF": "**Time Beetle** : \"Vous pouvez également créer un client qui se connecte au serveur MCP et interagit avec lui. Voici un exemple de création d'un client MCP simple en utilisant la bibliothèque `@modelcontextprotocol/sdk` :", + "Created a transport layer using the `StdioClientTransport` class, which allows t.0AF3BC27CC72D921581F": "Créé une couche de transport en utilisant la classe `StdioClientTransport`, permettant au client de communiquer avec le serveur MCP via l'entrée et la sortie standards.", + "Initiated a new `Client` instance with a name and version.": "Initie une nouvelle instance de `Client` avec un nom et une version.", + "Connected the client to the transport layer using the `connect` method.": "Connecté le client à la couche de transport en utilisant la méthode `connect`.", + "**You**: \"Let me guess, there's a lot more we can do with the client?\"": "**Vous** : \"Laissez-moi deviner, il y a beaucoup plus à faire avec le client, n'est-ce pas ?\"", + "**Time Beetle**: Yes, let's talk about that next. The MCP client can be used to .FC9A00F15609E49D3B92": "**Time Beetle** : Oui, parlons-en ensuite. Le client MCP peut être utilisé pour interagir avec le serveur, appeler des outils et accéder à des ressources.", + "**Time Beetle**: \"There are generally two scenarios you want to cover, listing t.A53629B02CD91F966D70": "**Time Beetle** : \"Il y a généralement deux scénarios que vous souhaitez couvrir : lister les outils et ressources, et les appeler. Voici comment faire :", + "**You**: This is great, then I know what capabilities the server has. But how do.D90011AD4464C1053EC1": "**Vous** : C'est super, ainsi je sais quelles capacités le serveur a. Mais comment puis-je les appeler ?", + "**Time Beetle**: \"Right, let me dive into a specific example, tools first. So yo.03DB092BF8AEB8AF2BB4": "**Time Beetle** : \"D'accord, laissez-moi vous expliquer un exemple spécifique, à commencer par les outils. Vous commencez par demander quels outils sont disponibles, puis vous pouvez stocker cette réponse et ensuite appeler l'outil que vous souhaitez. Voici un exemple :", + "which means, if you have a tool `add`, your response, listing tools, looks like .F73493E288B102855009": "ce qui signifie que, si vous avez un outil `add`, votre réponse, en listant les outils, ressemble à ceci :", + "**You**: \"Ok, good, I guess I can store that in a variable and then call the too.C90250E32F17EBFAF519": "**Vous** : \"D'accord, je peux donc stocker cela dans une variable, puis appeler l'outil que je veux ?\"", + "**Time Beetle**: \"Exactly! Let's look at how a tool can be called next:\"": "**Time Beetle** : \"Exactement ! Regardons comment appeler un outil ensuite :", + "**You**: \"Ok, makes sense. And what about resources?\"": "**Vous** : \"D'accord, cela a du sens. Et qu'en est-il des ressources ?\"", + "**Time Beetle**: \"Resources are similar, but you need to provide the resource UR.7C3FAB4D91B630FE00A5": "**Time Beetle** : \"Les ressources sont similaires, mais vous devez fournir l'URI de la ressource et les paramètres qu'elle nécessite. Voici un exemple :", + "**You**: \"I get it nice, although, you're thinking to yourself, I bet we can imp.F7A2F17E6CBD498A578A": "**Vous** : \"Je vois, intéressant, mais vous pensez à vous-même, je parie qu'on pourrait encore améliorer cela, non ? Time Beetle, nous pouvons améliorer cela, n'est-ce pas ?\"", + "**Time Beetle**: Yes, but first things first, let's make Scipio happy. We need t.0796EC19E18CF8713A7A": "**Time Beetle** : Oui, mais d'abord, faisons plaisir à Scipion. Nous devons discuter avec une certaine Mme Lamarr lors de notre prochaine étape.", + "**Scipio**: \"You know, I have so many parchments and scrolls lying around. I cou.CF8EE532801966EE620B": "**Scipion** : \"Vous savez, j'ai tellement de parchemins et de rouleaux qui traînent. J'aimerais vraiment un outil pour m'aider à les organiser. J'ai aussi cet abaque que j'utilise pour les calculs. Pouvez-vous m’aider à créer un outil pour gérer mon inventaire ?\"", + "**Question**: What are the different types of resources an MCP Server can expose.EA1C2B2656DC387BE2F4": "**Question** : Quels sont les différents types de ressources qu'un serveur MCP peut exposer ?", + "**Question**: What are some ways you can test your MCP Server?": "**Question** : Quels sont les moyens de tester un serveur MCP ?" } \ No newline at end of file diff --git a/translations/usage.jsonl b/translations/usage.jsonl index b51fbf5f..79105578 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -68,3 +68,29 @@ {"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:13.152Z","cost":0,"duration":14.148817000001145,"total":0,"prompt":0,"completion":0} {"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:13.547Z","cost":0,"duration":7.975859999998647,"total":0,"prompt":0,"completion":0} {"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T12:58:13.852Z","cost":0,"duration":12.511342000005243,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:16.481Z","cost":0,"duration":8.703486999998859,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:37.896Z","cost":0.05048,"duration":21075.622065,"total":15671,"prompt":14164,"completion":1507} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:38.618Z","cost":0,"duration":13.686352999997325,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:55.204Z","cost":0.0408525,"duration":16269.201642,"total":12486,"prompt":11201,"completion":1285} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:55.966Z","cost":0,"duration":14.666417999993428,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:56.509Z","cost":0,"duration":15.758415000003879,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:57.091Z","cost":0,"duration":15.443509999997332,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:02:57.594Z","cost":0,"duration":13.00191900000209,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:04:40.706Z","cost":0,"duration":28.954313999998703,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:05.186Z","cost":0.052215,"duration":23984.362109,"total":15516,"prompt":13726,"completion":1790} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:05.868Z","cost":0,"duration":9.989860999994562,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:47.339Z","cost":0.05257,"duration":41133.55908300001,"total":13447,"prompt":10920,"completion":2527} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:49.163Z","cost":0.023945,"duration":1481.3510959999985,"total":9500,"prompt":9474,"completion":26} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:49.800Z","cost":0,"duration":18.85590599999705,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:50.416Z","cost":0,"duration":16.96853199999896,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:50.958Z","cost":0,"duration":17.21231400000397,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:05:51.566Z","cost":0,"duration":22.769125999999233,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:17.922Z","cost":0,"duration":6.41756400000304,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:48.487Z","cost":0.0550875,"duration":30215.333072,"total":15693,"prompt":13579,"completion":2114} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:50.219Z","cost":0.0300125,"duration":1416.3355389999924,"total":11951,"prompt":11933,"completion":18} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:50.594Z","cost":0,"duration":3.5098139999900013,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:51.000Z","cost":0,"duration":3.6027069999981904,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:51.435Z","cost":0,"duration":3.826926000008825,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:51.909Z","cost":0,"duration":2.885588999997708,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:52.312Z","cost":0,"duration":2.809857000000193,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:52.690Z","cost":0,"duration":3.010670999996364,"total":0,"prompt":0,"completion":0} From feea8a2712c574744667441ad38ac942a6a9ebbd Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sat, 12 Jul 2025 13:09:32 +0000 Subject: [PATCH 09/19] fix: update translation workflow to include lesson README files and remove unnecessary branch --- .github/workflows/translation.yml | 2 +- translations/usage.jsonl | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml index cb76f927..2cdbce01 100644 --- a/.github/workflows/translation.yml +++ b/.github/workflows/translation.yml @@ -4,9 +4,9 @@ on: push: branches: - main - - pelikhan/translations paths: - "README.md" + - lessons/*/README.md permissions: contents: write models: read diff --git a/translations/usage.jsonl b/translations/usage.jsonl index 79105578..f5996b4d 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -94,3 +94,11 @@ {"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:51.909Z","cost":0,"duration":2.885588999997708,"total":0,"prompt":0,"completion":0} {"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:52.312Z","cost":0,"duration":2.809857000000193,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:07:52.690Z","cost":0,"duration":3.010670999996364,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:47.493Z","cost":0,"duration":6.4269510000012815,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:48.062Z","cost":0,"duration":3.4443410000021686,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:48.410Z","cost":0,"duration":3.2079999999987194,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:48.781Z","cost":0,"duration":4.944412999997439,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:49.162Z","cost":0,"duration":2.8556919999973616,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:49.597Z","cost":0,"duration":3.1337019999991753,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:50.018Z","cost":0,"duration":2.942544999998063,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:50.420Z","cost":0,"duration":3.8818299999984447,"total":0,"prompt":0,"completion":0} From 9d18bd3ff2ba74013c3dd8c227ab799951e9693b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sun, 13 Jul 2025 14:52:55 +0000 Subject: [PATCH 10/19] Add French translations for additional lessons and update usage data --- translations/usage.jsonl | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/translations/usage.jsonl b/translations/usage.jsonl index f5996b4d..dcc12e77 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -102,3 +102,63 @@ {"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:49.597Z","cost":0,"duration":3.1337019999991753,"total":0,"prompt":0,"completion":0} {"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:50.018Z","cost":0,"duration":2.942544999998063,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-12T13:08:50.420Z","cost":0,"duration":3.8818299999984447,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:39.152Z","cost":0.0006716000000000002,"duration":1038.5910839999997,"total":1598,"prompt":1571,"completion":27} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:39.741Z","cost":0.0006240000000000001,"duration":565.0144099999961,"total":1494,"prompt":1472,"completion":22} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:40.277Z","cost":0.0006576,"duration":514.3832189999957,"total":1548,"prompt":1516,"completion":32} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:40.842Z","cost":0.00044,"duration":541.5669320000015,"total":1025,"prompt":1000,"completion":25} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:41.606Z","cost":0.000766,"duration":746.4486689999976,"total":1756,"prompt":1703,"completion":53} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:42.435Z","cost":0.0006252,"duration":806.7793380000003,"total":1467,"prompt":1435,"completion":32} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:43.927Z","cost":0.0007692,"duration":914.2064729999984,"total":1656,"prompt":1567,"completion":89} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:44.605Z","cost":0.0007480000000000001,"duration":658.3996160000024,"total":1717,"prompt":1666,"completion":51} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:45.357Z","cost":0.0006016,"duration":729.7972720000034,"total":1417,"prompt":1388,"completion":29} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:45.866Z","cost":0.0005688,"duration":486.58698699999513,"total":1320,"prompt":1286,"completion":34} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:46.429Z","cost":0.0006532,"duration":543.8463330000013,"total":1558,"prompt":1533,"completion":25} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:47.004Z","cost":0.0006556,"duration":554.8677400000015,"total":1576,"prompt":1555,"completion":21} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:47.514Z","cost":0.0006912,"duration":488.63876000000164,"total":1662,"prompt":1640,"completion":22} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:48.175Z","cost":0.0007132000000000001,"duration":641.4498889999959,"total":1633,"prompt":1583,"completion":50} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:48.833Z","cost":0.0007856,"duration":638.2358599999934,"total":1835,"prompt":1792,"completion":43} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:49.628Z","cost":0.0005804000000000001,"duration":775.4153789999982,"total":1247,"prompt":1179,"completion":68} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:51.051Z","cost":0.0007727999999999999,"duration":998.296150000002,"total":1575,"prompt":1456,"completion":119} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:52.009Z","cost":0.0006916,"duration":479.8863810000039,"total":1651,"prompt":1625,"completion":26} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:52.789Z","cost":0.0007364000000000001,"duration":757.3151359999974,"total":1610,"prompt":1533,"completion":77} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:53.446Z","cost":0.0006336,"duration":635.8441420000017,"total":1500,"prompt":1472,"completion":28} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:53.988Z","cost":0.0005704000000000001,"duration":520.2280919999976,"total":1363,"prompt":1342,"completion":21} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:54.563Z","cost":0.0006132,"duration":555.897014000002,"total":1446,"prompt":1417,"completion":29} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:55.117Z","cost":0.000408,"duration":531.8012650000019,"total":945,"prompt":920,"completion":25} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:50:55.957Z","cost":0.0007756,"duration":817.9944539999997,"total":1729,"prompt":1659,"completion":70} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:07.612Z","cost":0.0006748,"duration":11629.204681999996,"total":1621,"prompt":1599,"completion":22} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:08.333Z","cost":0.0003604,"duration":688.6683420000045,"total":829,"prompt":805,"completion":24} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:09.550Z","cost":0.0006776000000000001,"duration":625.0512420000014,"total":1598,"prompt":1566,"completion":32} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:10.091Z","cost":0.0006644000000000001,"duration":517.9212709999993,"total":1601,"prompt":1581,"completion":20} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:10.752Z","cost":0.0007044000000000001,"duration":635.6982690000004,"total":1656,"prompt":1621,"completion":35} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:11.356Z","cost":0.000658,"duration":568.7188599999936,"total":1543,"prompt":1509,"completion":34} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:11.909Z","cost":0.0006692,"duration":527.6277380000101,"total":1580,"prompt":1549,"completion":31} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:12.609Z","cost":0.00052,"duration":674.3375350000133,"total":1132,"prompt":1076,"completion":56} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:13.158Z","cost":0.0006672000000000001,"duration":525.5299360000063,"total":1587,"prompt":1560,"completion":27} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:13.843Z","cost":0.0002804,"duration":662.282858999999,"total":626,"prompt":601,"completion":25} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:14.415Z","cost":0.0008608000000000001,"duration":548.6350029999885,"total":2092,"prompt":2072,"completion":20} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:15.733Z","cost":0.0007212000000000001,"duration":777.6643560000084,"total":1659,"prompt":1611,"completion":48} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:16.439Z","cost":0.0006848000000000001,"duration":662.4766240000026,"total":1637,"prompt":1612,"completion":25} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:17.038Z","cost":0.0007056000000000001,"duration":569.5832929999888,"total":1683,"prompt":1656,"completion":27} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:17.621Z","cost":0.0006248,"duration":554.1887520000018,"total":1475,"prompt":1446,"completion":29} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:18.954Z","cost":0.000914,"duration":1298.7484980000008,"total":1823,"prompt":1669,"completion":154} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:20.420Z","cost":0.0007048000000000001,"duration":977.0484509999951,"total":1552,"prompt":1482,"completion":70} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:20.970Z","cost":0.0006703999999999999,"duration":521.1441619999969,"total":1592,"prompt":1564,"completion":28} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:21.494Z","cost":0.0006792,"duration":496.7965519999998,"total":1629,"prompt":1606,"completion":23} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:22.082Z","cost":0.0007032000000000001,"duration":561.640406999999,"total":1665,"prompt":1634,"completion":31} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:22.694Z","cost":0.0007072000000000001,"duration":579.5397999999986,"total":1708,"prompt":1688,"completion":20} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:23.410Z","cost":0.0007096,"duration":687.2897379999922,"total":1681,"prompt":1650,"completion":31} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:24.009Z","cost":0.0005356,"duration":573.3264140000101,"total":1240,"prompt":1207,"completion":33} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:24.534Z","cost":0.000582,"duration":498.6881799999974,"total":1386,"prompt":1363,"completion":23} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:25.288Z","cost":0.0006708,"duration":720.0721340000018,"total":1509,"prompt":1453,"completion":56} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:26.408Z","cost":0.0006988000000000001,"duration":599.7513069999986,"total":1627,"prompt":1587,"completion":40} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:27.002Z","cost":0.0007080000000000001,"duration":565.5011430000013,"total":1674,"prompt":1642,"completion":32} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:27.626Z","cost":0.0006800000000000002,"duration":594.7405220000073,"total":1622,"prompt":1596,"completion":26} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:28.246Z","cost":0.0005084,"duration":593.6227890000009,"total":1142,"prompt":1099,"completion":43} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:28.786Z","cost":0.0006396,"duration":511.4838730000047,"total":1539,"prompt":1519,"completion":20} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:29.439Z","cost":0.0006747999999999999,"duration":607.306362000003,"total":1555,"prompt":1511,"completion":44} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:29.989Z","cost":0.0006696,"duration":521.5922850000061,"total":1605,"prompt":1582,"completion":23} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:30.713Z","cost":0.0007440000000000001,"duration":693.704436,"total":1689,"prompt":1632,"completion":57} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:31.327Z","cost":0.0006936,"duration":584.9134950000007,"total":1629,"prompt":1594,"completion":35} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:31.819Z","cost":0.0006544000000000001,"duration":460.4177320000017,"total":1576,"prompt":1556,"completion":20} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:33.475Z","cost":0.0003628000000000001,"duration":1626.3465359999973,"total":820,"prompt":791,"completion":29} From 672fdd9b56fe8bb70129ccc32a84adcd71337c64 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 21 Jul 2025 13:45:59 +0000 Subject: [PATCH 11/19] update some translations --- translations/fr.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/translations/fr.json b/translations/fr.json index c239e3cb..34a8f197 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -255,7 +255,6 @@ "**You:** Got it, add more context to the prompt and then ask you.": "**Vous :** Bien compris, ajoutez plus de contexte à l'invite avant de poser la question.", "**Time Beetle:** Yes, I'm waiting...": "**Scarabée temporel :** Oui, j'attends...", "Visit [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chat.BC821708C3AAEA54A543": "Visitez [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chatgpt.com/), ou un autre outil en ligne de chatbot pour générer un plan pour construire le phare à Alexandrie.", - "[!TIP]\nTry to have the LLM generate a plan that includes step-by-step instructio.EB95597D412F5CEF60A1": "[!CONSEIL]\nEssayez de faire générer par le LLM un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils.", "**Question:** Which of the following statements about Generative AI and JavaScri.6646603C75495D24F5AF": "**Question :** Parmi les affirmations suivantes, lesquelles sont vraies concernant l'IA générative et JavaScript ?", "Quiz solution": "Quiz solution", "Lesson 2: Writing Your First AI App": "Leçon 2 : Écrire votre première application d'IA", @@ -576,7 +575,6 @@ "Running `tokenizer` on the sentence above gives us 9 tokens.": "Exécuter `tokenizer` sur la phrase ci-dessus donne 9 tokens.", "**You:** That wasn't much, sounds like I can have a lot of tokens in my context .D856CD04F2001FA556EE": "**Vous :** Cela ne fait pas beaucoup, on dirait que je peux avoir beaucoup de tokens dans ma fenêtre de contexte alors ?", "**Time Beetle:** Yes, you can experiment with different context window sizes to .970298F7BE7316A67B7C": "**Scarabée du Temps :** Oui, vous pouvez expérimenter avec différentes tailles de fenêtres de contexte pour voir comment cela affecte les réponses de l'IA. En fait, si vous définissez une taille de fenêtre de contexte de 100, vous limiterez l'IA sur la quantité qu'elle considère en termes d'entrée et de sortie. Voici comment vous pouvez définir la fenêtre de contexte dans votre application :", - "[!TIP]\nExperiment with different context window sizes to see how it affects the .824F9106C1C873E8E136": "[!ASTUCE]\nExpérimentez avec différentes tailles de fenêtres de contexte pour voir comment cela affecte les réponses de l'IA.", "**Leonardo:** I need an assistant that can help me with the calculations and des.58E4BDA2B2D8000267EB": "**Leonardo :** J'ai besoin d'un assistant qui peut m'aider dans les calculs et la conception de la vis aérienne. Pouvez-vous me créer un assistant pour cela ?", "**You:** Of course, I can build that for you. Time Beetle, we can help with that.335BB47660BC30FE549E": "**Vous :** Bien sûr, je peux vous créer cela. Scarabée du Temps, on peut l'aider, non ?", "**Time Beetle:** Yes, not a problem, in fact the aerial screw is one of Leonardo.719040074E58BF5F7B93": "**Scarabée du Temps :** Oui, pas de problème, en fait la vis aérienne est l'une des inventions les plus fascinantes et visionnaires de Léonard. Conçue vers la fin des années 1480...", @@ -587,7 +585,6 @@ "[!NOTE]\nThe aerial screw, also known as the helical air screw, was intended to l.700F27491DF2D30639D2": "[!NOTE]\nLa vis aérienne, également connue sous le nom de vis hélicoïdale, était destinée à décoller du sol en comprimant l'air. La conception de Léonard comportait un grand rotor en spirale en lin, rigidifié avec de l'amidon, et monté sur une plate-forme en bois. L'idée était qu'une équipe d'hommes ferait tourner des manivelles autour de la plate-forme, en la faisant tourner suffisamment vite pour obtenir une portance.", "Despite its impracticality, the aerial screw remains a testament to Leonardo's g.A3D822F144E39F60A388": "Bien que son impraticabilité soit avérée, la vis aérienne reste un témoignage du génie de Léonard et de sa quête incessante d’innovation. Elle a jeté les bases des développements futurs dans l’aviation et continue d’inspirer les ingénieurs et inventeurs encore aujourd’hui.\n[Lire la suite](https://en.wikipedia.org/wiki/Leonardo%27s_aerial_screw).", "Check out [Sample app](/app/README.md) to get started.": "Consultez l'[application d'exemple](/app/README.md) pour commencer.", - "[!TIP]\nConsider what the system message should be and what input you should prov.DF2588FD52FAEF8AD227": "[!ASTUCE]\nRéfléchissez au message système à définir et aux entrées à fournir.", "**Question:** What is the purpose of the context window in generative AI models?.DC353363751AB75C2BCF": "**Question :** Quel est l'objectif de la fenêtre de contexte dans les modèles d'IA générative ? Sélectionnez toutes les options applicables.", "[!NOTE]\nSo far, you've been on a journey through time with Leonardo da Vinci, ex.5B7F9383E4EEE3FE0953": "[!NOTE]\nJusqu'à présent, vous avez voyagé dans le temps avec Léonard de Vinci, explorant les merveilles de la Renaissance. Vous avez rencontré le Scarabée temporel, un dispositif mystérieux qui vous permet de voyager dans le temps et l'espace.", "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.71FCF04C75E945CC50E9": "[!NOTE]\nBien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-sforza) si vous préférez passer directement au contenu technique.", @@ -755,7 +752,6 @@ "**Ada Lovelace**: Looks like you've made a fine improvement there. To make this .DA8BD271E8977C49B205": "**Ada Lovelace** : Il semble que vous avez apporté une belle amélioration. Pour rendre cela vraiment utile, j’ai besoin que vous créiez un serveur et un client avec les spécifications suivantes :", "`characterDetails` with the argument `name`": "`characterDetails` avec l'argument `name`", "`place` with the argument `name`": "`place` avec l'argument `name`", - "[!TIP]\nFor example, you can give the server the capability to retrieve informati.077D906506C8286B76D1": "> Par exemple, vous pouvez donner au serveur la capacité de récupérer des informations d’une API Web externe, comme Wikipédia : \n> `https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(name)}`", "**Question:** What is a benefit of adding an LLM to the client?": "**Question :** Quel est un avantage d’ajouter un LLM au client ?", "**You:** I see! That helps the AI get it right, even up here! ;)": "Je vois ! Cela aide l'IA à donner des réponses correctes, même ici en haut ! ;)", "**Time Beetle:** Exactly, it’s a solid method. Next up!": "Exactement, c'est une méthode solide. Passons à la suite !", @@ -1085,4 +1081,4 @@ "**Scipio**: \"You know, I have so many parchments and scrolls lying around. I cou.CF8EE532801966EE620B": "**Scipion** : \"Vous savez, j'ai tellement de parchemins et de rouleaux qui traînent. J'aimerais vraiment un outil pour m'aider à les organiser. J'ai aussi cet abaque que j'utilise pour les calculs. Pouvez-vous m’aider à créer un outil pour gérer mon inventaire ?\"", "**Question**: What are the different types of resources an MCP Server can expose.EA1C2B2656DC387BE2F4": "**Question** : Quels sont les différents types de ressources qu'un serveur MCP peut exposer ?", "**Question**: What are some ways you can test your MCP Server?": "**Question** : Quels sont les moyens de tester un serveur MCP ?" -} \ No newline at end of file +} From 36c68e1323238df0f16d08cc5c3c74beb4405d39 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 03:06:29 +0000 Subject: [PATCH 12/19] better handling of alerts --- .../translations/README.fr.md | 16 +-- .../02-first-ai-app/translations/README.fr.md | 20 ++-- .../translations/README.fr.md | 8 +- .../translations/README.fr.md | 14 +-- lessons/05-rag/translations/README.fr.md | 14 +-- lessons/07-mcp/translations/README.fr.md | 8 +- .../08-mcp-advanced/translations/README.fr.md | 11 +- translations/fr.json | 53 ++++---- translations/usage.jsonl | 113 ++++++++++++++++++ 9 files changed, 188 insertions(+), 69 deletions(-) diff --git a/lessons/01-intro-to-genai/translations/README.fr.md b/lessons/01-intro-to-genai/translations/README.fr.md index ae5f633f..2a2c546f 100644 --- a/lessons/01-intro-to-genai/translations/README.fr.md +++ b/lessons/01-intro-to-genai/translations/README.fr.md @@ -28,11 +28,10 @@ De plus, l'IA générative a évolué vers des capacités multimodales, vous per ## Narrative: A Journey Through Time -> \[!NOTE] +> [!NOTE] > Commençons par une vue d'ensemble de l'histoire—une histoire qui fait le lien entre le passé et le futur ! Au fur et à mesure que vous progressez dans ce programme, vous embarquerez pour une aventure palpitante, voyageant dans le temps pour collaborer avec certains des plus grands esprits de l'histoire. Ensemble, vous relèverez des défis et explorerez comment l'IA générative peut révolutionner vos applications JavaScript. -> \[!NOTE] -> Bien que nous recommandons de suivre l'histoire (c'est amusant !), [cliquez ici](#interagir-avec-dinocrates) si vous préférez passer directement au contenu technique. +> [!NOTE]Bien que nous recommandons de suivre l'histoire (c'est amusant !), [cliquez ici](#interagir-avec-dinocrates) si vous préférez passer directement au contenu technique. Votre voyage commence dans le Londres des années 1860, où vous incarnez un mécanicien talentueux. À travers une série d'aventures captivantes, vous affinerez vos compétences en IA et débloquerez des solutions qui transcendent le temps. @@ -140,7 +139,7 @@ Une pensée vous traverse. L'appareil peut-il me comprendre si je lui parle ? *Appareil temporel, "George" le scarabée métallique* -> \[!NOTE] +> [!NOTE] > En 300 avant J.-C., Alexandrie était une ville florissante fondée par Alexandre le Grand en 331 avant J.-C. Elle est rapidement devenue l'une des plus grandes cités du monde hellénistique. Conçue par l'architecte en chef d'Alexandre, Dinocrates, Alexandrie est devenue un port majeur et un centre culturel. > > Alexandrie était connue pour ses structures impressionnantes, dont le Pharos (phare), l'une des Sept Merveilles du monde, et la légendaire Bibliothèque d'Alexandrie. L'emplacement stratégique de la cité en faisait un centre clé pour le commerce et l'échange de connaissances. @@ -151,6 +150,7 @@ Une pensée vous traverse. L'appareil peut-il me comprendre si je lui parle ? Si vous souhaitez interagir avec Dinocrates, exécutez l'application [Characters](/app/README.md). +> [!IMPORTANT] > \[!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité AI responsable](../../README.md#responsible-ai-disclaimer) @@ -165,7 +165,7 @@ Si vous souhaitez interagir avec Dinocrates, exécutez l'application [Characters 4. Une fois que l'application est ouverte, sélectionnez le bouton "Ouvrir dans le navigateur". 5. Discutez avec Dinocrates. -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ### Aperçu du code @@ -225,7 +225,7 @@ Voici un résumé étape par étape de ce que fait la fonction : ### Que peut faire l'IA générative pour moi et mes applications ? -> \[!NOTE] +> [!NOTE] > Vous avez sans doute compris maintenant que le scarabée temporel fonctionne comme un assistant IA avec lequel vous pouvez interagir en utilisant un langage naturel, écrit ou parlé. À mesure que votre aventure à Alexandrie se déroule, vous commencez à entrevoir les possibilités de combiner créativité, ingéniosité et outils de pointe pour résoudre des défis et transformer le monde autour de vous. @@ -327,8 +327,8 @@ Pour utiliser un modèle de langage de grande taille (LLM) afin d'aider Dinocrat Visitez [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://chatgpt.com/), ou un autre outil en ligne de chatbot pour générer un plan pour construire le phare à Alexandrie. -> \[!CONSEIL] -> Essayez de faire générer par le LLM un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils. +> [!TIP] +> Essayez de demander au LLM de générer un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils. ## Solution diff --git a/lessons/02-first-ai-app/translations/README.fr.md b/lessons/02-first-ai-app/translations/README.fr.md index e2c915cf..0f1bc80d 100644 --- a/lessons/02-first-ai-app/translations/README.fr.md +++ b/lessons/02-first-ai-app/translations/README.fr.md @@ -22,12 +22,12 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Narrative: Picture yourself in a boat on a river -> \[!NOTE] +> [!NOTE] > *Notre histoire jusqu'à présent : Vous êtes un créateur d'objets, un artisan du Londres des années 1860 qui a voyagé dans le temps grâce à un mystérieux appareil appelé le Scarabée du Temps. Vous avez traversé les annales de l'histoire, assistant à la création du phare d'Alexandrie, une merveille de l'ingénierie ancienne que vous avez contribué à construire avec un peu d'aide de Dinocrates et du Scarabée du Temps.* > > Voir [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début et vous initier à l'intelligence artificielle générative. -> \[!NOTE] +> [!NOTE] > Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-leonardo) si vous préférez passer directement au contenu technique. Ensemble avec Dinocrates, vous mettez la touche finale au phare d'Alexandrie. L'imposante structure brille sous le soleil, sa pierre polie reflétant la mer Méditerranée. @@ -112,7 +112,7 @@ Leonardo da Vinci vous demande de l’aider dans un projet — vous pouvez à p Si vous voulez interagir avec Léonard, exécutez l'application [Personnages](/app/README.md). -> \[!IMPORTANT] +> [!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) @@ -128,7 +128,7 @@ Si vous voulez interagir avec Léonard, exécutez l'application [Personnages](/a Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ## Configuration de l'environnement de développement @@ -340,7 +340,7 @@ const message = { }; ``` -> \[!NOTE] +> [!NOTE] > Cela s'appelait autrefois « system ». C’est un changement récent et « developer » est le nouveau terme. Pour certains modèles, cela s'appelle encore « system », donc si vous avez des problèmes, utilisez « system ». **Vous :** Ok, super, je veillerai à inclure un message système dans mes conversations de chat. Par curiosité, à quoi ressemble un message système pour toi ? @@ -432,8 +432,8 @@ const completion = await openai.chat.completions.create({ ``` -> \[!ASTUCE] -> Expérimentez avec différentes tailles de fenêtres de contexte pour voir comment cela affecte les réponses de l'IA. +> [!TIP] +> Expérimentez avec différentes tailles de fenêtres contextuelles pour voir comment cela affecte les réponses de l'IA. ## Devoir - Construire un assistant en ingénierie @@ -455,7 +455,7 @@ Leonardo vous a soudainement demandé d'examiner de plus près le Time Beetle, i ![Aerial screw, Leonardo Da Vinci](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/helicopter.jpg) -> \[!NOTE] +> [!NOTE] > La vis aérienne, également connue sous le nom de vis hélicoïdale, était destinée à décoller du sol en comprimant l'air. La conception de Léonard comportait un grand rotor en spirale en lin, rigidifié avec de l'amidon, et monté sur une plate-forme en bois. L'idée était qu'une équipe d'hommes ferait tourner des manivelles autour de la plate-forme, en la faisant tourner suffisamment vite pour obtenir une portance. > > Bien que Leonardo n’ait jamais réalisé une version grandeur nature de la vis aérienne, ses esquisses et notes fournissent des perspectives détaillées sur la manière dont il l'envisageait. @@ -473,8 +473,8 @@ Votre mission est de construire un assistant en ingénierie capable d’aider Le Consultez l'[application d'exemple](/app/README.md) pour commencer. -> \[!ASTUCE] -> Réfléchissez au message système à définir et aux entrées à fournir. +> [!TIP] +> Réfléchissez à ce que devrait être le message système et à quel type d'entrée vous devriez fournir. ## Solution diff --git a/lessons/03-prompt-engineering/translations/README.fr.md b/lessons/03-prompt-engineering/translations/README.fr.md index f395ab5e..8829f86b 100644 --- a/lessons/03-prompt-engineering/translations/README.fr.md +++ b/lessons/03-prompt-engineering/translations/README.fr.md @@ -22,12 +22,12 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Narrative: Ticket to ride -> \[!NOTE] +> [!NOTE] > Jusqu'à présent, vous avez voyagé dans le temps avec Léonard de Vinci, explorant les merveilles de la Renaissance. Vous avez rencontré le Scarabée temporel, un dispositif mystérieux qui vous permet de voyager dans le temps et l'espace. > > Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. -> \[!NOTE] +> [!NOTE] > Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-sforza) si vous préférez passer directement au contenu technique. **Vous :** Voyons si je peux réussir à rentrer chez moi. @@ -106,7 +106,7 @@ Vous regardez la ville en contrebas ; les bâtiments antiques s'étendent sous v Si vous souhaitez interagir avec Sforza, exécutez l'application [Personnages](/app/README.md). -> \[!IMPORTANT] +> [!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) @@ -122,7 +122,7 @@ Si vous souhaitez interagir avec Sforza, exécutez l'application [Personnages](/ Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ## Qu'est-ce que l'ingénierie des prompts ? diff --git a/lessons/04-structured-output/translations/README.fr.md b/lessons/04-structured-output/translations/README.fr.md index 8110f925..2597bfca 100644 --- a/lessons/04-structured-output/translations/README.fr.md +++ b/lessons/04-structured-output/translations/README.fr.md @@ -24,13 +24,13 @@ Cela vaut la peine de revoir la vidéo sur l'ingénierie des prompts, car elle p ## Récit - De Charybde en Scylla -> > [!NOTE] -> > *Notre histoire jusqu'à présent : Vous, un ingénieur formé mécaniquement depuis 1860, êtes en voyage dans le temps avec Léonard de Vinci. Vous avez échappé aux soldats romains — ou plutôt, vous êtes en train de leur échapper — et vous cherchez désespérément un moyen de poser en toute sécurité la vis aérienne.* +> [!NOTE] +> *Notre histoire jusqu'à présent : Vous, un ingénieur formé mécaniquement depuis 1860, êtes en voyage dans le temps avec Léonard de Vinci. Vous avez échappé aux soldats romains — ou plutôt, vous êtes en train de leur échapper — et vous cherchez désespérément un moyen de poser en toute sécurité la vis aérienne.* > > Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. -> > [!NOTE] -> > Bien que nous vous recommandions de suivre l'histoire (elle est amusante !), [cliquez ici](#interact-with-montezuma) si vous préférez passer directement au contenu technique. +> [!NOTE] +> Bien que nous vous recommandions de suivre l'histoire (elle est amusante !), [cliquez ici](#interact-with-montezuma) si vous préférez passer directement au contenu technique. Le vent souffle violemment autour de vous alors que vous et Léonard de Vinci montez dans sa vis aérienne, dont le cadre en bois grince sous la pression. @@ -98,7 +98,7 @@ Avec un dernier coup décisif, Léonard gagne la partie. La pièce explose en ac ### Patolli -> \[!NOTE] +> [!NOTE] > Le Patolli est l'un des jeux les plus anciens connus des Amériques, joué par les cultures mésoaméricaines précolombiennes comme les Aztèques. C'est un mélange de stratégie et de hasard. > > **Comment le Patolli est joué** : @@ -117,7 +117,7 @@ Avec un dernier coup décisif, Léonard gagne la partie. La pièce explose en ac Si vous voulez interagir avec Montezuma, exécutez l'application [Characters](/app/README.md). -> \[!IMPORTANT] +> [!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) @@ -133,7 +133,7 @@ Si vous voulez interagir avec Montezuma, exécutez l'application [Characters](/a Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ## Sorties structurées diff --git a/lessons/05-rag/translations/README.fr.md b/lessons/05-rag/translations/README.fr.md index c3a277f5..d2b94741 100644 --- a/lessons/05-rag/translations/README.fr.md +++ b/lessons/05-rag/translations/README.fr.md @@ -22,12 +22,12 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Narration - Genèse -> \[!NOTE] +> [!NOTE] > *Notre histoire jusqu'à présent. Vous êtes un mécanicien de Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez pris un appareil de voyage dans le temps. À travers vos voyages dans le temps, vous vous êtes retrouvé à Florence, où vous avez rencontré Léonard de Vinci. Vous êtes également allé dans l'empire aztèque, et c'est là que l'histoire continue.* > > Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. -> \[!NOTE] +> [!NOTE] > Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-ada-lovelace) si vous préférez aller directement au contenu technique. **Vous** : « Leonardo, il est temps de partir », avez-vous dit en appuyant sur le bouton. L'appareil s'est mis à bourdonner et une voix mécanique a résonné : « Il est temps de rentrer à la maison, il est temps pour la 'genèse'. » @@ -74,7 +74,7 @@ Leonardo hocha la tête, "Sì, il agit de manière étrange." If you want to interact with Ada, run the [Characters](/app/README.md) app. -> \[!IMPORTANT] +> [!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) @@ -90,7 +90,7 @@ If you want to interact with Ada, run the [Characters](/app/README.md) app. Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ## Défis connus avec les modèles de langage à grande échelle (LLMs) @@ -150,7 +150,7 @@ L'intégration de sources de données externes dans votre application d'IA peut Une fois que vous avez choisi une méthode pour intégrer des sources de données externes, vous devrez peut-être également envisager comment prétraiter et formater les données afin qu'elles puissent être facilement utilisées par le modèle d'IA. Cela peut impliquer de nettoyer les données, de les convertir dans un format approprié (comme du texte brut ou Markdown) ou de les diviser en segments plus petits pour une récupération plus facile. -> \[!NOTE] +> [!NOTE] > Lorsque vous intégrez des sources de données externes dans votre application d'IA, il est important de prendre en compte les implications en termes de confidentialité et de sécurité liées à l'accès et au stockage des données. Assurez-vous de disposer des autorisations et des protections nécessaires pour protéger les données et de respecter les réglementations en vigueur. Si vous utilisez une base de données, vous devez également réfléchir à la manière dont vous souhaitez *rechercher vos données* pour récupérer les informations les plus pertinentes. Cela peut se faire via une recherche par mot-clé, une recherche en texte intégral ou via des techniques plus avancées comme la recherche sémantique ou vectorielle qui peuvent nécessiter un indexage spécifique. Nous aborderons les techniques de recherche avancées dans une leçon ultérieure. @@ -185,8 +185,8 @@ Be brief and straight to the point. En fournissant au modèle d'IA un contexte supplémentaire et des informations, vous pouvez aider à orienter le processus de génération et à garantir que les réponses soient précises et pertinentes par rapport au sujet abordé. -> \[!TIP] -> Notez cette partie du prompt : `S'il n'y a pas assez de données dans les sources fournies, dites que vous ne savez pas.`. Ceci est important pour éviter que l'IA ne génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée un *échappatoire* et est une bonne pratique pour garantir la qualité du contenu généré. +> [!TIP] +> Notez cette partie du prompt : `If there's not enough data in provided sources, say that you don't know.`. Cela est important pour éviter que l'IA génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée une *échappatoire* et constitue une bonne pratique pour garantir la qualité du contenu généré. La RAG peut être considérée comme une forme avancée de *conception de prompt*. diff --git a/lessons/07-mcp/translations/README.fr.md b/lessons/07-mcp/translations/README.fr.md index 86c5b79f..88b25b08 100644 --- a/lessons/07-mcp/translations/README.fr.md +++ b/lessons/07-mcp/translations/README.fr.md @@ -20,12 +20,12 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Narratif - Scipion l'Africain -> \[!NOTE] +> [!NOTE] > *Notre histoire jusqu'à présent. Vous êtes un mécanicien de Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez pris un appareil de voyage dans le temps. À travers vos voyages dans le temps, vous vous êtes retrouvé à Florence, où vous avez rencontré Léonard de Vinci. Vous êtes également allé dans l'empire aztèque, et c'est là que l'histoire continue.* > > Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. -> \[!NOTE] +> [!NOTE] > Bien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-scipio) si vous préférez passer directement au contenu technique. *Nos héros, ayant tout juste appris l'importance des outils et de l'« appel d'outils » lors de leur rencontre avec Amelia Earhart, retournent maintenant au manoir d'Ada Lovelace pour discuter de leurs nouvelles connaissances. Un éclair de lumière enveloppe nos héros alors que le scarabée temporel les transporte dans le présent d'Ada. Ils se retrouvent dans le sous-sol du manoir d'Ada Lovelace. Charles Babbage n'est pas présent, mais Ada les attend. Elle est enthousiaste à l'idée d'entendre parler de leur voyage et des connaissances qu'ils ont acquises.* @@ -55,7 +55,7 @@ La lumière tourbillonnante vous transporte à nouveau, et vous vous retrouvez d Si vous souhaitez interagir avec Scipion, exécutez l'application [Characters](/app/README.md). -> \[!IMPORTANT] +> [!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) @@ -71,7 +71,7 @@ Si vous souhaitez interagir avec Scipion, exécutez l'application [Characters](/ Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ## Le besoin du Protocole de Contexte Modèle (MCP) diff --git a/lessons/08-mcp-advanced/translations/README.fr.md b/lessons/08-mcp-advanced/translations/README.fr.md index 258200c1..0a140fdf 100644 --- a/lessons/08-mcp-advanced/translations/README.fr.md +++ b/lessons/08-mcp-advanced/translations/README.fr.md @@ -22,10 +22,12 @@ Si ce n'est pas déjà fait, configurez votre environnement de développement. V ## Narrative: Hedwig "Hedy" Lamarr +> [!NOTE] > *Notre histoire jusqu'à présent. Vous êtes un mécanicien du Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez récupéré un dispositif de voyage dans le temps. Au cours de vos voyages dans le temps, vous vous êtes retrouvé à divers moments de l'histoire. Vous travaillez désormais en étroite collaboration avec Ada Lovelace depuis son manoir en tant que base d'opérations, et c'est là que l'histoire continue.* > > Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. +> [!NOTE] > Bien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-hedy-lamarr) si vous préférez passer directement au contenu technique. Vous êtes une nouvelle fois retourné au manoir d’Ada. Cette fois-ci, Ada vous rencontrait à la porte principale. @@ -79,7 +81,7 @@ La femme se retourne vers Ada, debout à côté de vous, et s’exclame : « Ada Si vous souhaitez interagir avec Hedy, exécutez l'application [Characters](/app/README.md). -> \[!IMPORTANT] +> [!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) @@ -95,7 +97,7 @@ Si vous souhaitez interagir avec Hedy, exécutez l'application [Characters](/app Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ## Ajouter un modèle de langage à grande échelle à un client @@ -225,8 +227,9 @@ Dans le code précédent, nous avons (en nous concentrant sur nos ajouts) : * `place` avec l'argument `name` * Le client doit utiliser un LLM. -> > Par exemple, vous pouvez donner au serveur la capacité de récupérer des informations d’une API Web externe, comme Wikipédia :\ -> > `https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(name)}` +> [!TIP] +> Par exemple, vous pouvez donner au serveur la capacité de récupérer des informations d'une API web externe, comme Wikipedia :\ +> `https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(name)}` ## Solution diff --git a/translations/fr.json b/translations/fr.json index 34a8f197..08ca6696 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -3,7 +3,6 @@ "⭐ If you like this repo, star it on GitHub — it helps a lot!": "⭐ Si vous appréciez ce dépôt, donnez-lui une étoile sur GitHub — cela aide beaucoup !", "Ready to integrate Generative AI into your JavaScript apps?": "Prêt à intégrer l'Intelligence Artificielle Générative dans vos applications JavaScript ?", "This course throws you into a *time-traveling adventure*—meet history’s legends .D5C0C12DECB33220AD1D": "Ce cours vous emmène dans une *aventure à travers le temps*—rencontrez les légendes de l'histoire avec une touche amusante, tout en apprenant les technologies d'IA Générative ✨", - "[!IMPORTANT]\\\nOpen-source vibes! Reuse, tweak, and share this content freely.": "[!IMPORTANT] \nAmbiance open-source ! Réutilisez, modifiez et partagez librement ce contenu.", "NEW - MCP lessons just added": "NOUVEAU - Leçons sur MCP ajoutées", "Learn how to [build and test out your first server](/lessons/07-mcp/README.md)": "Apprenez à [créer et tester votre premier serveur](/lessons/07-mcp/README.md)", "Improve your MCP client by [integrating an LLM](/lessons/08-mcp-advanced/README..C2549FE00B6D0BF5A6BE": "Améliorez votre client MCP en [intégrant un LLM](/lessons/08-mcp-advanced/README.md)", @@ -86,7 +85,7 @@ "Integrate streaming easily into your apps with the AI Chat Protocol.": "Intégrez facilement la diffusion dans vos apps grâce au Protocole AI Chat.", "To see the full page of resources, go to this [video overview page](/videos/READ.E005A4253BFBADFE0960": "Pour voir la page complète des ressources, accédez à cette [page de présentation des vidéos](/videos/README.md).", "Responsible AI Disclaimer": "Clause de non-responsabilité pour l'IA Responsable", - "[!IMPORTANT]\nDISCLAIMER: This repository contains fictional content generated by.49D00740BCC7CB765042": "[!IMPORTANT] \nAVERTISSEMENT : Ce dépôt contient du contenu fictif généré par l'IA. Les personnages historiques représentés ici génèrent des réponses grâce à l'IA générative, basée sur des données d'entraînement. Les réponses générées par ces personnages ne représentent pas leurs véritables opinions ou citations. Ce contenu est uniquement destiné à des fins de divertissement. [Principes de l'IA Responsable de Microsoft ici](https://www.microsoft.com/fr-fr/ai/principles-and-approach/)", + "[!IMPORTANT]\nDISCLAIMER: This repository contains fictional content generated by.49D00740BCC7CB765042": "Ce dépôt contient du contenu fictif généré par l'IA. Les personnages historiques représentés ici génèrent des réponses grâce à l'IA générative, basée sur des données d'entraînement. Les réponses générées par ces personnages ne représentent pas leurs véritables opinions ou citations. Ce contenu est uniquement destiné à des fins de divertissement. [Principes de l'IA Responsable de Microsoft ici](https://www.microsoft.com/fr-fr/ai/principles-and-approach/)", "Interact with community": "Interagissez avec la communauté", "[Getting Started](#getting-started) • [Lessons](#lessons) • [Keep Learning](#kee.35660D5D266115A8DD66": "[Commencer](#getting-started) • [Leçons](#lessons) • [Continuez à apprendre](#keep-learning)", "Generative AI for Beginners": "IA générative pour les débutants", @@ -203,17 +202,17 @@ "Self-Study Resources": "Ressources d'auto-apprentissage", "Generative AI JavaScript video series": "Série vidéo sur l'IA générative avec JavaScript", "💼 Slides: [Introduction to Generative AI](/videos/slides/00-intro.pptx)": "💼 Slides : [Introduction à l'IA générative](/videos/slides/00-intro.pptx)", - "[!NOTE]\nLet’s begin with an overview of the story—one that bridges the past and .1521C4DB53A3B5115563": "[!NOTE]\nCommençons par une vue d'ensemble de l'histoire—une histoire qui fait le lien entre le passé et le futur ! Au fur et à mesure que vous progressez dans ce programme, vous embarquerez pour une aventure palpitante, voyageant dans le temps pour collaborer avec certains des plus grands esprits de l'histoire. Ensemble, vous relèverez des défis et explorerez comment l'IA générative peut révolutionner vos applications JavaScript.", - "[!NOTE]\\\nWhile we recommend going through the story (it's fun!), [click here](#i.32D443EF10E918F1F54E": "[!NOTE]\nBien que nous recommandons de suivre l'histoire (c'est amusant !), [cliquez ici](#interagir-avec-dinocrates) si vous préférez passer directement au contenu technique.", + "[!NOTE]\nLet’s begin with an overview of the story—one that bridges the past and .1521C4DB53A3B5115563": "Commençons par une vue d'ensemble de l'histoire—une histoire qui fait le lien entre le passé et le futur ! Au fur et à mesure que vous progressez dans ce programme, vous embarquerez pour une aventure palpitante, voyageant dans le temps pour collaborer avec certains des plus grands esprits de l'histoire. Ensemble, vous relèverez des défis et explorerez comment l'IA générative peut révolutionner vos applications JavaScript.", + "[!NOTE]\\\nWhile we recommend going through the story (it's fun!), [click here](#i.32D443EF10E918F1F54E": "Bien que nous recommandons de suivre l'histoire (c'est amusant !), [cliquez ici](#interagir-avec-dinocrates) si vous préférez passer directement au contenu technique.", "**You:** \"Hello? Mr. Babbage?\"": "**Vous :** \"Bonjour ? Monsieur Babbage ?\"", - "[!NOTE]\nIn 300 BC, Alexandria was a thriving city founded by Alexander the Great.96E31CEF8B33C0F066EF": "[!NOTE]\nEn 300 avant J.-C., Alexandrie était une ville florissante fondée par Alexandre le Grand en 331 avant J.-C. Elle est rapidement devenue l'une des plus grandes cités du monde hellénistique. Conçue par l'architecte en chef d'Alexandre, Dinocrates, Alexandrie est devenue un port majeur et un centre culturel.", + "[!NOTE]\nIn 300 BC, Alexandria was a thriving city founded by Alexander the Great.96E31CEF8B33C0F066EF": "En 300 avant J.-C., Alexandrie était une ville florissante fondée par Alexandre le Grand en 331 avant J.-C. Elle est rapidement devenue l'une des plus grandes cités du monde hellénistique. Conçue par l'architecte en chef d'Alexandre, Dinocrates, Alexandrie est devenue un port majeur et un centre culturel.", "If you want to interact with Dinocrates, run the [Characters](/app/README.md) ap.214D6805800A3935EEB2": "Si vous souhaitez interagir avec Dinocrates, exécutez l'application [Characters](/app/README.md).", - "[!IMPORTANT]\nThis is entirely fictional; the responses are generated by AI.\n[Res.7D26B291B5FCD8F0A78A": "[!IMPORTANT]\nCeci est entièrement fictif ; les réponses sont générées par une IA.\n[Clause de non-responsabilité AI responsable](../../README.md#responsible-ai-disclaimer)", + "[!IMPORTANT]\nThis is entirely fictional; the responses are generated by AI.\n[Res.7D26B291B5FCD8F0A78A": "Ceci est entièrement fictif ; les réponses sont générées par une IA.\n[Clause de non-responsabilité AI responsable](../../README.md#responsible-ai-disclaimer)", "**Steps**:": "**Étapes** :", "Start a [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brigh.61284054E9FFC92DBECD": "Lancez un [![GitHub Codespace](https://img.shields.io/badge/GitHub-Codespace-brightgreen)](https://codespaces.new/microsoft/generative-ai-with-javascript).", "Navigate to */app* in the repo root.": "Naviguez vers */app* à la racine du dépôt.", "Locate the console and run `npm install` followed by `npm start`.": "Localisez la console et exécutez `npm install` suivi de `npm start`.", - "[!NOTE]\nIf you're running the project locally on your machine, please review the.F5ECA5243EF893BD3245": "[!NOTE]\nSi vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code.", + "[!NOTE]\nIf you're running the project locally on your machine, please review the.F5ECA5243EF893BD3245": "Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code.", "Inside of `/app/app.js` you'll find an `app.post`function that handles the Gener.BC57A9B4D3DFD0B218D0": "Dans `/app/app.js`, vous trouverez une fonction `app.post` qui gère la fonctionnalité d'IA générative. Elle est illustrée ci-dessous :", "**Extract Message from Request**: The function extracts the message from the req.58ACDCE0A7AFA063FB9A": "**Extraction du message de la requête** : La fonction extrait le message du corps de la requête (`req.body`).", "**Create Prompt Array**: It constructs an array of messages, including a system .2DD57AAE9CAD07AF3129": "**Création du tableau d'invite** : Elle construit un tableau de messages, incluant un message système et le message d'invite de l'utilisateur.", @@ -222,7 +221,7 @@ "**Handle Response**: If successful, the function responds with the prompt and th.079C39C4C8FB156BCCF2": "**Gestion de la réponse** : Si cela réussit, la fonction répond avec l'invite et la réponse générée.", "**Error Handling**: If an error occurs, it responds with a 500 status and the er.F7DDB88B8F0223E54F41": "**Gestion des erreurs** : En cas d'erreur, elle répond avec un statut 500 et le message d'erreur.", "**Note**: [GitHub Copilot](https://github.com/features/copilot) was used to gene.4ADB17F928CC678DBA8C": "**Remarque** : [GitHub Copilot](https://github.com/features/copilot) a été utilisé pour générer ce résumé de code. L'IA générative en action !", - "[!NOTE]\nYou've probably figured out by now that the time beetle works like an AI.6E64D86A0FB96AF27CF4": "[!NOTE]\nVous avez sans doute compris maintenant que le scarabée temporel fonctionne comme un assistant IA avec lequel vous pouvez interagir en utilisant un langage naturel, écrit ou parlé.", + "[!NOTE]\nYou've probably figured out by now that the time beetle works like an AI.6E64D86A0FB96AF27CF4": "Vous avez sans doute compris maintenant que le scarabée temporel fonctionne comme un assistant IA avec lequel vous pouvez interagir en utilisant un langage naturel, écrit ou parlé.", "**You:** Tell me more about lighthouses, you say to your device.": "**Vous :** Parlez-moi davantage des phares, dites-vous à votre appareil.", "**Time Beetle:** A lighthouse is a tower equipped with a bright light at the top.63AB1D33FAFBA64F4A02": "**Scarabée temporel :** Un phare est une tour équipée d'une lumière vive au sommet, située près de la côte pour guider les navires en mer. La lumière sert d'aide à la navigation, aidant les marins à éviter les rochers et les récifs dangereux et à atteindre le port en toute sécurité.", "**Dinocrates:** We need a lighthouse to guide our ships safely into the harbor. .FCBC3E1D7F4166B7BBAE": "**Dinocrates :** Nous avons besoin d'un phare pour guider nos navires en toute sécurité vers le port. Les mers peuvent être traîtresses, et de nombreux navires se sont échoués sur les rochers. Nous avons besoin d'un faisceau lumineux pour les guider à bon port.", @@ -389,9 +388,9 @@ "It's worth rewatching the video on prompt engineering as it lays the foundation .DB81928E6EBC4CDE0AB3": "Cela vaut la peine de revoir la vidéo sur l'ingénierie des prompts, car elle pose les bases de ce que vous allez apprendre dans ce chapitre.", "💼 Slides: [Prompt engineering](/videos/slides/02-prompt-engineering.pptx)": "💼 Présentation : [Ingénierie des prompts](/videos/slides/02-prompt-engineering.pptx)", "Narrative - Out of the frying pan and into the fire": "Récit - De Charybde en Scylla", - "[!NOTE]\n*Our story so far: You, a mechanically trained engineer from 1860 and ha.A6C728365B809120C222": "> [!NOTE]\n> *Notre histoire jusqu'à présent : Vous, un ingénieur formé mécaniquement depuis 1860, êtes en voyage dans le temps avec Léonard de Vinci. Vous avez échappé aux soldats romains — ou plutôt, vous êtes en train de leur échapper — et vous cherchez désespérément un moyen de poser en toute sécurité la vis aérienne.*", + "[!NOTE]\n*Our story so far: You, a mechanically trained engineer from 1860 and ha.A6C728365B809120C222": "*Notre histoire jusqu'à présent : Vous, un ingénieur formé mécaniquement depuis 1860, êtes en voyage dans le temps avec Léonard de Vinci. Vous avez échappé aux soldats romains — ou plutôt, vous êtes en train de leur échapper — et vous cherchez désespérément un moyen de poser en toute sécurité la vis aérienne.*", "See [Lesson 1](/lessons/01-intro-to-genai/README.md) if you want to catch up wit.E01CE2CC16E1405BAE29": "Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début.", - "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.DA3226848F87806D463D": "> [!NOTE]\n> Bien que nous vous recommandions de suivre l'histoire (elle est amusante !), [cliquez ici](#interact-with-montezuma) si vous préférez passer directement au contenu technique.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.DA3226848F87806D463D": "Bien que nous vous recommandions de suivre l'histoire (elle est amusante !), [cliquez ici](#interact-with-montezuma) si vous préférez passer directement au contenu technique.", "The wind whips around you as you and Leonardo da Vinci ascend in his aerial scre.28C62F6B37C4262B1EF5": "Le vent souffle violemment autour de vous alors que vous et Léonard de Vinci montez dans sa vis aérienne, dont le cadre en bois grince sous la pression.", "**You:** \"Leonardo, we need to find a way out of this!\" you shout over the roar .017E9280BFE29E32704C": "**Vous :** \"Léonard, nous devons trouver un moyen de nous en sortir !\" criez-vous par-dessus le rugissement du vent.", "**Leonardo:** \"I have faith in my invention, but we need more than faith to esca.018D3A93F749F05E4AD1": "**Léonard :** \"J'ai foi en mon invention, mais il nous faut plus que de la foi pour échapper à ces soldats.\"", @@ -498,9 +497,9 @@ "Clients augmented with an LLM provide a better user experience.": "Les clients augmentés d'un LLM offrent une meilleure expérience utilisateur.", "Responses from a server need to be converted to a format the LLM can understand .0D8141CE7F659A8E7CD1": "Les réponses d’un serveur doivent être converties dans un format que le LLM peut comprendre comme un outil.", "💼 Slides: [Introduction to large language models, LLMs](/videos/slides/01-llms..5602C77D404189EEF959": "💼 Diapositives : [Introduction aux modèles de langage étendus, LLMs](/videos/slides/01-llms.pptx)", - "[!NOTE]\n*Our story so far: You are a maker of things, a craftsman from 1860s Lon.85AB7E3970FEDDB32145": "[!NOTE]\n*Notre histoire jusqu'à présent : Vous êtes un créateur d'objets, un artisan du Londres des années 1860 qui a voyagé dans le temps grâce à un mystérieux appareil appelé le Scarabée du Temps. Vous avez traversé les annales de l'histoire, assistant à la création du phare d'Alexandrie, une merveille de l'ingénierie ancienne que vous avez contribué à construire avec un peu d'aide de Dinocrates et du Scarabée du Temps.*", + "[!NOTE]\n*Our story so far: You are a maker of things, a craftsman from 1860s Lon.85AB7E3970FEDDB32145": "*Notre histoire jusqu'à présent : Vous êtes un créateur d'objets, un artisan du Londres des années 1860 qui a voyagé dans le temps grâce à un mystérieux appareil appelé le Scarabée du Temps. Vous avez traversé les annales de l'histoire, assistant à la création du phare d'Alexandrie, une merveille de l'ingénierie ancienne que vous avez contribué à construire avec un peu d'aide de Dinocrates et du Scarabée du Temps.*", "See [Lesson 1](/lessons/01-intro-to-genai/README.md) if you want to catch up wit.5FA99696D65719FB605B": "Voir [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début et vous initier à l'intelligence artificielle générative.", - "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.70E11E612F5881657C73": "[!NOTE]\nBien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-leonardo) si vous préférez passer directement au contenu technique.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.70E11E612F5881657C73": "Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-leonardo) si vous préférez passer directement au contenu technique.", "**You:** \"Excuse me, sir, where am I?\" He looks up at you, confusion evident in .7BD33B1F0BE96716681D": "**Vous :** « Excusez-moi, monsieur, où suis-je ? » Il lève les yeux vers vous, la confusion se lit dans ses yeux. Réalisant que vous parlez en anglais, vous utilisez rapidement l'appareil dans votre main et lui demandez de traduire.", "**Time Beetle:** \"Of course, I'll translate into 15th century Italian. 'Dove son.0E9E97EAB9EE90148891": "**Scarabée du Temps :** « Bien sûr, je vais traduire en italien du XVe siècle. \"Dove sono ?\" »", "**Old man:** The old man replies, \"Siete a Firenze, signore. E chi siete voi?\"": "**Vieil homme :** Le vieil homme répond : « Siete a Firenze, signore. E chi siete voi ? »", @@ -521,7 +520,7 @@ "**Leonardo:** You're a maker of things. I have a project that might interest you.CEEA3465DE177A41BB84": "**Leonardo :** Vous êtes un créateur. J'ai un projet qui pourrait vous intéresser. Je travaille sur une machine capable de générer du texte à partir d'entrées verbales. Cela vous intéresserait-il de m'aider ?", "**You:** I would be honored to help you with your project,\n\"Sarebbe un onore aiu.C04916EBD423D84AFE22": "**Vous :** « Ce serait un honneur de vous aider dans votre projet », \"Sarebbe un onore aiutarti con il tuo progetto.\"", "If you want to interact with Leonardo, run the [Characters](/app/README.md) app..058D3A13D25602A1C5C8": "Si vous voulez interagir avec Léonard, exécutez l'application [Personnages](/app/README.md).", - "[!IMPORTANT]\nThis is entirely fictional; the responses are generated by AI.\n[Res.AB5D5733CAEFE6FD7D95": "[!IMPORTANT]\nCeci est entièrement fictif ; les réponses sont générées par une IA. \n[Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer)", + "[!IMPORTANT]\nThis is entirely fictional; the responses are generated by AI.\n[Res.AB5D5733CAEFE6FD7D95": "Ceci est entièrement fictif ; les réponses sont générées par une IA. \n[Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer)", "Navigate to */app/README.md* in the repo root.": "Accédez à */app/README.md* à la racine du référentiel.", "For a more detailed explanation of the app, see [Detailed app explanation](/less.C2B882AE8CDAB3376C09": "Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates).", "**You:** \"Time Beetle, what do I need to get started with this project?\" Suggest.B4EDF82075F09D58C19A": "**Vous :** « Scarabée du Temps, de quoi ai-je besoin pour démarrer ce projet ? Suggère des outils et des bibliothèques qui pourraient m'aider à créer une application d'IA que tu es capable de faire fonctionner. »", @@ -560,7 +559,7 @@ "**Time Beetle:** Yes, you can add a system message to the conversation. A system.CF8DE107129B1532760C": "**Scarabée du Temps :** Oui, vous pouvez ajouter un message système à la conversation. Un message système crée une « personnalité » pour l'IA et peut être utilisé pour fournir un contexte supplémentaire.", "**You:** Ok, so in the context of the conversation we've been having, what would.6CD1F9D2EE30A7D92559": "**Vous :** D'accord, dans le contexte de la conversation que nous avons eue, à quoi ressemblerait un message système ?", "**Time Beetle:** A system message for this conversation could be something like .5CDBD740A77F06BBBF07": "**Scarabée du Temps :** Un message système pour cette conversation pourrait être quelque chose comme *\"Je suis un assistant de voyage IA, ici pour vous aider à planifier votre voyage en Italie.\"* Ce message donne le ton de la conversation et aide l'IA à comprendre son rôle dans l'interaction.", - "[!NOTE]\nThis used to be called \"system\". This is a recent change and \"developer\".71E382A329474FF9B6A4": "[!NOTE]\nCela s'appelait autrefois « system ». C’est un changement récent et « developer » est le nouveau terme. Pour certains modèles, cela s'appelle encore « system », donc si vous avez des problèmes, utilisez « system ».", + "[!NOTE]\nThis used to be called \"system\". This is a recent change and \"developer\".71E382A329474FF9B6A4": "Cela s'appelait autrefois « system ». C’est un changement récent et « developer » est le nouveau terme. Pour certains modèles, cela s'appelle encore « system », donc si vous avez des problèmes, utilisez « system ».", "**You:** Ok, great, I'll make sure to include a system message in my chat conver.EC60368AAD68E8D4CAB1": "**Vous :** Ok, super, je veillerai à inclure un message système dans mes conversations de chat. Par curiosité, à quoi ressemble un message système pour toi ?", "**Time Beetle:** A system message for me could be something like *\"I'm the Time .505B3EBF98CB3AED10B6": "**Scarabée du Temps :** Un message système pour moi pourrait être quelque chose comme *\"Je suis le Scarabée du Temps, ici pour vous aider à naviguer dans le temps et l'espace. Je devrais être utile pour vous fournir des informations et des conseils sur l’époque où vous vous trouvez, ainsi que les outils dont vous avez besoin pour retourner à votre époque.\"*", "**You:** Anything else I should know about chat conversations?": "**Vous :** Y a-t-il autre chose que je devrais savoir sur les conversations de chat ?", @@ -582,12 +581,12 @@ "**Time Beetle:** Rude..": "**Scarabée du Temps :** Quelle impolitesse...", "**You:** What?": "**Vous :** Quoi ?", "**Time Beetle:** Nothing": "**Scarabée du Temps :** Rien.", - "[!NOTE]\nThe aerial screw, also known as the helical air screw, was intended to l.700F27491DF2D30639D2": "[!NOTE]\nLa vis aérienne, également connue sous le nom de vis hélicoïdale, était destinée à décoller du sol en comprimant l'air. La conception de Léonard comportait un grand rotor en spirale en lin, rigidifié avec de l'amidon, et monté sur une plate-forme en bois. L'idée était qu'une équipe d'hommes ferait tourner des manivelles autour de la plate-forme, en la faisant tourner suffisamment vite pour obtenir une portance.", + "[!NOTE]\nThe aerial screw, also known as the helical air screw, was intended to l.700F27491DF2D30639D2": "La vis aérienne, également connue sous le nom de vis hélicoïdale, était destinée à décoller du sol en comprimant l'air. La conception de Léonard comportait un grand rotor en spirale en lin, rigidifié avec de l'amidon, et monté sur une plate-forme en bois. L'idée était qu'une équipe d'hommes ferait tourner des manivelles autour de la plate-forme, en la faisant tourner suffisamment vite pour obtenir une portance.", "Despite its impracticality, the aerial screw remains a testament to Leonardo's g.A3D822F144E39F60A388": "Bien que son impraticabilité soit avérée, la vis aérienne reste un témoignage du génie de Léonard et de sa quête incessante d’innovation. Elle a jeté les bases des développements futurs dans l’aviation et continue d’inspirer les ingénieurs et inventeurs encore aujourd’hui.\n[Lire la suite](https://en.wikipedia.org/wiki/Leonardo%27s_aerial_screw).", "Check out [Sample app](/app/README.md) to get started.": "Consultez l'[application d'exemple](/app/README.md) pour commencer.", "**Question:** What is the purpose of the context window in generative AI models?.DC353363751AB75C2BCF": "**Question :** Quel est l'objectif de la fenêtre de contexte dans les modèles d'IA générative ? Sélectionnez toutes les options applicables.", - "[!NOTE]\nSo far, you've been on a journey through time with Leonardo da Vinci, ex.5B7F9383E4EEE3FE0953": "[!NOTE]\nJusqu'à présent, vous avez voyagé dans le temps avec Léonard de Vinci, explorant les merveilles de la Renaissance. Vous avez rencontré le Scarabée temporel, un dispositif mystérieux qui vous permet de voyager dans le temps et l'espace.", - "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.71FCF04C75E945CC50E9": "[!NOTE]\nBien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-sforza) si vous préférez passer directement au contenu technique.", + "[!NOTE]\nSo far, you've been on a journey through time with Leonardo da Vinci, ex.5B7F9383E4EEE3FE0953": "Jusqu'à présent, vous avez voyagé dans le temps avec Léonard de Vinci, explorant les merveilles de la Renaissance. Vous avez rencontré le Scarabée temporel, un dispositif mystérieux qui vous permet de voyager dans le temps et l'espace.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.71FCF04C75E945CC50E9": "Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-sforza) si vous préférez passer directement au contenu technique.", "**You:** Let's see if I can manage to get back home.": "**Vous :** Voyons si je peux réussir à rentrer chez moi.", "**Sforza**: Da Vinci, dov'è il mio dipinto? Where is my painting?": "**Sforza** : Da Vinci, dov'è il mio dipinto ? Où est mon tableau ?", "**Leonardo:** It's Sforza. He wants me to complete a painting, 'The Last Supper..1702706B164746BB09A2": "**Léonard :** C'est Sforza. Il veut que je termine une peinture, « La Cène ».", @@ -633,7 +632,7 @@ "**You:** That sounds interesting, I assume you will give me some examples?": "**Vous :** Ça a l'air intéressant. Je suppose que tu vas me donner des exemples ?", "**Time Beetle:** Yes, coming right up. Let's look at examples for each of these .37451E68F8F792A815C8": "**Scarabée temporel :** Oui, ils arrivent tout de suite. Regardons des exemples pour chacune de ces techniques afin de comprendre comment elles fonctionnent en pratique.", "Patolli": "Patolli", - "[!NOTE]\nPatolli is one of the oldest known games in the Americas, played by pre-.9BC3E7AE1FCA93DC44A0": "[!NOTE]\nLe Patolli est l'un des jeux les plus anciens connus des Amériques, joué par les cultures mésoaméricaines précolombiennes comme les Aztèques. C'est un mélange de stratégie et de hasard.", + "[!NOTE]\nPatolli is one of the oldest known games in the Americas, played by pre-.9BC3E7AE1FCA93DC44A0": "Le Patolli est l'un des jeux les plus anciens connus des Amériques, joué par les cultures mésoaméricaines précolombiennes comme les Aztèques. C'est un mélange de stratégie et de hasard.", "**How Patolli is Played**:": "**Comment le Patolli est joué** :", "**Board and Pieces**: Played on an X-shaped board with a center block and four a.3A4333544633207C20C7": "**Plateau et pièces** : Joué sur un plateau en forme de X avec un bloc central et quatre branches. Les joueurs utilisent cinq haricots noirs comme dés, marqués d'un côté.", "**Setup**: Each player picks six markers (beads) of their color and places them .BC8F26F0D93B02BFA0FF": "**Installation** : Chaque joueur choisit six marqueurs (perles) de sa couleur et les place en dehors du plateau, ainsi que des perles de points pour le score.", @@ -657,7 +656,7 @@ "Shaping the output": "Modeler les sorties", "**Time Beetle:** Let's start with a simple example. Imagine you're Leonardo da V.6BEAC2381DB3EA0B1849": "**Scarabée temporel :** Commençons par un exemple simple. Imagine que tu es Léonard de Vinci et que tu essaies de trouver des idées d'inventions avec la technologie du XVe siècle. Tu veux savoir quels sont les ressources nécessaires et combien d'efforts cela demanderait pour construire chaque invention. Voici comment poser la question :", "**Leonardo:** Oh I like this game, everyone pretend you're me!": "**Léonard :** Oh, j'aime ce jeu, tout le monde fait comme si vous étiez moi !", - "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.98C3011CD192FE1BB50D": "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#interact-with-amelia-earhart) if you'd prefer to jump straight to the technical content.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.98C3011CD192FE1BB50D": "While we recommend going through the story (it's fun!), [click here](#interact-with-amelia-earhart) if you'd prefer to jump straight to the technical content.", "**Ada Lovelace**: \"I need you to go meet a friend of mine. There are few people .EF2292730A6DE3B186A5": "**Ada Lovelace**: \"J'ai besoin que vous rencontriez une amie à moi. Peu de personnes peuvent égaler son expertise en mécanique et en résolution de problèmes. Il pourrait être difficile de la trouver, cependant ; elle est toujours en déplacement :)\"", "**Ada Lovelace**: \"Why, Amelia Earhart, of course! She's a pilot and adventurer,.B99F756AFB11C43D14AC": "**Ada Lovelace**: \"Mais bien sûr, Amelia Earhart ! C'est une aviatrice et une aventurière, actuellement en train de faire le tour du monde. C'est totalement de ma faute si elle a disparu — je lui ai donné le dispositif de voyage dans le temps, eh bien, un prototype précoce de celui-ci. Heureusement, le dispositif que vous avez peut localiser d'autres appareils, donc vous pouvez la retrouver. Tout ce que vous devez faire est de cliquer ici et là, puis de tourner ce bouton.\"", "**You**: \"Hey, wait, what's our mission exactly?\"": "**Vous**: \"Hé, attendez, quelle est exactement notre mission ?\"", @@ -942,8 +941,8 @@ "Serverless AI Chat with RAG": "Chat IA sans serveur avec RAG", "Ask Youtube: A RAG-based Youtube Q&A API": "Demandez à Youtube : Une API de questions-réponses basée sur RAG pour Youtube", "Full-length workshop: Create your own ChatGPT with RAG": "Atelier complet : Créez votre propre ChatGPT avec RAG", - "[!NOTE]\n*Our story so far. You are a mechanic from 1860s London. You were workin.733792134DE76CF624D8": "[!NOTE]\n*Notre histoire jusqu'à présent. Vous êtes un mécanicien de Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez pris un appareil de voyage dans le temps. À travers vos voyages dans le temps, vous vous êtes retrouvé à Florence, où vous avez rencontré Léonard de Vinci. Vous êtes également allé dans l'empire aztèque, et c'est là que l'histoire continue.*", - "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.C107240EAC68507C06A2": "[!NOTE]\nBien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-scipio) si vous préférez passer directement au contenu technique.", + "[!NOTE]\n*Our story so far. You are a mechanic from 1860s London. You were workin.733792134DE76CF624D8": "*Notre histoire jusqu'à présent. Vous êtes un mécanicien de Londres des années 1860. Vous travailliez sur votre automate et avez reçu une lettre de Charles Babbage qui vous a finalement conduit dans une bibliothèque où vous avez pris un appareil de voyage dans le temps. À travers vos voyages dans le temps, vous vous êtes retrouvé à Florence, où vous avez rencontré Léonard de Vinci. Vous êtes également allé dans l'empire aztèque, et c'est là que l'histoire continue.*", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.C107240EAC68507C06A2": "Bien que nous vous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-scipio) si vous préférez passer directement au contenu technique.", "**Ada Lovelace**: \"Welcome back! I trust your journey was enlightening.\"": "**Ada Lovelace**: \"Bienvenue ! J'espère que votre voyage a été enrichissant.\"", "**You**: \"It was! Meeting with Mrs. Earhart was quite the experience. She taught.F0ADC874BB8619F96196": "**Vous** : \"Ça l'était ! Rencontrer Mme Earhart a été toute une expérience. Elle nous a appris l'importance des outils et comment les utiliser efficacement.\"", "**Ada Lovelace**: \"There are few people who understand the importance of tools b.6665EBD9651A476C02F8": "**Ada Lovelace**: \"Peu de gens comprennent mieux qu'Amelia l'importance des outils. Je suppose que vous avez également mis à jour son Scarabée Temporel ?\"", @@ -978,7 +977,7 @@ "**You**: \"Yes, please!\"": "**Vous** : \"Oui, je veux bien !\"", "**Time Beetle**: \"Good, let's start with creating a server\"": "**Time Beetle** : \"Bien, commençons par créer un serveur.\"", "💼 Slides: [Retrieval augmented generation, RAG](/videos/slides/03-rag.pptx)": "💼 Diapositives : [Génération augmentée par récupération, RAG](/videos/slides/03-rag.pptx)", - "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.1C6E22C551C0E4E9806D": "[!NOTE]\nBien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-ada-lovelace) si vous préférez aller directement au contenu technique.", + "[!NOTE]\nWhile we recommend going through the story (it's fun!), [click here](#in.1C6E22C551C0E4E9806D": "Bien que nous recommandions de suivre l'histoire (c'est amusant !), [cliquez ici](#interact-with-ada-lovelace) si vous préférez aller directement au contenu technique.", "**You**: \"Leonardo, it's time to go,\" you said, pressing the button. The device .B67CB1E00F440233FEFA": "**Vous** : « Leonardo, il est temps de partir », avez-vous dit en appuyant sur le bouton. L'appareil s'est mis à bourdonner et une voix mécanique a résonné : « Il est temps de rentrer à la maison, il est temps pour la 'genèse'. »", "**Leonardo:** \"Genesis? Che cosa significa?\" Leonardo asked, confused. Before yo.2C0B1B3749ADEDB192C4": "**Leonardo :** « Genèse ? Che cosa significa ? » Leonardo demanda, confus. Avant que vous ne puissiez répondre, le monde se dissout en un flou de couleurs et de sons, le temple disparaissant tandis que vous étiez propulsé à travers le temps.", "**Ada:** \"Ah, it's about time you arrived,\" she said warmly. \"We need you to run.06D0750A1F4176EFA392": "**Ada :** « Ah, il était temps que vous arriviez », dit-elle chaleureusement. « Nous avons besoin de vous pour une commission. »", @@ -1008,14 +1007,13 @@ "**Ada:** Now that we've covered the basics of RAG, let's talk about how you can .9ECFF218E5FF2D457020": "**Ada :** « Maintenant que nous avons couvert les bases de RAG, parlons de la manière dont vous pouvez intégrer des sources de données externes dans votre application d'IA. »", "**APIs:** Many external data sources provide APIs that allow you to access their.2315BB3AAAFF5E5D4193": "**APIs :** De nombreuses sources de données externes fournissent des APIs qui vous permettent d'accéder à leurs données de manière programmatique. Vous pouvez utiliser ces APIs pour récupérer des informations en temps réel et les utiliser pour améliorer les réponses générées par l'IA.", "**Databases:** If you have a large amount of data that you want to use for retri.62FDFD2B0F507D1AE89E": "**Bases de données :** Si vous disposez d'un grand volume de données que vous souhaitez utiliser pour la récupération, vous pouvez les stocker dans une base de données et les interroger selon les besoins. Cela peut être utile pour les données structurées devant être accessibles rapidement.", - "[!NOTE]\nWhen integrating external data sources into your AI application, it's im.E2602251372D8F8B0829": "[!NOTE]\nLorsque vous intégrez des sources de données externes dans votre application d'IA, il est important de prendre en compte les implications en termes de confidentialité et de sécurité liées à l'accès et au stockage des données. Assurez-vous de disposer des autorisations et des protections nécessaires pour protéger les données et de respecter les réglementations en vigueur.", + "[!NOTE]\nWhen integrating external data sources into your AI application, it's im.E2602251372D8F8B0829": "Lorsque vous intégrez des sources de données externes dans votre application d'IA, il est important de prendre en compte les implications en termes de confidentialité et de sécurité liées à l'accès et au stockage des données. Assurez-vous de disposer des autorisations et des protections nécessaires pour protéger les données et de respecter les réglementations en vigueur.", "If you're using a database, you also want to think about how you want to *search.A86190FC5DD4F30BEE38": "Si vous utilisez une base de données, vous devez également réfléchir à la manière dont vous souhaitez *rechercher vos données* pour récupérer les informations les plus pertinentes. Cela peut se faire via une recherche par mot-clé, une recherche en texte intégral ou via des techniques plus avancées comme la recherche sémantique ou vectorielle qui peuvent nécessiter un indexage spécifique. Nous aborderons les techniques de recherche avancées dans une leçon ultérieure.", "**You**: Can you explain terms like API and Databases in more 1860s terms?": "**Vous :** « Pouvez-vous expliquer des termes comme API et Bases de données dans des termes plus proches des années 1860 ? »", "**Ada**: Of course, an API is like a messenger that delivers a message from one .10C8A9D0F04034A77F68": "**Ada :** « Bien sûr, une API est comme un messager qui transmet un message d'un endroit à un autre, et une base de données est comme une bibliothèque où vous stockez tous vos livres. »", "**You**: Ah, I see, that makes sense.": "**Vous :** « Ah, je vois, cela a du sens. »", "**Ada:** Are you still with me? Good, let's move on to the next step, let's try .938FFD3D429DBA9E4E05": "**Ada :** « Vous êtes toujours avec moi ? Bien, passons à l'étape suivante, essayons d'améliorer le prompt envoyé au modèle d'IA. »", "**Ada:** Once you’ve set up a way to pull info from your data, you can add it to.CB9332A5002295504DA7": "**Ada :** « Une fois que vous avez mis en place un moyen d'extraire des informations de vos données, vous pouvez les ajouter au prompt du modèle d'IA. Mélangez simplement les informations récupérées avec le texte d'entrée en ajoutant un contexte ou des directives supplémentaires pour orienter la réponse de l'IA. »", - "[!TIP]\nNote this part of the prompt: `If there's not enough data in provided sou.3122A095CE2BF1CF89D2": "[!TIP]\nNotez cette partie du prompt : `S'il n'y a pas assez de données dans les sources fournies, dites que vous ne savez pas.`. Ceci est important pour éviter que l'IA ne génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée un *échappatoire* et est une bonne pratique pour garantir la qualité du contenu généré.", "RAG can be considered as an advanced form of *prompt engineering*.": "La RAG peut être considérée comme une forme avancée de *conception de prompt*.", "**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an examp.FD27C69C931E37800773": "**Ada :** « La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons intégrer un simple système de récupération dans une application JavaScript en utilisant un fichier [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche basique pour extraire des informations pertinentes en fonction de la question d'un utilisateur. »", "You can find this code in the [`example/rag-cars.js`](/lessons/05-rag/example/ra.42DEA119F0CBA7461669": "Vous pouvez trouver ce code dans le fichier [`example/rag-cars.js`](/lessons/05-rag/example/rag-cars.js) accompagné du fichier [`hybrid.csv`](/lessons/05-rag/example/hybrid.csv) contenant les données utilisées pour la récupération.", @@ -1080,5 +1078,10 @@ "**Time Beetle**: Yes, but first things first, let's make Scipio happy. We need t.0796EC19E18CF8713A7A": "**Time Beetle** : Oui, mais d'abord, faisons plaisir à Scipion. Nous devons discuter avec une certaine Mme Lamarr lors de notre prochaine étape.", "**Scipio**: \"You know, I have so many parchments and scrolls lying around. I cou.CF8EE532801966EE620B": "**Scipion** : \"Vous savez, j'ai tellement de parchemins et de rouleaux qui traînent. J'aimerais vraiment un outil pour m'aider à les organiser. J'ai aussi cet abaque que j'utilise pour les calculs. Pouvez-vous m’aider à créer un outil pour gérer mon inventaire ?\"", "**Question**: What are the different types of resources an MCP Server can expose.EA1C2B2656DC387BE2F4": "**Question** : Quels sont les différents types de ressources qu'un serveur MCP peut exposer ?", - "**Question**: What are some ways you can test your MCP Server?": "**Question** : Quels sont les moyens de tester un serveur MCP ?" + "**Question**: What are some ways you can test your MCP Server?": "**Question** : Quels sont les moyens de tester un serveur MCP ?", + "[!TIP]\nFor example, you can give the server the capability to retrieve informati.077D906506C8286B76D1": "Par exemple, vous pouvez donner au serveur la capacité de récupérer des informations d'une API web externe, comme Wikipedia :\\\n`https://en.wikipedia.org/api/rest_v1/page/summary/${encodeURIComponent(name)}`", + "[!TIP]\nExperiment with different context window sizes to see how it affects the .824F9106C1C873E8E136": "Expérimentez avec différentes tailles de fenêtres contextuelles pour voir comment cela affecte les réponses de l'IA.", + "[!TIP]\nConsider what the system message should be and what input you should prov.DF2588FD52FAEF8AD227": "Réfléchissez à ce que devrait être le message système et à quel type d'entrée vous devriez fournir.", + "[!TIP]\nNote this part of the prompt: `If there's not enough data in provided sou.3122A095CE2BF1CF89D2": "Notez cette partie du prompt : `If there's not enough data in provided sources, say that you don't know.`. Cela est important pour éviter que l'IA génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée une *échappatoire* et constitue une bonne pratique pour garantir la qualité du contenu généré.", + "[!TIP]\nTry to have the LLM generate a plan that includes step-by-step instructio.EB95597D412F5CEF60A1": "Essayez de demander au LLM de générer un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils." } diff --git a/translations/usage.jsonl b/translations/usage.jsonl index dcc12e77..c5bfa62f 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -162,3 +162,116 @@ {"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:31.327Z","cost":0.0006936,"duration":584.9134950000007,"total":1629,"prompt":1594,"completion":35} {"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:31.819Z","cost":0.0006544000000000001,"duration":460.4177320000017,"total":1576,"prompt":1556,"completion":20} {"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4.1-mini","date":"2025-07-13T14:51:33.475Z","cost":0.0003628000000000001,"duration":1626.3465359999973,"total":820,"prompt":791,"completion":29} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T02:55:58.962Z","cost":0.012065,"duration":1750.018419999993,"total":4679,"prompt":4630,"completion":49} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:00.553Z","cost":0.00026565,"duration":1439.8108670000001,"total":1708,"prompt":1687,"completion":21} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:00.581Z","cost":0,"duration":4.2285960000008345,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:01.308Z","cost":0.00025679999999999995,"duration":698.2499339999995,"total":1652,"prompt":1632,"completion":20} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:01.329Z","cost":0,"duration":3.0595529999991413,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:01.352Z","cost":0,"duration":3.5410310000006575,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:02.771Z","cost":0.00024359999999999999,"duration":1398.542911000004,"total":1564,"prompt":1544,"completion":20} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:04.322Z","cost":0.00026925,"duration":960.2663680000114,"total":1711,"prompt":1683,"completion":28} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:05.279Z","cost":0.00028215000000000005,"duration":936.8816250000091,"total":1803,"prompt":1777,"completion":26} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.023Z","cost":0.00023684999999999998,"duration":721.7688749999943,"total":1519,"prompt":1499,"completion":20} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.045Z","cost":0,"duration":2.9860589999880176,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.066Z","cost":0,"duration":3.006968000001507,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.089Z","cost":0,"duration":2.588407000002917,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.112Z","cost":0,"duration":2.4814579999947455,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.135Z","cost":0,"duration":3.593689000001177,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.160Z","cost":0,"duration":3.095549999998184,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:06.182Z","cost":0,"duration":2.370267000005697,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:06.204Z","cost":0,"duration":2.646889999989071,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:07.655Z","cost":0.00026025,"duration":1007.6549950000044,"total":1609,"prompt":1567,"completion":42} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:08.605Z","cost":0.0043675,"duration":931.2727989999985,"total":1612,"prompt":1567,"completion":45} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:08.632Z","cost":0,"duration":2.612351999996463,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:09.544Z","cost":0.00028409999999999997,"duration":889.7589749999897,"total":1813,"prompt":1786,"completion":27} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:09.569Z","cost":0,"duration":3.4209399999963352,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:09.593Z","cost":0,"duration":2.4368849999882514,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:09.614Z","cost":0,"duration":2.433989000011934,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:09.639Z","cost":0,"duration":3.010744999992312,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:09.661Z","cost":0,"duration":3.2877080000034766,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:09.689Z","cost":0,"duration":2.9948549999971874,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:09.716Z","cost":0,"duration":2.645574000009219,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:10.890Z","cost":0.00027375,"duration":759.9520709999924,"total":1762,"prompt":1741,"completion":21} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:12.435Z","cost":0.0002604,"duration":1516.8817360000103,"total":1667,"prompt":1644,"completion":23} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:13.140Z","cost":0.00024885,"duration":680.1975840000086,"total":1602,"prompt":1583,"completion":19} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:13.167Z","cost":0,"duration":2.5950490000104764,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:14.936Z","cost":0.00024119999999999998,"duration":1746.6090859999968,"total":1548,"prompt":1528,"completion":20} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:29.236Z","cost":0.00017025,"duration":14273.895336999994,"total":1057,"prompt":1031,"completion":26} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:29.275Z","cost":0,"duration":4.560725999996066,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:29.311Z","cost":0,"duration":3.928717000002507,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:29.345Z","cost":0,"duration":3.3001549999899,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:31.218Z","cost":0.00028829999999999996,"duration":1176.2397530000017,"total":1742,"prompt":1682,"completion":60} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:31.254Z","cost":0,"duration":4.084229999993113,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:33.120Z","cost":0.0003006,"duration":1833.8768249999994,"total":1797,"prompt":1728,"completion":69} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.059Z","cost":0.00026115,"duration":908.7034310000017,"total":1657,"prompt":1629,"completion":28} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.092Z","cost":0,"duration":2.762982000000193,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.128Z","cost":0,"duration":2.4961749999929452,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.163Z","cost":0,"duration":2.812338000003365,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.203Z","cost":0,"duration":2.95492099999683,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.237Z","cost":0,"duration":2.778492000012193,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.270Z","cost":0,"duration":2.6652309999917634,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.302Z","cost":0,"duration":3.0358419999975013,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:34.333Z","cost":0,"duration":3.6031499999953667,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:34.364Z","cost":0,"duration":2.6068620000005467,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:36.830Z","cost":0.00031545,"duration":1927.3590949999925,"total":1821,"prompt":1727,"completion":94} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:37.824Z","cost":0.0048575,"duration":967.2116559999995,"total":1781,"prompt":1727,"completion":54} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:37.855Z","cost":0,"duration":2.747644000002765,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:40.243Z","cost":0.00027840000000000005,"duration":2355.1133249999984,"total":1793,"prompt":1772,"completion":21} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:40.276Z","cost":0,"duration":2.704012000001967,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:40.307Z","cost":0,"duration":2.5094200000021374,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:40.342Z","cost":0,"duration":2.6288230000063777,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:40.380Z","cost":0,"duration":3.6652630000025965,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:42.260Z","cost":0.013245,"duration":1471.9022010000044,"total":5208,"prompt":5178,"completion":30} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:43.217Z","cost":0.0080525,"duration":921.7314620000107,"total":3137,"prompt":3109,"completion":28} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:44.941Z","cost":0.00027345,"duration":1505.2632319999975,"total":1733,"prompt":1703,"completion":30} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:44.975Z","cost":0,"duration":2.9210779999993974,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:45.868Z","cost":0.00026940000000000004,"duration":859.1412030000065,"total":1733,"prompt":1712,"completion":21} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:45.903Z","cost":0,"duration":2.6616939999948954,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:45.939Z","cost":0,"duration":2.605479000005289,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:45.978Z","cost":0,"duration":3.5725429999874905,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:46.023Z","cost":0,"duration":4.4791129999939585,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:47.730Z","cost":0.00030225,"duration":1672.4260170000052,"total":1811,"prompt":1743,"completion":68} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:48.447Z","cost":0.0046075,"duration":672.3130600000004,"total":1768,"prompt":1743,"completion":25} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:49.151Z","cost":0.0002655,"duration":667.9588890000014,"total":1716,"prompt":1698,"completion":18} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:49.958Z","cost":0.00026684999999999995,"duration":771.4340349999984,"total":1698,"prompt":1671,"completion":27} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:50.792Z","cost":0.00014835,"duration":799.9608759999974,"total":920,"prompt":897,"completion":23} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T02:56:52.113Z","cost":0.0057125,"duration":997.7475479999994,"total":2150,"prompt":2105,"completion":45} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:56:53.667Z","cost":0,"duration":1357.620081000001,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T02:58:48.409Z","cost":0.011315,"duration":2273.279147999994,"total":4274,"prompt":4190,"completion":84} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:49.861Z","cost":0.00018554999999999998,"duration":1276.4848609999972,"total":1750,"prompt":1729,"completion":21} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:49.885Z","cost":0,"duration":3.2099359999992885,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:51.183Z","cost":0.00024855,"duration":1274.847655000005,"total":1597,"prompt":1577,"completion":20} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:51.204Z","cost":0,"duration":2.510252000000037,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:52.044Z","cost":0.0002421,"duration":821.5851699999985,"total":1545,"prompt":1522,"completion":23} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:52.739Z","cost":0.00016695,"duration":670.9295390000043,"total":1041,"prompt":1017,"completion":24} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:52.766Z","cost":0,"duration":2.9882630000065546,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:52.789Z","cost":0,"duration":2.8644820000045,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:58:52.812Z","cost":0,"duration":2.6637639999971725,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:04.830Z","cost":0.00026925,"duration":11496.673797999996,"total":1735,"prompt":1715,"completion":20} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:04.862Z","cost":0,"duration":3.117674999994051,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:05.643Z","cost":0.00027689999999999995,"duration":749.3370379999978,"total":1786,"prompt":1766,"completion":20} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:05.674Z","cost":0,"duration":3.7969710000033956,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:05.705Z","cost":0,"duration":3.2800770000030752,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:05.740Z","cost":0,"duration":3.5193169999984093,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:05.773Z","cost":0,"duration":4.883620999993582,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:07.967Z","cost":0.00026264999999999996,"duration":1399.622997999999,"total":1706,"prompt":1691,"completion":15} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:08.004Z","cost":0,"duration":3.3702350000021397,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:08.600Z","cost":0.00016049999999999997,"duration":568.0114919999978,"total":1723,"prompt":1706,"completion":17} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:08.642Z","cost":0,"duration":3.6097919999956503,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:08.670Z","cost":0,"duration":3.2151560000056634,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:08.704Z","cost":0,"duration":3.1354169999976875,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:08.734Z","cost":0,"duration":2.626598999995622,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:09.443Z","cost":0.00019575,"duration":681.0785269999978,"total":1757,"prompt":1737,"completion":20} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:09.473Z","cost":0,"duration":4.039934000000358,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:10.951Z","cost":0.00026355000000000004,"duration":1450.3799940000026,"total":1688,"prompt":1665,"completion":23} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:10.986Z","cost":0,"duration":3.7740780000021914,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T02:59:12.459Z","cost":0.0126375,"duration":1074.3020179999949,"total":4929,"prompt":4887,"completion":42} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:13.436Z","cost":0.00016275,"duration":760.4537029999992,"total":1620,"prompt":1585,"completion":35} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:14.257Z","cost":0.0002613,"duration":780.4098740000045,"total":1688,"prompt":1670,"completion":18} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:15.346Z","cost":0.00027,"duration":1058.3579060000047,"total":1734,"prompt":1712,"completion":22} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:16.040Z","cost":0.00027465,"duration":663.4486839999881,"total":1765,"prompt":1743,"completion":22} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:16.914Z","cost":0.00028275,"duration":833.8560349999898,"total":1816,"prompt":1793,"completion":23} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:17.779Z","cost":0.000276,"duration":835.6907629999914,"total":1777,"prompt":1756,"completion":21} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:18.615Z","cost":0.00021255,"duration":807.7780709999934,"total":1339,"prompt":1313,"completion":26} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:19.378Z","cost":0.00023595,"duration":736.2743699999992,"total":1495,"prompt":1469,"completion":26} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:20.225Z","cost":0.0002472,"duration":817.6805759999988,"total":1579,"prompt":1556,"completion":23} From 6b82b96242aa1534a74c2adf47e32a432f8a3146 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 03:14:00 +0000 Subject: [PATCH 13/19] fix: correct formatting in French translations and update usage data for structured output lessons --- .../translations/README.fr.md | 1 - translations/fr.json | 6 +-- translations/usage.jsonl | 41 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/lessons/01-intro-to-genai/translations/README.fr.md b/lessons/01-intro-to-genai/translations/README.fr.md index 2a2c546f..b0b27523 100644 --- a/lessons/01-intro-to-genai/translations/README.fr.md +++ b/lessons/01-intro-to-genai/translations/README.fr.md @@ -151,7 +151,6 @@ Une pensée vous traverse. L'appareil peut-il me comprendre si je lui parle ? Si vous souhaitez interagir avec Dinocrates, exécutez l'application [Characters](/app/README.md). > [!IMPORTANT] -> \[!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité AI responsable](../../README.md#responsible-ai-disclaimer) diff --git a/translations/fr.json b/translations/fr.json index 08ca6696..de9d0077 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -844,7 +844,6 @@ "A. Presenting information in a structured manner.": "A. Présenter les informations de manière structurée.", "B. Extracting data from prompts.": "B. Extraire des données des prompts.", "C. Generating unstructured text.": "C. Générer du texte non structuré.", - "Generative AI with JavaScript video series": "* [Série de vidéos sur l'intelligence artificielle générative avec JavaScript](https://aka.ms/genai-js)", "Building MCP Servers": "Construire des serveurs MCP", "Building a Client": "Construire un client", "Building a Client with an LLM": "Construire un client avec un LLM", @@ -1083,5 +1082,6 @@ "[!TIP]\nExperiment with different context window sizes to see how it affects the .824F9106C1C873E8E136": "Expérimentez avec différentes tailles de fenêtres contextuelles pour voir comment cela affecte les réponses de l'IA.", "[!TIP]\nConsider what the system message should be and what input you should prov.DF2588FD52FAEF8AD227": "Réfléchissez à ce que devrait être le message système et à quel type d'entrée vous devriez fournir.", "[!TIP]\nNote this part of the prompt: `If there's not enough data in provided sou.3122A095CE2BF1CF89D2": "Notez cette partie du prompt : `If there's not enough data in provided sources, say that you don't know.`. Cela est important pour éviter que l'IA génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée une *échappatoire* et constitue une bonne pratique pour garantir la qualité du contenu généré.", - "[!TIP]\nTry to have the LLM generate a plan that includes step-by-step instructio.EB95597D412F5CEF60A1": "Essayez de demander au LLM de générer un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils." -} + "[!TIP]\nTry to have the LLM generate a plan that includes step-by-step instructio.EB95597D412F5CEF60A1": "Essayez de demander au LLM de générer un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils.", + "Generative AI with JavaScript video series": "Série vidéo sur l'IA générative avec JavaScript" +} \ No newline at end of file diff --git a/translations/usage.jsonl b/translations/usage.jsonl index c5bfa62f..5b39b1fe 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -275,3 +275,44 @@ {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:18.615Z","cost":0.00021255,"duration":807.7780709999934,"total":1339,"prompt":1313,"completion":26} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:19.378Z","cost":0.00023595,"duration":736.2743699999992,"total":1495,"prompt":1469,"completion":26} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T02:59:20.225Z","cost":0.0002472,"duration":817.6805759999988,"total":1579,"prompt":1556,"completion":23} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T03:10:37.084Z","cost":0.011045,"duration":1310.880373,"total":4361,"prompt":4342,"completion":19} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:38.519Z","cost":0.000267,"duration":1209.6614330000011,"total":1696,"prompt":1668,"completion":28} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:38.546Z","cost":0,"duration":3.6556479999999283,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:39.982Z","cost":0.00027614999999999996,"duration":1411.7021470000036,"total":1754,"prompt":1725,"completion":29} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.195Z","cost":0.0002541,"duration":1177.1180539999987,"total":1634,"prompt":1614,"completion":20} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.243Z","cost":0,"duration":7.89216899999883,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.285Z","cost":0,"duration":5.221568000000843,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.315Z","cost":0,"duration":3.101353999998537,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.343Z","cost":0,"duration":2.6891749999995227,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.368Z","cost":0,"duration":3.1836100000000442,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.391Z","cost":0,"duration":2.82308500000363,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:41.417Z","cost":0,"duration":3.856040999999095,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:44.706Z","cost":0.0002688,"duration":3261.6524900000004,"total":1432,"prompt":1312,"completion":120} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T03:10:45.519Z","cost":0.00355,"duration":791.6644329999981,"total":1339,"prompt":1312,"completion":27} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:46.165Z","cost":0,"duration":2.6244510000033188,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:46.196Z","cost":0,"duration":2.8916129999997793,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:47.077Z","cost":0.00027780000000000003,"duration":849.662397,"total":1783,"prompt":1760,"completion":23} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:47.113Z","cost":0,"duration":3.1874039999966044,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:47.148Z","cost":0,"duration":2.924183000002813,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:47.181Z","cost":0,"duration":2.941446000004362,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:47.209Z","cost":0,"duration":3.1825450000033015,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:47.868Z","cost":0,"duration":3.2772209999966435,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:47.902Z","cost":0,"duration":3.319561000003887,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.092Z","cost":0.0002694,"duration":3154.5286330000017,"total":1724,"prompt":1700,"completion":24} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.126Z","cost":0,"duration":3.1317099999942,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.163Z","cost":0,"duration":3.813662000000477,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.196Z","cost":0,"duration":3.002939999998489,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.234Z","cost":0,"duration":3.9734109999990324,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.287Z","cost":0,"duration":5.899232000003394,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.322Z","cost":0,"duration":4.320588000002317,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.365Z","cost":0,"duration":2.9729149999984656,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:51.396Z","cost":0,"duration":3.092587999999523,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.005Z","cost":0,"duration":2.914665000003879,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.033Z","cost":0,"duration":3.2874070000034408,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.065Z","cost":0,"duration":2.6106589999981225,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.719Z","cost":0.00027015000000000003,"duration":615.5231790000034,"total":1753,"prompt":1737,"completion":16} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.766Z","cost":0,"duration":6.889097999999649,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.804Z","cost":0,"duration":3.4532599999947706,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.861Z","cost":0,"duration":3.2009089999992284,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.897Z","cost":0,"duration":3.25327699999616,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.941Z","cost":0,"duration":3.820103999998537,"total":0,"prompt":0,"completion":0} From 4a89d4ad629426e611f010dfd14e91dd23a97d9f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 03:20:19 +0000 Subject: [PATCH 14/19] fix: correct formatting for notes and important sections in French translations --- lessons/04-structured-output/translations/README.fr.md | 2 +- lessons/06-tool-calling/translations/README.fr.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lessons/04-structured-output/translations/README.fr.md b/lessons/04-structured-output/translations/README.fr.md index 2597bfca..df4f3f98 100644 --- a/lessons/04-structured-output/translations/README.fr.md +++ b/lessons/04-structured-output/translations/README.fr.md @@ -558,4 +558,4 @@ C. Générer du texte non structuré. ## Ressources d'auto-apprentissage -* [\* \[Série de vidéos sur l'intelligence artificielle générative avec JavaScript\](https://aka.ms/genai-js)](https://aka.ms/genai-js) +* [Série vidéo sur l'IA générative avec JavaScript](https://aka.ms/genai-js) diff --git a/lessons/06-tool-calling/translations/README.fr.md b/lessons/06-tool-calling/translations/README.fr.md index e0fb3b81..83663241 100644 --- a/lessons/06-tool-calling/translations/README.fr.md +++ b/lessons/06-tool-calling/translations/README.fr.md @@ -26,7 +26,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V > > Reportez-vous à [Leçon 1](/lessons/01-intro-to-genai/README.md) si vous souhaitez reprendre l'histoire depuis le début. -> \[!NOTE] +> [!NOTE] > While we recommend going through the story (it's fun!), [click here](#interact-with-amelia-earhart) if you'd prefer to jump straight to the technical content. **Ada Lovelace**: "J'ai besoin que vous rencontriez une amie à moi. Peu de personnes peuvent égaler son expertise en mécanique et en résolution de problèmes. Il pourrait être difficile de la trouver, cependant ; elle est toujours en déplacement :)" @@ -65,7 +65,7 @@ Le monde autour de vous commence à se brouiller, et tout devient noir. Vous rev If you want to interact with Ada, run the [Characters](/app/README.md) app. -> \[!IMPORTANT] +> [!IMPORTANT] > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) @@ -81,7 +81,7 @@ If you want to interact with Ada, run the [Characters](/app/README.md) app. Pour une explication plus détaillée de l'application, voir [Explication détaillée de l'application](/lessons/01-intro-to-genai/README.md#interact-with-dinocrates). -> \[!NOTE] +> [!NOTE] > Si vous exécutez le projet localement sur votre machine, veuillez consulter le guide de démarrage rapide pour configurer un [token d'accès personnel GitHub](/docs/setup/README.md#creating-a-personal-access-token-pat-for-github-model-access) et remplacer la clé dans le code. ## Appels d'outils From 0890e5e316761d1e70a06a7808bc1d2d609f49f3 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 04:10:45 +0000 Subject: [PATCH 15/19] translate image alt --- .../translations/README.fr.md | 20 ++++----- .../02-first-ai-app/translations/README.fr.md | 14 +++--- .../translations/README.fr.md | 22 ++++----- .../translations/README.fr.md | 10 ++--- lessons/05-rag/translations/README.fr.md | 10 ++--- .../06-tool-calling/translations/README.fr.md | 6 +-- lessons/07-mcp/translations/README.fr.md | 16 +++---- .../08-mcp-advanced/translations/README.fr.md | 2 +- translations/fr.json | 45 ++++++++++++++++++- translations/usage.jsonl | 16 +++++++ 10 files changed, 110 insertions(+), 51 deletions(-) diff --git a/lessons/01-intro-to-genai/translations/README.fr.md b/lessons/01-intro-to-genai/translations/README.fr.md index b0b27523..8254b279 100644 --- a/lessons/01-intro-to-genai/translations/README.fr.md +++ b/lessons/01-intro-to-genai/translations/README.fr.md @@ -12,7 +12,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Ressources associées -[![Watch a short video about an Introduction to Generative AI](https://img.youtube.com/vi/vLYtDgs_zx8/0.jpg)](https://www.youtube.com/watch?v=vLYtDgs_zx8\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=1) +[![Regardez une courte vidéo sur l'introduction à l'IA générative](https://img.youtube.com/vi/vLYtDgs_zx8/0.jpg)](https://www.youtube.com/watch?v=vLYtDgs_zx8\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=1) *Cette vidéo vous donne une introduction à l'IA générative avec JavaScript.* @@ -73,7 +73,7 @@ Après une marche de 20 minutes le long de la Tamise, vous arrivez enfin à la b Alors que vos yeux s'adaptent à la faible lumière, vous remarquez une silhouette au loin, vous faisant signe de la main. Vous vous approchez d'elle, vos pas résonnant sur le plancher en bois. La silhouette devient plus nette, et vous le reconnaissez grâce à des photos dans les journaux, c'est Charles Babbage. -![Dusty Library](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/library.png) +![Bibliothèque poussiéreuse](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/library.png) ### Quel est cet appareil ? @@ -87,7 +87,7 @@ Poussé par la curiosité, vos doigts se dirigent vers le bouton rouge. Au momen Puis, le noir complet et une sensation de chute. -![Time Vortex](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/vortex.png) +![Vortex temporel](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/vortex.png) ### Alexandrie 300 av. J.-C. @@ -95,7 +95,7 @@ Vous vous réveillez, désorienté. Lorsque votre vision s'éclaircit, une cité Des gens en toges se déplacent dans les rues, leurs voix se mêlant en une symphonie de dialectes anciens, l’air embaumé des parfums d’épices exotiques et du son lointain des marchands vantant leurs marchandises. -![Alexandria 300 BC](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/alexandria.png) +![Alexandrie 300 av. J.-C.](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/alexandria.png) **Vous:** C'est sûr, je dois m'être cogné la tête, pensez-vous, en fermant les yeux et en les rouvrant, la scène reste inchangée. @@ -105,7 +105,7 @@ Suis-je coincé dans le passé ? Oserai-je appuyer à nouveau sur ce bouton ? Av Un vieil homme portant une toge vous fait signe depuis les marches du grand temple. Ses cheveux blancs et sa barbe captent la lumière du soleil, lui donnant une aura presque éthérée. -![Dinocrates wearing a toga](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/dinocrates.png) +![Dinocrates portant une toge](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/dinocrates.png) **Dinocrates:** "Bienvenue, voyageur," dit-il chaleureusement. "Je suis Dinocrates, architecte de cette grande cité. Votre arrivée avait été prédite." @@ -135,7 +135,7 @@ Une pensée vous traverse. L'appareil peut-il me comprendre si je lui parle ? **Vous:** Tu as raison, George est un bon nom, c'était en fait le prénom de mon père. -![Time Beetle](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/time-beetle.png) +![Scarabée Temporel](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/time-beetle.png) *Appareil temporel, "George" le scarabée métallique* @@ -154,7 +154,7 @@ Si vous souhaitez interagir avec Dinocrates, exécutez l'application [Characters > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité AI responsable](../../README.md#responsible-ai-disclaimer) -![Dinocrates wearing a toga](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/dinocrates.png) +![Dinocrates portant une toge](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/01-intro-to-genai/assets/dinocrates.png) **Étapes** : @@ -257,7 +257,7 @@ Comme vous pouvez le voir, ces améliorations peuvent à la fois aider le front- Voici un exemple d'une "application de chatbot" en action : -![Image of chat app](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2070448e130e5ba228084b9b4b128e3af9c9f5239/68747470733a2f2f6c6561726e2e6d6963726f736f66742e636f6d2f656e2d75732f73656d616e7469632d6b65726e656c2f6d656469612f636861742d636f70696c6f742d696e2d616374696f6e2e676966) +![Image de l'application de chat](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2070448e130e5ba228084b9b4b128e3af9c9f5239/68747470733a2f2f6c6561726e2e6d6963726f736f66742e636f6d2f656e2d75732f73656d616e7469632d6b65726e656c2f6d656469612f636861742d636f70696c6f742d696e2d616374696f6e2e676966) **Vous :** Fascinant, je vais noter l'idée de visiter le 21e siècle pour voir comment ces outils sont utilisés. @@ -337,8 +337,8 @@ Visitez [Microsoft Copilot](https://copilot.microsoft.com), [ChatGPT](https://ch **Question :** Parmi les affirmations suivantes, lesquelles sont vraies concernant l'IA générative et JavaScript ? -A. Les applications JavaScript alimentées par l'IA générative peuvent seulement générer du texte.\ -B. JavaScript peut être utilisé pour développer des applications alimentées par l'IA, y compris des chatbots, des outils de génération de texte, et plus encore.\ +A. Les applications JavaScript alimentées par l'IA générative peuvent seulement générer du texte. +B. JavaScript peut être utilisé pour développer des applications alimentées par l'IA, y compris des chatbots, des outils de génération de texte, et plus encore. C. Python est le seul langage utilisé pour le développement en IA. [Quiz solution](/lessons/01-intro-to-genai/solution/solution-quiz.md) diff --git a/lessons/02-first-ai-app/translations/README.fr.md b/lessons/02-first-ai-app/translations/README.fr.md index 0f1bc80d..a313c04a 100644 --- a/lessons/02-first-ai-app/translations/README.fr.md +++ b/lessons/02-first-ai-app/translations/README.fr.md @@ -12,7 +12,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Ressources associées -[![Watch a short video about large language models](https://img.youtube.com/vi/GQ_2OjNZ9aA/0.jpg)](https://www.youtube.com/watch?v=GQ_2OjNZ9aA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=2) +[![Regardez une courte vidéo sur les modèles de langage étendus.](https://img.youtube.com/vi/GQ_2OjNZ9aA/0.jpg)](https://www.youtube.com/watch?v=GQ_2OjNZ9aA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=2) *Cette vidéo vous donne une introduction aux modèles d'IA appelés "modèles de langage étendus", LLM, ce qu'ils sont et comment vous pouvez les utiliser pour intégrer l'IA dans vos applications.* @@ -40,7 +40,7 @@ Quand vous ouvrez les yeux, le monde a changé. En vous levant, vous réalisez q En regardant autour du bateau, vous trouvez une longue rame reposant sur le côté. La saisissant, vous commencez à ramer en direction des bâtiments au loin. À mesure que vous vous rapprochez, les bâtiments deviennent plus nets. Ils sont anciens, leur architecture rappelant une peinture de la Renaissance. -!["Boat on the river, man standing with a paddle](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/boat.png) +!["Bateau sur la rivière, un homme debout avec une rame".](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/boat.png) La question est maintenant, où et quand êtes-vous cette fois ? @@ -48,7 +48,7 @@ Vous réussissez à amarrer le bateau au quai et commencez à marcher le long de En marchant, vous remarquez un homme avec une longue barbe et un chapeau, fouillant dans une caisse contenant ce qui semble être des pièces mécaniques. Ses mains agiles trient les engrenages et ressorts avec une dextérité certaine. -![Leonardo Da Vinci standing next to a crate in the harbour](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo.png) +![Léonard de Vinci debout à côté d'une caisse dans le port.](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo.png) ### Aidez-moi, Leonardo @@ -76,7 +76,7 @@ En marchant, vous remarquez un homme avec une longue barbe et un chapeau, fouill ### À l'atelier -![Leonardos workshop](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo-workshop.png) +![Atelier de Léonard.](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo-workshop.png) Le vieil homme vous conduit à une grande porte en bois et vous êtes accueilli par la vue d’un atelier rempli de toutes sortes de machines mécanisées. @@ -116,7 +116,7 @@ Si vous voulez interagir avec Léonard, exécutez l'application [Personnages](/a > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) -![Leonardo talks](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo-talk.jpeg) +![Léonard parle.](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/leonardo-talk.jpeg) **Étapes** : @@ -401,7 +401,7 @@ Cela signifie que la majorité des tokens peuvent être consacrés aux tokens d' I want you to generate recipes for me. ``` -![Demo of tokenizer](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/tokenizer.png) +![Démo de tokenizer](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/tokenizer.png) Exécuter `tokenizer` sur la phrase ci-dessus donne 9 tokens. @@ -453,7 +453,7 @@ Leonardo vous a soudainement demandé d'examiner de plus près le Time Beetle, i **Scarabée du Temps :** Rien. -![Aerial screw, Leonardo Da Vinci](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/helicopter.jpg) +![Vis aérienne, Léonard de Vinci](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/02-first-ai-app/assets/helicopter.jpg) > [!NOTE] > La vis aérienne, également connue sous le nom de vis hélicoïdale, était destinée à décoller du sol en comprimant l'air. La conception de Léonard comportait un grand rotor en spirale en lin, rigidifié avec de l'amidon, et monté sur une plate-forme en bois. L'idée était qu'une équipe d'hommes ferait tourner des manivelles autour de la plate-forme, en la faisant tourner suffisamment vite pour obtenir une portance. diff --git a/lessons/03-prompt-engineering/translations/README.fr.md b/lessons/03-prompt-engineering/translations/README.fr.md index 8829f86b..cbcf467d 100644 --- a/lessons/03-prompt-engineering/translations/README.fr.md +++ b/lessons/03-prompt-engineering/translations/README.fr.md @@ -12,7 +12,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Ressources associées -[![Watch a short video about prompt engineering](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) +[![Regardez une courte vidéo sur l'ingénierie des prompts](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) *Cette vidéo propose une introduction à l'amélioration de vos compétences en matière de "prompt", en vous apprenant à donner des instructions plus claires et plus efficaces à l'IA pour obtenir de meilleurs résultats.* @@ -34,7 +34,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V Avant que vous ne puissiez appuyer sur le bouton, les portes de l'atelier s'ouvrent en claquant avec fracas. Un homme se tient dans l'encadrement, large d'épaules et vêtu de vêtements coûteux, brandissant un morceau de papier en l'air et criant : -!["An angry Ludovico Sforza busting in through the door](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/ludovico.png) +!["Un Ludovico Sforza en colère fait irruption par la porte."](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/ludovico.png) *Ludovico Sforza* @@ -62,7 +62,7 @@ Un tourbillon de couleurs enveloppe la calèche, dissolvant le monde autour de v Le tourbillon de couleurs s'estompe, et vous vous retrouvez dans la calèche, désormais lancée à toute vitesse sur la Via Appia à Rome. À votre grande surprise, vous êtes en plein milieu d'une course de chars. Les roues des chars tonnent, soulevant des nuages de poussière. -![Escape from Rome](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/escape.png) +![Fuite de Rome](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/escape.png) **Vous :** Léonard, où sommes-nous ? @@ -100,7 +100,7 @@ Avec une dernière poussée, l'hélice commence à tourner. Les pales attrapent Vous regardez la ville en contrebas ; les bâtiments antiques s'étendent sous vos pieds. -![Airborne, looks down at the city with feet dangling](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/airborne.png) +![En vol, regardant la ville avec les pieds pendants](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/03-prompt-engineering/assets/airborne.png) ## Interagir avec Sforza @@ -204,9 +204,9 @@ Cette technique guide l'IA en lui montrant un raisonnement étape par étape pou Votre prompt devient : -> * * 100 mètres au-dessus du sol +> * \- 100 mètres au-dessus du sol > * Gravity: 9.8 m/s² -> * * Combien de secondes pour atterrir ? +> * \- Combien de secondes pour atterrir ? **Answer: 4.5 seconds** @@ -296,11 +296,11 @@ Je peux oui, mais mon nom est George, je préfère cela à Gadget. Je vais en fa Créez une application qui demande : -* * La hauteur -* * La vitesse en avant -* * La gravité -* * Le vent ascendant -* * La distance jusqu'à la colline +* \- La hauteur +* \- La vitesse en avant +* \- La gravité +* \- Le vent ascendant +* \- La distance jusqu'à la colline Utilisez la technique de chaîne-de-pensée pour arriver à une réponse. diff --git a/lessons/04-structured-output/translations/README.fr.md b/lessons/04-structured-output/translations/README.fr.md index df4f3f98..91d5a86b 100644 --- a/lessons/04-structured-output/translations/README.fr.md +++ b/lessons/04-structured-output/translations/README.fr.md @@ -14,7 +14,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V Cela vaut la peine de revoir la vidéo sur l'ingénierie des prompts, car elle pose les bases de ce que vous allez apprendre dans ce chapitre. -[![Watch a short video about prompt engineering](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) +[![Regardez une courte vidéo sur l'ingénierie des prompts](https://img.youtube.com/vi/gQ6TlyxBmWs/0.jpg)](https://www.youtube.com/watch?v=gQ6TlyxBmWs\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=3) *Cette vidéo propose une introduction à l'amélioration de vos compétences en matière de "prompt", en vous apprenant à donner des instructions plus claires et plus efficaces à l'IA pour obtenir de meilleurs résultats.* @@ -46,7 +46,7 @@ La lumière brillante émise par le Scarabée temporel s'estompe, et vous vous r La vis aérienne repose maladroitement sur une grande pierre finement sculptée, marquée de gravures qui ressemblent à un calendrier. -![Aztec calendar, Wikipedia](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/aztec.png) +![Calendrier aztèque, Wikipedia](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/aztec.png) *Calendrier aztèque, Wikipedia* @@ -56,7 +56,7 @@ Léonard de Vinci s'avance et ses yeux s'ouvrent en grand de fascination. Avant que vous puissiez réagir, un groupe de soldats aztèques s'approche. -![Meeting with Aztecs](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/meeting.png) +![Rencontre avec les Aztèques](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/meeting.png) **Chef des soldats :** "Qui êtes-vous et qu'avez-vous fait ?" demande-t-il en nahuatl. @@ -78,7 +78,7 @@ Une fois au sommet de la pyramide, vous êtes conduit dans une grande chambre o **Montezuma :** "D'accord. Je vous propose une partie de [Patolli](#patolli). Si je gagne deux manches sur trois, vous me donnerez votre machine et m'expliquerez son fonctionnement. Si vous gagnez, vous serez libres de partir." -![Playing a game of Patolli](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/game.png) +![Partie de Patolli](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/game.png) Le jeu commence, et la pièce plonge dans le silence, interrompu seulement par le son des haricots roulés et des pièces déplacées sur le plateau. @@ -109,7 +109,7 @@ Avec un dernier coup décisif, Léonard gagne la partie. La pièce explose en ac > > **Implication aztèque** : Largement pratiqué par les nobles et les gens du peuple, c'était un jeu favori à la cour de Montezuma. Au-delà du plaisir, il impliquait des paris à forts enjeux comme des couvertures, des pierres précieuses, voire la liberté. -![Patolli board](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/patolli.png) +![Plateau de Patolli](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/04-structured-output/assets/patolli.png) *Patolli - Wikipedia* diff --git a/lessons/05-rag/translations/README.fr.md b/lessons/05-rag/translations/README.fr.md index d2b94741..844465f2 100644 --- a/lessons/05-rag/translations/README.fr.md +++ b/lessons/05-rag/translations/README.fr.md @@ -12,7 +12,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Ressources associées -[![Watch a short video about RAG](https://img.youtube.com/vi/xkFOmx5yxIA/0.jpg)](https://www.youtube.com/watch?v=xkFOmx5yxIA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=4) +[![Regardez une courte vidéo sur RAG](https://img.youtube.com/vi/xkFOmx5yxIA/0.jpg)](https://www.youtube.com/watch?v=xkFOmx5yxIA\&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk\&index=4) *Cette vidéo explique la génération augmentée par récupération (RAG), une méthode qui aide l'IA à utiliser vos contenus en complément de ses données d'entraînement pour de meilleurs résultats.* @@ -36,13 +36,13 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V Vous atterrissez dans le jardin, il est tard dans la nuit avec un brouillard épais, et des lumières étranges scintillent au loin. Le manoir se dresse devant vous. Leonardo regarde autour de lui, les yeux écarquillés d'émerveillement. -![Old mansion shown in a deep fog](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/mansion.jpeg) +![Vieux manoir montré dans un épais brouillard](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/mansion.jpeg) ### Fuir les chiens Vous entendez des aboiements et le bruit des chiens qui courent vers vous. Vous vous tournez vers Leonardo : "Nous devons entrer, maintenant !" -![Running from the dogs](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/dogs.jpeg) +![Fuir les chiens](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/dogs.jpeg) En atteignant la porte du manoir, elle s'ouvre brusquement, et une paire de serviteurs se précipitent dehors. Après vous avoir observés, ils vous font signe de les suivre. @@ -58,7 +58,7 @@ Vous vous retrouvez face à Ada Lovelace, ses yeux brillant de curiosité. **Vous :** « Mais... » -![Ada Lovelace and Charles Babbage working on a device](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/ada.jpeg) +![Ada Lovelace et Charles Babbage travaillant sur un appareil](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/ada.jpeg) Charles Babbage s'avance et examine le Scarabée Temporel dans votre main. "Cet appareil est remarquable, mais il est un peu défectueux, n'est-ce pas ? Vous l'avez sûrement remarqué." @@ -123,7 +123,7 @@ Au cœur de RAG, il y a deux composants principaux : un **récupérateur** et un Voici un schéma illustrant le fonctionnement d'un système RAG : -![Schema of a RAG system](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/rag.png) +![Schéma d'un système RAG](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/05-rag/assets/rag.png) 1. **Entrée utilisateur :** L'utilisateur pose une question. 2. **Récupérateur :** Le composant récupérateur recherche des informations pertinentes en utilisant une ou plusieurs bases de connaissances. diff --git a/lessons/06-tool-calling/translations/README.fr.md b/lessons/06-tool-calling/translations/README.fr.md index 83663241..80a8ae54 100644 --- a/lessons/06-tool-calling/translations/README.fr.md +++ b/lessons/06-tool-calling/translations/README.fr.md @@ -14,7 +14,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Ressources associées -[![Integrating with function calling](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/11-lesson-banner.png)](https://aka.ms/gen-ai-lesson11-gh?WT.mc_id=academic-105485-koreyst) +[![Intégration avec les appels de fonction](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/11-lesson-banner.png)](https://aka.ms/gen-ai-lesson11-gh?WT.mc_id=academic-105485-koreyst) *Cette vidéo explique l'appel d'outils, une méthode qui aide l'IA à appeler vos fonctions et à élargir ainsi ses capacités.* @@ -41,7 +41,7 @@ You: "Who are we talking about and where can I find her?" Le monde autour de vous commence à se brouiller, et tout devient noir. Vous revenez à vous et vous trouvez dans le cockpit d’un avion. Vous êtes en vol, et vous pouvez voir l’océan sous vous. Il y a quelqu’un devant vous ; vous ne pouvez voir que l’arrière de leur cou. -![Amelia piloting a plane](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/amelia.jpeg) +![Amelia pilotant un avion](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/amelia.jpeg) **Vous**: "Amelia, c'est toi ?" @@ -92,7 +92,7 @@ Pour une explication plus détaillée de l'application, voir [Explication détai **Time Beetle**: "Voici une illustration pour montrer le processus d'appel d'outil :" -![Tool calling process illustration](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/tool_call_langchain.png) +![Illustration du processus d'appel d'outil](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/06-tool-calling/assets/tool_call_langchain.png) *Crédit image Langchain * diff --git a/lessons/07-mcp/translations/README.fr.md b/lessons/07-mcp/translations/README.fr.md index 88b25b08..304d4e26 100644 --- a/lessons/07-mcp/translations/README.fr.md +++ b/lessons/07-mcp/translations/README.fr.md @@ -12,7 +12,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V ## Ressources associées -[![Watch a short video about MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)](https://www.youtube.com/watch?v=YRfOiB0Im64) +[![Regardez une courte vidéo sur MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)](https://www.youtube.com/watch?v=YRfOiB0Im64) *Cette vidéo explique le Protocole de Contexte Modèle.* @@ -46,7 +46,7 @@ Si ce n'est pas encore fait, configurez votre environnement de développement. V La lumière tourbillonnante vous transporte à nouveau, et vous vous retrouvez dans une vaste pièce avec une grande table au centre. Les murs sont décorés de cartes et de stratégies militaires. Scipion l'Africain est debout près de la table, profondément plongé dans ses pensées. Il lève les yeux lorsque vous entrez : "Ada te misit/Ada vous a envoyé(e) ?" -![Scipio Africanus](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/07-mcp/assets/scipio.png) +![Scipion l'Africain](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/07-mcp/assets/scipio.png) > Scipion l'Africain, également connu sous le nom de Publius Cornelius Scipion Africanus, était un général et homme d'État romain éminent ayant vécu de 236 av. J.-C. à 183 av. J.-C. Il est surtout connu pour son rôle décisif dans la Deuxième Guerre Punique contre Carthage et pour avoir vaincu Hannibal lors de la bataille de Zama en 202 av. J.-C. > Sa vie et sa carrière illustrent des qualités de leadership, de génie stratégique et de résilience. Ses contributions aux sphères militaires et politiques de Rome ont laissé une empreinte durable sur l'Empire romain. @@ -59,7 +59,7 @@ Si vous souhaitez interagir avec Scipion, exécutez l'application [Characters](/ > Ceci est entièrement fictif ; les réponses sont générées par une IA. > [Clause de non-responsabilité sur l'IA responsable](/README.md#responsible-ai-disclaimer) -![Scipio Africanus](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/07-mcp/assets/scipio.png) +![Scipion l'Africain](https://raw.githubusercontent.com/microsoft/generative-ai-with-javascript/main/lessons/07-mcp/assets/scipio.png) **Étapes** : @@ -104,7 +104,7 @@ Parlons des manœuvres de contournement, de l'infiltration et de l'utilisation d et voici un aperçu rapide de l'architecture MCP : -![Architecture of MCP](https://softchris.github.io/mcp-workshop/assets/images/diagram-791787b0cac57bc331c20e72b645d4f7.png) +![Architecture de MCP](https://softchris.github.io/mcp-workshop/assets/images/diagram-791787b0cac57bc331c20e72b645d4f7.png) ## Les éléments de base du MCP @@ -262,13 +262,13 @@ Ici, nous utilisons le package `@modelcontextprotocol/inspector` pour exécuter **Time Beetle** : "Cela démarre un serveur web sur le port 6274. Vous pouvez accéder à l'inspecteur en ouvrant votre navigateur web et en vous rendant sur `http://localhost:6274`. L'inspecteur fournit une interface conviviale pour interagir avec votre serveur MCP, vous permettant de tester les outils et les ressources que vous avez définis." -![Inspector user interface](https://softchris.github.io/mcp-workshop/assets/images/connect-7703c67645f368d51c7b24a5d635d6a0.png) +![Interface utilisateur de l'inspecteur](https://softchris.github.io/mcp-workshop/assets/images/connect-7703c67645f368d51c7b24a5d635d6a0.png) ### -1- Connexion au serveur **Time Beetle** : Sélectionnez "Connecter" et vous devriez voir la fenêtre ci-dessous : -![Connecting to server](https://softchris.github.io/mcp-workshop/assets/images/connected-7c3570d5d0a8659e27740d2950031cb3.png) +![Connexion au serveur](https://softchris.github.io/mcp-workshop/assets/images/connected-7c3570d5d0a8659e27740d2950031cb3.png) Il devrait indiquer que vous êtes connecté. Vous pouvez ensuite interagir avec les outils ou les ressources. @@ -276,7 +276,7 @@ Il devrait indiquer que vous êtes connecté. Vous pouvez ensuite interagir avec **Time Beetle** : "Ensuite, nous voulons lister les outils et ressources disponibles sur le serveur. Vous pouvez le faire en sélectionnant "Lister les outils" pour voir les outils disponibles : -![Listing tools](https://softchris.github.io/mcp-workshop/assets/images/tools-listed-630aa49c9d7e4347108419fb83c409f6.png) +![Listage des outils](https://softchris.github.io/mcp-workshop/assets/images/tools-listed-630aa49c9d7e4347108419fb83c409f6.png) Vous devriez maintenant voir l'outil « add » dans la liste. Vous pouvez également afficher les ressources en sélectionnant l'onglet « Ressources ». @@ -284,7 +284,7 @@ Vous devriez maintenant voir l'outil « add » dans la liste. Vous pouvez éga **Time Beetle** : "Pour exécuter l'outil, sélectionnez l'outil "add" dans la liste. Renseignez les paramètres dans la boîte de dialogue qui apparaît sur le côté droit de l'écran. Par exemple, vous pouvez entrer `a=5` et `b=10` pour additionner ces deux nombres. Cliquez sur "Exécuter l'outil" pour exécuter l'outil. Vous devriez voir le résultat dans la zone de sortie ci-dessous. Le résultat devrait être `15`." -![Run the tool](https://softchris.github.io/mcp-workshop/assets/images/ran-tool-271ecd5f84a457462e59789b579ee9d4.png) +![Exécuter l'outil](https://softchris.github.io/mcp-workshop/assets/images/ran-tool-271ecd5f84a457462e59789b579ee9d4.png) **Scipion** : "Intéressant, j'aurais aimé pouvoir tester mes stratégies comme cela. Cela semble très utile." diff --git a/lessons/08-mcp-advanced/translations/README.fr.md b/lessons/08-mcp-advanced/translations/README.fr.md index 0a140fdf..56d4f923 100644 --- a/lessons/08-mcp-advanced/translations/README.fr.md +++ b/lessons/08-mcp-advanced/translations/README.fr.md @@ -14,7 +14,7 @@ Si ce n'est pas déjà fait, configurez votre environnement de développement. V ## Ressources associées -[![Watch a short video about MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)](https://www.youtube.com/watch?v=YRfOiB0Im64) +[![Regardez une courte vidéo sur MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)](https://www.youtube.com/watch?v=YRfOiB0Im64) *Cette vidéo explique l'utilisation des LLM avec le protocole Model Context.* diff --git a/translations/fr.json b/translations/fr.json index de9d0077..5298eb2d 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -1083,5 +1083,48 @@ "[!TIP]\nConsider what the system message should be and what input you should prov.DF2588FD52FAEF8AD227": "Réfléchissez à ce que devrait être le message système et à quel type d'entrée vous devriez fournir.", "[!TIP]\nNote this part of the prompt: `If there's not enough data in provided sou.3122A095CE2BF1CF89D2": "Notez cette partie du prompt : `If there's not enough data in provided sources, say that you don't know.`. Cela est important pour éviter que l'IA génère des informations incorrectes lorsqu'il n'y a pas suffisamment de données pour fournir une réponse fiable. Cette technique est appelée une *échappatoire* et constitue une bonne pratique pour garantir la qualité du contenu généré.", "[!TIP]\nTry to have the LLM generate a plan that includes step-by-step instructio.EB95597D412F5CEF60A1": "Essayez de demander au LLM de générer un plan comprenant des instructions étape par étape pour construire le phare. Besoin d'aide ? Consultez la solution pour des conseils.", - "Generative AI with JavaScript video series": "Série vidéo sur l'IA générative avec JavaScript" + "Generative AI with JavaScript video series": "Série vidéo sur l'IA générative avec JavaScript", + "![Watch a short video about MCP](https://img.youtube.com/vi/YRfOiB0Im64/0.jpg)": "Regardez une courte vidéo sur MCP", + "![Hedy Lamarr](https://raw.githubusercontent.com/microsoft/generative-ai-with-ja.B67D62C0CFA4D47F2999": "Hedy Lamarr", + "![Hedy Lamarr](https://raw.githubusercontent.com/microsoft/generative-ai-with-ja.1370C7A6739A3B2CA6F0": "Hedy Lamarr", + "![Scipio Africanus](https://raw.githubusercontent.com/microsoft/generative-ai-wi.D259FC9FD3F3A41D8A8A": "Scipion l'Africain", + "![Architecture of MCP](https://softchris.github.io/mcp-workshop/assets/images/di.90B8379BA90B8890A1D0": "Architecture de MCP", + "![Inspector user interface](https://softchris.github.io/mcp-workshop/assets/imag.30DD7EB8D67F5C5DBD45": "Interface utilisateur de l'inspecteur", + "![Connecting to server](https://softchris.github.io/mcp-workshop/assets/images/c.93C1AB22A80EBE84BA6E": "Connexion au serveur", + "![Listing tools](https://softchris.github.io/mcp-workshop/assets/images/tools-li.3CD29E6CF5E1BB9C5C20": "Listage des outils", + "![Run the tool](https://softchris.github.io/mcp-workshop/assets/images/ran-tool-.C15F147DC10AB06CBD9C": "Exécuter l'outil", + "![Integrating with function calling](https://raw.githubusercontent.com/microsoft.B144ABE3A43C7BC03853": "Intégration avec les appels de fonction", + "![Amelia piloting a plane](https://raw.githubusercontent.com/microsoft/generativ.08E748C1E9A9AE478D4C": "Amelia pilotant un avion", + "![Ada Lovelace](https://raw.githubusercontent.com/microsoft/generative-ai-with-j.CD9F8D06B833E2BF5D12": "Ada Lovelace", + "![Tool calling process illustration](https://raw.githubusercontent.com/microsoft.6E3C5CFE21AA3982665F": "Illustration du processus d'appel d'outil", + "![Watch a short video about RAG](https://img.youtube.com/vi/xkFOmx5yxIA/0.jpg)": "Regardez une courte vidéo sur RAG", + "![Old mansion shown in a deep fog](https://raw.githubusercontent.com/microsoft/g.3F07B3139322F25230C0": "Vieux manoir montré dans un épais brouillard", + "![Running from the dogs](https://raw.githubusercontent.com/microsoft/generative-.B727FF2BF38C1CBE61F3": "Fuir les chiens", + "![Ada Lovelace and Charles Babbage working on a device](https://raw.githubuserco.4A84655482FAC9050483": "Ada Lovelace et Charles Babbage travaillant sur un appareil", + "![Ada Lovelace](https://raw.githubusercontent.com/microsoft/generative-ai-with-j.06E831563013550866BB": "Ada Lovelace", + "![Schema of a RAG system](https://raw.githubusercontent.com/microsoft/generative.2FFC55324E1981FE3AC9": "Schéma d'un système RAG", + "![Watch a short video about prompt engineering](https://img.youtube.com/vi/gQ6Tl.057F143DAF3372327114": "Regardez une courte vidéo sur l'ingénierie des prompts", + "![Aztec calendar, Wikipedia](https://raw.githubusercontent.com/microsoft/generat.0D307D49F5F20EFB49E0": "Calendrier aztèque, Wikipedia", + "![Meeting with Aztecs](https://raw.githubusercontent.com/microsoft/generative-ai.6675353488B64BFC6144": "Rencontre avec les Aztèques", + "![Playing a game of Patolli](https://raw.githubusercontent.com/microsoft/generat.AF81607012AD0F5E80D3": "Partie de Patolli", + "![Patolli board](https://raw.githubusercontent.com/microsoft/generative-ai-with-.89D2F0C11211BF6BE8D8": "Plateau de Patolli", + "![Montezuma](https://raw.githubusercontent.com/microsoft/generative-ai-with-java.6E147758E7DE58BD6E57": "Montezuma", + "![\"An angry Ludovico Sforza busting in through the door](https://raw.githubuserc.E875504D283FEA4C282D": "\"Un Ludovico Sforza en colère fait irruption par la porte.\"", + "![Escape from Rome](https://raw.githubusercontent.com/microsoft/generative-ai-wi.7B855AF895957E606D3D": "Fuite de Rome", + "![Airborne, looks down at the city with feet dangling](https://raw.githubusercon.E163CBDA93393105C445": "En vol, regardant la ville avec les pieds pendants", + "![Ludovico Sforza](https://raw.githubusercontent.com/microsoft/generative-ai-wit.3C38D24A92B23EE0A29E": "Ludovico Sforza", + "![Watch a short video about large language models](https://img.youtube.com/vi/GQ.D2767618E2916E05A6B3": "Regardez une courte vidéo sur les modèles de langage étendus.", + "![\"Boat on the river, man standing with a paddle](https://raw.githubusercontent..EB445500952F668583E4": "\"Bateau sur la rivière, un homme debout avec une rame\".", + "![Leonardo Da Vinci standing next to a crate in the harbour](https://raw.githubu.106277A85D2A73B76F56": "Léonard de Vinci debout à côté d'une caisse dans le port.", + "![Leonardos workshop](https://raw.githubusercontent.com/microsoft/generative-ai-.0BAEF70C00B723B36C74": "Atelier de Léonard.", + "![Leonardo talks](https://raw.githubusercontent.com/microsoft/generative-ai-with.8FBFB48BCDF36DCABACF": "Léonard parle.", + "![Demo of tokenizer](https://raw.githubusercontent.com/microsoft/generative-ai-w.221B12926E29FA97924B": "Démo de tokenizer", + "![Aerial screw, Leonardo Da Vinci](https://raw.githubusercontent.com/microsoft/g.AB9FC8D879CA98C55670": "Vis aérienne, Léonard de Vinci", + "![Watch a short video about an Introduction to Generative AI](https://img.youtub.A21B415396C1BEF88EAB": "Regardez une courte vidéo sur l'introduction à l'IA générative", + "![Dusty Library](https://raw.githubusercontent.com/microsoft/generative-ai-with-.EAE8509AA49A8C0D0CAA": "Bibliothèque poussiéreuse", + "![Time Vortex](https://raw.githubusercontent.com/microsoft/generative-ai-with-ja.5D027DA7B2C4276BB263": "Vortex temporel", + "![Alexandria 300 BC](https://raw.githubusercontent.com/microsoft/generative-ai-w.E324E260562AA641126B": "Alexandrie 300 av. J.-C.", + "![Dinocrates wearing a toga](https://raw.githubusercontent.com/microsoft/generat.AE76EBDCD672991E414D": "Dinocrates portant une toge", + "![Time Beetle](https://raw.githubusercontent.com/microsoft/generative-ai-with-ja.CF7B65CDB9B2D8604A29": "Scarabée Temporel", + "![Image of chat app](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2.CFA38B50E689836B8F4E": "Image de l'application de chat" } \ No newline at end of file diff --git a/translations/usage.jsonl b/translations/usage.jsonl index 5b39b1fe..ac9ca16a 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -316,3 +316,19 @@ {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.861Z","cost":0,"duration":3.2009089999992284,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.897Z","cost":0,"duration":3.25327699999616,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T03:10:52.941Z","cost":0,"duration":3.820103999998537,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/08-mcp-advanced/README.md","lang":"fr","tokens":3104,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:45.492Z","cost":0,"duration":5.166235000004235,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:45.996Z","cost":0,"duration":2.098493999998027,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:46.023Z","cost":0,"duration":1.6421620000037365,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/07-mcp/README.md","lang":"fr","tokens":5431,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:46.052Z","cost":0,"duration":1.8907859999962966,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/06-tool-calling/README.md","lang":"fr","tokens":4730,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:46.462Z","cost":0,"duration":1.5798370000047726,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:46.812Z","cost":0,"duration":1.346692000006442,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:46.836Z","cost":0,"duration":0.9808590000029653,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:47.279Z","cost":0,"duration":1.4843190000028699,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:47.304Z","cost":0,"duration":1.1856009999974049,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:47.716Z","cost":0,"duration":1.3259929999985616,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.146Z","cost":0,"duration":1.381225999997696,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.176Z","cost":0,"duration":2.789201999999932,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.201Z","cost":0,"duration":1.0720090000031632,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.613Z","cost":0,"duration":2.0288840000066557,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.651Z","cost":0,"duration":1.2621849999995902,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.684Z","cost":0,"duration":1.1820039999947767,"total":0,"prompt":0,"completion":0} From 3c6942c59a72678c7ebb0e9a727ac5782ab6651f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 04:14:26 +0000 Subject: [PATCH 16/19] fix: add section for non-translatable technical terms in glossary --- glossary.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/glossary.md b/glossary.md index b46fece9..7c88666d 100644 --- a/glossary.md +++ b/glossary.md @@ -43,3 +43,9 @@ A comprehensive list of technical terms used throughout the lessons. - **Tokenizer**: A tool used to convert text into tokens, providing structure for how data is inputted or analyzed by models. - **Vector Search**: Retrieval technique comparing encoded vectors to find semantically similar information in AI applications. - **XML (eXtensible Markup Language)**: A markup language formatting structured data for information storage, exchange, or generative model input/output. + +## Technical Terms + +The following terms should NOT be translated: + +- prompt From 5a6e6c19e856b1451305e8a3be7c1e6b7b03896d Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 04:53:22 +0000 Subject: [PATCH 17/19] Update French translations for RAG lesson and related files - Revised the French translation of Ada's example in the RAG lesson to improve clarity and accuracy. - Updated the corresponding JSON translation file to reflect the changes made in the RAG lesson. - Added usage statistics for the RAG lesson translation in the usage log. --- lessons/05-rag/translations/README.fr.md | 2 +- translations/fr.json | 4 +- translations/usage.jsonl | 116 +++++++++++++++++++++++ 3 files changed, 119 insertions(+), 3 deletions(-) diff --git a/lessons/05-rag/translations/README.fr.md b/lessons/05-rag/translations/README.fr.md index 844465f2..7e888c92 100644 --- a/lessons/05-rag/translations/README.fr.md +++ b/lessons/05-rag/translations/README.fr.md @@ -192,7 +192,7 @@ La RAG peut être considérée comme une forme avancée de *conception de prompt ### Exemple de code -**Ada :** « La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons intégrer un simple système de récupération dans une application JavaScript en utilisant un fichier [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche basique pour extraire des informations pertinentes en fonction de la question d'un utilisateur. » +**Ada :** La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons construire un système de récupération simple dans une application JavaScript en utilisant un fichier [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche de base pour extraire des informations pertinentes en fonction de la question d'un utilisateur. ```javascript // This example demonstrates how to use the Retrieval Augmented Generation (RAG) diff --git a/translations/fr.json b/translations/fr.json index 5298eb2d..4ffffcdc 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -1014,7 +1014,6 @@ "**Ada:** Are you still with me? Good, let's move on to the next step, let's try .938FFD3D429DBA9E4E05": "**Ada :** « Vous êtes toujours avec moi ? Bien, passons à l'étape suivante, essayons d'améliorer le prompt envoyé au modèle d'IA. »", "**Ada:** Once you’ve set up a way to pull info from your data, you can add it to.CB9332A5002295504DA7": "**Ada :** « Une fois que vous avez mis en place un moyen d'extraire des informations de vos données, vous pouvez les ajouter au prompt du modèle d'IA. Mélangez simplement les informations récupérées avec le texte d'entrée en ajoutant un contexte ou des directives supplémentaires pour orienter la réponse de l'IA. »", "RAG can be considered as an advanced form of *prompt engineering*.": "La RAG peut être considérée comme une forme avancée de *conception de prompt*.", - "**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an examp.FD27C69C931E37800773": "**Ada :** « La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons intégrer un simple système de récupération dans une application JavaScript en utilisant un fichier [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche basique pour extraire des informations pertinentes en fonction de la question d'un utilisateur. »", "You can find this code in the [`example/rag-cars.js`](/lessons/05-rag/example/ra.42DEA119F0CBA7461669": "Vous pouvez trouver ce code dans le fichier [`example/rag-cars.js`](/lessons/05-rag/example/rag-cars.js) accompagné du fichier [`hybrid.csv`](/lessons/05-rag/example/hybrid.csv) contenant les données utilisées pour la récupération.", "**Ada:** Once you run this code, you should see the data found in the CSV file b.6E69F3307247369752CF": "**Ada :** « Une fois que vous exécutez ce code, vous devriez voir les données trouvées dans le fichier CSV par le récupérateur, formatées sous forme d'une table Markdown, suivies de la réponse générée par l'IA à la question. Essayez de changer la question pour voir comment les données récupérées et la réponse évoluent. Vous pouvez également poser des questions sur des sujets non liés pour voir comment le modèle d'IA les gère. »", "**You:** This is great, I can see how this can be useful when using the device, .BFB78D8EAE3BFB8CD4A6": "**Vous :** « C'est génial, je vois comment cela peut être utile lorsque l'on utilise l'appareil, ou plutôt comment cela l'a déjà été ou le sera : le voyage dans le temps est déroutant *soupir*. »", @@ -1126,5 +1125,6 @@ "![Alexandria 300 BC](https://raw.githubusercontent.com/microsoft/generative-ai-w.E324E260562AA641126B": "Alexandrie 300 av. J.-C.", "![Dinocrates wearing a toga](https://raw.githubusercontent.com/microsoft/generat.AE76EBDCD672991E414D": "Dinocrates portant une toge", "![Time Beetle](https://raw.githubusercontent.com/microsoft/generative-ai-with-ja.CF7B65CDB9B2D8604A29": "Scarabée Temporel", - "![Image of chat app](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2.CFA38B50E689836B8F4E": "Image de l'application de chat" + "![Image of chat app](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2.CFA38B50E689836B8F4E": "Image de l'application de chat", + "**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an examp.FD27C69C931E37800773": "**Ada :** La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons construire un système de récupération simple dans une application JavaScript en utilisant un fichier [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche de base pour extraire des informations pertinentes en fonction de la question d'un utilisateur." } \ No newline at end of file diff --git a/translations/usage.jsonl b/translations/usage.jsonl index ac9ca16a..1e70b96d 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -332,3 +332,119 @@ {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.613Z","cost":0,"duration":2.0288840000066557,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.651Z","cost":0,"duration":1.2621849999995902,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:08:48.684Z","cost":0,"duration":1.1820039999947767,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:40:32.326Z","cost":0.0112075,"duration":2353.1271300000008,"total":4210,"prompt":4119,"completion":91} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:33.073Z","cost":0,"duration":4.736934000000474,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:40:33.099Z","cost":0,"duration":3.849808999999368,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:34.658Z","cost":0.00030255,"duration":1533.877231999999,"total":1771,"prompt":1689,"completion":82} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.742Z","cost":0.00027705,"duration":1050.0550709999952,"total":1757,"prompt":1727,"completion":30} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.773Z","cost":0,"duration":5.627732000000833,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.796Z","cost":0,"duration":2.5881369999988237,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.820Z","cost":0,"duration":3.0762939999985974,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.843Z","cost":0,"duration":3.442239999996673,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.868Z","cost":0,"duration":3.4119209999989835,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.890Z","cost":0,"duration":3.0845919999992475,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.915Z","cost":0,"duration":2.782125999998243,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.943Z","cost":0,"duration":3.2087439999959315,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:35.968Z","cost":0,"duration":4.8357990000004065,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:40:35.992Z","cost":0,"duration":4.62658800000645,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:37.390Z","cost":0.00026999999999999995,"duration":779.5590870000015,"total":1743,"prompt":1724,"completion":19} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:38.143Z","cost":0.00027045,"duration":732.6800299999959,"total":1740,"prompt":1719,"completion":21} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:38.999Z","cost":0.00027795,"duration":831.7174969999978,"total":1784,"prompt":1761,"completion":23} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:39.023Z","cost":0,"duration":2.6877430000022287,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:40.380Z","cost":0.00029895,"duration":1337.682762999997,"total":1831,"prompt":1777,"completion":54} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:42.691Z","cost":0.00032609999999999996,"duration":2278.614908000003,"total":1862,"prompt":1758,"completion":104} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:40:44.146Z","cost":0.005355,"duration":1436.0932990000001,"total":1854,"prompt":1758,"completion":96} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:44.168Z","cost":0,"duration":2.589693999994779,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:44.734Z","cost":0,"duration":3.0682119999983115,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:45.620Z","cost":0.00027539999999999997,"duration":859.0341840000037,"total":1764,"prompt":1740,"completion":24} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:46.500Z","cost":0.00027285,"duration":856.5460630000016,"total":1747,"prompt":1723,"completion":24} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:46.534Z","cost":0,"duration":3.083641000004718,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:46.563Z","cost":0,"duration":2.6346839999896474,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:46.591Z","cost":0,"duration":2.340605000004871,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:46.617Z","cost":0,"duration":3.5213740000035614,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:46.644Z","cost":0,"duration":3.6810350000014296,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:47.610Z","cost":0.00026865,"duration":941.0696889999963,"total":1722,"prompt":1699,"completion":23} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:48.511Z","cost":0.00026504999999999996,"duration":872.9903079999931,"total":1692,"prompt":1667,"completion":25} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:48.537Z","cost":0,"duration":2.7152340000029653,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:49.004Z","cost":0,"duration":3.0091410000022734,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:49.893Z","cost":0.0002652,"duration":865.2376800000056,"total":1696,"prompt":1672,"completion":24} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:50.523Z","cost":0.00027104999999999995,"duration":602.9319400000095,"total":1741,"prompt":1719,"completion":22} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:51.278Z","cost":0.000273,"duration":723.0598219999956,"total":1760,"prompt":1740,"completion":20} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:51.309Z","cost":0,"duration":4.100359999996726,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:52.088Z","cost":0.0002694,"duration":752.6472050000011,"total":1727,"prompt":1704,"completion":23} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:53.021Z","cost":0.00021705,"duration":907.5806440000015,"total":1387,"prompt":1367,"completion":20} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:53.052Z","cost":0,"duration":3.3678110000037123,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:40:54.256Z","cost":0.0002493,"duration":1176.636495999992,"total":1587,"prompt":1562,"completion":25} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:42:27.295Z","cost":0.0111975,"duration":1942.4415329999974,"total":4209,"prompt":4119,"completion":90} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:28.831Z","cost":0.00027239999999999995,"duration":860.317790999994,"total":1747,"prompt":1724,"completion":23} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:30.195Z","cost":0.00015464999999999996,"duration":1331.150778000003,"total":1739,"prompt":1719,"completion":20} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:31.016Z","cost":0.00016754999999999998,"duration":798.8195909999995,"total":1792,"prompt":1761,"completion":31} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:32.003Z","cost":0.0002478,"duration":963.2082230000015,"total":1577,"prompt":1552,"completion":25} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:33.103Z","cost":0.00028455,"duration":1075.2051720000018,"total":1807,"prompt":1777,"completion":30} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:35.889Z","cost":0.0002241,"duration":2761.2836610000013,"total":1884,"prompt":1758,"completion":126} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:42:38.463Z","cost":0.004075,"duration":2551.438310999998,"total":1918,"prompt":1758,"completion":160} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:40.161Z","cost":0.00014385,"duration":1665.2530830000032,"total":893,"prompt":871,"completion":22} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:41.508Z","cost":0.00027075,"duration":811.5406210000001,"total":1724,"prompt":1697,"completion":27} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:42.391Z","cost":0.0001578,"duration":862.8918720000001,"total":1760,"prompt":1740,"completion":20} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:43.135Z","cost":0.00027045,"duration":719.739717000004,"total":1743,"prompt":1723,"completion":20} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:43.819Z","cost":0.00019275,"duration":659.6477779999987,"total":1225,"prompt":1205,"completion":20} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:44.478Z","cost":0.00025455000000000003,"duration":631.9517379999961,"total":1643,"prompt":1625,"completion":18} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:45.086Z","cost":0.00025335,"duration":583.9005240000042,"total":1635,"prompt":1617,"completion":18} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:45.880Z","cost":0.00026639999999999997,"duration":768.836669999997,"total":1710,"prompt":1688,"completion":22} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:46.668Z","cost":0.00027495,"duration":753.7096630000015,"total":1761,"prompt":1737,"completion":24} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:47.548Z","cost":0.00027105,"duration":853.6131679999962,"total":1726,"prompt":1699,"completion":27} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:48.482Z","cost":0.00014744999999999998,"duration":907.7935279999947,"total":1688,"prompt":1667,"completion":21} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:49.506Z","cost":0.00014595,"duration":992.5894279999993,"total":916,"prompt":897,"completion":19} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:50.581Z","cost":0.0002505,"duration":612.5795300000027,"total":1610,"prompt":1590,"completion":20} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:51.377Z","cost":0.0001482,"duration":772.4482500000013,"total":1693,"prompt":1672,"completion":21} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:52.111Z","cost":0.00027045,"duration":706.1532290000032,"total":1740,"prompt":1719,"completion":21} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:53.099Z","cost":0.000273,"duration":962.5298989999937,"total":1760,"prompt":1740,"completion":20} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:53.910Z","cost":0.00028034999999999996,"duration":782.1005730000034,"total":1812,"prompt":1793,"completion":19} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:54.599Z","cost":0.0001512,"duration":660.3137169999973,"total":1722,"prompt":1704,"completion":18} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:55.381Z","cost":0.00013185,"duration":755.2143290000095,"total":1389,"prompt":1367,"completion":22} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:56.094Z","cost":0.00023295,"duration":685.7675409999938,"total":1490,"prompt":1469,"completion":21} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:42:57.018Z","cost":0.0002487,"duration":898.4893060000031,"total":1586,"prompt":1562,"completion":24} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T04:49:28.621Z","cost":0.01126,"duration":2838.6180049999966,"total":4231,"prompt":4140,"completion":91} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:30.305Z","cost":0.00026445,"duration":1106.4261239999978,"total":1697,"prompt":1675,"completion":22} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:31.454Z","cost":0.00026835000000000004,"duration":1113.1204020000005,"total":1714,"prompt":1689,"completion":25} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:32.266Z","cost":0.00027705,"duration":785.3111840000056,"total":1757,"prompt":1727,"completion":30} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:33.226Z","cost":0.00025529999999999997,"duration":931.6846700000024,"total":1636,"prompt":1614,"completion":22} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:34.856Z","cost":0.00026025,"duration":1603.1535619999995,"total":1675,"prompt":1655,"completion":20} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:35.536Z","cost":0.0001881,"duration":661.9447960000034,"total":1200,"prompt":1182,"completion":18} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:36.621Z","cost":0.00026309999999999994,"duration":1065.6077570000052,"total":1688,"prompt":1666,"completion":22} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:38.040Z","cost":0.00014565000000000002,"duration":1403.1972500000047,"total":773,"prompt":707,"completion":66} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:49:38.729Z","cost":0.0019375,"duration":673.1124100000015,"total":724,"prompt":707,"completion":17} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:39.509Z","cost":0.0003387,"duration":763.1086350000041,"total":2198,"prompt":2178,"completion":20} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:41.877Z","cost":0.00032385,"duration":2348.6011,"total":1700,"prompt":1547,"completion":153} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:49:42.585Z","cost":0.0041175,"duration":690.8572360000035,"total":1572,"prompt":1547,"completion":25} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:43.430Z","cost":0.000279,"duration":826.9562529999967,"total":1791,"prompt":1768,"completion":23} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:44.830Z","cost":0.0002478,"duration":1380.3040049999981,"total":1397,"prompt":1312,"completion":85} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:49:45.655Z","cost":0.00354,"duration":798.4048140000014,"total":1338,"prompt":1312,"completion":26} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:46.308Z","cost":0,"duration":3.382875999996031,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:46.331Z","cost":0,"duration":3.179470000002766,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:46.356Z","cost":0,"duration":2.675479000004998,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:46.380Z","cost":0,"duration":2.531721999999718,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:46.408Z","cost":0,"duration":5.2541990000027,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:46.435Z","cost":0,"duration":2.4151640000054613,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T04:49:46.456Z","cost":0,"duration":2.4330269999991287,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:46.487Z","cost":0,"duration":2.39314299999387,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.073Z","cost":0,"duration":2.3140260000000126,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.096Z","cost":0,"duration":2.2718370000002324,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.125Z","cost":0,"duration":2.367946000005759,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.148Z","cost":0,"duration":2.282796999999846,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.171Z","cost":0,"duration":2.392571999997017,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.198Z","cost":0,"duration":2.84755099999893,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.222Z","cost":0,"duration":2.431453999997757,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.249Z","cost":0,"duration":2.6038059999991674,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.275Z","cost":0,"duration":2.6925220000048284,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.302Z","cost":0,"duration":2.27416099999391,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.327Z","cost":0,"duration":2.272227000001294,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.761Z","cost":0,"duration":2.683295000002545,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.787Z","cost":0,"duration":2.610097000004316,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.815Z","cost":0,"duration":3.6563489999971353,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.844Z","cost":0,"duration":3.0950920000032056,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.871Z","cost":0,"duration":2.558732000004966,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.900Z","cost":0,"duration":2.3145670000012615,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.926Z","cost":0,"duration":2.2473919999974896,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.954Z","cost":0,"duration":2.284090000001015,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.982Z","cost":0,"duration":2.560474999998405,"total":0,"prompt":0,"completion":0} From 4b6f95b856abf33eb77780c4bb584389b7f77b6f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 08:11:47 +0000 Subject: [PATCH 18/19] fix: update CSV link and improve French translation for RAG lesson example --- lessons/05-rag/README.md | 2 +- lessons/05-rag/translations/README.fr.md | 2 +- translations/fr.json | 4 +- translations/usage.jsonl | 53 ++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/lessons/05-rag/README.md b/lessons/05-rag/README.md index 0217b042..52b06556 100644 --- a/lessons/05-rag/README.md +++ b/lessons/05-rag/README.md @@ -193,7 +193,7 @@ RAG can be considered as an advanced form of *prompt engineering*. ### Code example -**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an example. We’ll build a simple retrieval system into a JavaScript app using a [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) file of hybrid car data and a basic search algorithm to pull relevant info based on a user’s question. +**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an example. We’ll build a simple retrieval system into a JavaScript app using a [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) file of hybrid car data and a basic search algorithm to pull relevant info based on a user’s question. ```javascript // This example demonstrates how to use the Retrieval Augmented Generation (RAG) diff --git a/lessons/05-rag/translations/README.fr.md b/lessons/05-rag/translations/README.fr.md index 7e888c92..2f1f5c27 100644 --- a/lessons/05-rag/translations/README.fr.md +++ b/lessons/05-rag/translations/README.fr.md @@ -192,7 +192,7 @@ La RAG peut être considérée comme une forme avancée de *conception de prompt ### Exemple de code -**Ada :** La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons construire un système de récupération simple dans une application JavaScript en utilisant un fichier [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche de base pour extraire des informations pertinentes en fonction de la question d'un utilisateur. +**Ada :** La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons intégrer un système de récupération simple dans une application JavaScript en utilisant un fichier [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche basique pour extraire des informations pertinentes en fonction d'une question posée par l'utilisateur. ```javascript // This example demonstrates how to use the Retrieval Augmented Generation (RAG) diff --git a/translations/fr.json b/translations/fr.json index 4ffffcdc..f10c9071 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -1126,5 +1126,5 @@ "![Dinocrates wearing a toga](https://raw.githubusercontent.com/microsoft/generat.AE76EBDCD672991E414D": "Dinocrates portant une toge", "![Time Beetle](https://raw.githubusercontent.com/microsoft/generative-ai-with-ja.CF7B65CDB9B2D8604A29": "Scarabée Temporel", "![Image of chat app](https://camo.githubusercontent.com/76f2ad7cd754a2de2b9957d2.CFA38B50E689836B8F4E": "Image de l'application de chat", - "**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an examp.FD27C69C931E37800773": "**Ada :** La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons construire un système de récupération simple dans une application JavaScript en utilisant un fichier [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche de base pour extraire des informations pertinentes en fonction de la question d'un utilisateur." -} \ No newline at end of file + "**Ada:** Practice makes perfect, so let’s apply what we’ve learned with an examp.B895EFC394AF928891C9": "**Ada :** La pratique rend parfait, alors appliquons ce que nous avons appris avec un exemple. Nous allons intégrer un système de récupération simple dans une application JavaScript en utilisant un fichier [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) contenant des données sur les voitures hybrides et un algorithme de recherche basique pour extraire des informations pertinentes en fonction d'une question posée par l'utilisateur." +} diff --git a/translations/usage.jsonl b/translations/usage.jsonl index 1e70b96d..a327d571 100644 --- a/translations/usage.jsonl +++ b/translations/usage.jsonl @@ -448,3 +448,56 @@ {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.926Z","cost":0,"duration":2.2473919999974896,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.954Z","cost":0,"duration":2.284090000001015,"total":0,"prompt":0,"completion":0} {"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T04:49:47.982Z","cost":0,"duration":2.560474999998405,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"translate","model":"github:openai/gpt-4o","date":"2025-07-22T08:10:50.025Z","cost":0.01128,"duration":2072.3602880000035,"total":4233,"prompt":4140,"completion":93} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:10:51.309Z","cost":0.00027104999999999995,"duration":1101.0194869999978,"total":1750,"prompt":1731,"completion":19} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:10:55.888Z","cost":0.00025665,"duration":4558.352265000001,"total":1660,"prompt":1643,"completion":17} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:10:56.872Z","cost":0.00025095,"duration":964.9664279999997,"total":1601,"prompt":1577,"completion":24} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:10:57.971Z","cost":0.00023295,"duration":1079.731605999994,"total":1475,"prompt":1449,"completion":26} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:10:59.365Z","cost":0.0002427,"duration":1375.6158740000028,"total":1546,"prompt":1522,"completion":24} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:00.292Z","cost":0.00016274999999999997,"duration":909.4841520000045,"total":1034,"prompt":1017,"completion":17} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:01.263Z","cost":0.00028035,"duration":950.8799359999975,"total":1791,"prompt":1765,"completion":26} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:02.154Z","cost":0.00026955,"duration":871.9355089999954,"total":1728,"prompt":1705,"completion":23} +{"filename":"lessons/05-rag/README.md","lang":"fr","tokens":4252,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.042Z","cost":0.00014805000000000002,"duration":866.4980829999986,"total":930,"prompt":911,"completion":19} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.742Z","cost":0,"duration":42.9340050000028,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.771Z","cost":0,"duration":4.468282000001636,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.799Z","cost":0,"duration":2.9271430000007967,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.846Z","cost":0,"duration":22.211599999995087,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.873Z","cost":0,"duration":4.447513000006438,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.909Z","cost":0,"duration":4.188258999995014,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T08:11:03.937Z","cost":0,"duration":2.940394000004744,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/03-prompt-engineering/README.md","lang":"fr","tokens":3627,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:03.969Z","cost":0,"duration":2.788835999999719,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.558Z","cost":0,"duration":31.00867200000357,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.586Z","cost":0,"duration":5.157578999998805,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.616Z","cost":0,"duration":2.6051230000011856,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.663Z","cost":0,"duration":16.58070199999929,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.690Z","cost":0,"duration":3.0601429999951506,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.717Z","cost":0,"duration":3.4247620000023744,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.747Z","cost":0,"duration":3.2955329999967944,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.776Z","cost":0,"duration":2.7743000000045868,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T08:11:04.801Z","cost":0,"duration":2.6412710000004154,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.835Z","cost":0,"duration":2.900594999999157,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.866Z","cost":0,"duration":3.108613999997033,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T08:11:04.891Z","cost":0,"duration":2.69302699999389,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.949Z","cost":0,"duration":32.3489350000018,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:04.980Z","cost":0,"duration":3.5437459999957355,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/04-structured-output/README.md","lang":"fr","tokens":6232,"stage":"validate","model":"github:openai/gpt-4o","date":"2025-07-22T08:11:05.014Z","cost":0,"duration":2.6474530000050436,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.545Z","cost":0,"duration":2.89461200000369,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.621Z","cost":0,"duration":46.64837200000329,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.659Z","cost":0,"duration":3.0214130000022124,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.691Z","cost":0,"duration":3.650116999997408,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.724Z","cost":0,"duration":2.645659000001615,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.756Z","cost":0,"duration":3.7358769999991637,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.786Z","cost":0,"duration":2.6586500000048545,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.824Z","cost":0,"duration":4.367095000001427,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.859Z","cost":0,"duration":3.6947609999988344,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.894Z","cost":0,"duration":2.648072999996657,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/02-first-ai-app/README.md","lang":"fr","tokens":5634,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:05.925Z","cost":0,"duration":2.5627449999956298,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.418Z","cost":0,"duration":2.7958489999946323,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.448Z","cost":0,"duration":2.718574999998964,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.484Z","cost":0,"duration":3.078539999994973,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.515Z","cost":0,"duration":2.7294659999970463,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.552Z","cost":0,"duration":3.048931999997876,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.583Z","cost":0,"duration":2.579883999998856,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.622Z","cost":0,"duration":2.81274200000189,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.653Z","cost":0,"duration":2.696924999996554,"total":0,"prompt":0,"completion":0} +{"filename":"lessons/01-intro-to-genai/README.md","lang":"fr","tokens":4732,"stage":"validate","model":"github:openai/gpt-4o-mini","date":"2025-07-22T08:11:06.689Z","cost":0,"duration":2.631944000000658,"total":0,"prompt":0,"completion":0} From cfb48f7e7bcdfad7e7b7f30a6700038601157d30 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 22 Jul 2025 08:16:22 +0000 Subject: [PATCH 19/19] fix: correct formatting for important notes in French translations --- README.fr.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.fr.md b/README.fr.md index 94f76283..72cbb085 100644 --- a/README.fr.md +++ b/README.fr.md @@ -22,7 +22,7 @@ Prêt à intégrer l'Intelligence Artificielle Générative dans vos application Ce cours vous emmène dans une *aventure à travers le temps*—rencontrez les légendes de l'histoire avec une touche amusante, tout en apprenant les technologies d'IA Générative ✨ -> \[!IMPORTANT]\ +> [!IMPORTANT] > Ambiance open-source ! Réutilisez, modifiez et partagez librement ce contenu. ![Character App Sneak Peek](/docs/images/background.png) @@ -147,7 +147,7 @@ Vous trouverez également des ressources supplémentaires sous forme de [tutorie ## Clause de non-responsabilité pour l'IA Responsable -> \[!IMPORTANT]\ +> [!IMPORTANT] > AVERTISSEMENT : Ce dépôt contient du contenu fictif généré par l'IA. Les personnages historiques représentés ici génèrent des réponses grâce à l'IA générative, basée sur des données d'entraînement. Les réponses générées par ces personnages ne représentent pas leurs véritables opinions ou citations. Ce contenu est uniquement destiné à des fins de divertissement. [Principes de l'IA Responsable de Microsoft ici](https://www.microsoft.com/fr-fr/ai/principles-and-approach/) ## Interagissez avec la communauté