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
|
lancedb==0.6.13
|
||||||
docling==2.31.0
|
docling==2.31.0
|
||||||
cohere==5.15.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
|
from ..interface.base_response_generator import BaseResponseGenerator
|
||||||
import requests
|
from groq import Groq
|
||||||
import json
|
import os
|
||||||
|
|
||||||
|
|
||||||
SYSTEM_PROMPT = """Tu es un assistant intelligent qui répond aux questions en te basant sur le contexte fourni.
|
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):
|
class ResponseGenerator(BaseResponseGenerator):
|
||||||
|
|
||||||
def __init__(self, model_name: str = "llama3.2:3b", base_url: str = "http://localhost:11434"):
|
def __init__(self, api_key: Optional[str] = None):
|
||||||
self.model_name = model_name
|
try :
|
||||||
self.base_url = base_url
|
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:
|
try:
|
||||||
"""Génère une réponse basée sur la requête et le contexte."""
|
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
|
# Formater le contexte
|
||||||
formatted_context = "\n\n".join([f"Document {i+1}:\n{doc}" for i, doc in enumerate(context)])
|
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
|
# Appeler Ollama via l'API
|
||||||
try:
|
try:
|
||||||
response = requests.post(
|
response = self.client.chat.completions.create(
|
||||||
f"{self.base_url}/api/generate",
|
model=self.model,
|
||||||
json={
|
messages=[
|
||||||
"model": self.model_name,
|
{"role": "system", "content": SYSTEM_PROMPT},
|
||||||
"prompt": prompt,
|
{"role": "user", "content": prompt}
|
||||||
"stream": False,
|
],
|
||||||
"options": {
|
temperature=0.7,
|
||||||
"temperature": 0.7,
|
max_tokens=max_tokens,
|
||||||
"top_p": 0.9,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Vérifier le statut de la réponse
|
answer = response.choices[0].message.content.strip()
|
||||||
response.raise_for_status()
|
|
||||||
|
|
||||||
# Parser le JSON
|
if not answer:
|
||||||
result = response.json()
|
return "⚠️ Le modèle n'a pas pu générer de réponse."
|
||||||
|
|
||||||
# DEBUG: Afficher la structure de la réponse
|
return answer
|
||||||
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}"
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as 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)}"
|
return f"❌ Erreur lors de la génération: {str(e)}"
|
||||||
|
|
||||||
Reference in New Issue
Block a user