Passage de ollama à groq pour le générateur de réponse, nécessite une clé API.

This commit is contained in:
2025-11-05 15:59:36 +01:00
parent ccc730f8c8
commit 195b3c05c8
3 changed files with 63 additions and 58 deletions

20
main.py

File diff suppressed because one or more lines are too long

View File

@ -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

View File

@ -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)}"