|
|
import streamlit as st |
|
|
import pickle |
|
|
import faiss |
|
|
import numpy as np |
|
|
from sentence_transformers import SentenceTransformer |
|
|
from groq import Groq |
|
|
import os |
|
|
|
|
|
|
|
|
GROQ_API_KEY = st.secrets["GROQ_API_KEY"] |
|
|
|
|
|
|
|
|
client = Groq(api_key=GROQ_API_KEY) |
|
|
|
|
|
|
|
|
embed_model = SentenceTransformer("all-MiniLM-L6-v2") |
|
|
|
|
|
|
|
|
@st.cache_resource |
|
|
def load_data(): |
|
|
with open("documents.pkl", "rb") as f: |
|
|
documents = pickle.load(f) |
|
|
index = faiss.read_index("docs.index") |
|
|
return documents, index |
|
|
|
|
|
documents, index = load_data() |
|
|
|
|
|
|
|
|
def retrieve(query, k=2): |
|
|
q_emb = embed_model.encode([query]) |
|
|
D, I = index.search(np.array(q_emb), k) |
|
|
return [documents[i]["text"] for i in I[0]] |
|
|
|
|
|
|
|
|
def rag_query(query): |
|
|
retrieved = retrieve(query) |
|
|
context = "\n".join(retrieved) |
|
|
completion = client.chat.completions.create( |
|
|
messages=[ |
|
|
{"role": "system", "content": "You are a helpful assistant."}, |
|
|
{"role": "user", "content": f"Context:\n{context}\n\nQuestion: {query}"} |
|
|
], |
|
|
model="llama-3.3-70b-versatile", |
|
|
) |
|
|
return completion.choices[0].message.content |
|
|
|
|
|
|
|
|
st.set_page_config(page_title="RAG with Groq", page_icon="π") |
|
|
st.title("π Simple RAG with Groq + SentenceTransformers") |
|
|
|
|
|
query = st.text_input("Ask a question:") |
|
|
|
|
|
if st.button("Submit") and query: |
|
|
with st.spinner("Thinking..."): |
|
|
answer = rag_query(query) |
|
|
st.subheader("Answer") |
|
|
st.write(answer) |
|
|
|
|
|
st.subheader("Retrieved context") |
|
|
for c in retrieve(query): |
|
|
st.markdown(f"- {c}") |
|
|
|