import os import streamlit as st from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_huggingface import HuggingFaceEndpoint from langchain.prompts import PromptTemplate from langchain.chains import LLMChain, RetrievalQA import gspread from oauth2client.service_account import ServiceAccountCredentials import json import gspread from oauth2client.service_account import ServiceAccountCredentials import json # Load Google service account credentials from Hugging Face secrets GOOGLE_SERVICE_ACCOUNT_JSON = st.secrets["GOOGLE_SERVICE_ACCOUNT_JSON"] # Google Sheets setup scope = ["https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive"] service_account_info = json.loads(GOOGLE_SERVICE_ACCOUNT_JSON) creds = ServiceAccountCredentials.from_json_keyfile_dict(service_account_info, scope) client = gspread.authorize(creds) sheet = client.open("users feedback").sheet1 # Replace with your Google Sheet name # Fonction pour enregistrer les retours utilisateur dans Google Sheets def save_feedback(user_input, bot_response, rating, comment): feedback = [user_input, bot_response, rating, comment] sheet.append_row(feedback) # Connexion API Hugging Face from huggingface_hub import login login(token=st.secrets["HF_TOKEN"]) # Initialiser les composants LangChain db = FAISS.load_local("faiss_index", HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L12-v2'), allow_dangerous_deserialization=True) retriever = db.as_retriever(search_type="mmr", search_kwargs={'k': 1}) prompt_template = """ ### [INST] Instruction: You are a Q&A assistant. Your goal is to answer questions as accurately as possible based on the instructions and context provided without using prior knowledge. You answer in FRENCH. Analyse carefully the context and provide a direct answer based on the context. If the user says Bonjour or Hello, your only answer will be: Hi! comment puis-je vous aider? Answer in french only {context} Vous devez répondre aux questions en français. ### QUESTION: {question} [/INST] Answer in french only Vous devez répondre aux questions en français. """ repo_id = "mistralai/Mistral-7B-Instruct-v0.3" mistral_llm = HuggingFaceEndpoint( repo_id=repo_id, max_length=2048, temperature=0.05, huggingfacehub_api_token=st.secrets["HF_TOKEN"] ) # Créer le prompt à partir du modèle de prompt prompt = PromptTemplate( input_variables=["question"], template=prompt_template, ) # Créer la chaîne LLM llm_chain = LLMChain(llm=mistral_llm, prompt=prompt) # Créer la chaîne RetrievalQA qa = RetrievalQA.from_chain_type( llm=mistral_llm, chain_type="stuff", retriever=retriever, chain_type_kwargs={"prompt": prompt}, ) # Interface Streamlit avec une esthétique améliorée st.set_page_config(page_title="Alter-IA Chat", page_icon="🤖") # Définir la fonction pour gérer l'entrée utilisateur et afficher la réponse du chatbot def chatbot_response(user_input): response = qa.run(user_input) return response # Créer des colonnes pour les logos col1, col2, col3 = st.columns([2, 3, 2]) with col1: st.image("Design 3_22.png", width=150, use_column_width=True) # Ajustez le chemin et la taille de l'image selon vos besoins with col3: st.image("Altereo logo 2023 original - eau et territoires durables.png", width=150, use_column_width=True) # Ajustez le chemin et la taille de l'image selon vos besoins # Composants Streamlit st.markdown(""" """, unsafe_allow_html=True) # Utiliser les classes CSS pour styliser le texte st.markdown('
"Votre Réponse à Chaque Défi Méthodologique"
', unsafe_allow_html=True) # Interface utilisateur avec formulaire with st.form(key='feedback_form'): user_input = st.text_input("You:") submit_button = st.form_submit_button("Ask 📨") if submit_button: if user_input.strip() != "": bot_response = chatbot_response(user_input) st.markdown("### Bot:") st.text_area("", value=bot_response, height=600) # Formulaire de retour d'information st.markdown("### Rate the response:") rating = st.slider("Select a rating:", min_value=1, max_value=5, value=1) st.markdown("### Leave a comment:") comment = st.text_area("") # Soumettre les retours d'information if st.form_submit_button("Submit Feedback"): if comment.strip() and rating: save_feedback(user_input, bot_response, rating, comment) st.success("Thank you for your feedback!") else: st.warning("⚠️ Please provide a comment and a rating.") # Citation motivante en bas de page st.markdown("---") st.markdown("La collaboration est la clé du succès. Chaque question trouve sa réponse, chaque défi devient une opportunité.")