first comit

This commit is contained in:
Johan
2025-12-17 09:44:42 +01:00
commit 59a077d5fd
5 changed files with 1740 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/.idea

94
README.md Normal file
View File

@@ -0,0 +1,94 @@
# Démonstration d'une première interaction avec un LLM
## Installation
Ouvrir un terminal dans le dossier racine du projet :
```bash
poetry install # installer les dépendances nécessaires
```
## Instructions
L'objectif est de vous familiariser avec le cœur de l'interaction avec une Intelligence Artificielle : lui envoyer une instruction (un **prompt**) et recevoir sa réponse.
Nous allons utiliser un script Python pré-rempli où vous devrez compléter les étapes clés de ce processus.
### Vue d'ensemble de l'architecture
Ce diagramme montre comment les différents composants interagissent :
```mermaid
graph LR
User["Vous (IDE)"] -- "Lance le script" --> Script["Script Python 'demo_llm.py'"]
Script -- "Envoie le prompt (requête HTTP)" --> Server["Serveur LM Studio 'localhost'"]
Server -- "Transmet au modèle" --> Model["Modèle LLM 'llama-3.1'"]
Model -- "Génère la réponse" --> Server
Server -- "Retourne la réponse (JSON)" --> Script
Script -- "Affiche dans la console" --> User
```
-----
### Prérequis
Avant de commencer, assurez-vous que :
1. **LM Studio est lancé** et qu'un modèle (ex: `meta-llama-3.1-8b-instruct`) est entièrement chargé.
2. Le **serveur local** de LM Studio est bien démarré.
Attention : si vous êtes derrière un proxy, vous devez définir en haut de votre fichier Python :
```python
import os
os.environ["NO_PROXY"] = "127.0.0.1,localhost"
```
---
### Votre mission
Ouvrez le fichier `demo_llm.py`. Votre mission est de trouver et de compléter les sections marquées par des commentaires `# TODO`.
Voici le flux logique que vous allez implémenter dans le script :
```mermaid
graph TD
Start(Début) --> T1["TODO 1: Définir 'prompt'"]
T1 --> T2["TODO 2: Appeler 'await llm.ainvoke(prompt)'"]
T2 --> T3["TODO 3: Extraire 'response.content'"]
T3 --> Print["Afficher le résultat"]
Print --> End(Fin)
```
#### Étape 1 : formuler le Prompt (`TODO 1`)
Un "prompt" est simplement l'instruction que vous donnez à l'IA.
**Action :** dans la fonction `main`, trouvez la ligne `prompt = ""` et remplacez la chaîne de caractères vide par la question de votre choix.
* *Simple :* `"Quelle est la distance entre la Terre et la Lune ?"`
* *Créatif :* `"Invente un nom de super-héros pour un écureuil."`
#### Étape 2 : invoquer le LLM (`TODO 2`)
Maintenant que nous avons notre question, il faut l'envoyer au modèle. Nous utilisons pour cela l'objet `llm` qui a été initialisé pour nous.
**Action :** repérez la ligne `response = None`. Remplacez `None` par l'appel à la méthode qui envoie le prompt au LLM.
* **Indice** : la bibliothèque `langchain` utilise une méthode asynchrone nommée **`ainvoke()`** sur l'objet `llm`. Vous devez lui passer votre variable `prompt` en argument. N'oubliez pas le mot-clé `await` car la fonction est asynchrone.
#### Étape 3 : extraire la Réponse (`TODO 3`)
L'appel au LLM ne retourne pas directement le texte de la réponse, mais un objet qui contient plusieurs informations. Le texte généré par l'IA se trouve dans un attribut spécifique de cet objet.
**Action :** trouvez la ligne `ai_message = ""`. Remplacez la chaîne vide par le code qui permet d'accéder au contenu textuel de l'objet `response`.
* **Indice** : le texte se trouve dans l'attribut **`.content`** de l'objet `response`.
---
### Lancement
Une fois que vous avez complété les 3 `TODO`, lancez le script via le bouton "Run" de votre IDE.
Vous devriez voir s'afficher dans la console la question que vous avez posée ainsi que la réponse générée par le modèle IA.
Vous avez réalisé votre première interaction avec un LLM en Python !

74
demo_llm.py Normal file
View File

@@ -0,0 +1,74 @@
import asyncio
from pydantic import SecretStr
from pydantic_settings import BaseSettings, SettingsConfigDict
from langchain_openai import ChatOpenAI
# --- Étape 1 : Configuration ---
# Paramètres de connexion au LLM.
class Settings(BaseSettings):
"""Charge les variables d'environnement depuis variables d'environnement ou un fichier .env."""
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=True
)
# Paramètres de connexion au serveur LLM (LM Studio)
LLM_CHAT_SERVER_BASE_URL: str = "http://127.0.0.1:1234/v1"
LLM_CHAT_MODEL: str = "meta-llama-3.1-8b-instruct"
LLM_CHAT_TEMPERATURE: float = 0.7 # Rendre le LLM un peu plus créatif
LLM_CHAT_API_KEY: SecretStr = "not-needed" # attention : en production, ne pas hardcoder l'API key !
# On instancie la configuration
settings = Settings()
# --- Étape 2 : Initialisation du LLM ---
# On crée un "client" qui sait comment communiquer avec notre LLM.
print(f"Connexion au modèle '{settings.LLM_CHAT_MODEL}'...")
llm = ChatOpenAI(
model=settings.LLM_CHAT_MODEL,
base_url=settings.LLM_CHAT_SERVER_BASE_URL,
temperature=settings.LLM_CHAT_TEMPERATURE,
api_key=settings.LLM_CHAT_API_KEY
)
print("Connecté !")
# --- Étape 3 : La fonction principale asynchrone ---
async def main():
"""Fonction principale pour poser une question au LLM."""
# TODO 1: définir le prompt de votre choix
# On définit le prompt : c'est la question/instruction que l'on donne à l'IA.
prompt = "Raconte-moi une blague courte sur un développeur Python."
print("\n-------------------------------------------")
print(f" Envoi du prompt au LLM :")
print(f" '{prompt}'")
print("-------------------------------------------")
# TODO 2: Invoquer le LLM
# `ainvoke` envoie le prompt au LLM et attend sa réponse de manière asynchrone.
# C'est la fonction la plus importante à comprendre.
response = # ... votre code ici ...
# Vérification que la réponse a bien été reçue
if response is None:
print("Erreur : Le LLM n'a pas été appelé ! Veuillez compléter le code (TODO 2).")
return
# TODO 3: extraire le contenu de la réponse
# La réponse du LLM est un objet. Le texte généré se trouve dans l'attribut `content`.
ai_message = # ... votre code ici ...
print("\n Réponse du LLM :")
print(f" '{ai_message}'")
print("-------------------------------------------\n")
# --- Point d'entrée du script ---
if __name__ == "__main__":
asyncio.run(main())

1548
poetry.lock generated Normal file

File diff suppressed because it is too large Load Diff

23
pyproject.toml Normal file
View File

@@ -0,0 +1,23 @@
[project]
name = "demo-llm"
version = "0.1.0"
description = ""
authors = [
{name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.13"
[tool.poetry]
package-mode = false
[tool.poetry.dependencies]
python = "^3.13"
langchain = "^0.3.27"
langchain-openai = "^0.3.35"
pydantic-settings = "^2.10.1"
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"