khadijaaao commited on
Commit
16e5505
·
verified ·
1 Parent(s): 1d6ab9f

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +37 -53
src/streamlit_app.py CHANGED
@@ -1,10 +1,10 @@
1
  import streamlit as st
2
  import os
3
- import tempfile # On importe le module pour gérer les fichiers/dossiers temporaires
4
- from llama_cpp import Llama
 
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 utilisant un cache temporaire sécurisé.
 
33
  """
34
- model_repo_id = "QuantFactory/Meta-Llama-3-8B-Instruct-GGUF"
35
- model_filename = "Meta-Llama-3-8B-Instruct.Q4_K_M.gguf"
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
- # On s'assure que le dossier de cache existe dans le répertoire temporaire
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
- model_path = hf_hub_download(
51
- repo_id=model_repo_id,
52
- filename=model_filename,
53
- cache_dir=cache_dir # On spécifie le chemin de cache sûr et valide
 
 
 
 
 
 
 
54
  )
55
- logger.info(f"Chemin du modèle : {model_path}")
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 Llama : {e}")
74
- logger.error(f"Erreur de chargement Llama : {e}")
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
- system_prompt = "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."
 
 
 
 
 
 
 
 
 
 
 
 
 
139
 
140
- messages_for_llm = [
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: