Harishkhawaja/Lexicon_Chatbot
0
1import streamlit as st2import fitz # PyMuPDF3import os4from sentence_transformers import SentenceTransformer5import faiss6from langchain.embeddings import HuggingFaceEmbeddings7from langchain.vectorstores import FAISS8from langchain.docstore.document import Document9from langchain.chains import RetrievalQA10from langchain.llms import Groq11from dotenv import load_dotenv12 13load_dotenv()14 15# CONFIG16EMBEDDING_MODEL_NAME = "all-MiniLM-L6-v2"17GROQ_API_KEY = os.getenv("GROQ_API_KEY")18GROQ_MODEL_NAME = "mixtral-8x7b-32768"19 20st.set_page_config(page_title="Lexicon - Policy Explainer", layout="centered")21 22st.markdown("<h1 style='text-align: center;'>📜 Lexicon: Policy Explainer Bot</h1>", unsafe_allow_html=True)23st.markdown("This app explains, summarizes, and highlights risks in large policy or T&C documents.")24 25uploaded_file = st.file_uploader("Upload PDF", type=["pdf"])26clipboard_input = st.text_area("Or paste policy text here", height=200)27 28if uploaded_file or clipboard_input:29 with st.spinner("Processing document..."):30 31 # Step 1: Extract Text32 def extract_text_from_pdf(file):33 doc = fitz.open(stream=file.read(), filetype="pdf")34 return " ".join(page.get_text() for page in doc)35 36 raw_text = extract_text_from_pdf(uploaded_file) if uploaded_file else clipboard_input37 38 # Step 2: Split and Embed39 sentences = raw_text.split(". ")40 model = SentenceTransformer(EMBEDDING_MODEL_NAME)41 embeddings = model.encode(sentences)42 43 # Step 3: Create Vector Store44 dimension = embeddings.shape[1]45 index = faiss.IndexFlatL2(dimension)46 index.add(embeddings)47 48 retriever = FAISS(embedding_function=lambda x: model.encode(x), index=index)49 documents = [Document(page_content=s) for s in sentences]50 retriever = FAISS.from_documents(documents, HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL_NAME)).as_retriever()51 52 # Step 4: LLM RAG53 llm = Groq(api_key=GROQ_API_KEY, model=GROQ_MODEL_NAME)54 qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)55 56 st.success("Document processed! You can now ask questions.")57 query = st.text_input("Ask a question about the document:")58 59 if query:60 with st.spinner("Generating answer..."):61 result = qa_chain.run(query)62 st.markdown("### 🧠 Answer:")63 st.markdown(result)64 65 if st.button("Suggest key risks"):66 risk_prompt = "List any risks or obligations a user should be aware of from this document."67 with st.spinner("Identifying risks..."):68 risk_result = qa_chain.run(risk_prompt)69 st.markdown("### ⚠️ Risks & Concerns:")70 st.markdown(risk_result)71 