Spaces:
Sleeping
Sleeping
Update src/streamlit_app.py
Browse files- src/streamlit_app.py +37 -53
src/streamlit_app.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
import os
|
| 3 |
-
|
| 4 |
-
from
|
|
|
|
| 5 |
from langchain_community.vectorstores import FAISS
|
| 6 |
from langchain_community.embeddings import HuggingFaceEmbeddings
|
| 7 |
-
from huggingface_hub import hf_hub_download
|
| 8 |
from langchain.docstore.document import Document
|
| 9 |
import logging
|
| 10 |
|
|
@@ -29,49 +29,31 @@ Document.__setstate__ = custom_setstate
|
|
| 29 |
@st.cache_resource
|
| 30 |
def load_llm():
|
| 31 |
"""
|
| 32 |
-
Charge le modèle LLM depuis le Hub Hugging Face en
|
|
|
|
| 33 |
"""
|
| 34 |
-
model_repo_id = "
|
| 35 |
-
model_filename = "
|
| 36 |
-
|
| 37 |
-
# ✅ LA SOLUTION LA PLUS ROBUSTE :
|
| 38 |
-
# On demande au système de nous donner le chemin vers le répertoire temporaire.
|
| 39 |
-
# C'est la méthode standard de Python pour éviter les erreurs de permission.
|
| 40 |
-
temp_dir = tempfile.gettempdir()
|
| 41 |
-
cache_dir = os.path.join(temp_dir, "models_cache")
|
| 42 |
-
logger.info(f"Utilisation du répertoire de cache temporaire système : {cache_dir}")
|
| 43 |
|
| 44 |
-
|
| 45 |
-
os.makedirs(cache_dir, exist_ok=True)
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
with st.spinner(f"Vérification/Téléchargement du modèle '{model_filename}'... (Long au premier démarrage)"):
|
| 49 |
try:
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
)
|
| 55 |
-
logger.info(
|
| 56 |
-
except Exception as e:
|
| 57 |
-
st.error(f"Erreur critique lors du téléchargement du modèle. Chemin tenté : {cache_dir}. Erreur : {e}")
|
| 58 |
-
logger.error(f"Erreur de téléchargement du modèle vers '{cache_dir}': {e}")
|
| 59 |
-
st.stop()
|
| 60 |
-
|
| 61 |
-
with st.spinner("Chargement du modèle LLM en mémoire..."):
|
| 62 |
-
try:
|
| 63 |
-
llm = Llama(
|
| 64 |
-
model_path=model_path,
|
| 65 |
-
n_gpu_layers=0, # CPU
|
| 66 |
-
n_ctx=4096,
|
| 67 |
-
verbose=False,
|
| 68 |
-
chat_format="llama-3"
|
| 69 |
-
)
|
| 70 |
-
logger.info("Modèle LLM chargé avec succès.")
|
| 71 |
return llm
|
| 72 |
except Exception as e:
|
| 73 |
-
st.error(f"Erreur lors du chargement du modèle
|
| 74 |
-
logger.error(f"Erreur de chargement
|
| 75 |
st.stop()
|
| 76 |
|
| 77 |
@st.cache_resource
|
|
@@ -135,20 +117,22 @@ if prompt := st.chat_input("Posez votre question ici..."):
|
|
| 135 |
docs = retriever.invoke(prompt)
|
| 136 |
context = "\n\n".join([doc.page_content for doc in docs])
|
| 137 |
|
| 138 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
|
| 140 |
-
|
| 141 |
-
{"role": "system", "content": f"{system_prompt}\n\nContexte:\n{context}"},
|
| 142 |
-
{"role": "user", "content": prompt}
|
| 143 |
-
]
|
| 144 |
-
|
| 145 |
-
response_stream = llm.create_chat_completion_stream(
|
| 146 |
-
messages=messages_for_llm,
|
| 147 |
-
max_tokens=1500,
|
| 148 |
-
temperature=0.7,
|
| 149 |
-
stop=["<|eot_id|>", "<|end_of_text|>"]
|
| 150 |
-
)
|
| 151 |
-
answer = st.write_stream(token['choices'][0]['delta'].get('content', '') for token in response_stream)
|
| 152 |
st.session_state.messages.append({"role": "assistant", "content": answer})
|
| 153 |
|
| 154 |
except Exception as e:
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
import os
|
| 3 |
+
# from llama_cpp import Llama # Nous n'utilisons plus llama-cpp-python
|
| 4 |
+
from ctransformers import AutoModelForCausalLM
|
| 5 |
+
from langchain.llms.ctransformers import CTransformers
|
| 6 |
from langchain_community.vectorstores import FAISS
|
| 7 |
from langchain_community.embeddings import HuggingFaceEmbeddings
|
|
|
|
| 8 |
from langchain.docstore.document import Document
|
| 9 |
import logging
|
| 10 |
|
|
|
|
| 29 |
@st.cache_resource
|
| 30 |
def load_llm():
|
| 31 |
"""
|
| 32 |
+
Charge le modèle LLM directement depuis le Hub Hugging Face en mémoire
|
| 33 |
+
en utilisant la bibliothèque ctransformers, qui ne nécessite pas d'écriture disque.
|
| 34 |
"""
|
| 35 |
+
model_repo_id = "TheBloke/Llama-2-7B-Chat-GGUF"
|
| 36 |
+
model_filename = "llama-2-7b-chat.Q4_K_M.gguf"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
+
with st.spinner(f"Chargement du modèle '{model_filename}' en mémoire... (Long au premier démarrage)"):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
try:
|
| 40 |
+
# ctransformers charge le modèle SANS le sauvegarder sur un disque local
|
| 41 |
+
# C'est la solution pour les environnements en lecture seule.
|
| 42 |
+
llm = CTransformers(
|
| 43 |
+
model=model_repo_id,
|
| 44 |
+
model_file=model_filename,
|
| 45 |
+
model_type="llama",
|
| 46 |
+
config={
|
| 47 |
+
'max_new_tokens': 1500,
|
| 48 |
+
'temperature': 0.7,
|
| 49 |
+
'context_length': 4096
|
| 50 |
+
}
|
| 51 |
)
|
| 52 |
+
logger.info("Modèle LLM chargé avec succès en mémoire.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
return llm
|
| 54 |
except Exception as e:
|
| 55 |
+
st.error(f"Erreur critique lors du chargement du modèle depuis le Hub : {e}")
|
| 56 |
+
logger.error(f"Erreur de chargement du modèle CTransformers : {e}")
|
| 57 |
st.stop()
|
| 58 |
|
| 59 |
@st.cache_resource
|
|
|
|
| 117 |
docs = retriever.invoke(prompt)
|
| 118 |
context = "\n\n".join([doc.page_content for doc in docs])
|
| 119 |
|
| 120 |
+
# Création du prompt pour CTransformers
|
| 121 |
+
full_prompt = f"""
|
| 122 |
+
System: Vous êtes un coach expert. Répondez à la question en vous basant UNIQUEMENT sur le contexte fourni. Ne mentionnez pas le contexte dans votre réponse.
|
| 123 |
+
|
| 124 |
+
Contexte:
|
| 125 |
+
{context}
|
| 126 |
+
|
| 127 |
+
Question: {prompt}
|
| 128 |
+
|
| 129 |
+
Réponse:
|
| 130 |
+
"""
|
| 131 |
+
|
| 132 |
+
# Invocation du LLM
|
| 133 |
+
answer = llm.invoke(full_prompt)
|
| 134 |
|
| 135 |
+
st.markdown(answer)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
st.session_state.messages.append({"role": "assistant", "content": answer})
|
| 137 |
|
| 138 |
except Exception as e:
|