pcschreiber1 commited on
Commit
0368783
·
1 Parent(s): 56706a3

Create simple chatbot.

Browse files
Files changed (2) hide show
  1. app.py +161 -0
  2. requirements.txt +4 -0
app.py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ import gradio as gr
4
+
5
+ from dotenv import load_dotenv
6
+
7
+ from qdrant_client import models, QdrantClient
8
+ from sentence_transformers import SentenceTransformer
9
+ from openai import OpenAI
10
+
11
+
12
+ ################## Set-up ##################
13
+
14
+ load_dotenv() # load environment variables
15
+
16
+ embedding_model = SentenceTransformer("antoinelouis/french-multilingual-e5-small")
17
+
18
+ db_client = QdrantClient(":memory:")
19
+
20
+ db_client.create_collection(
21
+ collection_name="IncubAI",
22
+ vectors_config=models.VectorParams(
23
+ size=embedding_model.get_sentence_embedding_dimension(), # Vector size is defined by used model
24
+ distance=models.Distance.COSINE,
25
+ ),
26
+ )
27
+
28
+
29
+ ################# Filling the DB ################
30
+
31
+ documents = [
32
+ {
33
+ "page_content": "La Tour Eiffel a été construite en 1889 comme pièce maîtresse de l'Exposition universelle à Paris.",
34
+ "source": "encyclopedia"
35
+ },
36
+ {
37
+ "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.",
38
+ "source": "blog"
39
+ },
40
+ {
41
+ "page_content": "Les bienfaits de la méditation incluent la réduction du stress, l'amélioration de la concentration et un meilleur sommeil.",
42
+ "source": "health_guide"
43
+ },
44
+ {
45
+ "page_content": "Le framework LangChain permet d’intégrer facilement la recherche documentaire dans les applications alimentées par des modèles de langage.",
46
+ "source": "developer_docs"
47
+ },
48
+ {
49
+ "page_content": "Selon une étude de 2023, les énergies renouvelables ont représenté 30 % de la production mondiale d'électricité.",
50
+ "source": "news"
51
+ },
52
+ {
53
+ "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.",
54
+ "source": "business_tips"
55
+ },
56
+ {
57
+ "page_content": "Le Louvre abrite des œuvres célèbres comme la Joconde, la Vénus de Milo et le Sacre de Napoléon.",
58
+ "source": "museum_guide"
59
+ },
60
+ {
61
+ "page_content": "Si vous voulez apprendre Python, commencez par comprendre les variables, les boucles et les fonctions.",
62
+ "source": "tutorial"
63
+ },
64
+ {
65
+ "page_content": "Les voitures électriques produisent moins d’émissions locales, mais leur impact écologique dépend de la production des batteries.",
66
+ "source": "science_article"
67
+ },
68
+ {
69
+ "page_content": "« Interstellar » explore les thèmes de la relativité temporelle, de l’amour et de la survie humaine à travers une aventure spatiale.",
70
+ "source": "movie_review"
71
+ }
72
+ ]
73
+
74
+
75
+ # Upload to DB
76
+ for id, doc in enumerate(documents):
77
+
78
+ # 1. embed the content
79
+ doc_embedding = embedding_model.encode(doc["page_content"]).tolist()
80
+
81
+ # 2. upload the document
82
+ db_client.upload_points(
83
+ collection_name="IncubAI",
84
+ points=[
85
+ models.PointStruct(
86
+ id=id, vector=doc_embedding, payload=doc
87
+ )
88
+ ],
89
+ )
90
+
91
+
92
+ ################# Preparing Generation ################
93
+
94
+ template = """Répondez à la question en vous basant uniquement sur le contexte suivant:
95
+ {context}
96
+
97
+ Question : {question}
98
+ """
99
+
100
+ llm_client = OpenAI(
101
+ # This is the default and can be omitted
102
+ api_key=os.environ.get("OPENAI_API_KEY"),
103
+ )
104
+
105
+
106
+ ################# Combining Retrieval and Generation for RAG ################
107
+
108
+ def execute_RAG(user_query):
109
+ query_embedding = embedding_model.encode(user_query).tolist()
110
+
111
+ results = db_client.query_points(
112
+ collection_name="IncubAI",
113
+ query = query_embedding,
114
+ limit=2
115
+ )
116
+
117
+ context = "\n\n".join(result.payload["page_content"] for result in results.points)
118
+ prompt = template.format(context=context, question=user_query)
119
+ response = llm_client.chat.completions.create(
120
+ model="gpt-4o",
121
+ messages=[{"role": "user", "content": prompt}],
122
+ temperature=0.3
123
+ )
124
+
125
+ return response.choices[0].message.content
126
+
127
+
128
+
129
+ ################# Prepare Interface ################
130
+
131
+ def respond(message, chat_history):
132
+
133
+ bot_response = execute_RAG(message)
134
+
135
+ chat_history.append({"role": "user", "content": message})
136
+ chat_history.append({"role": "assistant", "content": bot_response})
137
+ return "", chat_history
138
+
139
+
140
+ examples = [
141
+ "Quand la Tour Eiffel a-t-elle été construite ?",
142
+ "Quels sont les effets de la méditation ?",
143
+ "Comment fonctionne LangChain ?",
144
+ "Quel est l’impact écologique des voitures électriques ?",
145
+ ]
146
+
147
+ msg = gr.Textbox() # define outside to define location
148
+
149
+
150
+ with gr.Blocks() as demo:
151
+ gr.HTML("<h1 style='text-align:center'>Example de un Chatbot minimal 🤖</h1>")
152
+ chatbot = gr.Chatbot(type="messages")
153
+ gr.Examples(examples, msg)
154
+ msg.render()
155
+ clear = gr.ClearButton([msg, chatbot])
156
+
157
+ msg.submit(respond, [msg, chatbot], [msg, chatbot])
158
+
159
+
160
+ if __name__ == "__main__":
161
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio
2
+ sentence_transformers
3
+ qdrant_client
4
+ python-dotenv