first comit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/.idea
|
||||||
94
README.md
Normal file
94
README.md
Normal 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
74
demo_llm.py
Normal 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
1548
poetry.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
23
pyproject.toml
Normal file
23
pyproject.toml
Normal 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"
|
||||||
|
|
||||||
Reference in New Issue
Block a user