# Math Problem Solver # A Streamlit application that solves math problems and searches for information using Google Gemma 2 model through Groq API import streamlit as st import os from langchain_groq import ChatGroq from langchain.agents import Tool, initialize_agent from langchain.agents.agent_types import AgentType from langchain.prompts import PromptTemplate from langchain_community.utilities import WikipediaAPIWrapper, ArxivAPIWrapper, DuckDuckGoSearchRun from langchain_community.tools import WikipediaQueryRun, ArxivQueryRun from langchain.callbacks import StreamlitCallbackHandler from langchain.chains import LLMMathChain, LLMChain from langchain.schema import SystemMessage from dotenv import load_dotenv # Load environment variables from .env file load_dotenv() # Page configuration st.set_page_config( page_title="Math Problem Solver", page_icon="🧮", layout="wide" ) # App title and description st.title("🧮 Math Problem Solver") st.markdown(""" This application solves mathematical problems and provides step-by-step explanations using Groq's AI models. It can handle various math topics including: - Arithmetic calculations - Algebra - Geometry - Statistics - Word problems - And more! """) # Sidebar configuration st.sidebar.title("⚙️ Configuration") st.sidebar.markdown("---") # API key input - use environment variable if available default_api_key = os.getenv("GROQ_API_KEY", "") groq_api_key = st.sidebar.text_input( label="Groq API Key", value=default_api_key, type="password", help="Get your API key from https://console.groq.com/keys" ) # Model selection model_options = { "gemma2-9b-it": "Gemma 2 9B (Fast)", "llama3-8b-8192": "Llama 3 8B (Balanced)", "llama3-70b-8192": "Llama 3 70B (Powerful)", "mixtral-8x7b-32768": "Mixtral 8x7B (Comprehensive)" } selected_model = st.sidebar.selectbox( "Select AI model:", list(model_options.keys()), format_func=lambda x: model_options[x], index=0 ) # Advanced options with st.sidebar.expander("Advanced Options"): temperature = st.slider("Temperature", min_value=0.0, max_value=1.0, value=0.2, step=0.1, help="Lower values make responses more deterministic, higher values more creative") show_reasoning = st.checkbox("Show AI reasoning steps", value=True, help="Display the AI's step-by-step reasoning process") # Initialize LLM if API key is provided if not groq_api_key: st.info("Please add your Groq API key in the sidebar to continue") st.sidebar.info("Don't have an API key? Sign up at [console.groq.com](https://console.groq.com)") # Example problem display st.markdown("### Example Problem") st.markdown(""" ``` I have 5 bananas and 7 grapes. I eat 2 bananas and give away 3 grapes. Then I buy a dozen apples and 2 packs of blueberries. Each pack of blueberries contains 25 berries. How many total pieces of fruit do I have at the end? ``` """) st.stop() # Initialize LLM try: llm = ChatGroq( model=selected_model, groq_api_key=groq_api_key, temperature=temperature, streaming=True ) except Exception as e: st.error(f"Error initializing the AI model: {str(e)}") st.stop() # Initialize tools def setup_tools(): """Initialize and return tools for the agent""" # Wikipedia tool wiki_wrapper = WikipediaAPIWrapper(top_k_results=2) wiki_tool = WikipediaQueryRun(api_wrapper=wiki_wrapper) # ArXiv tool for academic papers arxiv_wrapper = ArxivAPIWrapper(top_k_results=1) arxiv_tool = ArxivQueryRun(api_wrapper=arxiv_wrapper) # DuckDuckGo search tool search_tool = DuckDuckGoSearchRun() # Math calculation tool llm_math_chain = LLMMathChain.from_llm(llm=llm) calculator = Tool( func=llm_math_chain.run, name="Calculator", description="A tool for performing mathematical calculations. Input only mathematical expressions." ) # Reasoning tool for detailed explanations prompt = """ You're an expert mathematics teacher. Solve the following problem step by step: {question} First, identify what information is given and what is being asked. Then, lay out a clear strategy for solving the problem. Show your work carefully, with each step clearly labeled. Provide a final answer with appropriate units if applicable. Your solution: """ prompt_template = PromptTemplate( input_variables=["question"], template=prompt ) chain = LLMChain(llm=llm, prompt=prompt_template) reasoning_tool = Tool( name="MathReasoning", func=chain.run, description="A tool for solving math problems step-by-step with detailed explanations." ) return [wiki_tool, arxiv_tool, search_tool, calculator, reasoning_tool] # Set up the agent def initialize_math_agent(tools): """Initialize the math problem solving agent""" system_message = SystemMessage(content=""" You are an expert mathematics tutor and problem solver. Your goal is to: 1. Solve mathematical problems accurately 2. Provide clear, step-by-step explanations 3. Use the appropriate tools for calculations and information gathering 4. Organize your answers in a structured format with headings 5. Include formulas and equations where relevant For math problems, always show your work and explain your thinking. For information queries, cite your sources where appropriate. """) return initialize_agent( tools=tools, llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=show_reasoning, handle_parsing_errors=True, system_message=system_message, early_stopping_method="generate" ) # Initialize chat session state if "messages" not in st.session_state: st.session_state["messages"] = [ {"role": "assistant", "content": "Hi, I'm your Math Problem Solver! Ask me any math question or problem, and I'll solve it step-by-step."} ] # Display chat history for msg in st.session_state.messages: st.chat_message(msg["role"]).write(msg['content']) # Example problems for the user to try example_problems = [ "Solve for x: 2x + 5 = 15", "Find the area of a circle with radius 4 cm", "If a train travels at 60 mph and takes 3 hours to reach its destination, how far did it travel?", "I have 5 bananas and 7 grapes. I eat 2 bananas and give away 3 grapes. Then I buy a dozen apples and 2 packs of blueberries. Each pack contains 25 berries. How many total pieces of fruit do I have at the end?" ] # User input area with tabs for different input methods tab1, tab2 = st.tabs(["Enter Your Question", "Try Examples"]) with tab1: question = st.text_area( "Type your math problem or question:", placeholder="Enter your math problem here...", height=100 ) solve_button = st.button("Solve Problem", type="primary") with tab2: st.write("Select an example problem:") for i, example in enumerate(example_problems): if st.button(f"Example {i+1}", key=f"example_{i}"): question = example solve_button = True st.session_state.messages.append({"role": "user", "content": question}) st.experimental_rerun() # Process the request when button is clicked if solve_button and question: # Add user message to chat st.session_state.messages.append({"role": "user", "content": question}) st.chat_message("user").write(question) # Initialize tools and agent tools = setup_tools() assistant_agent = initialize_math_agent(tools) # Generate response with callback handler for streaming with st.chat_message("assistant"): st_cb = StreamlitCallbackHandler(st.container(), expand_new_thoughts=show_reasoning) try: response = assistant_agent.run(question, callbacks=[st_cb]) st.write(response) # Add assistant response to chat st.session_state.messages.append({'role': 'assistant', "content": response}) except Exception as e: error_msg = f"Error generating response: {str(e)}" st.error(error_msg) st.session_state.messages.append({'role': 'assistant', "content": error_msg}) # Add footer st.sidebar.markdown("---") st.sidebar.markdown("### About") st.sidebar.info( "This app uses Groq's AI models to solve math problems " "and provide step-by-step explanations. It can handle a wide range " "of mathematical topics from basic arithmetic to advanced calculus." ) st.sidebar.markdown("### Feedback") st.sidebar.markdown("[Report an issue](https://github.com/yourusername/math-problem-solver/issues)")