Passage de ollama à groq pour le générateur de réponse, nécessite une clé API.
This commit is contained in:
@ -13,4 +13,4 @@ pydantic>=2.0.0 # For data validation
|
||||
lancedb==0.6.13
|
||||
docling==2.31.0
|
||||
cohere==5.15.0
|
||||
|
||||
requests>=2.31.0
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
from typing import List
|
||||
from typing import List, Optional
|
||||
from ..interface.base_response_generator import BaseResponseGenerator
|
||||
import requests
|
||||
import json
|
||||
from groq import Groq
|
||||
import os
|
||||
|
||||
|
||||
SYSTEM_PROMPT = """Tu es un assistant intelligent qui répond aux questions en te basant sur le contexte fourni.
|
||||
|
||||
@ -15,12 +16,31 @@ Règles importantes:
|
||||
|
||||
class ResponseGenerator(BaseResponseGenerator):
|
||||
|
||||
def __init__(self, model_name: str = "llama3.2:3b", base_url: str = "http://localhost:11434"):
|
||||
self.model_name = model_name
|
||||
self.base_url = base_url
|
||||
def __init__(self, api_key: Optional[str] = None):
|
||||
try :
|
||||
self.api_key = api_key or os.getenv("GROQ_API_KEY")
|
||||
except Exception as e:
|
||||
raise ValueError(f"erreur avec la clé API: {e}")
|
||||
|
||||
def generate_response(self, query: str, context: List[str]) -> str:
|
||||
"""Génère une réponse basée sur la requête et le contexte."""
|
||||
try:
|
||||
self.client = Groq(api_key=self.api_key)
|
||||
self.model = "llama-3.1-8b-instant" # Rapide et gratuit
|
||||
print("✅ Générateur Groq initialisé avec succès")
|
||||
except Exception as e:
|
||||
raise ValueError(f"❌ Erreur lors de l'initialisation de Groq: {e}")
|
||||
|
||||
def generate_response(self, query: str, context: List[str], max_tokens: int = 512) -> str:
|
||||
"""
|
||||
Génère une réponse basée sur la requête et le contexte.
|
||||
|
||||
Args:
|
||||
query: Question de l'utilisateur
|
||||
context: Liste de documents pertinents
|
||||
max_tokens: Longueur maximale de la réponse
|
||||
|
||||
Returns:
|
||||
Réponse générée
|
||||
"""
|
||||
|
||||
# Formater le contexte
|
||||
formatted_context = "\n\n".join([f"Document {i+1}:\n{doc}" for i, doc in enumerate(context)])
|
||||
@ -36,48 +56,31 @@ class ResponseGenerator(BaseResponseGenerator):
|
||||
|
||||
# Appeler Ollama via l'API
|
||||
try:
|
||||
response = requests.post(
|
||||
f"{self.base_url}/api/generate",
|
||||
json={
|
||||
"model": self.model_name,
|
||||
"prompt": prompt,
|
||||
"stream": False,
|
||||
"options": {
|
||||
"temperature": 0.7,
|
||||
"top_p": 0.9,
|
||||
}
|
||||
}
|
||||
response = self.client.chat.completions.create(
|
||||
model=self.model,
|
||||
messages=[
|
||||
{"role": "system", "content": SYSTEM_PROMPT},
|
||||
{"role": "user", "content": prompt}
|
||||
],
|
||||
temperature=0.7,
|
||||
max_tokens=max_tokens,
|
||||
)
|
||||
|
||||
# Vérifier le statut de la réponse
|
||||
response.raise_for_status()
|
||||
answer = response.choices[0].message.content.strip()
|
||||
|
||||
# Parser le JSON
|
||||
result = response.json()
|
||||
if not answer:
|
||||
return "⚠️ Le modèle n'a pas pu générer de réponse."
|
||||
|
||||
# DEBUG: Afficher la structure de la réponse
|
||||
print(f"DEBUG - Structure de la réponse: {result.keys()}")
|
||||
|
||||
# Vérifier les différentes clés possibles
|
||||
if "response" in result:
|
||||
return result["response"]
|
||||
elif "message" in result:
|
||||
return result["message"]
|
||||
elif "content" in result:
|
||||
return result["content"]
|
||||
else:
|
||||
# Si aucune clé attendue n'est trouvée
|
||||
print(f"DEBUG - Réponse complète: {result}")
|
||||
return f"Erreur: Format de réponse inattendu. Clés disponibles: {list(result.keys())}"
|
||||
|
||||
except requests.exceptions.ConnectionError:
|
||||
return "❌ Impossible de se connecter au serveur Ollama. Vérifiez qu'Ollama est en cours d'exécution avec: ollama serve"
|
||||
|
||||
except requests.exceptions.Timeout:
|
||||
return "⚠️ La génération a pris trop de temps. Essayez avec un modèle plus petit."
|
||||
|
||||
except requests.exceptions.HTTPError as e:
|
||||
return f"❌ Erreur HTTP {response.status_code}: {e}"
|
||||
return answer
|
||||
|
||||
except Exception as e:
|
||||
return f"❌ Erreur lors de la génération: {str(e)}"
|
||||
error_msg = str(e).lower()
|
||||
|
||||
# Erreurs spécifiques
|
||||
if "rate" in error_msg or "limit" in error_msg:
|
||||
return "⚠️ Limite de requêtes atteinte. Attendez 1 minute et réessayez."
|
||||
elif "authentication" in error_msg or "api" in error_msg:
|
||||
return "❌ Erreur d'authentification. Vérifiez votre clé API dans le fichier .env"
|
||||
else:
|
||||
return f"❌ Erreur lors de la génération: {str(e)}"
|
||||
|
||||
Reference in New Issue
Block a user