coffreobsidian/LLM/Test Cline.md
2025-04-14 08:52:08 +02:00

395 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
Premier tests sur cline depuis serveur distant OVH
- Attention dans le code de bien définir le nom du modèle ici nous allons commencer des tests léger sur "mistral : latest"
- Adresse OLLAMA_URL = "http://217.182.105.173:11434/api/generate"
- Attention pour réception des réponses "stream" : False ou True par défaut sur True ce qui signifie:
- Il envoie les tokens un par un en flux (streaming)
- Chaque ligne de réponse est un objet JSON séparé
- [x] Création d'un script python avec prompt simple : réponse attendue ✅ 2025-03-25
- [ ]
##Création d'un logger de réponse Mistral (Ollama)
###Objectif
- [x] Ce script envoie au modèle Mistral 7b via Ollama, avec des paramètres configurables. Il enregistre la réponse en .md ✅ 2025-03-25
## 🛠️ Paramètres disponibles
- `model` : nom exact du modèle (`mistral:latest`)
- `temperature` : contrôle la créativité (0.1 = déterministe, 1.0 = créatif)
- `top_p` : échantillonnage nucleus
- `top_k` : nombre max de tokens à considérer
- `repeat_penalty` : pénalise les répétitions
- `num_predict` : nombre max de tokens générés
- `stop` : mot/char de coupure manuelle
---
## 📄 Exemple de sortie `.md` générée
```markdown
# 🧾 Résultat génération Mistral
**🗓️ Date :** 2025-03-25 16:42
**🧠 Modèle :** mistral:latest
**💬 Prompt :** Explique-moi simplement ce qu'est l'intelligence artificielle.
---
## ⚙️ Paramètres utilisés
- Temperature : 0.7
- Top P : 0.9
- Top K : 50
- Repeat Penalty : 1.1
- Max Tokens (num_predict) : 512
- Stop : *Aucun*
---```
---
## ⚖️ Comparatif `stream: True` vs `stream: False`
| Paramètre | `stream: True` | `stream: False` |
| --------------------- | ------------------------------------ | ------------------------------------------ |
| 🧠 Fonctionnement | Réception **progressive** des tokens | Réception **dun seul bloc** à la fin |
| ⏱️ Vitesse perçue | **Immédiate** (1er token direct) | **Plus lente** (attend que tout soit prêt) |
| 📈 Performance réelle | Quasiment équivalente | Légèrement plus rapide si réponse courte |
| 🧩 Intégration | Utile en **interface temps réel** | Mieux pour **log** ou traitement global |
| 🛠️ Complexité | Traitement ligne à ligne | Plus simple (`response.json()`) |
| 📤 Poids réseau | Petites requêtes multiples | Une seule grosse réponse |
---
## ✅ **Quand utiliser `stream: True`**
- Tu veux afficher la réponse **en temps réel dans un terminal ou une interface**.
- Tu fais un chatbot et veux **rendre lUI plus réactive**.
- Tu veux **interrompre** la génération à la volée.
### ⚠️ Nécessite :
```python
for line in response.iter_lines():
data = json.loads(line)
print(data["response"], end="", flush=True)
```
---
## ✅ **Quand utiliser `stream: False`**
- Tu fais de lanalyse, du **logging** ou de la **comparaison de générations**.
- Tu veux une réponse **complète, simple à traiter**.
- Tu veux **enregistrer ou archiver** les prompts + réponses sans complexité.
---
### 🔁 Résumé express
- **stream: True** → dynamique, pour interface interactive (chatbot, terminal live)
- **stream: False** → simple, pour logs, scripts, tests comparatifs (ton cas actuel)
---
## 🔜 **Objectifs à venir**
Voici ce qui est **prévu ensuite** (dis-moi si on ajuste la priorité) :
### 🧩 1. **Étendre les logs pour mieux suivre les variations**
- [x] Ajouter un identifiant unique par test ✅ 2025-03-25
- [x] Historiser les prompts / réglages dans un index central (genre `log_index.md`) ✅ 2025-03-25
### 🧪 2. **Faire varier les paramètres automatiquement**
- [x] Générer plusieurs réponses à partir dun même prompt avec différentes températures, top_p, etc. ✅ 2025-03-25
### 🧠 3. **Passer à l'intégration avec Cline (dans Cursor)**
- [ ] Utiliser le modèle directement depuis l'interface Cline (client local)
- [ ] Voir si la connexion à distance fonctionne via API dOllama
- [ ] Créer un `cline.config.json` plus tard si utile
---
## 🧠 **1. Dans notre contexte, les scripts bien cadrés sont la base**
Tu as entièrement raison : si ton but est de :
- 🧪 Faire des **tests structurés sur les LLM**
- 🔁 Comparer les **effets de réglages**
- 📊 Récupérer des **logs propres pour analyse**
- 🔧 Envisager des **améliorations par RAG ou fine-tuning**
Alors **le cœur de ton infrastructure doit être : des scripts robustes, versionnés, traçables, testables.**
---
## 🔍 **2. Lintérêt davoir des “classes dagents” par modèle et par tâche**
Cest une **approche dingénierie avancée** et **très scalable** :
- Tu définis des **profils d'agents** :
- ✨ Agent RAG pour recherche technique
- 📑 Agent résumé juridique
- 🔧 Agent support technique
- 🧠 Agent pour test de comportement (prompt sensitivity, hallucinations, etc.)
- Et tu **lances ces agents via des scripts** avec :
- un modèle précis (`mistral`, `llama2`, etc.)
- des prompts types
- des paramètres contrôlés
- des logs traçables
Cette approche te permet ensuite de :
- Réentraîner des modèles avec les bons exemples
- Affiner le comportement de chaque "rôle"
- Prioriser les modèles à adapter ou remplacer
---
## 🤖 **3. Alors… est-ce que Cline est indispensable ?**
> **Non. Cline nest pas indispensable.**
> Mais il peut être **très utile selon tes usages secondaires.**
### ✅ Ce pour quoi Cline _est_ utile :
- 👨‍💻 **Exploration interactive** dun modèle
- 📋 Rapidité pour **tester un prompt** ou une idée
- 💡 Travailler dans **Cursor ou VSCode** pour explorer le comportement dun modèle sur des fichiers
### ❌ Ce pour quoi **tu nas pas besoin de Cline** :
- ❎ Campagnes de test automatisées
- ❎ Analyse de résultats
- ❎ Suivi fin des comportements ou génération de logs
- ❎ Entraînement, fine-tuning, adaptation par LoRA ou supervision
---
## 📦 En résumé
| Usage | Cline | Scripts personnalisés |
| ----------------------------------- | ----- | --------------------- |
| Prompt rapide / test manuel | ✅ | ✅ |
| Campagne de test (variation params) | ❌ | ✅ |
| Logging / Récupération fine | ❌ | ✅ |
| Comparaison multi-modèles | ❌ | ✅ |
| Préparation fine-tuning / LoRA | ❌ | ✅ |
| Workflow typé (agent/task/model) | ❌ | ✅ |
| Dev exploratoire dans Cursor | ✅ | ✅ (moins fluide) |
---
### Créer une classe abstraite globale** (comme `BaseLLM`) est **fortement recommandé** si tu comptes :
- Gérer plusieurs modèles (Mistral, LLaMA2, Mixtral, etc.)
- Réutiliser des comportements communs (log, rôle, configuration)
- Faciliter lévolution, la maintenance et lextension de ton code
---
## ✅ **Pourquoi créer une classe abstraite `BaseLLM` ?**
### 🔁 1. **Mutualiser les fonctionnalités communes**
Tu nauras pas à réécrire :
- La gestion des rôles
- Le logging Markdown
- Lenregistrement dans lindex
- La structure des paramètres
➡️ Tu définis ça **une seule fois dans `BaseLLM`**, et tes classes comme `Mistral7B` nont plus quà se concentrer sur les **spécificités du modèle**.
---
### 🧱 2. **Faciliter lajout dautres classes**
Tu pourras ensuite créer rapidement :
```python
class LLaMA2(BaseLLM): ...
class Mixtral8x7B(BaseLLM): ...
class Phi3(BaseLLM): ...
```
Et chacune ne définira que ce qui change : lURL, le nom du modèle, le système de requête, etc.
---
### 🔄 3. **Permettre linteropérabilité**
Tu peux créer un **système générique** qui accepte **nimporte quelle instance de modèle** :
```python
def test_model(agent_name, prompt, model: BaseLLM):
model.set_role(agent_name)
return model.generate(prompt)
```
➡️ Cela permet dévaluer **plusieurs modèles avec la même interface** !
---
## ✅ En résumé
| Avantage | Sans classe abstraite | Avec `BaseLLM` |
| ---------------------------------- | ----------------------- | -------------- |
| Réutilisation du code | ❌ Faible | ✅ Très forte |
| Facilité à ajouter un nouveau LLM | ❌ Long | ✅ Très rapide |
| Uniformité d'appel (`.generate()`) | ❌ Différente par modèle | ✅ Identique |
| Structure propre & maintenable | ❌ Complexité croissante | ✅ Solide |
| Interopérabilité / abstraction | ❌ Difficile | ✅ Naturelle |
---
## 🧠 1. Les **paramètres de configuration** varient selon les modèles
### ✅ Ce que **tous** les modèles acceptent via Ollama :
|Paramètre|Description|
|---|---|
|`temperature`|Contrôle la créativité|
|`top_p`|Nucleus sampling|
|`repeat_penalty`|Pénalise les répétitions|
|`num_predict`|Nombre de tokens générés|
|`stop`|Mots ou séquences d'arrêt|
|`seed`|Graine pour reproductibilité|
|`stream`|Réponse en streaming|
|`prompt`|(obligatoire) le texte utilisateur|
|`model`|(obligatoire) le nom du modèle|
### ⚠️ Ce qui est **optionnel ou spécifique** selon les modèles :
|Paramètre|Cas spécifique|
|---|---|
|`top_k`|Non supporté par tous|
|`frequency_penalty`, `presence_penalty`|Valides surtout sur API OpenAI-like|
|`max_tokens`|Peut ne pas être utilisé|
---
## ✅ Conséquence sur `BaseLLM`
Ta classe abstraite doit :
- Accepter un dictionnaire `params` initial personnalisé par modèle
- Avoir une méthode de validation ou un filtre des paramètres
- Enregistrer dans les logs **uniquement les paramètres actifs**
---
## ✅ 2. Les logs doivent **identifier clairement le modèle utilisé**
Déjà prévu dans `BaseLLM._log_result()` :
```python
f.write(f"**🧠 Modèle :** {self.model}\n")
```
Mais on peut améliorer avec une ligne en plus dans le `log_index.md` :
```markdown
🧠 `mistral:latest` (via Ollama)
```
Et pourquoi pas ajouter :
```python
self.engine = "Ollama"
```
dans les classes filles pour différencier un jour `Ollama`, `vLLM`, `HF Transformers`, etc.
---
## 📂 Arborescence recommandée de ton projet
Voici une arborescence professionnelle et modulaire :
```
llm_lab/ ← Racine de ton projet
├── agents/ ← Définition des rôles d'agents
│ └── roles.py ← Dictionnaire AGENTS
├── core/ ← Coeur du système LLM
│ ├── base_llm.py ← Classe abstraite BaseLLM
│ ├── mistral7b.py ← Classe héritée Mistral7B
│ ├── llama2.py ← (futur)
│ └── factory.py ← Instanciation dynamique
├── logs/ ← Réponses générées
│ ├── mistral_2025-03-25_XXXX.md
├── log_index.md ← Index global des tests
├── tests/ ← Scripts de test
│ └── test_mistral7b.py ← Exemple dusage
├── prompts/ ← Templates ou scénarios de tests
│ └── test_prompt1.txt
├── data/ ← Données utilisées (optionnel)
└── README.md ← Explication générale du projet
```
---
- `utils/` pour fonctions génériques (formatage, parsers)
- `config/` si tu charges des réglages depuis YAML/JSON
- `outputs/` pour stocker les tests ou réponses groupées (JSON/CSV)
---