khadijaaao commited on
Commit
52eea35
·
verified ·
1 Parent(s): fcc2ce9

Upload 2 files

Browse files
Files changed (2) hide show
  1. requirements.txt +8 -3
  2. streamlit_app.py.py +80 -0
requirements.txt CHANGED
@@ -1,3 +1,8 @@
1
- altair
2
- pandas
3
- streamlit
 
 
 
 
 
 
1
+
2
+ langchain
3
+ langchain-community
4
+ faiss-cpu
5
+ sentence-transformers
6
+ # Pour le support GPU (NVIDIA), installez avec la commande ci-dessous. Sinon, utilisez la version CPU.
7
+ # pip install llama-cpp-python --prefer-binary --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121
8
+ llama-cpp-python
streamlit_app.py.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ from llama_cpp import Llama
4
+ from langchain_community.vectorstores import FAISS
5
+ from langchain_community.embeddings import HuggingFaceEmbeddings
6
+
7
+ # --- Configuration de la page Streamlit ---
8
+ st.set_page_config(page_title="Wize, votre Coach RAG", layout="wide")
9
+ st.title("🤖 Wize - Votre Coach Expert")
10
+ st.write("Posez une question sur vos documents, et je vous répondrai en me basant sur leur contenu.")
11
+
12
+ # --- Fonctions de chargement mises en cache ---
13
+ # @st.cache_resource est CRUCIAL pour que Streamlit ne recharge pas les modèles à chaque interaction
14
+ @st.cache_resource
15
+ def load_llm(model_path):
16
+ print("Chargement du modèle LLM...")
17
+ return Llama(model_path=model_path, n_gpu_layers=-1, n_ctx=4096, verbose=False, chat_format="llama-3")
18
+
19
+ @st.cache_resource
20
+ def load_retriever(faiss_path, embeddings_path):
21
+ print("Chargement du modèle d'embeddings et de FAISS...")
22
+ embeddings_model = HuggingFaceEmbeddings(model_name=embeddings_path, model_kwargs={'device': 'cpu'}) # Utiliser le CPU sur les serveurs gratuits
23
+ vectorstore = FAISS.load_local(faiss_path, embeddings_model, allow_dangerous_deserialization=True)
24
+ return vectorstore.as_retriever(search_kwargs={"k": 5})
25
+
26
+ # --- Chemins d'accès (relatifs) ---
27
+ DOSSIER_PROJET = os.path.dirname(__file__)
28
+ CHEMIN_MODELE_GGUF = os.path.join(DOSSIER_PROJET, "Meta-Llama-3-8B-Instruct.Q4_K_M.gguf") # Assurez-vous que le nom correspond
29
+ CHEMIN_INDEX_FAISS = os.path.join(DOSSIER_PROJET, "faiss_index_wize")
30
+ CHEMIN_MODELE_EMBEDDINGS = os.path.join(DOSSIER_PROJET, "embedding_model")
31
+
32
+ # --- Chargement des modèles via Streamlit ---
33
+ try:
34
+ llm = load_llm(CHEMIN_MODELE_GGUF)
35
+ retriever = load_retriever(CHEMIN_INDEX_FAISS, CHEMIN_MODELE_EMBEDDINGS)
36
+ st.success("Les modèles sont chargés et prêts !")
37
+ except Exception as e:
38
+ st.error(f"Erreur lors du chargement des modèles : {e}")
39
+ st.stop()
40
+
41
+ # --- Initialisation de l'historique de chat ---
42
+ if "messages" not in st.session_state:
43
+ st.session_state.messages = []
44
+
45
+ # Afficher les messages de l'historique
46
+ for message in st.session_state.messages:
47
+ with st.chat_message(message["role"]):
48
+ st.markdown(message["content"])
49
+
50
+ # --- Logique de Chat ---
51
+ if prompt := st.chat_input("Posez votre question ici..."):
52
+ # Ajouter le message de l'utilisateur à l'historique
53
+ st.session_state.messages.append({"role": "user", "content": prompt})
54
+ with st.chat_message("user"):
55
+ st.markdown(prompt)
56
+
57
+ # Générer la réponse de l'assistant
58
+ with st.chat_message("assistant"):
59
+ with st.spinner("Je réfléchis..."):
60
+ # 1. Récupérer le contexte
61
+ docs = retriever.invoke(prompt)
62
+ context = "\n".join([doc.page_content for doc in docs])
63
+
64
+ # 2. Créer le prompt pour le LLM
65
+ system_prompt = "Vous êtes Wize. Répondez à la question en vous basant uniquement sur le contexte fourni."
66
+ full_prompt = f"""
67
+ <|begin_of_text|><|start_header_id|>system<|end_header_id|>
68
+ {system_prompt}
69
+ Contexte : {context}<|eot_id|><|start_header_id|>user<|end_header_id|>
70
+ Question : {prompt}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
71
+ """
72
+
73
+ # 3. Générer la réponse
74
+ response = llm(full_prompt, max_tokens=1500, stop=["<|eot_id|>"], echo=False)
75
+ answer = response['choices'][0]['text'].strip()
76
+
77
+ st.markdown(answer)
78
+
79
+ # Ajouter la réponse de l'assistant à l'historique
80
+ st.session_state.messages.append({"role": "assistant", "content": answer})