mirror of
https://github.com/Ladebeze66/llm_lab.git
synced 2025-12-15 20:06:50 +01:00
351 lines
12 KiB
Markdown
351 lines
12 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/
|
|
└── analyse_projets.md (ce document)
|
|
```
|
|
|
|
### 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 (fonctionnalité absente de l'ancien projet)
|
|
- Structure plus légère
|
|
|
|
## 4. Recommandations d'implémentations pour le nouveau projet
|
|
|
|
### 1. Proposition d'intégration de la classe Agent abstraite
|
|
|
|
Il serait bénéfique de créer une classe abstraite `Agent` dans le nouveau projet sans perturber son fonctionnement actuel :
|
|
|
|
```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()")
|
|
```
|
|
|
|
### 2. Proposition d'agents spécialisés
|
|
|
|
Des agents spécialisés pourraient être créés pour hériter de cette classe abstraite :
|
|
|
|
#### AgentAnalyseImage
|
|
|
|
Un agent qui utiliserait LlamaVision pour analyser des images :
|
|
|
|
```python
|
|
# Proposition pour agents/analyse_image.py
|
|
class AgentAnalyseImage(Agent):
|
|
"""
|
|
Agent pour analyser des images avec LlamaVision
|
|
"""
|
|
def __init__(self, nom: str = "AgentAnalyseImage"):
|
|
super().__init__(nom)
|
|
self.llm = LLMFactory.create("llamavision")
|
|
self.questions_standard = [
|
|
"Décris en détail ce que tu vois sur cette image.",
|
|
"Quels sont les éléments principaux visibles sur cette image?",
|
|
"Y a-t-il du texte visible sur cette image? Si oui, peux-tu le transcrire?",
|
|
"Quelle est l'ambiance générale de cette image?"
|
|
]
|
|
|
|
def executer(self, image_path: str, json_data: Optional[Dict[str, Any]] = None,
|
|
question: Optional[str] = None) -> Dict[str, Any]:
|
|
# Implémentation de l'analyse d'image
|
|
```
|
|
|
|
#### AgentAnalyseJSON
|
|
|
|
Un agent qui analyserait des données JSON :
|
|
|
|
```python
|
|
# Proposition pour agents/analyseJSON.py
|
|
class AgentAnalyseJSON(Agent):
|
|
"""
|
|
Agent pour analyser des données JSON
|
|
"""
|
|
def __init__(self, nom: str = "AgentAnalyseJSON", modele: str = "mistral7b"):
|
|
super().__init__(nom)
|
|
|
|
# Choix du modèle
|
|
self.llm = LLMFactory.create(modele)
|
|
|
|
# Configuration du modèle
|
|
self.llm.set_role("formateur", {
|
|
"system_prompt": "Tu es un expert en analyse de données JSON...",
|
|
"params": {
|
|
"temperature": 0.4,
|
|
"top_p": 0.9
|
|
}
|
|
})
|
|
|
|
def executer(self, json_data: Dict[str, Any],
|
|
question: str = "Analyse ces données...") -> Dict[str, Any]:
|
|
# Implémentation de l'analyse JSON
|
|
```
|
|
|
|
### 3. Proposition d'adaptation de LlamaVision90B
|
|
|
|
L'implémentation de LlamaVision90B pourrait être enrichie pour inclure tous les paramètres et fonctionnalités de la version originale :
|
|
|
|
```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 de créativité
|
|
"temperature": 0.3,
|
|
"top_p": 1.0,
|
|
"top_k": 40,
|
|
|
|
# Paramètres de qualité
|
|
"repeat_penalty": 1.1,
|
|
"min_p": 0.0,
|
|
|
|
# Paramètres de contrôle avancé
|
|
"mirostat": 0,
|
|
"mirostat_eta": 0.1,
|
|
"mirostat_tau": 5.0,
|
|
|
|
# Paramètres de taille
|
|
"num_predict": 512,
|
|
"num_ctx": 4096,
|
|
|
|
# Paramètres de contrôle
|
|
"seed": 0,
|
|
"stop": [],
|
|
|
|
# Autres paramètres
|
|
"format": "json",
|
|
"stream": False,
|
|
"raw": False,
|
|
"keep_alive": "5m"
|
|
}
|
|
|
|
# Attributs pour la gestion des images et données JSON
|
|
self.image_data = None
|
|
self.json_data = {}
|
|
|
|
super().__init__(model_name=model_name, engine=engine, base_params=default_params)
|
|
```
|
|
|
|
### 4. Proposition de création de MistralAPI
|
|
|
|
Une nouvelle classe MistralAPI compatible avec l'API Mistral externe pourrait être ajoutée :
|
|
|
|
```python
|
|
# Proposition pour core/mistral_api.py
|
|
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 = os.environ.get("MISTRAL_API_KEY", "")
|
|
|
|
default_params = {
|
|
# Paramètres de génération
|
|
"temperature": 0.7,
|
|
"top_p": 0.9,
|
|
"max_tokens": 1024,
|
|
|
|
# Paramètres de contrôle
|
|
"presence_penalty": 0,
|
|
"frequency_penalty": 0,
|
|
"stop": [],
|
|
|
|
# Paramètres divers
|
|
"random_seed": None
|
|
}
|
|
|
|
super().__init__(model_name=model_name, engine=engine, base_params=default_params)
|
|
```
|
|
|
|
### 5. Proposition de mise à jour de la Factory
|
|
|
|
La Factory pourrait être mise à jour pour inclure le nouveau modèle MistralAPI :
|
|
|
|
```python
|
|
# Proposition de mise à jour pour core/factory.py
|
|
class LLMFactory:
|
|
"""
|
|
Factory pour créer des instances de modèles LLM dynamiquement
|
|
"""
|
|
_registry = {
|
|
"mistral7b": Mistral7B,
|
|
"llamavision": LlamaVision90B,
|
|
"mistralapi": MistralAPI,
|
|
# Ajouter d'autres modèles LLM ici
|
|
}
|
|
```
|
|
|
|
## 5. Conclusion
|
|
|
|
Cette analyse a permis d'identifier des opportunités d'enrichissement du nouveau projet llm_lab-test avec les fonctionnalités clés de l'ancien projet AIagent2, tout en conservant sa structure modulaire et moderne. Les ajouts potentiels sont :
|
|
|
|
1. Une classe abstraite Agent pour unifier les comportements des agents
|
|
2. Des implémentations d'agents spécialisés (analyse d'image et JSON)
|
|
3. Une version enrichie de LlamaVision90B avec tous les paramètres de l'original
|
|
4. Une nouvelle classe MistralAPI compatible avec l'API Mistral externe
|
|
|
|
Ces modifications permettraient de bénéficier des avantages des deux approches : la richesse fonctionnelle de l'ancien projet et la structure modulaire du nouveau. |