Alass-ADS commited on
Commit
39a6a95
·
1 Parent(s): 5232b49

added requirements, rag setup and prebaked prompts

Browse files
Files changed (2) hide show
  1. app.py +207 -0
  2. requirements.txt +6 -1
app.py CHANGED
@@ -2,6 +2,23 @@ import os
2
  import gradio as gr
3
  from llama_index.llms.mistralai import MistralAI
4
  from llama_index.core.llms import ChatMessage
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  title = "Gaia Mistral Chat RAG PDF Demo"
7
  description = "Example of an assistant with Gradio, RAG from PDF documents and Mistral AI via its API"
@@ -31,3 +48,193 @@ def predict(message, history):
31
  yield chunk.delta
32
 
33
  chat = gr.ChatInterface(predict).launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  import gradio as gr
3
  from llama_index.llms.mistralai import MistralAI
4
  from llama_index.core.llms import ChatMessage
5
+ from mistralai.client import MistralClient, ChatMessage
6
+ import requests
7
+ import numpy as np
8
+ import faiss
9
+ import os
10
+ from haystack import Pipeline
11
+ from haystack.document_stores.in_memory import InMemoryDocumentStore
12
+ from haystack.dataclasses import ChatMessage
13
+ from haystack.utils.auth import Secret
14
+ from haystack.components.builders import DynamicChatPromptBuilder
15
+ from haystack.components.converters import TextFileToDocument
16
+ from haystack.components.preprocessors import DocumentSplitter
17
+ from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
18
+ from haystack.components.writers import DocumentWriter
19
+ from haystack_integrations.components.embedders.mistral import MistralDocumentEmbedder, MistralTextEmbedder
20
+ from haystack_integrations.components.generators.mistral import MistralChatGenerator
21
+ import pandas as pd
22
 
23
  title = "Gaia Mistral Chat RAG PDF Demo"
24
  description = "Example of an assistant with Gradio, RAG from PDF documents and Mistral AI via its API"
 
48
  yield chunk.delta
49
 
50
  chat = gr.ChatInterface(predict).launch()
51
+
52
+ prompts = [
53
+ """
54
+ #Facts :
55
+
56
+ reseau: Charentes
57
+
58
+ culture: Vigne
59
+
60
+ date: 26/02/2024
61
+ Partie 1 : Phénologie :
62
+ Rédige un analyse détaillée de la phénologie décrivant les différentes situations observées pour la culture sur le réseau.""",
63
+ """#Facts :
64
+
65
+ reseau: Charents
66
+
67
+ culture: Vigne
68
+
69
+ date: 26/02/2024
70
+ Partie 2 : Climatologie :
71
+ - Rédige une courte analyse de la climatologie sur les 7 jours précédant la date de rédaction du BSV, en la comparant à la semaine précédente. Cette analyse devra être divisée en 2 parties : Températures et Pluies.
72
+ - Rédige une courte synthèse sur la prévision météorologique, la plus probable et la plus optimiste, dans les 7 prochains jours suivant la date de rédaction du BSV. Cette analyse devra inclure, entre autres, les cumuls de précipitations ainsi que les températures minimales et maximales attendus."""
73
+ ,
74
+ """#Facts :
75
+ reseau: Charentes
76
+ culture: Vigne
77
+ date: 26/02/2024
78
+ Partie 3 : Maladies
79
+ - Lister toutes les méthodes alternatives aux produits phytosanitaires existantes et opérationnelles qui permettent de lutter contre le mildiou et qui sont applicables à cette période de l’année.
80
+ - Lister toutes les fiches d’identification existantes sur les tordeuses de la grappe avec leur lien url.
81
+ Propose une synthèse de la situation épidémiologique du "Black rot" sur le territoire et des risques associés pour la vigne. Cette synthèse commencera par un rapide rappel des éléments de biologie du pathogène et des facteurs climatiques favorisants et défavorables à la dissémination et la contamination du pathogène en du stade phénologique de la vigne.
82
+ Cette synthèse doit ensuite inclure un résumé des observations réalisées sur le territoire durant les 7 derniers jours, et proposer une analyse quantitative et qualitative sur. Pour finir la synthèse devra évaluer, sur une échelle de 0 à 10, le risque de pression épidémiologique attendu pour les 7 prochains jours en fonction des conditions météorologiques à venir et du stade phénologique théorique de la vigne sur cette période
83
+ - Lister toutes les méthodes alternatives aux produits phytosanitaires existantes et opérationnelles qui permettent de lutter contre le mildiou et qui sont applicables à cette période de l’année.
84
+ - Lister toutes les fiches d’identification existantes sur les tordeuses de la grappe avec leur lien url.
85
+ - Propose une synthèse de la situation épidémiologique du "Black rot" sur le territoire et des risques associés pour la vigne. Cette synthèse commencera par un rapide rappel des éléments de biologie du pathogène et des facteurs climatiques favorisants et défavorables à la dissémination et la contamination du pathogène en du stade phénologique de la vigne.
86
+ Cette synthèse doit ensuite inclure un résumé des observations réalisées sur le territoire durant les 7 derniers jours, et proposer une analyse quantitative et qualitative sur. Pour finir la synthèse devra évaluer, sur une échelle de 0 à 10, le risque de pression épidémiologique attendu pour les 7 prochains jours en fonction des conditions météorologiques à venir et du stade phénologique théorique de la vigne sur cette période.
87
+ """,
88
+ """#Facts :
89
+ reseau: Charentes
90
+ culture: Vigne
91
+ date: 26/02/2024
92
+ Partie 4 : Ravageurs
93
+
94
+ - Rédige un encart biodiversité sur les auxiliaires de culture de la vigne présent sur la période en cours (bénéfices, ravageurs ciblés et conseils pratiques).
95
+ à partir de ce que tu sais sur les bulletins de santé du végétal liste les auxiliaires de culture de la vigne présent sur la période de avril à juin (bénéfices, ravageurs ciblés, conseils pratiques et liens de redirection vers des ressources utiles trouvées sur le site ecophytopic.fr)
96
+ """,
97
+ """#Facts :
98
+ reseau: Charentes
99
+ culture: Vigne
100
+ date: 26/02/2024
101
+ 5. Partie 5 : Mémo de l’observateur
102
+ Rédige un encart “mémo de l’Observateur” qui liste les bonnes pratiques, suggère la recherche de premiers symptômes de bioagresseurs à forte pression épidémiologique spécifique à la culture sur la période de un mois avant et un moins après la date
103
+ """,
104
+ """Partie 6 : Ce qu’il faut retenir
105
+ A partir du bulletin de santé végétal proposé, rédige une rubrique de synthèse intitulé “Ce qu’il faut retenir”. Cette rubrique sera divisée en sous sections correspondant à chacun des encarts qui compose le BSV, hormis celle de la météorologie, et proposera un récapitulatif de deux lignes maximum sur les éléments essentiels à retenir. Par exemple :
106
+ sur les informations sur la situation épidémiologique et les risques associés pour la semaine passée, afin que le lecteur du BSV puisse facilement les retenir, en les classant par bioagresseur et en les mettant sous forme de bullet point."""
107
+ ]
108
+
109
+
110
+ def embed_model():
111
+
112
+ llm = MistralChatGenerator(api_key=Secret.from_token(env_api_key),
113
+ model='mistral-large-latest')
114
+
115
+ prompt_maladies = """
116
+ Je vais te donner une extraction d\'un fichier CSV, la première ligne est composée des entêtes :\
117
+ NOM_PARCELLE;TYPE_SUIVI;COMMUNE_PARCELLE;CEPAGE;DATE_OBSERVATION;STADE_PHENOLOGIQUE;COMMENTAIRE;MCF;MFF;MFI;MGF;MGI;OCF;OFF;OFI;OGF;OGI;BCF;BFF;BFI;BGF;BGI;PCF;PFF;PFI;PGF;PGI\
118
+ Toutes les colonnes en 3 lettres ont une signification :\
119
+ M pour le mildiou\
120
+ O pour l\'oidium\
121
+ F pour la feuille si en deuxième position\
122
+ F frequence si en 3ème position\
123
+ G pour la grappe\
124
+ C pour le cep\
125
+ P pour pourriture grise\
126
+ Par Exemple MCF veux dire Mildiou sur Cep Frequence et MFF veut dire Mildiou sur Feuille Fréquence.\
127
+ # Facts\
128
+ MCI < 30 : Début d\'invasion\
129
+ 30 < MCI < 50 : Invasion moyenne\
130
+ 50 < MCI <= 100 : Invasion généralisée
131
+ et pareil pour les autres triplets.
132
+ Les valeurs sont des pourcentages.
133
+ # fichier CSV"""
134
+
135
+ df = pd.read_csv('maladies.csv', delimiter=';')
136
+ #keep the 50 lines where DATE_OBSERVATION is the most recent. date format is %d/%m/%Y
137
+ df['DATE_OBSERVATION'] = pd.to_datetime(df['DATE_OBSERVATION'], format='%d/%m/%Y')
138
+ df = df.sort_values(by='DATE_OBSERVATION', ascending=False).head(200)
139
+ csv_text = df.to_csv(index=False, sep=';')
140
+
141
+ prompt_maladies = prompt_maladies + csv_text
142
+
143
+ prompt_maladies = prompt_maladies + "```# Steps\
144
+ step 1 : dans cette étape, écris un rapport permettant d\'évaluer la progression de l\'invasion pour chaque triplet en fonction de la date\
145
+ step 2 : liste les triplets pour lesquels l\'invasion est la plus avancée\
146
+ step 3 : écrit un résumé de la situation pour le black rot, l\'oidium et le mildiou sur la période.\
147
+ step 4 : indique les actions à mettre en place pour lutter contre les maladies.\
148
+ applique les étapes\
149
+ ```"
150
+
151
+ message = ChatMessage.from_user(prompt_maladies)
152
+ print("asking for maladies")
153
+ response = llm.run(messages=[message])
154
+ maladies = (response["replies"][0].content)
155
+ print(maladies)
156
+
157
+ #turn the string maladies into a document for haystack
158
+ f = open('maladies.txt', 'w')
159
+ f.write(maladies)
160
+ f.close()
161
+
162
+ print("asking for stades")
163
+ prompt_stades = """je vais te donner une extraction d\'un fichier CSV, avec des dates d'observation et des stades phénologiques.
164
+ DATE_OBSERVATION;STADE_PHENOLOGIQUE;
165
+ évaluer la progression de la vigne sur les derniers jours. Citer le stade phénologique le plus commun et le stade phénologique le plus avancé.
166
+ # fichier CSV"""
167
+ df = pd.read_csv('maladies.csv', delimiter=';')
168
+ df = df[ ['DATE_OBSERVATION', 'STADE_PHENOLOGIQUE'] ]
169
+ #convert date to dmy
170
+ df['DATE_OBSERVATION'] = pd.to_datetime(df['DATE_OBSERVATION'], format='%d/%m/%Y')
171
+ df = df.sort_values(by='DATE_OBSERVATION', ascending=False)
172
+ #get the observations for the 10 days before the most recent observation
173
+ most_recent_date = df['DATE_OBSERVATION'].iloc[0]
174
+ df = df[df['DATE_OBSERVATION'] > most_recent_date - pd.Timedelta(days=10)]
175
+ df = df.head(200)
176
+ csv_text = df.to_csv(index=False, sep=';')
177
+ prompt_stades = prompt_stades + csv_text
178
+
179
+ message = ChatMessage.from_user(prompt_stades)
180
+ response = llm.run(messages=[message])
181
+ stades = (response["replies"][0].content)
182
+ print(stades)
183
+
184
+ #turn the string stades into a document for haystack
185
+ f = open('stades.txt', 'w')
186
+ f.write(stades)
187
+ f.close()
188
+
189
+
190
+
191
+ print("embedding documents")
192
+ document_store = InMemoryDocumentStore()
193
+
194
+ docs_maladies = TextFileToDocument().run(sources=["maladies.txt"])
195
+ docs_stades = TextFileToDocument().run(sources=["stades.txt"])
196
+ docs = {"documents": docs_maladies["documents"] + docs_stades["documents"]}
197
+ split_docs = DocumentSplitter(split_by="passage", split_length=2).run(documents=docs["documents"])
198
+ embeddings = MistralDocumentEmbedder(api_key=Secret.from_token(env_api_key)).run(documents=split_docs["documents"])
199
+ DocumentWriter(document_store=document_store).run(documents=embeddings["documents"])
200
+
201
+
202
+ text_embedder = MistralTextEmbedder(api_key=Secret.from_token(env_api_key))
203
+ retriever = InMemoryEmbeddingRetriever(document_store=document_store)
204
+ prompt_builder = DynamicChatPromptBuilder(runtime_variables=["documents"])
205
+
206
+
207
+ chat_template = """Vous êtes un rédacteur de l'institut techique de la vignerédigez un bulletin de santé du végétal pour la culture "vigne" dans la région "charente" pour la date du 29/09/2023 en utilisant le contenu des documents. Sois spécifique et concis.
208
+ # Facts Les 5 principales catégories sont "phrénologie", "météorologie", "maladies", et un récapitulatif.
209
+
210
+
211
+
212
+ {{query}}\n
213
+ Documents:
214
+ {% for document in documents %}
215
+ {{document.content}}
216
+ {% endfor%}
217
+ """
218
+
219
+ messages = [ChatMessage.from_user(chat_template)]
220
+
221
+ # print(messages)
222
+
223
+ rag_pipeline = Pipeline()
224
+ rag_pipeline.add_component("text_embedder", text_embedder)
225
+ rag_pipeline.add_component("retriever", retriever)
226
+ rag_pipeline.add_component("prompt_builder", prompt_builder)
227
+ llm = MistralChatGenerator(api_key=Secret.from_token(env_api_key), model="mistral-large-latest")
228
+ rag_pipeline.add_component("llm", llm)
229
+
230
+
231
+ rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
232
+ rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
233
+ rag_pipeline.connect("prompt_builder.prompt", "llm.messages")
234
+ # steps
235
+ # step 1 : dans "Phrénologie", rédigez un bref rapport sur le stade phénologique de la vigne. mentionnez le stade moyen et le stade le plus avancé avec les codes.
236
+ # step 2 : dans "Météorologie", rédigez un rapport sur la météo. mentionnez la température moyenne, les précipitations, et leur évolution par rapport à la semaine dernière, ainsi que l'impact sur la vigne.
237
+ # step 3 : dans "Maladies", rédigez un rapport exhaustif sur l'évolution des maladies. mentionnez les maladies les plus avancées et les actions à entreprendre.
238
+ # step 4 : dans "Récapitulatif", rédigez un résumé de la situation et des actions à entreprendre.
239
+
240
+ return rag_pipeline, messages
requirements.txt CHANGED
@@ -7,4 +7,9 @@ fastapi
7
  uvicorn
8
  gradio
9
  gradio_client
10
- starlette
 
 
 
 
 
 
7
  uvicorn
8
  gradio
9
  gradio_client
10
+ starlette
11
+ requests
12
+ numpy
13
+ faiss
14
+ haystack
15
+ pandas