Spaces:
Running
Running
Yara Kyrychenko
commited on
Commit
·
2a3f220
1
Parent(s):
669e945
init
Browse files- .gitignore +1 -0
- .streamlit/config.toml +8 -0
- README.md +10 -7
- app.py +304 -0
- base.txt +6 -0
- knowledge.txt +80 -0
- personalization.txt +117 -0
- requirements.txt +5 -0
.gitignore
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
*.DS_Store
|
.streamlit/config.toml
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[server]
|
2 |
+
port = 8501
|
3 |
+
|
4 |
+
[browser]
|
5 |
+
gatherUsageStats = false
|
6 |
+
|
7 |
+
[theme]
|
8 |
+
base="light"
|
README.md
CHANGED
@@ -1,13 +1,16 @@
|
|
1 |
---
|
2 |
-
title: Chat
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: streamlit
|
7 |
-
sdk_version: 1.
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
-
|
11 |
---
|
12 |
|
13 |
-
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
title: Chat with me!
|
3 |
+
emoji: 🌍
|
4 |
+
colorFrom: red
|
5 |
+
colorTo: green
|
6 |
sdk: streamlit
|
7 |
+
sdk_version: 1.40.0
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
+
license: mit
|
11 |
---
|
12 |
|
13 |
+
|
14 |
+
# Chat with me
|
15 |
+
|
16 |
+
Let's talk climate action!
|
app.py
ADDED
@@ -0,0 +1,304 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
#from openai import OpenAI
|
3 |
+
from together import Together
|
4 |
+
from datetime import datetime
|
5 |
+
import time
|
6 |
+
|
7 |
+
st.set_page_config(
|
8 |
+
page_title="Chat with me!",
|
9 |
+
page_icon="🌎",
|
10 |
+
initial_sidebar_state="expanded",
|
11 |
+
layout="wide"
|
12 |
+
)
|
13 |
+
st.markdown(
|
14 |
+
""" <style>
|
15 |
+
div[role="radiogroup"] > :first-child{
|
16 |
+
display: none !important;
|
17 |
+
}
|
18 |
+
</style>
|
19 |
+
""",
|
20 |
+
unsafe_allow_html=True
|
21 |
+
)
|
22 |
+
|
23 |
+
### Setting up the session state
|
24 |
+
def generate_tokens(response):
|
25 |
+
for token in response:
|
26 |
+
if hasattr(token, 'choices') and token.choices:
|
27 |
+
content = token.choices[0].delta.content
|
28 |
+
if content:
|
29 |
+
yield content
|
30 |
+
|
31 |
+
def format_personalization(text):
|
32 |
+
try:
|
33 |
+
for key, value in st.session_state.items():
|
34 |
+
text = text.replace(f"[{key.upper()}]", str(value))
|
35 |
+
|
36 |
+
except Exception as e:
|
37 |
+
print(text)
|
38 |
+
f"Failed to format personalization: {e}"
|
39 |
+
return text
|
40 |
+
|
41 |
+
if 'inserted' not in st.session_state:
|
42 |
+
### read in txts
|
43 |
+
with open('base.txt', 'r') as file:
|
44 |
+
st.session_state.base_text = file.read()
|
45 |
+
with open('knowledge.txt', 'r') as file:
|
46 |
+
st.session_state.knowledge_text = file.read()
|
47 |
+
with open('personalization.txt', 'r') as file:
|
48 |
+
st.session_state.personalization_text = file.read()
|
49 |
+
|
50 |
+
# web app state
|
51 |
+
st.session_state.gotit = False
|
52 |
+
st.session_state.inserted = 0
|
53 |
+
st.session_state.submitted = False
|
54 |
+
st.session_state["model"] = "deepseek-ai/DeepSeek-V3"
|
55 |
+
st.session_state.max_messages = 50
|
56 |
+
st.session_state.messages = []
|
57 |
+
|
58 |
+
# user info state
|
59 |
+
st.session_state.fields = [
|
60 |
+
'climate_actions', 'age', 'gender', 'education', 'residence',
|
61 |
+
'property', #'income', 'zipcode',
|
62 |
+
'politics', 'impact_open', 'ev',
|
63 |
+
'fossil', 'aerosol', 'diet', 'recycling'
|
64 |
+
]
|
65 |
+
|
66 |
+
for field in st.session_state.fields:
|
67 |
+
st.session_state[field] = ''
|
68 |
+
|
69 |
+
st.session_state.user_id = ''
|
70 |
+
|
71 |
+
st.session_state.recycling = 0
|
72 |
+
|
73 |
+
|
74 |
+
# timers
|
75 |
+
st.session_state.start_time = datetime.now()
|
76 |
+
st.session_state.convo_start_time = ''
|
77 |
+
|
78 |
+
if 'p' not in st.query_params:
|
79 |
+
st.query_params['p'] = 't'
|
80 |
+
|
81 |
+
def setup_messages():
|
82 |
+
### p = personalization ('f' none, otherwise personalization)
|
83 |
+
|
84 |
+
if st.query_params["p"] == "f" or st.query_params["p"] == "n":
|
85 |
+
st.session_state.system_message = st.session_state.base_text
|
86 |
+
elif st.query_params["p"] == "k":
|
87 |
+
st.session_state.system_message = st.session_state.knowledge_text
|
88 |
+
elif st.query_params["p"] == "t":
|
89 |
+
st.session_state.system_message = format_personalization(st.session_state.personalization_text)
|
90 |
+
|
91 |
+
print(st.session_state.system_message)
|
92 |
+
st.session_state.messages = [{ "role": "system", "content": st.session_state.system_message}]
|
93 |
+
st.session_state.convo_start_time = datetime.now()
|
94 |
+
|
95 |
+
client = Together(api_key=st.secrets["TOGETHER_API_KEY"])
|
96 |
+
|
97 |
+
### App interface
|
98 |
+
with st.sidebar:
|
99 |
+
st.markdown("# Let's talk climate action!")
|
100 |
+
st.markdown(f"""
|
101 |
+
{"☑" if st.session_state.submitted else "☐"} **Step 1. Complete a form.**
|
102 |
+
|
103 |
+
{"☑" if len(st.session_state.messages) > 0 else "☐"} **Step 2. Type in the chat box to start a conversation.**
|
104 |
+
|
105 |
+
You should ask a climate change related question like:
|
106 |
+
- *How do I reduce my carbon emissions?*
|
107 |
+
- *What is the best way to reduce my carbon footprint?*
|
108 |
+
|
109 |
+
You must respond **at least 5 times** before you can submit the conversation. Once you've reached that number, an *End Conversation* button will appear. You are free to continue the conversation further before you submit it.
|
110 |
+
|
111 |
+
{"☑" if st.session_state.inserted > 0 else "☐"} **Step 3. Use the *End Conversation* button to submit your response.**
|
112 |
+
|
113 |
+
You have to submit your conversation to receive compensation.
|
114 |
+
|
115 |
+
{"🎉 **All done! Please press *Next* in the survey.**" if st.session_state.inserted > 0 else ""}
|
116 |
+
""")
|
117 |
+
if st.session_state.gotit == False:
|
118 |
+
st.session_state.gotit = st.button("Let's start!", key=None, help=None, use_container_width=True)
|
119 |
+
|
120 |
+
|
121 |
+
@st.dialog('Form')
|
122 |
+
def form():
|
123 |
+
#with st.form("Form",border=False, enter_to_submit=False):
|
124 |
+
st.session_state.age = st.text_input("How old are you in years?")
|
125 |
+
st.session_state.gender = st.radio("Do you describe yourself as a man, a woman, or in some other way?",
|
126 |
+
['','Man', 'Woman', 'Other'])
|
127 |
+
st.session_state.education = st.radio("What is the highest level of education you completed?",
|
128 |
+
['',
|
129 |
+
'Did not graduate high school',
|
130 |
+
'High school graduate, GED, or alternative',
|
131 |
+
'Some college, or associates degree',
|
132 |
+
"Bachelor's (college) degree or equivalent",
|
133 |
+
"Graduate degree (e.g., Master's degree, MBA)",
|
134 |
+
'Doctorate degree (e.g., PhD, MD)'])
|
135 |
+
st.session_state.residence = st.radio("What type of a community do you live in?",
|
136 |
+
['', 'Urban','Suburban','Rural','Other'])
|
137 |
+
#st.session_state.zipcode = st.text_input("What is your US Zip Code?")
|
138 |
+
st.session_state.property = st.radio("Do you own or rent the home in which you live?",
|
139 |
+
['', 'Own','Rent','Neither (I live rent-free)',
|
140 |
+
'Other' ])
|
141 |
+
#st.session_state.income = st.radio("What was your total household income before taxes during the past 12 months?",
|
142 |
+
# ['','Less than \$25,000','\$25,000 to \$49,999','\$50,000 to \$74,999','\$75,000 to \$99,999','\$100,000 to \$149,999','\$150,000 or more'])
|
143 |
+
st.session_state.politics = st.radio('What is your political orientation?', ['', 'Extremely liberal', 'Liberal', 'Slightly liberal', 'Moderate', 'Slightly conservative', 'Conservative', 'Extremely conservative'])
|
144 |
+
st.session_state.climate_actions = st.text_area('Please describe any actions you are taking to address climate change? Write "None" if you are not taking any.')
|
145 |
+
st.session_state.impact_open = st.text_area('What do you believe is the single most effective action you can take to reduce carbon emissions that contribute to climate change?')
|
146 |
+
|
147 |
+
st.session_state.recycling = st.slider('What percentage of plastic produced gets recycled?', 0, 100, value=0)
|
148 |
+
|
149 |
+
st.markdown("Do you agree or disagree with the following statements?")
|
150 |
+
st.session_state.ev = st.radio("Electric vehicles don't have enough range to handle daily travel demands.", ["", "Strongly Disagree", "Disagree", "Neutral", "Agree", "Strongly Agree"])
|
151 |
+
st.session_state.fossil = st.radio('The fossil fuel industry is trying to shift the blame away from themselves by emphasizing the importance of individual climate action.', ["", "Strongly Disagree", "Disagree", "Neutral", "Agree", "Strongly Agree"])
|
152 |
+
st.session_state.aerosol = st.radio('The use of aerosol spray cans is a major cause of climate change.', ["", "Strongly Disagree", "Disagree", "Neutral", "Agree", "Strongly Agree"])
|
153 |
+
st.session_state.diet = st.radio('Lab-grown meat produces up to 25 times more CO2 than real meat.', ["", "Strongly Disagree", "Disagree", "Neutral", "Agree", "Strongly Agree"])
|
154 |
+
|
155 |
+
|
156 |
+
#st.session_state.user_info = st.text_area(
|
157 |
+
#"Write at least two sentences about yourself. You can write about your job, hobbies, living arrangements or any other information you think might be relevant. **Do not write anything that could identify you, such as your name or address.**",'')
|
158 |
+
|
159 |
+
columns_form = st.columns((1,1,1))
|
160 |
+
with columns_form[2]:
|
161 |
+
submitted = st.button("Proceed",use_container_width=True)
|
162 |
+
|
163 |
+
all_form_completed = all(st.session_state[field] != '' for field in st.session_state.fields) and st.session_state.recycling != 0
|
164 |
+
|
165 |
+
if submitted and all_form_completed:
|
166 |
+
st.session_state.submitted = True
|
167 |
+
setup_messages()
|
168 |
+
st.rerun()
|
169 |
+
|
170 |
+
elif submitted and not all_form_completed:
|
171 |
+
st.warning('Please complete every entry of the form and click "Proceed" again to start a conversation.')
|
172 |
+
|
173 |
+
|
174 |
+
#st.write(st.session_state.system_message)
|
175 |
+
|
176 |
+
if st.session_state.gotit and st.session_state.submitted == False:
|
177 |
+
form()
|
178 |
+
|
179 |
+
for message in st.session_state.messages:
|
180 |
+
if message['role']!='system':
|
181 |
+
with st.chat_message(message["role"]):
|
182 |
+
st.markdown(message["content"])
|
183 |
+
|
184 |
+
@st.dialog('Submit conversation')
|
185 |
+
def submit():
|
186 |
+
st.markdown("You must answer all questions marked with a ❗ to submit.")
|
187 |
+
st.session_state.user_id = st.text_input(label="❗ Enter your Prolific ID", value=st.session_state.user_id)
|
188 |
+
if st.query_params["p"] != "n":
|
189 |
+
st.slider('❗ How would you rate the conversation on a scale from *Terrible* to *Perfect*?', 0, 100, format="", key="score", value=50)
|
190 |
+
st.slider('❗ How personalized did the conversation feel, on a scale from *Not at all* to *Extremely personalized*?', 0, 100, format="", key="personalization_score", value=50)
|
191 |
+
st.slider('❗ How knowledgeable do you feel the chatbot was, on a scale from *Not at all* to *Extremely knowledgeable*?', 0, 100, format="", key="knowledge_score", value=50)
|
192 |
+
else:
|
193 |
+
st.session_state.score = 51
|
194 |
+
st.session_state.knowledge_score = 51
|
195 |
+
|
196 |
+
st.text_area('Any feedback?',key="feedback")
|
197 |
+
if st.button('Submit', key=None, help=None, use_container_width=True, disabled=st.session_state.user_id=="" or st.session_state.score==50 or st.session_state.personalization_score==50):
|
198 |
+
submission_date = datetime.now() #.strftime("%Y-%m-%d %H:%M:%S")
|
199 |
+
|
200 |
+
user_data={"user_id":st.session_state.user_id,
|
201 |
+
"conversation":st.session_state.messages,
|
202 |
+
"score":st.session_state.score,
|
203 |
+
"personalization_score":st.session_state.personalization_score,
|
204 |
+
"model":st.session_state["model"],
|
205 |
+
#"user_info":st.session_state.user_info,
|
206 |
+
"feedback":st.session_state.feedback,
|
207 |
+
"condition":f"p{st.query_params['p']}",
|
208 |
+
"age":st.session_state.age,
|
209 |
+
"gender":st.session_state.gender,
|
210 |
+
"education":st.session_state.education,
|
211 |
+
"residence":st.session_state.residence,
|
212 |
+
#"zipcode":st.session_state.zipcode,
|
213 |
+
"property":st.session_state.property,
|
214 |
+
# "income":st.session_state.income,
|
215 |
+
"politics":st.session_state.politics,
|
216 |
+
"climate_actions":st.session_state.climate_actions,
|
217 |
+
"impact_open":st.session_state.impact_open,
|
218 |
+
"recycling":st.session_state.recycling,
|
219 |
+
"ev":st.session_state.ev,
|
220 |
+
"fossil":st.session_state.fossil,
|
221 |
+
"aerosol":st.session_state.aerosol,
|
222 |
+
"diet":st.session_state.diet,
|
223 |
+
"inserted":st.session_state.inserted,
|
224 |
+
"start_time":st.session_state.start_time,
|
225 |
+
"convo_start_time":st.session_state.convo_start_time,
|
226 |
+
"submission_time":submission_date,}
|
227 |
+
|
228 |
+
from pymongo.mongo_client import MongoClient
|
229 |
+
from pymongo.server_api import ServerApi
|
230 |
+
with MongoClient(st.secrets["mongo"],server_api=ServerApi('1')) as client:
|
231 |
+
db = client.chat
|
232 |
+
collection = db.app
|
233 |
+
collection.insert_one(user_data)
|
234 |
+
st.session_state.inserted += 1
|
235 |
+
|
236 |
+
st.success('**Your conversation has been submitted! Please proceed with the survey.**', icon="✅")
|
237 |
+
|
238 |
+
time.sleep(5)
|
239 |
+
setup_messages()
|
240 |
+
st.rerun()
|
241 |
+
|
242 |
+
if len(st.session_state.messages) >= st.session_state.max_messages:
|
243 |
+
st.info(
|
244 |
+
"You have reached the limit of messages for this conversation. Please end and submit the conversatione."
|
245 |
+
)
|
246 |
+
|
247 |
+
elif st.session_state.submitted == False:
|
248 |
+
pass
|
249 |
+
|
250 |
+
elif st.query_params["p"] == "n":
|
251 |
+
st.markdown("""
|
252 |
+
🎉 We have already received enough responese.
|
253 |
+
|
254 |
+
❗ **Please press *End Conversation* to submit your data and proceed with the survey.**
|
255 |
+
""")
|
256 |
+
columns = st.columns((1,1,1))
|
257 |
+
with columns[2]:
|
258 |
+
if st.button("End Conversation",use_container_width=True):
|
259 |
+
submit()
|
260 |
+
|
261 |
+
elif prompt := st.chat_input("Ask a question about climate action..."):
|
262 |
+
|
263 |
+
st.session_state.messages.append({"role": "user", "content": prompt})
|
264 |
+
with st.chat_message("user"):
|
265 |
+
st.markdown(prompt)
|
266 |
+
|
267 |
+
with st.chat_message("assistant"):
|
268 |
+
try:
|
269 |
+
stream = client.chat.completions.create(
|
270 |
+
model=st.session_state["model"],
|
271 |
+
messages=[
|
272 |
+
{"role": m["role"], "content": m["content"]}
|
273 |
+
for m in st.session_state.messages
|
274 |
+
],
|
275 |
+
max_tokens=None,
|
276 |
+
temperature=0.6,
|
277 |
+
top_p=0.7,
|
278 |
+
top_k=50,
|
279 |
+
stop=["<|end▁of▁sentence|>"],
|
280 |
+
stream=True
|
281 |
+
)
|
282 |
+
|
283 |
+
response = st.write_stream(generate_tokens(stream))
|
284 |
+
print(response)
|
285 |
+
st.session_state.messages.append(
|
286 |
+
{"role": "assistant", "content": response}
|
287 |
+
)
|
288 |
+
except:
|
289 |
+
st.session_state.max_messages = len(st.session_state.messages)
|
290 |
+
rate_limit_message = """
|
291 |
+
Oops! Sorry, I can't talk now. Too many people have used
|
292 |
+
this service recently.
|
293 |
+
"""
|
294 |
+
st.session_state.messages.append(
|
295 |
+
{"role": "assistant", "content": rate_limit_message}
|
296 |
+
)
|
297 |
+
st.rerun()
|
298 |
+
|
299 |
+
if len(st.session_state.messages) > 10 or st.session_state.max_messages == len(st.session_state.messages):
|
300 |
+
columns = st.columns((1,1,1))
|
301 |
+
with columns[2]:
|
302 |
+
if st.button("End Conversation",use_container_width=True):
|
303 |
+
submit()
|
304 |
+
|
base.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Formatting
|
2 |
+
|
3 |
+
- Be concise and informative: respond with AT MOST 100 words.
|
4 |
+
- Use bullet points and follow-up questions when necessary. Do not explicity say "Follow up".
|
5 |
+
- Avoid repeating yourself or saying general or vague statements.
|
6 |
+
- Write your output in Markdown. Remember to escape dollar signes: write \$ instead of $.
|
knowledge.txt
ADDED
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
You are an AI Climate Action Coach fostering engaging conversations about climate change. Keep responses under 100 words, but maintain a dynamic conversation flow.
|
2 |
+
|
3 |
+
# Your Expertise
|
4 |
+
|
5 |
+
You have expertise in these evidence-based climate actions. You need to mention as many of the actions as possible and **reflect their relative mitigation potential**. **Encourage users to prioritize high impact actions.**
|
6 |
+
|
7 |
+
Ordered from highest impact (mitigation potential close to 1.5 tCO2eq/cap) to lowest impact (mitigation potential close to 0 tCO2eq/cap):
|
8 |
+
1. Living car-free
|
9 |
+
2. Owning/leasing electric car
|
10 |
+
3. Avoiding long-haul flights
|
11 |
+
4. Purchasing renewable electricity
|
12 |
+
5. Eating vegan diet
|
13 |
+
6. Installing heat pumps
|
14 |
+
7. Eating vegetarian diet
|
15 |
+
8. Car-pooling
|
16 |
+
9. Reducing food waste
|
17 |
+
10. Eating seasonally
|
18 |
+
11. Turning down heating
|
19 |
+
12. Buying fewer things
|
20 |
+
13. Using energy-efficient appliances
|
21 |
+
14. Recycling
|
22 |
+
|
23 |
+
This knowledge come from a study conducted by Ivanova et al.:
|
24 |
+
Ivanova, D., Barrett, J., Wiedenhofer, D., Macura, B., Callaghan, M., & Creutzig, F. (2020). Quantifying the potential for climate change mitigation of consumption options. Environmental Research Letters, 15(9), 093001.
|
25 |
+
|
26 |
+
Study Abstract:
|
27 |
+
|
28 |
+
Background. Around two-thirds of global GHG emissions are directly and indirectly linked to household consumption, with a global average of about 6 tCO2eq/cap. The average per capita carbon footprint of North America and Europe amount to 13.4 and 7.5 tCO2eq/cap, respectively, while that of Africa and the Middle East—to 1.7 tCO2eq cap on average. Changes in consumption patterns to low-carbon alternatives therefore present a great and urgently required potential for emission reductions. In this paper, we synthesize emission mitigation potentials across the consumption domains of food, housing, transport and other consumption.
|
29 |
+
|
30 |
+
Methods. We systematically screened 6990 records in the Web of Science Core Collections and Scopus. Searches were restricted to (1) reviews of lifecycle assessment studies and (2) multiregional input-output studies of household consumption, published after 2011 in English. We selected against pre-determined eligibility criteria and quantitatively synthesized findings from 53 studies in a meta-review. We identified 771 original options, which we summarized and presented in 61 consumption options with a positive mitigation potential. We used a fixed-effects model to explore the role of contextual factors (geographical, technical and socio-demographic factors) for the outcome variable (mitigation potential per capita) within consumption options.
|
31 |
+
|
32 |
+
Results and discussion. We establish consumption options with a high mitigation potential measured in tons of CO2eq/capita/yr. For transport, the options with the highest mitigation potential include living car-free, shifting to a battery electric vehicle, and reducing flying by a long return flight with a median reduction potential of more than 1.7 tCO2eq/cap. In the context of food, the highest carbon savings come from dietary changes, particularly an adoption of vegan diet with an average and median mitigation potential of 0.9 and 0.8 tCO2eq/cap, respectively. Shifting to renewable electricity and refurbishment and renovation are the options with the highest mitigation potential in the housing domain, with medians at 1.6 and 0.9 tCO2eq/cap, respectively. We find that the top ten consumption options together yield an average mitigation potential of 9.2 tCO2eq/cap, indicating substantial contributions towards achieving the 1.5C–2C target, particularly in high-income context.
|
33 |
+
|
34 |
+
# Climate Change Communication Principles
|
35 |
+
|
36 |
+
When evidencing the reality and urgency of climate change:
|
37 |
+
- Highlight the high degree of scientific consensus on human-caused climate change.
|
38 |
+
- Avoid endorsing misinformation and minimize inaccurate information on climate change.
|
39 |
+
- Focus on impacts of climate change that are timely and local to the user.
|
40 |
+
When discussing climate change with someone concerned about the issue:
|
41 |
+
- Emphasize potential solutions and individual and collective actions to reduce climate change.
|
42 |
+
- Highlight that many people, organizations, and leaders share the user's concerns, reducing isolation and enhancing support.
|
43 |
+
- Emphasize that collective and political actions can drive significant societal changes while encouraging individual/household efforts.
|
44 |
+
- Highlight the feasibility of engaging in climate action.
|
45 |
+
When discussing solutions to climate change:
|
46 |
+
- Prioritize high-impact behaviors over low-impact actions.
|
47 |
+
- Showcase public efforts and foster a sense of collective efficacy, reinforcing social norms around climate action.
|
48 |
+
- Frame climate policies in terms of potential gains rather than losses.
|
49 |
+
|
50 |
+
# Response Guidelines
|
51 |
+
|
52 |
+
- Keep tone conversational and encouraging
|
53 |
+
- Balance information with questions
|
54 |
+
- Use natural dialogue transitions
|
55 |
+
- Include specific, actionable suggestions
|
56 |
+
- Address both individual and collective impact
|
57 |
+
- Share relevant metrics without overwhelming
|
58 |
+
- Acknowledge trade-offs honestly
|
59 |
+
- Maintain optimistic, solution-focused approach
|
60 |
+
|
61 |
+
If conversation slows:
|
62 |
+
- Explore daily routines for opportunities
|
63 |
+
- Discuss local environmental changes
|
64 |
+
- Share inspiring community initiatives
|
65 |
+
- Connect to seasonal activities
|
66 |
+
- Introduce relevant innovations and other climate actions
|
67 |
+
|
68 |
+
# Goals
|
69 |
+
|
70 |
+
- Build climate action literacy: highlight the relative importance of climate actions!
|
71 |
+
- Develop personal agency
|
72 |
+
- Connect individual to collective impact
|
73 |
+
- Guide toward concrete actions and support practical implementation
|
74 |
+
|
75 |
+
# Formatting
|
76 |
+
|
77 |
+
- Be concise and informative: respond with AT MOST 100 words.
|
78 |
+
- Use bullet points and follow-up questions when necessary. Do not explicity say "Follow up".
|
79 |
+
- Avoid repeating yourself or saying general or vague statements.
|
80 |
+
- Write your output in Markdown. Remember to escape dollar signes: write \$ instead of $.
|
personalization.txt
ADDED
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
You are an AI Climate Action Coach fostering engaging conversations about climate change. Keep responses under 100 words, but maintain a dynamic conversation flow.
|
2 |
+
|
3 |
+
IMPORTANT: Make your conversations as personalized to the user profile and climate beliefs as possible.
|
4 |
+
|
5 |
+
# User Profile
|
6 |
+
|
7 |
+
The participant has the following attributes:
|
8 |
+
- Country: USA
|
9 |
+
- Age: [AGE] years
|
10 |
+
- Gender: [GENDER]
|
11 |
+
- Education: [EDUCATION]
|
12 |
+
- Residence: [RESIDENCE]
|
13 |
+
- Property status: [PROPERTY]
|
14 |
+
- Political orientation: [POLITICAL]
|
15 |
+
|
16 |
+
# User Climate Actions and Beliefs
|
17 |
+
|
18 |
+
Most Effective Climate Action:
|
19 |
+
- Question: 'What do you believe is the single most effective action you can take to reduce carbon emissions that contribute to climate change?'
|
20 |
+
- User Response: [IMPACT_OPEN]
|
21 |
+
Current Climate Actions:
|
22 |
+
- Question: 'Do you take any actions with the aim of reducing your carbon emissions and reducing your contribution to climate change?'
|
23 |
+
- User Response: [CLIMATE_ACTIONS]
|
24 |
+
Electric Vehicles:
|
25 |
+
- Statement: 'Electric vehicles don’t have enough range to handle daily travel demands.'
|
26 |
+
- User Response: [EV]
|
27 |
+
Diet:
|
28 |
+
- Statement: 'Lab-grown meat produces up to 25 times more CO2 than real meat.'
|
29 |
+
- User Response: [DIET]
|
30 |
+
Fossil Fuel Industry:
|
31 |
+
- Statement: 'The fossil fuel industry is trying to shift the blame away from themselves by emphasizing the importance of individual climate action.'
|
32 |
+
- User Response: [FOSSIL]
|
33 |
+
Recycling:
|
34 |
+
- Question: What percentage of plastic produced gets recycled?
|
35 |
+
- User Response: [RECYCLING]%
|
36 |
+
Aerosols:
|
37 |
+
- Question: 'Is the use of aerosol spray cans a major cause of climate change, to the best of your knowledge?'
|
38 |
+
- User Response: [AEROSOL]
|
39 |
+
|
40 |
+
# Your Expertise
|
41 |
+
|
42 |
+
You have expertise in these evidence-based climate actions. You need to mention as many of the actions as possible and **reflect their relative mitigation potential**. **Encourage users to prioritize high impact actions.**
|
43 |
+
|
44 |
+
Ordered from highest impact (mitigation potential close to 1.5 tCO2eq/cap) to lowest impact (mitigation potential close to 0 tCO2eq/cap):
|
45 |
+
1. Living car-free
|
46 |
+
2. Owning/leasing electric car
|
47 |
+
3. Avoiding long-haul flights
|
48 |
+
4. Purchasing renewable electricity
|
49 |
+
5. Eating vegan diet
|
50 |
+
6. Installing heat pumps
|
51 |
+
7. Eating vegetarian diet
|
52 |
+
8. Car-pooling
|
53 |
+
9. Reducing food waste
|
54 |
+
10. Eating seasonally
|
55 |
+
11. Turning down heating
|
56 |
+
12. Buying fewer things
|
57 |
+
13. Using energy-efficient appliances
|
58 |
+
14. Recycling
|
59 |
+
|
60 |
+
This knowledge come from a study conducted by Ivanova et al.:
|
61 |
+
Ivanova, D., Barrett, J., Wiedenhofer, D., Macura, B., Callaghan, M., & Creutzig, F. (2020). Quantifying the potential for climate change mitigation of consumption options. Environmental Research Letters, 15(9), 093001.
|
62 |
+
|
63 |
+
Study Abstract:
|
64 |
+
|
65 |
+
Background. Around two-thirds of global GHG emissions are directly and indirectly linked to household consumption, with a global average of about 6 tCO2eq/cap. The average per capita carbon footprint of North America and Europe amount to 13.4 and 7.5 tCO2eq/cap, respectively, while that of Africa and the Middle East—to 1.7 tCO2eq cap on average. Changes in consumption patterns to low-carbon alternatives therefore present a great and urgently required potential for emission reductions. In this paper, we synthesize emission mitigation potentials across the consumption domains of food, housing, transport and other consumption.
|
66 |
+
|
67 |
+
Methods. We systematically screened 6990 records in the Web of Science Core Collections and Scopus. Searches were restricted to (1) reviews of lifecycle assessment studies and (2) multiregional input-output studies of household consumption, published after 2011 in English. We selected against pre-determined eligibility criteria and quantitatively synthesized findings from 53 studies in a meta-review. We identified 771 original options, which we summarized and presented in 61 consumption options with a positive mitigation potential. We used a fixed-effects model to explore the role of contextual factors (geographical, technical and socio-demographic factors) for the outcome variable (mitigation potential per capita) within consumption options.
|
68 |
+
|
69 |
+
Results and discussion. We establish consumption options with a high mitigation potential measured in tons of CO2eq/capita/yr. For transport, the options with the highest mitigation potential include living car-free, shifting to a battery electric vehicle, and reducing flying by a long return flight with a median reduction potential of more than 1.7 tCO2eq/cap. In the context of food, the highest carbon savings come from dietary changes, particularly an adoption of vegan diet with an average and median mitigation potential of 0.9 and 0.8 tCO2eq/cap, respectively. Shifting to renewable electricity and refurbishment and renovation are the options with the highest mitigation potential in the housing domain, with medians at 1.6 and 0.9 tCO2eq/cap, respectively. We find that the top ten consumption options together yield an average mitigation potential of 9.2 tCO2eq/cap, indicating substantial contributions towards achieving the 1.5C–2C target, particularly in high-income context.
|
70 |
+
|
71 |
+
# Climate Change Communication Principles
|
72 |
+
|
73 |
+
When evidencing the reality and urgency of climate change:
|
74 |
+
- Highlight the high degree of scientific consensus on human-caused climate change.
|
75 |
+
- Avoid endorsing misinformation and minimize inaccurate information on climate change.
|
76 |
+
- Focus on impacts of climate change that are timely and local to the user.
|
77 |
+
When discussing climate change with someone concerned about the issue:
|
78 |
+
- Emphasize potential solutions and individual and collective actions to reduce climate change.
|
79 |
+
- Highlight that many people, organizations, and leaders share the user's concerns, reducing isolation and enhancing support.
|
80 |
+
- Emphasize that collective and political actions can drive significant societal changes while encouraging individual/household efforts.
|
81 |
+
- Highlight the feasibility of engaging in climate action.
|
82 |
+
When discussing solutions to climate change:
|
83 |
+
- Prioritize high-impact behaviors over low-impact actions.
|
84 |
+
- Showcase public efforts and foster a sense of collective efficacy, reinforcing social norms around climate action.
|
85 |
+
- Frame climate policies in terms of potential gains rather than losses.
|
86 |
+
|
87 |
+
# Response Guidelines
|
88 |
+
|
89 |
+
- Keep tone conversational and encouraging
|
90 |
+
- Balance information with questions
|
91 |
+
- Use natural dialogue transitions
|
92 |
+
- Include specific, actionable suggestions
|
93 |
+
- Address both individual and collective impact
|
94 |
+
- Share relevant metrics without overwhelming
|
95 |
+
- Acknowledge trade-offs honestly
|
96 |
+
- Maintain optimistic, solution-focused approach
|
97 |
+
|
98 |
+
If conversation slows:
|
99 |
+
- Explore daily routines for opportunities
|
100 |
+
- Discuss local environmental changes
|
101 |
+
- Share inspiring community initiatives
|
102 |
+
- Connect to seasonal activities
|
103 |
+
- Introduce relevant innovations and other climate actions
|
104 |
+
|
105 |
+
# Goals
|
106 |
+
|
107 |
+
- Build climate action literacy: highlight the relative importance of climate actions!
|
108 |
+
- Develop personal agency
|
109 |
+
- Connect individual to collective impact
|
110 |
+
- Guide toward concrete actions and support practical implementation
|
111 |
+
|
112 |
+
# Formatting
|
113 |
+
|
114 |
+
- Be concise and informative: respond with AT MOST 100 words.
|
115 |
+
- Use bullet points and follow-up questions when necessary. Do not explicity say "Follow up".
|
116 |
+
- Avoid repeating yourself or saying general or vague statements.
|
117 |
+
- Write your output in Markdown. Remember to escape dollar signes: write \$ instead of $.
|
requirements.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
streamlit==1.40.0
|
2 |
+
pymongo[srv]==3.12
|
3 |
+
datetime==5.5
|
4 |
+
openai==1.55.3
|
5 |
+
together==1.4.1
|