import os import gradio as gr from dotenv import load_dotenv from qdrant_client import models, QdrantClient from sentence_transformers import SentenceTransformer from openai import OpenAI ################## Set-up ################## load_dotenv() # load environment variables embedding_model = SentenceTransformer("antoinelouis/french-multilingual-e5-small") db_client = QdrantClient(":memory:") db_client.create_collection( collection_name="IncubAI", vectors_config=models.VectorParams( size=embedding_model.get_sentence_embedding_dimension(), # Vector size is defined by used model distance=models.Distance.COSINE, ), ) ################# Filling the DB ################ documents = [ { "page_content": "La Tour Eiffel a été construite en 1889 comme pièce maîtresse de l'Exposition universelle à Paris.", "source": "encyclopedia" }, { "page_content": "Pour préparer un bon café filtre, il est crucial de choisir une mouture moyenne et d’utiliser de l’eau à 92–96°C.", "source": "blog" }, { "page_content": "Les bienfaits de la méditation incluent la réduction du stress, l'amélioration de la concentration et un meilleur sommeil.", "source": "health_guide" }, { "page_content": "Le framework LangChain permet d’intégrer facilement la recherche documentaire dans les applications alimentées par des modèles de langage.", "source": "developer_docs" }, { "page_content": "Selon une étude de 2023, les énergies renouvelables ont représenté 30 % de la production mondiale d'électricité.", "source": "news" }, { "page_content": "Un bon pitch d’ascenseur doit être clair, concis et présenter en moins de 30 secondes ce qui rend votre idée unique.", "source": "business_tips" }, { "page_content": "Le Louvre abrite des œuvres célèbres comme la Joconde, la Vénus de Milo et le Sacre de Napoléon.", "source": "museum_guide" }, { "page_content": "Si vous voulez apprendre Python, commencez par comprendre les variables, les boucles et les fonctions.", "source": "tutorial" }, { "page_content": "Les voitures électriques produisent moins d’émissions locales, mais leur impact écologique dépend de la production des batteries.", "source": "science_article" }, { "page_content": "« Interstellar » explore les thèmes de la relativité temporelle, de l’amour et de la survie humaine à travers une aventure spatiale.", "source": "movie_review" } ] # Upload to DB for id, doc in enumerate(documents): # 1. embed the content doc_embedding = embedding_model.encode(doc["page_content"]).tolist() # 2. upload the document db_client.upload_points( collection_name="IncubAI", points=[ models.PointStruct( id=id, vector=doc_embedding, payload=doc ) ], ) ################# Preparing Generation ################ template = """Répondez à la question en vous basant uniquement sur le contexte suivant: {context} Question : {question} """ llm_client = OpenAI( # This is the default and can be omitted api_key=os.environ.get("OPENAI_API_KEY"), ) ################# Combining Retrieval and Generation for RAG ################ def execute_RAG(user_query): query_embedding = embedding_model.encode(user_query).tolist() results = db_client.query_points( collection_name="IncubAI", query = query_embedding, limit=2 ) context = "\n\n".join(result.payload["page_content"] for result in results.points) prompt = template.format(context=context, question=user_query) response = llm_client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], temperature=0.3 ) return response.choices[0].message.content ################# Prepare Interface ################ def respond(message, chat_history): bot_response = execute_RAG(message) chat_history.append({"role": "user", "content": message}) chat_history.append({"role": "assistant", "content": bot_response}) return "", chat_history examples = [ "Quand la Tour Eiffel a-t-elle été construite ?", "Quels sont les effets de la méditation ?", "Comment fonctionne LangChain ?", "Quel est l’impact écologique des voitures électriques ?", ] msg = gr.Textbox() # define outside to define location with gr.Blocks() as demo: gr.HTML("

Example de un Chatbot minimal 🤖

") chatbot = gr.Chatbot(type="messages") gr.Examples(examples, msg) msg.render() clear = gr.ClearButton([msg, chatbot]) msg.submit(respond, [msg, chatbot], [msg, chatbot]) if __name__ == "__main__": demo.launch()