Ilyas KHIAT
commited on
Commit
·
e516684
1
Parent(s):
b8471e7
ecologits codecarbon
Browse files- app.py +27 -6
- chat_with_pps.py +62 -4
- emissions.csv +0 -0
- partie_prenante_carte.py +16 -1
app.py
CHANGED
|
@@ -40,6 +40,15 @@ def main():
|
|
| 40 |
tracker = EmissionsTracker()
|
| 41 |
tracker.start()
|
| 42 |
st.session_state["emission"] = tracker
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
st.sidebar.title("OPEN DATA & IA au service de la RSE")
|
| 45 |
section_principale = st.sidebar.radio(
|
|
@@ -137,17 +146,29 @@ def main():
|
|
| 137 |
""",
|
| 138 |
unsafe_allow_html=True
|
| 139 |
)
|
| 140 |
-
|
| 141 |
-
st.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 142 |
c1,c2,c3 = st.sidebar.columns([1,1,1])
|
| 143 |
|
| 144 |
c2.write("---")
|
| 145 |
|
| 146 |
-
st.sidebar.markdown("**Votre équivalence
|
| 147 |
col1,col2,col3 = st.sidebar.columns([1,1,1])
|
| 148 |
-
display_comparaison(col1,
|
| 149 |
-
display_comparaison(col2,
|
| 150 |
-
display_comparaison(col3,
|
| 151 |
st.sidebar.markdown("\n")
|
| 152 |
st.sidebar.markdown(
|
| 153 |
f"""
|
|
|
|
| 40 |
tracker = EmissionsTracker()
|
| 41 |
tracker.start()
|
| 42 |
st.session_state["emission"] = tracker
|
| 43 |
+
|
| 44 |
+
if "partial_emissions" not in st.session_state:
|
| 45 |
+
st.session_state["partial_emissions"] = {
|
| 46 |
+
"Scrapping": {"cc": 0, "el": 0}, #cc for codecarbon , el for ecologits
|
| 47 |
+
"extraction_pp": {"cc": 0, "el": 0},
|
| 48 |
+
"cartographie": {"cc": 0, "el": 0},
|
| 49 |
+
"chatbot": {"cc": 0, "el": 0},
|
| 50 |
+
"download_rapport": {"cc": 0, "el": 0},
|
| 51 |
+
}
|
| 52 |
|
| 53 |
st.sidebar.title("OPEN DATA & IA au service de la RSE")
|
| 54 |
section_principale = st.sidebar.radio(
|
|
|
|
| 146 |
""",
|
| 147 |
unsafe_allow_html=True
|
| 148 |
)
|
| 149 |
+
|
| 150 |
+
serveur_emission = st.session_state['emission'].stop()
|
| 151 |
+
emission_api = sum([value["el"] for value in st.session_state["partial_emissions"].values()])
|
| 152 |
+
|
| 153 |
+
total_emission = serveur_emission + emission_api
|
| 154 |
+
|
| 155 |
+
pourcentage_api = emission_api / total_emission
|
| 156 |
+
pourcentage_serveur = serveur_emission / total_emission
|
| 157 |
+
|
| 158 |
+
st.sidebar.markdown(f"<div style='text-align: center; margin-bottom: 10px;'><b>{total_emission*1000:.3f}</b> g eq. CO2</div>", unsafe_allow_html=True)
|
| 159 |
+
st.sidebar.markdown("Dont :")
|
| 160 |
+
st.sidebar.markdown(f"- Empreinte serveur (via CodeCarbon) : **{serveur_emission*1000:.3f}** g eq. CO2 ({pourcentage_serveur:.2%})")
|
| 161 |
+
st.sidebar.markdown(f"- Empreinte serveur (via EcoLogits) : **{emission_api*1000:.3f}** g eq. CO2 ({pourcentage_api:.2%})")
|
| 162 |
+
# st.sidebar.markdown("(avec l'outil CodeCarbon)")
|
| 163 |
c1,c2,c3 = st.sidebar.columns([1,1,1])
|
| 164 |
|
| 165 |
c2.write("---")
|
| 166 |
|
| 167 |
+
st.sidebar.markdown("**Votre équivalence**")
|
| 168 |
col1,col2,col3 = st.sidebar.columns([1,1,1])
|
| 169 |
+
display_comparaison(col1,total_emission,dict_comparaison_1kgCO2["eau en litre"][0]*1000,dict_comparaison_1kgCO2["eau en litre"][1],"ml")
|
| 170 |
+
display_comparaison(col2,total_emission,dict_comparaison_1kgCO2["tgv en km"][0],dict_comparaison_1kgCO2["tgv en km"][1],"km")
|
| 171 |
+
display_comparaison(col3,total_emission,dict_comparaison_1kgCO2["voiture en km"][0]*1000,dict_comparaison_1kgCO2["voiture en km"][1],"m")
|
| 172 |
st.sidebar.markdown("\n")
|
| 173 |
st.sidebar.markdown(
|
| 174 |
f"""
|
chat_with_pps.py
CHANGED
|
@@ -13,6 +13,9 @@ import random
|
|
| 13 |
import pandas as pd
|
| 14 |
from codecarbon import EmissionsTracker
|
| 15 |
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
|
| 18 |
|
|
@@ -105,6 +108,58 @@ def get_response(user_query, chat_history, context,llm=None,history_limit=5,stre
|
|
| 105 |
"user_question": user_query,
|
| 106 |
})
|
| 107 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
def display_chart():
|
| 109 |
if "pp_grouped" not in st.session_state or st.session_state['pp_grouped'] is None or len(st.session_state['pp_grouped']) == 0:
|
| 110 |
st.warning("Aucune partie prenante n'a été définie")
|
|
@@ -315,10 +370,10 @@ def display_chat():
|
|
| 315 |
st.markdown(f"**{st.session_state.model}**")
|
| 316 |
if st.session_state.model not in st.session_state.used_models:
|
| 317 |
st.session_state.used_models.append(st.session_state.model)
|
| 318 |
-
response =
|
| 319 |
st.session_state.chat_history.append(AIMessage(content=response))
|
| 320 |
with st.spinner("Proposition de prompts..."):
|
| 321 |
-
propositions_prompts =
|
| 322 |
extract_format_prompts_from_response(propositions_prompts)
|
| 323 |
|
| 324 |
|
|
@@ -343,10 +398,13 @@ def display_chat():
|
|
| 343 |
format_pp_add_viz(partie_prenante)
|
| 344 |
disp_carto_in_chat()
|
| 345 |
else:
|
| 346 |
-
response = st.write_stream(get_response(user_query, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model))
|
|
|
|
|
|
|
| 347 |
st.session_state.chat_history.append(AIMessage(content=response))
|
|
|
|
| 348 |
with st.spinner("Proposition de prompts..."):
|
| 349 |
-
propositions_prompts =
|
| 350 |
extract_format_prompts_from_response(propositions_prompts)
|
| 351 |
|
| 352 |
|
|
|
|
| 13 |
import pandas as pd
|
| 14 |
from codecarbon import EmissionsTracker
|
| 15 |
|
| 16 |
+
from ecologits.tracers.utils import compute_llm_impacts
|
| 17 |
+
import time
|
| 18 |
+
import itertools
|
| 19 |
|
| 20 |
|
| 21 |
|
|
|
|
| 108 |
"user_question": user_query,
|
| 109 |
})
|
| 110 |
|
| 111 |
+
def get_response_with_impact(user_query, chat_history, context,llm=None,history_limit=5,stream=True):
|
| 112 |
+
model_vs_provider = {
|
| 113 |
+
"Mistral (FR)": ["mistral-large-latest","mistralai"],
|
| 114 |
+
"GPT-4o": ["gpt-4o","openai"]
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
start = time.perf_counter()
|
| 118 |
+
response_generator = get_response(user_query, chat_history, context,llm,history_limit,stream)
|
| 119 |
+
request_latency_invoke = time.perf_counter() - start
|
| 120 |
+
wrapped_response_generator, token_count_generator = itertools.tee(response_generator)
|
| 121 |
+
|
| 122 |
+
token_count = 0
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
# Stream the response while counting tokens
|
| 126 |
+
if stream:
|
| 127 |
+
try:
|
| 128 |
+
final_response = st.write_stream(wrapped_response_generator)
|
| 129 |
+
|
| 130 |
+
finally:
|
| 131 |
+
token_count = len(list(token_count_generator))
|
| 132 |
+
else:
|
| 133 |
+
final_response = response_generator
|
| 134 |
+
token_count = len(list(token_count_generator))
|
| 135 |
+
|
| 136 |
+
request_latency_stream = time.perf_counter() - start
|
| 137 |
+
|
| 138 |
+
nbre_out_tokens = token_count
|
| 139 |
+
model_name = model_vs_provider[st.session_state.model][0]
|
| 140 |
+
model_provider = model_vs_provider[st.session_state.model][1]
|
| 141 |
+
|
| 142 |
+
if not stream:
|
| 143 |
+
request_latency = request_latency_invoke
|
| 144 |
+
else:
|
| 145 |
+
request_latency = request_latency_stream
|
| 146 |
+
|
| 147 |
+
impact = compute_llm_impacts(
|
| 148 |
+
provider=model_provider,
|
| 149 |
+
model_name=model_name,
|
| 150 |
+
output_token_count=nbre_out_tokens,
|
| 151 |
+
request_latency=request_latency,
|
| 152 |
+
)
|
| 153 |
+
|
| 154 |
+
print(f"Request latency: {request_latency:.3f} s")
|
| 155 |
+
print(f"Output token count: {nbre_out_tokens}")
|
| 156 |
+
print(f"Impact: {impact.gwp.value} {impact.gwp.unit}")
|
| 157 |
+
|
| 158 |
+
st.session_state["partial_emissions"]["chatbot"]["el"] += impact.gwp.value
|
| 159 |
+
|
| 160 |
+
return final_response
|
| 161 |
+
|
| 162 |
+
|
| 163 |
def display_chart():
|
| 164 |
if "pp_grouped" not in st.session_state or st.session_state['pp_grouped'] is None or len(st.session_state['pp_grouped']) == 0:
|
| 165 |
st.warning("Aucune partie prenante n'a été définie")
|
|
|
|
| 370 |
st.markdown(f"**{st.session_state.model}**")
|
| 371 |
if st.session_state.model not in st.session_state.used_models:
|
| 372 |
st.session_state.used_models.append(st.session_state.model)
|
| 373 |
+
response = get_response_with_impact(last_message.content, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model)
|
| 374 |
st.session_state.chat_history.append(AIMessage(content=response))
|
| 375 |
with st.spinner("Proposition de prompts..."):
|
| 376 |
+
propositions_prompts = get_response_with_impact(generated_prompt_question, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model,history_limit=1,stream=False)
|
| 377 |
extract_format_prompts_from_response(propositions_prompts)
|
| 378 |
|
| 379 |
|
|
|
|
| 398 |
format_pp_add_viz(partie_prenante)
|
| 399 |
disp_carto_in_chat()
|
| 400 |
else:
|
| 401 |
+
#response = st.write_stream(get_response(user_query, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model))
|
| 402 |
+
response = get_response_with_impact(user_query, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model)
|
| 403 |
+
|
| 404 |
st.session_state.chat_history.append(AIMessage(content=response))
|
| 405 |
+
|
| 406 |
with st.spinner("Proposition de prompts..."):
|
| 407 |
+
propositions_prompts = get_response_with_impact(generated_prompt_question, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model,history_limit=1,stream=False)
|
| 408 |
extract_format_prompts_from_response(propositions_prompts)
|
| 409 |
|
| 410 |
|
emissions.csv
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
partie_prenante_carte.py
CHANGED
|
@@ -3,6 +3,7 @@ import pandas as pd
|
|
| 3 |
import numpy as np
|
| 4 |
import re
|
| 5 |
import random
|
|
|
|
| 6 |
|
| 7 |
import streamlit as st
|
| 8 |
from dotenv import load_dotenv
|
|
@@ -17,7 +18,7 @@ from langchain_core.prompts.prompt import PromptTemplate
|
|
| 17 |
import os
|
| 18 |
from high_chart import test_chart
|
| 19 |
from chat_with_pps import get_response
|
| 20 |
-
|
| 21 |
from codecarbon import EmissionsTracker
|
| 22 |
|
| 23 |
load_dotenv()
|
|
@@ -184,14 +185,28 @@ def extract_pp(docs,input_variables):
|
|
| 184 |
|
| 185 |
question = fill_promptQ_template(input_variables, template_extraction_PP)
|
| 186 |
|
|
|
|
| 187 |
response = chain.invoke(question)
|
| 188 |
|
|
|
|
| 189 |
# version plus poussée a considérer
|
| 190 |
# each item in the list is a list with the name of the brand and the similarity percentage
|
| 191 |
# partie_prenante = text_to_list(response.content)
|
| 192 |
if "ne sais pas" in response.content:
|
| 193 |
return "444"
|
| 194 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 195 |
#version simple
|
| 196 |
partie_prenante = response.content.replace("- ","").split('\n')
|
| 197 |
partie_prenante = [item.strip() for item in partie_prenante]
|
|
|
|
| 3 |
import numpy as np
|
| 4 |
import re
|
| 5 |
import random
|
| 6 |
+
import time
|
| 7 |
|
| 8 |
import streamlit as st
|
| 9 |
from dotenv import load_dotenv
|
|
|
|
| 18 |
import os
|
| 19 |
from high_chart import test_chart
|
| 20 |
from chat_with_pps import get_response
|
| 21 |
+
from ecologits.tracers.utils import compute_llm_impacts
|
| 22 |
from codecarbon import EmissionsTracker
|
| 23 |
|
| 24 |
load_dotenv()
|
|
|
|
| 185 |
|
| 186 |
question = fill_promptQ_template(input_variables, template_extraction_PP)
|
| 187 |
|
| 188 |
+
start = time.perf_counter()
|
| 189 |
response = chain.invoke(question)
|
| 190 |
|
| 191 |
+
response_latency = time.perf_counter() - start
|
| 192 |
# version plus poussée a considérer
|
| 193 |
# each item in the list is a list with the name of the brand and the similarity percentage
|
| 194 |
# partie_prenante = text_to_list(response.content)
|
| 195 |
if "ne sais pas" in response.content:
|
| 196 |
return "444"
|
| 197 |
|
| 198 |
+
#calculate impact
|
| 199 |
+
nbre_out_tokens = response.response_metadata["token_usage"]["completion_tokens"]
|
| 200 |
+
provider = "openai"
|
| 201 |
+
model = "gpt-4o"
|
| 202 |
+
impact = compute_llm_impacts(
|
| 203 |
+
provider=provider,
|
| 204 |
+
model_name=model,
|
| 205 |
+
output_token_count=nbre_out_tokens,
|
| 206 |
+
request_latency=response_latency,
|
| 207 |
+
)
|
| 208 |
+
|
| 209 |
+
st.session_state["partial_emissions"]["extraction_pp"]["el"] += impact.gwp.value
|
| 210 |
#version simple
|
| 211 |
partie_prenante = response.content.replace("- ","").split('\n')
|
| 212 |
partie_prenante = [item.strip() for item in partie_prenante]
|