etienneombrea commited on
Commit
f3eae2b
·
1 Parent(s): eb93dbb

decoupage prompt etienne

Browse files
Files changed (4) hide show
  1. app.py +12 -1
  2. data/rendement.py +49 -0
  3. rag/prompt_processing.py +54 -3
  4. rag/query_engines.py +15 -26
app.py CHANGED
@@ -78,6 +78,17 @@ with gr.Blocks() as demo:
78
  scale=7,
79
  )
80
 
 
 
 
 
 
 
 
 
 
 
 
81
  with gr.Row():
82
  process_data_btn = gr.Button(value="Process data ✅", interactive=True)
83
 
@@ -93,7 +104,7 @@ with gr.Blocks() as demo:
93
 
94
  process_data_btn.click(
95
  fn=OmbreaQueryEngine.setup_data,
96
- inputs=[latitude, longitude, previous_crop, issues, area],
97
  outputs=prompt,
98
  )
99
  prompt.submit(respond, [prompt, chatbot], [chatbot])
 
78
  scale=7,
79
  )
80
 
81
+ gr.Markdown("""Quel est l'objectif principal de la prochaine rotation""")
82
+ with gr.Row():
83
+ objective = gr.CheckboxGroup( label='Objectif',
84
+ choices=["Maximiser mes revenus.", "Réduire mes intrants.", "Stocker plus de carbone dans le sol."]
85
+ )
86
+
87
+ gr.Markdown("""Avez-vous la possibilité d'irriguer votre culture ?""")
88
+ with gr.Row():
89
+ irrigation = gr.Checkbox(label = 'Irrigation possible'
90
+ )
91
+
92
  with gr.Row():
93
  process_data_btn = gr.Button(value="Process data ✅", interactive=True)
94
 
 
104
 
105
  process_data_btn.click(
106
  fn=OmbreaQueryEngine.setup_data,
107
+ inputs=[latitude, longitude, previous_crop, issues, objective, irrigation, area],
108
  outputs=prompt,
109
  )
110
  prompt.submit(respond, [prompt, chatbot], [chatbot])
data/rendement.py CHANGED
@@ -24,6 +24,8 @@ def get_rendement(lat, lon):
24
  "year": "annee",
25
  }
26
  )
 
 
27
  df = df.dropna(axis=0)
28
  df["surface (hectare)"] = (
29
  df["surface (hectare)"].apply(lambda x: x.replace(" ", "")).astype("int")
@@ -38,3 +40,50 @@ def get_rendement(lat, lon):
38
 
39
  df = df.loc[df.dep.str.contains(str(dep)), :]
40
  return df[["espece", "annee", "rendement (quintaux par hectare)"]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  "year": "annee",
25
  }
26
  )
27
+ df['espece'] = df['espece'].apply(lambda x:x.split('-')[1])
28
+ df = df.loc[~df.espece.str.contains("Autre"), :]
29
  df = df.dropna(axis=0)
30
  df["surface (hectare)"] = (
31
  df["surface (hectare)"].apply(lambda x: x.replace(" ", "")).astype("int")
 
40
 
41
  df = df.loc[df.dep.str.contains(str(dep)), :]
42
  return df[["espece", "annee", "rendement (quintaux par hectare)"]]
43
+
44
+ def get_species_surf_min(lat, lon):
45
+
46
+ df = pd.read_csv(
47
+ "./data/SAA_2010-2022_définitives_donnees_departementales.csv", skiprows=5
48
+ )
49
+ df = df.loc[~df.LIB_CODE.str.contains("Total"), :]
50
+ df = df.drop(["LIB_REG2"], axis=1)
51
+
52
+ df = pd.wide_to_long(
53
+ df, ["SURF_", "PROD_", "REND_"], i=["LIB_DEP", "LIB_CODE"], j="year"
54
+ ).reset_index()
55
+ df = df.rename(
56
+ columns={
57
+ "LIB_DEP": "dep",
58
+ "LIB_CODE": "espece",
59
+ "SURF_": "surface (hectare)",
60
+ "REND_": "rendement (quintaux par hectare)",
61
+ "PROD_": "production (quintaux)",
62
+ "year": "annee",
63
+ }
64
+ )
65
+ df['espece'] = df['espece'].apply(lambda x:x.split('-')[1])
66
+ df = df.loc[~df.espece.str.contains("Autre"), :]
67
+ df = df.dropna(axis=0)
68
+ df["surface (hectare)"] = (
69
+ df["surface (hectare)"].apply(lambda x: x.replace(" ", "")).astype("int")
70
+ )
71
+ df = df.loc[df["surface (hectare)"] > 0, :]
72
+ df["production (quintaux)"] = (
73
+ df["production (quintaux)"].apply(lambda x: x.replace(" ", "")).astype("int")
74
+ )
75
+
76
+ dep = gpd.read_file("./data/departement.geojson")
77
+ point = Point(lon, lat)
78
+ inclusion = dep.contains(point)
79
+
80
+ dep = int(dep[inclusion].code.values[0])
81
+
82
+ df = df.loc[df.dep.str.contains(str(dep)), :]
83
+
84
+ df = df.groupby('espece').agg({'production (quintaux)':'mean', 'surface (hectare)':'mean'}).reset_index()
85
+
86
+ df = df.loc[df['surface (hectare)']>1000,'espece']
87
+
88
+ return df
89
+
rag/prompt_processing.py CHANGED
@@ -2,7 +2,7 @@ import geopandas as gpd
2
  from shapely.geometry import Point
3
 
4
  from data.climatic_data import get_tmy, get_open_meteo, climatic_indicators
5
- from data.rendement import get_rendement
6
  from data.sol_data import get_soil_types
7
  import pandas as pd
8
 
@@ -20,7 +20,7 @@ def process_localisation(latitude, longitude):
20
  def process_meteo_tmy(latitude, longitude):
21
  tmy = get_tmy(latitude, longitude)
22
  meteo = (
23
- tmy.resample("M")
24
  .agg({"temp_min": "mean", "temp_max": "mean", "rain": "sum", 'irradiance':'sum'})
25
  .rename(
26
  columns={
@@ -63,4 +63,55 @@ def process_rendement(latitude, longitude):
63
 
64
  def process_area(area):
65
  prompt_area = "La Superficie de ma parcelle est: " + str(area) + ' ha \n'
66
- return prompt_area
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  from shapely.geometry import Point
3
 
4
  from data.climatic_data import get_tmy, get_open_meteo, climatic_indicators
5
+ from data.rendement import get_rendement, get_species_surf_min
6
  from data.sol_data import get_soil_types
7
  import pandas as pd
8
 
 
20
  def process_meteo_tmy(latitude, longitude):
21
  tmy = get_tmy(latitude, longitude)
22
  meteo = (
23
+ tmy.resample("ME")
24
  .agg({"temp_min": "mean", "temp_max": "mean", "rain": "sum", 'irradiance':'sum'})
25
  .rename(
26
  columns={
 
63
 
64
  def process_area(area):
65
  prompt_area = "La Superficie de ma parcelle est: " + str(area) + ' ha \n'
66
+ return prompt_area
67
+
68
+ def process_species_with_surf_min(latitude, longitude):
69
+ rendement = get_species_surf_min(latitude, longitude)
70
+ str_rendement = f"Les espèces cultivables dans mon département sont les suivantes : \n {rendement}\n"
71
+ return str_rendement
72
+
73
+
74
+ def call_list_of_species(latitude, longitude):
75
+ from rag.query_engines import OmbreaQueryEngine
76
+
77
+ # department_prompt = process_localisation(latitude, longitude)
78
+ meteo_prompt = process_meteo_indic(latitude, longitude)
79
+ prompt_species_with_surf_min = process_species_with_surf_min(latitude, longitude)
80
+
81
+ prompt = f"Je suis agriculteur français et je m'interroge sur quelle culture semer pour ma prochaine rotation de culture. \
82
+ En utilisant les informations que tu as, les données d'espèces cultivées dans mon département que je vais te renseigner et la météo typique que je vais te renseigner, peux-tu me sortir la liste des espèces que je peux cultiver sur ma parcelle. \
83
+ Donne moi la liste, sans explication, avec les espèces séparées par des virgules : \
84
+ {prompt_species_with_surf_min} \
85
+ {meteo_prompt} \
86
+ "
87
+
88
+ response = OmbreaQueryEngine.run_mistral(prompt, model='mistral-small')
89
+
90
+ return response
91
+
92
+ def call_list_of_rotations(prompt_list_species, irrigation, previous_crop):
93
+ from rag.query_engines import OmbreaQueryEngine
94
+
95
+ prompt_irrigation = "Concernant l'irrigation des cultures, je peux irriguer mes cultures" if irrigation else "Concernant l'irrigation des cultures, je ne peux pas irriguer mes cultures"
96
+ prompt_previous = f"Voici les espèces qui étaient dans ma dernière rotation : {previous_crop}"
97
+
98
+ context = f"Je suis un agriculteur français qui fait de la rotation de culture céréalière sur sa parcelle. \
99
+ Base toi sur tes connaissances, ne propose que des cultures qui sont dans cette liste : {prompt_list_species} \
100
+ Et en te basant sur les informations de contexte que je vais te donner, je voudrais un ensemble de propositions de cultures avec les avantages et inconvénients de chacune d'entre elles. \
101
+ Voici quelques éléments de contexte : \n"
102
+ prompt = (
103
+ context
104
+ # + department_prompt
105
+ # + meteo_prompt
106
+ # + soil_prompt
107
+ + '\n'
108
+ + prompt_previous
109
+ + "\n"
110
+ + prompt_irrigation
111
+ # + rendmt_prompt
112
+ + "\n Réponds en français s'il te plait."
113
+ )
114
+
115
+ response = OmbreaQueryEngine.run_mistral(prompt, model='mistral-small')
116
+
117
+ return response
rag/query_engines.py CHANGED
@@ -14,6 +14,9 @@ from rag.prompt_processing import (
14
  process_meteo_indic,
15
  process_rendement,
16
  process_soil,
 
 
 
17
  process_area
18
  )
19
 
@@ -44,34 +47,20 @@ class OmbreaQueryEngine(CustomQueryEngine):
44
  nodes = self.retriever.retrieve(query_str)
45
  response_obj = self.response_synthesizer.synthesize(query_str, nodes)
46
  return response_obj
47
-
48
  @staticmethod
49
- def setup_data(latitude: float, longitude: float, previous_crop: str, issues: str, area: int):
50
- # process meteo
51
- context = "Je suis un agriculteur français qui fait de la rotation de culture céréalière sur sa parcelle. \
52
- Je souhaite trouver la prochaine itération de ma rotation de culture afin de maximiser mon rendement. \
53
- Je voudrais un ensemble de propositions avec les avantages et inconvénients de chacune d'entre elles. \
54
- Voici quelques éléments de contexte : \n"
55
-
56
- department_prompt = process_localisation(latitude, longitude)
57
- meteo_prompt = process_meteo_indic(latitude, longitude)
58
  area_prompt = process_area(area)
59
- #soil_prompt = process_soil(latitude, longitude)
60
- rendmt_prompt = process_rendement(latitude, longitude)
61
-
62
- prompt = (
63
- context
64
- + department_prompt
65
- + area_prompt
66
- + meteo_prompt
67
- #+ soil_prompt
68
- + previous_crop
69
- + "\n"
70
- + issues
71
- + "\n"
72
- + rendmt_prompt
73
- + "\n Réponds en français s'il te plait."
74
- )
75
 
76
  return prompt
77
 
 
14
  process_meteo_indic,
15
  process_rendement,
16
  process_soil,
17
+ process_species_with_surf_min,
18
+ call_list_of_species,
19
+ call_list_of_rotations,
20
  process_area
21
  )
22
 
 
47
  nodes = self.retriever.retrieve(query_str)
48
  response_obj = self.response_synthesizer.synthesize(query_str, nodes)
49
  return response_obj
50
+
51
  @staticmethod
52
+ def setup_data(latitude: float, longitude: float, previous_crop: str, issues: str, objective: str, irrigation: bool, area: int, soil_type: str):
53
+
 
 
 
 
 
 
 
54
  area_prompt = process_area(area)
55
+
56
+ response_list_species = call_list_of_species(latitude, longitude)
57
+
58
+ response_list_rotations = call_list_of_rotations(response_list_species, irrigation, previous_crop)
59
+
60
+ prompt = f" Je suis agriculteur français, et je me demande quelle culture planter pour poursuivre ma rotation de culture. \
61
+ Je t'ai demandé précédemment de me recommander des cultures à planter pour poursuivre ma rotation. \
62
+ Je vais te fournir la liste des cultures que tu m'as conseillées avec les avantages et inconvénients associés, et tu vas m'adapter cette recommandation en prenant en compte les objectifs de ma prochaine rotation qui sont les suivants : {objective}. \
63
+ Voici la liste des rotations que tu m'as conseillé : {response_list_rotations}"
 
 
 
 
 
 
 
64
 
65
  return prompt
66