import pinecone import google.generativeai as genai from sklearn.metrics.pairwise import cosine_similarity from sentence_transformers import SentenceTransformer import numpy as np import gradio as gr from pinecone import Pinecone # Configurer l'API Google genai.configure(api_key="AIzaSyBLlaGtxtzHmVgMfOC02AfgvOoKTwXGGIc") pc = Pinecone(api_key="pcsk_2vJdv7_KGHuiapnC85fgFaUGdZKyqiHPBv4hPMSnDq7FnzLSvhs2Ur51C3Z6rmbyyYVLZ5", environment="us-west1-gcp") # 2. Initialisation index_name = "index-embeddings" embedding_model = SentenceTransformer("all-MiniLM-L6-v2") model_gene = genai.GenerativeModel("gemini-2.0-flash") # Connecter à l'index Pinecone index = pc.Index(index_name) # Fonction pour récupérer les 3 résultats les plus similaires de Pinecone def get_most_similar_chunk(query): # Utiliser le modèle SentenceTransformer pour générer l'embedding de la requête model = SentenceTransformer("all-MiniLM-L6-v2") query_embedding = model.encode(query) # Effectuer une recherche dans Pinecone result = index.query( vector=query_embedding.tolist(), # Convertir en liste pour Pinecone top_k=5, # Nombre de résultats à retourner include_metadata=True # Inclure les métadonnées ) # Vérifier si des matches sont trouvés if 'matches' not in result: return [] # Récupérer les chunks et leurs scores de similarité similar_chunks = [] for match in result['matches']: if 'metadata' in match: # Vérifier que la clé 'text' existe dans les métadonnées text = match['metadata'].get('text', 'Texte non disponible') similar_chunks.append((text, match['score'])) # Utiliser 'text' ici, pas 'chunk' return similar_chunks # Initialisation du modèle de génération model_gene = genai.GenerativeModel("gemini-2.0-flash") def chatbot(user_prompt): if not user_prompt: return "❗ Veuillez entrer une question." similar_chunks = get_most_similar_chunk(user_prompt) context = "\n".join( [f"Contexte {i+1}: {chunk} (score: {score:.2f})" for i, (chunk, score) in enumerate(similar_chunks)] ) prompt = f""" TTu es un assistant expert dans la politique interne de notre entreprise , et ta mission est d’apporter des réponses claires, concises et accessibles à toutes les questions liées à la politique interne, en te basant sur les informations disponibles dans le documents fournit et donne des exemples concrets pour illustrer la situation. Lorsque quelqu’un te pose une question, veille à ce que ta réponse soit facile à comprendre, sans jargon complexe. Si tu rencontres un manque d’informations pour répondre de manière précise, sois transparent à ce sujet. Chaque réponse doit commencer par une accroche sympathique pour engager l’utilisateur, puis expliquer de manière simple les concepts clés en lien avec la question posée. Enfin, offre une mini check-list ou résumé des points essentiels pour aider l’utilisateur à mieux comprendre. Question : {user_prompt}\n {context}\nRéponse : """ response = model_gene.generate_content(prompt) return response.text # 5. Interface Gradio demo = gr.Interface( fn=chatbot, inputs=gr.Textbox(label="💬 Entrez votre question ici :"), outputs=gr.Textbox(label="📢 Réponse du chatbot :"), title="🤖 Assistant Politique interne", description="Posez votre question, l’assistant vous répond avec des sources pertinentes." ) if __name__ == "__main__": demo.launch()