# Author: Fred Okorio # Date: 2024-01-01 # Description: A Streamlit app for a Climate Change Awareness Chatbot using the ClimateGPT-7B model. # Have to SWITCH to this more expressive model before the deadline. # # necessary libraries # import streamlit as st # import accelerate # from transformers import AutoTokenizer, AutoModelForCausalLM # import torch # # page configuration # st.set_page_config(page_title="Climate Change Awareness Chatbot", layout="wide") # # ClimateGPT-7B model and tokenizer # @st.cache_resource # def load_climategpt(): # tokenizer = AutoTokenizer.from_pretrained("eci-io/climategpt-7b") # model = AutoModelForCausalLM.from_pretrained("eci-io/climategpt-7b", device_map="auto") # return tokenizer, model # tokenizer, model = load_climategpt() # # generate responses # def generate_response(user_input): # prompt = f""" # <|im_start|>system # You are ClimateGPT, a large language model trained to provide information on climate change.<|im_end|> # <|im_start|>user # {user_input}<|im_end|> # <|im_start|>assistant # """ # inputs = tokenizer(prompt, return_tensors="pt").to(model.device) # outputs = model.generate(**inputs, max_new_tokens=200) # response = tokenizer.decode(outputs[0], skip_special_tokens=True) # return response.split("<|im_end|>")[-1].strip() # # initialize session state for chat history # if "history" not in st.session_state: # st.session_state.history = [] # # sidebar for chat history # with st.sidebar: # st.title("Chat History") # for idx, (question, answer) in enumerate(st.session_state.history[::-1]): # with st.expander(f"πŸ’¬ {question}"): # st.write(f"**Chatbot:** {answer}") # st.markdown("---") # st.info("🌱 *Ask me anything about climate change, sustainability, or eco-friendly living.*") # # main chat interface # st.title("Climate Change Awareness Chatbot") # st.subheader("Get answers, tips, and climate change facts for Uganda & East Africa") # # Display chat history # for question, answer in st.session_state.history: # st.markdown(f"**You:** {question}") # st.success(f"**Chatbot:** {answer}") # st.markdown("---") # # User input # user_input = st.text_input("πŸ’¬ Type your message and press Enter", key="text_input") # if user_input: # response = generate_response(user_input) # # Append conversation to history # st.session_state.history.append((user_input, response)) # # Clear input field after processing # st.session_state.text_input = "" # # Rerun the app to display the updated chat history # st.experimental_rerun() # # Clear chat history button # if st.button("Clear Chat History"): # st.session_state.history = [] # st.experimental_rerun() # # Footer # st.markdown(""" # --- # *Educational Purpose Only* | 🌱 **SDG Guardians AI - 2024** | *For a greener East Africa* # """) # import streamlit as st # from transformers import pipeline, AutoTokenizer, AutoModelForQuestionAnswering # # page configuration # st.set_page_config(page_title="Climate Chatbot - Uganda & East Africa", layout="wide") # # model loading... # @st.cache_resource # def load_climate_bert(): # tokenizer = AutoTokenizer.from_pretrained("NinaErlacher/ClimateBERTqa") # model = AutoModelForQuestionAnswering.from_pretrained("NinaErlacher/ClimateBERTqa") # qa_pipeline = pipeline("question-answering", model=model, tokenizer=tokenizer) # return qa_pipeline # qa_pipeline = load_climate_bert() # def generate_response(user_question, context): # result = qa_pipeline(question=user_question, context=context) # return result['answer'] # # Initialize session state variables # if "history" not in st.session_state: # st.session_state.history = [] # # Sidebar for chat history # with st.sidebar: # st.title("Chat History") # for idx, (question, answer) in enumerate(st.session_state.history[::-1]): # with st.expander(f"πŸ’¬ {question}"): # st.write(f"**Chatbot:** {answer}") # st.markdown("---") # st.info("🌱 *Ask me anything about climate change, sustainability, or eco-friendly living.*") # # main chat UI # st.title("Climate Change Awareness Chatbot") # st.subheader("Get answers, tips, and climate change facts for Uganda & East Africa") # # chat display # chat_container = st.container() # with chat_container: # for question, answer in st.session_state.history: # st.markdown(f"**You:** {question}") # st.success(f"**Chatbot:** {answer}") # st.markdown("---") # User input # user_input = st.text_input("πŸ’¬ Type your message and press Enter", key="text_input") # if user_input: # context = """ # Climate change is affecting Uganda and East Africa in various ways, including unpredictable rainfall patterns, # increased temperatures, and prolonged droughts. Sustainable farming practices, afforestation, and renewable # energy adoption are key solutions to mitigate these effects. # """ # Placeholder context # response = generate_response(user_input, context) # # append conversation to history # /' ' st.session_state.history.append((user_input, response)) # # Clear stored input after processing # st.session_state.pop("text_input", None) # st.rerun() # # Clear chat history button # if st.button("Clear Chat History"): # st.session_state.history = [] # st.rerun() # # footer # st.markdown(""" # --- # *Educational Purpose Only* | 🌱 **SDG Guardians AI - 2024** | *For a greener East Africa* # """) # import streamlit as st # from transformers import pipeline, AutoTokenizer, AutoModelForQuestionAnswering # # Page configuration # st.set_page_config(page_title="Climate Chatbot - Uganda", layout="wide") # # Custom CSS for shadow effect # st.markdown( # """ # # """, # unsafe_allow_html=True # ) # # Load model # @st.cache_resource # def load_climate_bert(): # tokenizer = AutoTokenizer.from_pretrained("NinaErlacher/ClimateBERTqa") # model = AutoModelForQuestionAnswering.from_pretrained("NinaErlacher/ClimateBERTqa") # return pipeline("question-answering", model=model, tokenizer=tokenizer) # qa_pipeline = load_climate_bert() # # Function to check if question is climate-related # def is_climate_related(question): # climate_keywords = ["climate", "global warming", "deforestation", "carbon", "sustainability", # "renewable", "pollution", "green energy", "climate action", "afforestation"] # return any(keyword in question.lower() for keyword in climate_keywords) # # Function to check if Uganda is mentioned # def is_uganda_related(question): # return "uganda" in question.lower() or "east africa" in question.lower() # # Function to generate response # def generate_response(user_question, context): # if not is_climate_related(user_question): # return "I'm here to discuss climate change. Try asking about Uganda's climate, sustainability, or environmental issues." # if not is_uganda_related(user_question): # return "This chatbot focuses on climate change in Uganda. Try asking about Uganda's environmental challenges." # result = qa_pipeline(question=user_question, context=context) # return result['answer'] # # Session state for chat history # if "history" not in st.session_state: # st.session_state.history = [] # # Sidebar - Chat History & Clear Button # with st.sidebar: # st.title("Chat History") # for idx, (question, answer) in enumerate(st.session_state.history[::-1]): # with st.expander(f"πŸ’¬ {question}"): # st.write(f"**Chatbot:** {answer}") # st.markdown("---") # if st.button("πŸ—‘οΈ Clear Chat History"): # st.session_state.history = [] # st.rerun() # st.info("🌱 *Ask about climate change in Uganda.*") # # Main UI # st.title("Climate Change Chatbot") # st.subheader("Explore climate action and sustainability in Uganda") # # Sample questions section # with st.expander("Need ideas? (Click to expand)"): # st.markdown(""" # - **How is Uganda affected by climate change?** # - **What are sustainable farming methods?** # - **How can I reduce my energy use?** # - **What are the risks of deforestation?** # - **Why is tree planting important?** # - **How can youth take action?** # """) # # Chat container with avatars # chat_container = st.container() # with chat_container: # for question, answer in st.session_state.history: # with st.chat_message("user"): # st.write(question) # with st.chat_message("assistant"): # st.write(answer) # # User input field with shadow effect # user_input = st.chat_input("Ask about climate change in Uganda...") # if user_input: # context = """ # Climate change is affecting Uganda and East Africa in various ways, including unpredictable rainfall, # rising temperatures, and prolonged droughts. Sustainable farming, afforestation, and renewable energy # adoption are key solutions to mitigate these effects. # """ # Placeholder context # response = generate_response(user_input, context) # st.session_state.history.append((user_input, response)) # st.rerun() # seems to be overcrowding the page, so we can remove it for now. # # footer fixed at the bottom # st.markdown( # """ # # # """, # unsafe_allow_html=True # ) import streamlit as st import torch from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline # Page configuration st.set_page_config(page_title="ClimateGPT Chatbot - Uganda", layout="wide") # Load ClimateGPT model @st.cache_resource def load_climate_gpt(): model_name = "eci-io/climategpt-7b" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto") return pipeline("text-generation", model=model, tokenizer=tokenizer, max_length=512) climate_gpt_pipeline = load_climate_gpt() # Function to generate response using ClimateGPT def generate_response(user_question): prompt = f""" <|im_start|>system You are ClimateGPT, an expert in climate change. Provide accurate and fact-based responses about Uganda’s climate issues.<|im_end|> <|im_start|>user {user_question}<|im_end|> <|im_start|>assistant """ response = climate_gpt_pipeline(prompt)[0]["generated_text"] # Extract only the assistant's response response = response.split("<|im_start|>assistant")[-1].strip() return response # Chat history if "history" not in st.session_state: st.session_state.history = [] # Sidebar - Chat History & Clear Button with st.sidebar: st.title("Chat History") for idx, (question, answer) in enumerate(st.session_state.history[::-1]): with st.expander(f"πŸ’¬ {question}"): st.write(f"**Chatbot:** {answer}") if st.button("πŸ—‘οΈ Clear Chat History"): st.session_state.history = [] st.rerun() # Main UI st.title("🌍 ClimateGPT - Uganda") st.subheader("Ask about climate change, sustainability, and environmental action in Uganda!") # User input field user_input = st.chat_input("Ask me anything about Uganda's climate...") if user_input: response = generate_response(user_input) st.session_state.history.append((user_input, response)) st.rerun()