12 KiB
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
-
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)
-
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
-
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
-
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.
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 :
- AgentAnalyseImage - Spécialisé dans l'analyse d'images avec LlamaVision
- AgentAnalyseJSON - Spécialisé dans l'analyse de données JSON
- AgentQuestionReponse - Spécialisé dans le processus de questions/réponses
Intérêt de cette approche
- Cohérence d'interface : Tous les agents partagent la même interface de base (
executer()) - Code réutilisable : Les fonctionnalités communes comme la gestion de l'historique sont implémentées une seule fois
- Extensibilité : Facile d'ajouter de nouveaux types d'agents en héritant de la classe de base
- Polymorphisme : Possibilité de traiter différents agents de manière uniforme
- 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 :
- Mistral - Intégration avec l'API Mistral
- Ollama - Intégration avec Ollama pour les modèles locaux
- DeepSeek - Intégration avec l'API DeepSeek
- Perplexity - Intégration avec l'API Perplexity
- DeepL - Intégration avec l'API DeepL pour la traduction
- RAG - Système de Retrieval Augmented Generation
- 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 :
- BaseLLM - Classe de base abstraite
- Mistral7B - Implémentation pour Mistral 7B
- 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 :
# 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 :
# 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 :
# 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 :
# 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 :
# 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 :
# 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 :
- Une classe abstraite Agent pour unifier les comportements des agents
- Des implémentations d'agents spécialisés (analyse d'image et JSON)
- Une version enrichie de LlamaVision90B avec tous les paramètres de l'original
- 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.