| # 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( | |
| # """ | |
| # <style> | |
| # .stChatInput { | |
| # box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.4); /* Strong shadow */ | |
| # border-radius: 10px; | |
| # padding: 12px; | |
| # background: white; | |
| # } | |
| # .stChatInput::before { | |
| # content: ""; | |
| # position: absolute; | |
| # width: 100%; | |
| # height: 15px; | |
| # left: 0; | |
| # background: linear-gradient(to top, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0)); /* Fading effect */ | |
| # } | |
| # </style> | |
| # """, | |
| # 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( | |
| # """ | |
| # <style> | |
| # .footer { | |
| # position: fixed; | |
| # bottom: 0; | |
| # left: 100px; | |
| # font-size: 14px; | |
| # font-weight: 900; | |
| # width: 100%; | |
| # background-color: white; | |
| # text-align: center; | |
| # padding: 10px; | |
| # box-shadow: 0px -2px 5px rgba(0, 0, 0, 0.1); | |
| # z-index: 999; | |
| # } | |
| # </style> | |
| # <div class="footer"> | |
| # --- | |
| # *Educational Purpose Only* | π± **SDG Guardians AI - 2024** | *For a greener East Africa* | |
| # </div> | |
| # """, | |
| # 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 | |
| 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() | |