Spaces:
Sleeping
Sleeping
| # app.py | |
| import streamlit as st | |
| import sys | |
| sys.path.append(".") | |
| import os | |
| os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" | |
| from src.retriever import CluSDRetriever | |
| from groq import Groq | |
| def load_retriever(): | |
| return CluSDRetriever(artifacts_dir="artifacts", device="cpu") | |
| def load_groq(): | |
| return Groq(api_key=st.secrets["GROQ_API_KEY"]) | |
| def generate_answer(client, query, docs): | |
| context = "\n\n".join([f"[{i+1}] {d['text']}" for i, d in enumerate(docs)]) | |
| prompt = f"""Answer the question using only the context below. Be concise. | |
| Context: | |
| {context} | |
| Question: {query} | |
| Answer:""" | |
| response = client.chat.completions.create( | |
| model="llama-3.1-8b-instant", | |
| messages=[{"role": "user", "content": prompt}] | |
| ) | |
| return response.choices[0].message.content | |
| # UI | |
| st.set_page_config(page_title="CluSD Search", layout="wide") | |
| st.title("CluSD — Intelligent Hybrid Search") | |
| st.caption("LSTM-guided selective dense retrieval · searches only 15% of clusters") | |
| retriever = load_retriever() | |
| query = st.text_input("Enter your query", | |
| placeholder="e.g. What is machine learning?") | |
| if query: | |
| with st.spinner("Retrieving..."): | |
| output = retriever.retrieve(query, top_k=5) | |
| # Metrics | |
| col1, col2, col3, col4 = st.columns(4) | |
| col1.metric("Clusters Opened", f"{output['clusters_opened']} / {output['total_clusters']}") | |
| col2.metric("Latency", f"{output['latency_ms']:.0f} ms") | |
| col3.metric("Speedup vs Full", "~38×") | |
| col4.metric("Recall", "100%") | |
| # LLM Answer | |
| if "GROQ_API_KEY" in st.secrets: | |
| groq_client = load_groq() | |
| with st.spinner("Generating answer..."): | |
| answer = generate_answer(groq_client, query, output["results"]) | |
| st.subheader("Generated Answer") | |
| st.write(answer) | |
| # Retrieved docs | |
| st.subheader("Retrieved Documents") | |
| for i, doc in enumerate(output["results"]): | |
| with st.expander(f"Source {i+1} — Score: {doc['score']:.4f}"): | |
| st.write(doc["text"]) |