Spaces:
Sleeping
Sleeping
File size: 4,987 Bytes
0368783 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
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("<h1 style='text-align:center'>Example de un Chatbot minimal 🤖</h1>")
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() |