Spaces:
Sleeping
Sleeping
File size: 3,282 Bytes
573a91c 5e7d66d 573a91c 2e7fddb 573a91c 2e7fddb 573a91c 7b40abc 573a91c f73409e 573a91c f73409e 573a91c 363044b d799db8 877e6c6 d799db8 877e6c6 d799db8 877e6c6 d799db8 877e6c6 573a91c f7e42e2 573a91c f7e42e2 573a91c f7e42e2 fdbee17 f7e42e2 573a91c f7e42e2 573a91c f7e42e2 573a91c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | import os
import zipfile
import gradio as gr
from langchain_openai import ChatOpenAI
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# Unzip vector DB if not already extracted
if not os.path.exists("geometry_chroma"):
with zipfile.ZipFile("geometry_chroma.zip", 'r') as zip_ref:
zip_ref.extractall(".")
# Load vector DB
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectordb = Chroma(persist_directory="geometry_chroma", embedding_function=embedding_model)
retriever = vectordb.as_retriever()
# Set OpenAI key (use Secrets or .env later)
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(model_name="gpt-4.1", temperature=0.2)
# ✅ Prompt templates
templates = {
"flashcard": PromptTemplate(
input_variables=["context", "query"],
template="""
{context}
Create 5 flashcards based on the topic: "{query}"
Each flashcard should include:
- A clear question
- A short answer
Focus on high school geometry understanding.
"""
),
"lesson plan": PromptTemplate(
input_variables=["context", "query"],
template="""
Given the following retrieved SOL text:
{context}
Generate a Geometry lesson plan based on: "{query}"
Include:
1. Simple explanation of the concept.
2. Real-world example.
3. Engaging class activity.
Be concise and curriculum-aligned for high school.
"""
),
"worksheet": PromptTemplate(
input_variables=["context", "query"],
template="""
{context}
Create a student worksheet for: "{query}"
Include:
- Concept summary
- A worked example
- 3 practice problems
"""
),
"proofs": PromptTemplate(
input_variables=["context", "query"],
template="""
{context}
Generate a proof-focused geometry lesson plan for: "{query}"
Include:
- Student-friendly explanation
- Real-world connection
- One short class activity
"""
),
"general question": PromptTemplate(
input_variables=["context", "query"],
template="""
You are a Virginia Geometry Standards of Learning (SOL) assistant.
Given the following SOL content:
{context}
Identify the correct SOL standard code (like G.RLT.1 or G.TR.2) that best addresses the following question: "{query}"
Only return the SOL code and a brief explanation why it matches.
"""
)
}
def generate_output(prompt_type, query):
docs = retriever.get_relevant_documents(query)
context = "\n\n".join([doc.page_content for doc in docs])
chain = LLMChain(llm=llm, prompt=templates[prompt_type])
return chain.run({"context": context, "query": query})
# ✅ Gradio UI
with gr.Blocks() as demo:
gr.Markdown("# 📐 Geometry Teaching Assistant")
with gr.Row():
query = gr.Textbox(label="Enter a geometry topic")
prompt_type = gr.Dropdown(
["general question", "lesson plan", "worksheet", "proofs", "flashcard"],
value="flashcard",
label="Prompt Type"
)
output = gr.Textbox(label="Generated Output", lines=12, interactive=True)
btn = gr.Button("Generate")
btn.click(fn=generate_output, inputs=[prompt_type, query], outputs=output)
demo.launch()
|