File size: 4,425 Bytes
03df0fa 059d631 883455d 059d631 603824f c2d601e 883455d 059d631 883455d 059d631 883455d 059d631 883455d 9dbc337 059d631 5b58cbf 059d631 5b58cbf 059d631 03df0fa 2e88d65 03df0fa |
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 |
import pandas as pd
import folium
from folium import IFrame
import plotly.graph_objects as go
from APIs.geolocation import get_geolocation, get_risques
from APIs.meteo import get_info_meteo
import os
from dotenv import load_dotenv
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.mistralai import MistralAI
from llama_index.embeddings.mistralai import MistralAIEmbedding
from llama_index.core import Settings
from llama_index.core.query_engine import RetrieverQueryEngine
load_dotenv()
Settings.llm = MistralAI(
max_tokens=2048,
api_key=os.environ.get('MISTRAL_API_KEY')
)
Settings.embed_model = MistralAIEmbedding(
model_name="mistral-embed",
api_key=os.environ.get('MISTRAL_API_KEY')
)
documents = SimpleDirectoryReader("documents").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=15)
def on_init(lat, lon, address):
map_html, fig = show_map(lat, lon, address)
df = get_info_meteo(lat, lon)
avg_temp = df.loc[:, 'avg_hourly_soil_temperature_0cm_C'].mean()
avg_humidity = df.loc[:, 'avg_hourly_relative_humidity_2m_%'].mean()
# avg_snowfall = df.loc[:, 'daily_precipitation_sum_mm'].mean()
avg_cloud_cover = df.loc[:, 'med_cloud_cover_%'].mean()
avg_precipitations = df.loc[:, 'daily_rain_sum_mm'].mean()
return map_html, fig, avg_temp, avg_humidity, avg_cloud_cover, avg_precipitations
def print_conversation(chat_history):
for question, response in chat_history:
print('Question: ', end='\n')
print(question, end='\n')
print('Response: ', end='\n')
print(response, end='\n')
def respond(elevage, temperature, humidite, chutes_de_neige, couverture_nuageuse, precipitations, message, chat_history):
PROMPT = f"""
Tu es un chatbot qui répond en français, qui doit aider à déterminer les risques parasitaires d'élevage en fonction des conditions météorologiques.
Voici les conditions:
- élevage: {elevage}
- température moyenne : {temperature} °C
- humidité moyenne : {humidite} %
Fais moi un tableau avec chaque parasite et/ou tiques susceptible de toucher mon élevage dans ces conditions météo, avec les conditions de prolifération, la vitesse de propagation, les troubles causés par ces parasites
Essaie d'écrire des données numériques précises dans le tableau
Si un parasite et/ou tique ne rentre pas dans les conditions, ne le met pas dans le tableau.
Donne-moi ensuite les solutions de prévention et de traitement pour chacun d'eux indépendamment du tableau.
Réponds également au message suivant:
{message}
Tu dois impérativement répondre en français
"""
reponse = query_engine.query(PROMPT)
chat_history.append((message, str(reponse)))
print_conversation(chat_history)
return '', chat_history
def get_and_plot_meteo(lat, lon):
df = get_info_meteo(lat, lon)
fig = go.Figure()
fig.add_trace(go.Scatter(x=df['date'], y=df['avg_hourly_soil_temperature_0cm_C'],
name="Température °C", mode="lines+markers"))
fig.add_trace(go.Scatter(x=df['date'], y=df['avg_hourly_relative_humidity_2m_%'],
name="Humidité moyenne en %", mode="lines+markers", yaxis="y2"))
fig.update_layout(
title="Température maximale et humidité moyenne journalière",
xaxis_title="Date",
yaxis_title="Température (°C)",
yaxis2=dict(
title="Humidity (%)",
overlaying="y",
side="right"
)
)
return fig
def show_map(lat, lon, address):
if address:
lat_tmp, lon_tmp, code_insee = get_geolocation(address, None, None)
risques = get_risques(code_insee=code_insee)
if lat_tmp or lon_tmp:
lat, lon = lat_tmp, lon_tmp
else:
return "Adress not found. Please enter a valid address", ""
if lat and lon:
lat_tmp, lon_tmp, code_insee = get_geolocation(None, lat, lon)
risques = get_risques(code_insee=code_insee)
# Create a map centered at the input coordinates
location_map = folium.Map(location=[lat, lon], zoom_start=14)
folium.Marker([lat, lon], popup=risques).add_to(location_map)
map_html = location_map._repr_html_()
fig = get_and_plot_meteo(lat, lon)
return map_html, fig
|