Spaces:
Runtime error
Runtime error
Commit ·
5e8b427
1
Parent(s): 441e374
changement modele llm gratuit
Browse files- requirements.txt +3 -0
- src/streamlit_app.py +30 -41
requirements.txt
CHANGED
|
@@ -16,3 +16,6 @@ chromadb
|
|
| 16 |
# Optional but often useful
|
| 17 |
tqdm # Pour affichage des barres de progression
|
| 18 |
python-dotenv # Pour lire .env si tu stockes des clés API
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
# Optional but often useful
|
| 17 |
tqdm # Pour affichage des barres de progression
|
| 18 |
python-dotenv # Pour lire .env si tu stockes des clés API
|
| 19 |
+
|
| 20 |
+
transformers
|
| 21 |
+
torch
|
src/streamlit_app.py
CHANGED
|
@@ -9,6 +9,35 @@ from utils.load_embeddings import get_local_embeddings
|
|
| 9 |
import requests
|
| 10 |
import datetime
|
| 11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
st.set_page_config(page_title="Assistant Juridique IA", layout="wide")
|
| 13 |
st.title("📚 Assistant Juridique avec IA")
|
| 14 |
st.write("Posez une question juridique.")
|
|
@@ -192,46 +221,6 @@ if st.button("📤 Envoyer") and user_input.strip():
|
|
| 192 |
f"\n[RESPONSE]"
|
| 193 |
)
|
| 194 |
# Appel direct à l'API Inference Hugging Face pour Mixtral
|
| 195 |
-
|
| 196 |
-
headers = {"Authorization": f"Bearer {token}"}
|
| 197 |
-
payload = {"inputs": prompt}
|
| 198 |
-
try:
|
| 199 |
-
response = requests.post(api_url, headers=headers, json=payload, timeout=60)
|
| 200 |
-
response.raise_for_status()
|
| 201 |
-
result_json = response.json()
|
| 202 |
-
if isinstance(result_json, list) and len(result_json) > 0 and "generated_text" in result_json[0]:
|
| 203 |
-
output_text = result_json[0]["generated_text"]
|
| 204 |
-
# Post-traitement : ne garder que la réponse après [RESPONSE]
|
| 205 |
-
if "[RESPONSE]" in output_text:
|
| 206 |
-
output_text = output_text.split("[RESPONSE]", 1)[-1].lstrip("\n :")
|
| 207 |
-
elif isinstance(result_json, dict) and "error" in result_json:
|
| 208 |
-
st.error(f"Erreur Hugging Face API : {result_json['error']}")
|
| 209 |
-
st.stop()
|
| 210 |
-
else:
|
| 211 |
-
output_text = str(result_json)
|
| 212 |
-
except Exception as e:
|
| 213 |
-
import traceback
|
| 214 |
-
st.error(f"❌ Erreur pendant la génération de la réponse : {e}")
|
| 215 |
-
st.error(f"Type d'erreur : {type(e).__name__}")
|
| 216 |
-
st.expander("Voir détails de l'erreur").write(traceback.format_exc())
|
| 217 |
-
st.write("### Question utilisateur")
|
| 218 |
-
st.write(user_input)
|
| 219 |
-
st.write("### Nombre de documents récupérés :", len(filtered_docs))
|
| 220 |
-
st.write("### Aperçu du premier document (métadonnées + contenu)")
|
| 221 |
-
if filtered_docs:
|
| 222 |
-
doc, score, pertinence = filtered_docs[0]
|
| 223 |
-
st.json({
|
| 224 |
-
"metadata": doc.metadata,
|
| 225 |
-
"pertinence": pertinence,
|
| 226 |
-
"page_content_preview": doc.page_content[:500]
|
| 227 |
-
})
|
| 228 |
-
st.stop()
|
| 229 |
-
# Gestion explicite de l'erreur 402 Hugging Face API
|
| 230 |
-
except requests.exceptions.HTTPError as e:
|
| 231 |
-
if hasattr(e.response, 'status_code') and e.response.status_code == 402:
|
| 232 |
-
st.error("❌ Erreur 402 : L’accès au modèle Mixtral via l’API Hugging Face nécessite un abonnement payant. Veuillez vérifier votre clé API ou utiliser un modèle local.")
|
| 233 |
-
st.stop()
|
| 234 |
-
else:
|
| 235 |
-
raise
|
| 236 |
st.subheader("✅ Réponse générée")
|
| 237 |
st.write(output_text)
|
|
|
|
| 9 |
import requests
|
| 10 |
import datetime
|
| 11 |
|
| 12 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 13 |
+
import torch
|
| 14 |
+
|
| 15 |
+
@st.cache_resource
|
| 16 |
+
def load_local_model():
|
| 17 |
+
model_id = "mistralai/Mistral-7B-Instruct-v0.2"
|
| 18 |
+
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
| 19 |
+
model = AutoModelForCausalLM.from_pretrained(
|
| 20 |
+
model_id,
|
| 21 |
+
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
|
| 22 |
+
device_map="auto"
|
| 23 |
+
)
|
| 24 |
+
return tokenizer, model
|
| 25 |
+
|
| 26 |
+
tokenizer, model = load_local_model()
|
| 27 |
+
|
| 28 |
+
def generate_response(prompt):
|
| 29 |
+
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
|
| 30 |
+
with torch.no_grad():
|
| 31 |
+
outputs = model.generate(
|
| 32 |
+
**inputs,
|
| 33 |
+
max_new_tokens=512,
|
| 34 |
+
do_sample=True,
|
| 35 |
+
temperature=0.7,
|
| 36 |
+
top_p=0.9
|
| 37 |
+
)
|
| 38 |
+
return tokenizer.decode(outputs[0], skip_special_tokens=True).split("[RESPONSE]")[-1].strip()
|
| 39 |
+
|
| 40 |
+
|
| 41 |
st.set_page_config(page_title="Assistant Juridique IA", layout="wide")
|
| 42 |
st.title("📚 Assistant Juridique avec IA")
|
| 43 |
st.write("Posez une question juridique.")
|
|
|
|
| 221 |
f"\n[RESPONSE]"
|
| 222 |
)
|
| 223 |
# Appel direct à l'API Inference Hugging Face pour Mixtral
|
| 224 |
+
output_text = generate_response(prompt)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 225 |
st.subheader("✅ Réponse générée")
|
| 226 |
st.write(output_text)
|