mirror of
https://github.com/Ladebeze66/llm_lab.git
synced 2025-12-15 20:17:07 +01:00
293 lines
10 KiB
Markdown
293 lines
10 KiB
Markdown
# Analyse comparative des projets AIagent2 et llm_lab-test
|
|
|
|
## 1. Différences structurelles entre les deux projets
|
|
|
|
### Structure de AIagent2 (ancien projet)
|
|
```
|
|
AIagent2/
|
|
├── llm_classes/
|
|
│ ├── __init__.py
|
|
│ ├── llm.py (classe abstraite de base)
|
|
│ ├── mistral.py
|
|
│ ├── ollama.py
|
|
│ ├── deepseek.py
|
|
│ ├── perplexity.py
|
|
│ ├── deepl.py
|
|
│ ├── rag.py
|
|
│ ├── llama_vision.py
|
|
│ ├── agents.py (classe Agent abstraite et implémentations)
|
|
│ ├── example.py
|
|
│ ├── example_vision.py
|
|
│ └── requirements.txt
|
|
├── images/
|
|
└── JSON/
|
|
```
|
|
|
|
### Structure de llm_lab-test (nouveau projet)
|
|
```
|
|
llm_lab-test/
|
|
├── core/
|
|
│ ├── base_llm.py (classe abstraite de base)
|
|
│ ├── factory.py (pattern Factory pour instancier les LLM)
|
|
│ ├── mistral7b.py
|
|
│ └── llama_vision90b.py
|
|
├── agents/
|
|
│ └── roles.py (définition des rôles d'agents)
|
|
├── utils/
|
|
├── tests/
|
|
├── config/
|
|
├── prompts/
|
|
├── outputs/
|
|
└── logs/
|
|
```
|
|
|
|
### Principales différences
|
|
|
|
1. **Organisation structurelle**:
|
|
- AIagent2: Organisation plus plate avec toutes les classes LLM et agents dans le même package
|
|
- llm_lab-test: Structure plus modulaire avec séparation claire entre core (modèles) et agents (rôles)
|
|
|
|
2. **Patron de conception**:
|
|
- AIagent2: Utilise principalement l'héritage avec classes abstraites
|
|
- llm_lab-test: Utilise le pattern Factory pour créer les instances LLM et séparation entre modèles et rôles
|
|
|
|
3. **Gestion des configurations**:
|
|
- AIagent2: Configuration intégrée dans les classes
|
|
- llm_lab-test: Configuration externalisée dans un dossier dédié et séparation des rôles
|
|
|
|
4. **Logging et sorties**:
|
|
- AIagent2: Gestion interne dans les classes
|
|
- llm_lab-test: Dossiers dédiés pour les logs et les sorties
|
|
|
|
## 2. Analyse de la classe abstraite Agent dans AIagent2
|
|
|
|
### Structure de la classe Agent
|
|
|
|
Dans l'ancien projet AIagent2, une classe abstraite `Agent` a été définie comme base pour tous les agents spécialisés. Cette approche suit le principe de conception orienté objet où une classe de base définit l'interface commune et les comportements partagés.
|
|
|
|
```python
|
|
class Agent:
|
|
"""
|
|
Classe de base pour tous les agents
|
|
"""
|
|
def __init__(self, nom: str = "Agent"):
|
|
self.nom: str = nom
|
|
self.historique: List[Dict[str, Any]] = []
|
|
|
|
def ajouter_historique(self, action: str, input_data: Any, output_data: Any) -> None:
|
|
# Implémentation commune
|
|
|
|
def obtenir_historique(self) -> List[Dict[str, Any]]:
|
|
# Implémentation commune
|
|
|
|
def executer(self, *args, **kwargs) -> Any:
|
|
# Méthode abstraite que chaque agent doit implémenter
|
|
raise NotImplementedError("Chaque agent doit implémenter sa propre méthode executer()")
|
|
```
|
|
|
|
### Agents spécialisés implémentés
|
|
|
|
Trois agents spécialisés héritent de cette classe abstraite :
|
|
|
|
1. **AgentAnalyseImage** - Spécialisé dans l'analyse d'images avec LlamaVision
|
|
2. **AgentAnalyseJSON** - Spécialisé dans l'analyse de données JSON
|
|
3. **AgentQuestionReponse** - Spécialisé dans le processus de questions/réponses
|
|
|
|
### Intérêt de cette approche
|
|
|
|
1. **Cohérence d'interface** : Tous les agents partagent la même interface de base (`executer()`)
|
|
2. **Code réutilisable** : Les fonctionnalités communes comme la gestion de l'historique sont implémentées une seule fois
|
|
3. **Extensibilité** : Facile d'ajouter de nouveaux types d'agents en héritant de la classe de base
|
|
4. **Polymorphisme** : Possibilité de traiter différents agents de manière uniforme
|
|
5. **Traçabilité** : Gestion unifiée de l'historique des actions et résultats
|
|
|
|
## 3. Analyse des classes LLM dans les deux projets
|
|
|
|
### Classes LLM dans AIagent2
|
|
|
|
Le projet AIagent2 comporte plusieurs classes pour différents modèles LLM, toutes héritant d'une classe abstraite `LLM` :
|
|
|
|
1. **Mistral** - Intégration avec l'API Mistral
|
|
2. **Ollama** - Intégration avec Ollama pour les modèles locaux
|
|
3. **DeepSeek** - Intégration avec l'API DeepSeek
|
|
4. **Perplexity** - Intégration avec l'API Perplexity
|
|
5. **DeepL** - Intégration avec l'API DeepL pour la traduction
|
|
6. **RAG** - Système de Retrieval Augmented Generation
|
|
7. **LlamaVision** - Intégration avec Llama Vision 3.2 pour l'analyse d'images
|
|
|
|
Toutes ces classes partagent une interface commune définie par la classe abstraite `LLM`, qui inclut des méthodes comme `Interroger()`, `LLM_POST()`, etc.
|
|
|
|
### Classes LLM dans llm_lab-test
|
|
|
|
Le nouveau projet utilise une approche similaire mais plus simplifiée :
|
|
|
|
1. **BaseLLM** - Classe de base abstraite
|
|
2. **Mistral7B** - Implémentation pour Mistral 7B
|
|
3. **LlamaVision90B** - Implémentation pour Llama Vision 90B
|
|
|
|
La différence principale est la séparation entre les modèles et les rôles (agents), qui sont définis dans un fichier séparé.
|
|
|
|
### Comparaison des implémentations LlamaVision
|
|
|
|
#### LlamaVision dans AIagent2
|
|
- Plus de paramètres configurables (température, top_k, top_p, mirostat, etc.)
|
|
- Support intégré pour les images et données JSON
|
|
- Méthodes pour la fusion des résultats avec JSON
|
|
- Gestion détaillée des erreurs
|
|
|
|
#### LlamaVision90B dans llm_lab-test
|
|
- Implémentation plus simple
|
|
- Moins de paramètres configurables
|
|
- Support pour la traduction automatique
|
|
- Structure plus légère
|
|
|
|
## 4. Recommandations pour le nouveau projet
|
|
|
|
### Intégration de la classe Agent dans llm_lab-test
|
|
|
|
L'approche avec une classe abstraite `Agent` présente des avantages significatifs qui pourraient être bénéfiques pour le nouveau projet sans perturber son fonctionnement actuel.
|
|
|
|
Voici comment elle pourrait être implémentée :
|
|
|
|
```python
|
|
# Proposition pour agents/base_agent.py
|
|
from datetime import datetime
|
|
from typing import Dict, List, Any, Optional
|
|
|
|
class Agent:
|
|
"""Classe de base pour tous les agents d'analyse"""
|
|
|
|
def __init__(self, nom: str = "Agent"):
|
|
self.nom = nom
|
|
self.historique = []
|
|
|
|
def ajouter_historique(self, action: str, input_data: Any, output_data: Any) -> None:
|
|
"""Ajoute une entrée dans l'historique de l'agent"""
|
|
self.historique.append({
|
|
"timestamp": datetime.now().isoformat(),
|
|
"action": action,
|
|
"input": str(input_data)[:500],
|
|
"output": str(output_data)[:500]
|
|
})
|
|
|
|
def obtenir_historique(self) -> List[Dict[str, Any]]:
|
|
"""Retourne l'historique complet de l'agent"""
|
|
return self.historique
|
|
|
|
def executer(self, *args, **kwargs) -> Any:
|
|
"""Méthode abstraite à implémenter dans les classes dérivées"""
|
|
raise NotImplementedError("Chaque agent doit implémenter sa propre méthode executer()")
|
|
```
|
|
|
|
### Adaptation de LlamaVision90B avec plus de paramètres
|
|
|
|
Le modèle LlamaVision90B du nouveau projet pourrait bénéficier des paramètres supplémentaires disponibles dans l'ancien projet :
|
|
|
|
```python
|
|
# Proposition de mise à jour pour core/llama_vision90b.py
|
|
class LlamaVision90B(BaseLLM):
|
|
def __init__(self):
|
|
model_name = "llama3.2-vision:90b"
|
|
engine = "Ollama"
|
|
|
|
self.api_url = "http://217.182.105.173:11434/api/chat"
|
|
|
|
default_params = {
|
|
# Paramètres existants
|
|
"temperature": 0.3,
|
|
"top_p": 1.0,
|
|
"top_k": 40,
|
|
"repeat_penalty": 1.1,
|
|
"num_predict": 512,
|
|
"num_ctx": 4096,
|
|
|
|
# Nouveaux paramètres inspirés de l'ancien projet
|
|
"mirostat": 0,
|
|
"mirostat_eta": 0.1,
|
|
"mirostat_tau": 5.0,
|
|
"seed": 0,
|
|
"stop": [],
|
|
"min_p": 0.0,
|
|
|
|
# Paramètres existants
|
|
"format": "json",
|
|
"stream": False,
|
|
"raw": False,
|
|
"keep_alive": "5m"
|
|
}
|
|
|
|
super().__init__(model_name=model_name, engine=engine, base_params=default_params)
|
|
|
|
# Support pour les données JSON associées
|
|
self.json_data = {}
|
|
|
|
def set_json_data(self, json_data: Dict[str, Any]) -> bool:
|
|
"""Définit les données JSON à associer à l'image"""
|
|
try:
|
|
self.json_data = json_data
|
|
return True
|
|
except Exception as e:
|
|
print(f"Erreur lors de la définition des données JSON: {e}")
|
|
return False
|
|
|
|
# [...] Reste de l'implémentation
|
|
```
|
|
|
|
### Création d'une classe Mistral compatible avec l'ancien projet
|
|
|
|
```python
|
|
# Proposition pour core/mistral_api.py
|
|
from core.base_llm import BaseLLM
|
|
import requests
|
|
import json
|
|
|
|
class MistralAPI(BaseLLM):
|
|
"""Intégration avec l'API Mistral (similaire à la classe Mistral de l'ancien projet)"""
|
|
|
|
def __init__(self):
|
|
model_name = "mistral-large-latest"
|
|
engine = "MistralAPI"
|
|
|
|
self.api_url = "https://api.mistral.ai/v1/chat/completions"
|
|
self.api_key = "VOTRE_CLE_API" # À remplacer par la clé réelle ou une variable d'environnement
|
|
|
|
default_params = {
|
|
"temperature": 0.7,
|
|
"top_p": 0.9,
|
|
"max_tokens": 1024,
|
|
"presence_penalty": 0,
|
|
"frequency_penalty": 0,
|
|
"stop": []
|
|
}
|
|
|
|
super().__init__(model_name=model_name, engine=engine, base_params=default_params)
|
|
|
|
def generate(self, user_prompt):
|
|
prompt = self._format_prompt(user_prompt)
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"Authorization": f"Bearer {self.api_key}"
|
|
}
|
|
|
|
payload = {
|
|
"model": self.model,
|
|
"messages": [
|
|
{"role": "system", "content": self.system_prompt},
|
|
{"role": "user", "content": user_prompt}
|
|
],
|
|
"temperature": self.params.get("temperature", 0.7),
|
|
"top_p": self.params.get("top_p", 0.9),
|
|
"max_tokens": self.params.get("max_tokens", 1024)
|
|
}
|
|
|
|
response = requests.post(self.api_url, headers=headers, json=payload)
|
|
|
|
if not response.ok:
|
|
raise Exception(f"Erreur API Mistral: {response.status_code} - {response.text}")
|
|
|
|
result_data = response.json()
|
|
result_text = result_data.get("choices", [{}])[0].get("message", {}).get("content", "")
|
|
|
|
return self._log_result(user_prompt, result_text)
|
|
``` |