import os import gradio as gr from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_chroma import Chroma from langchain_groq import ChatGroq from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser embeddings=HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") llm=ChatGroq(model="llama-3.3-70b-versatile",temperature=0) prompt=ChatPromptTemplate.from_template(""" Answer only from the supplied context. Context: {context} Question: {question} """) chain=prompt|llm|StrOutputParser() def ask(files,question,chunk_size,overlap,k): docs=[] for f in files: docs.extend(PyPDFLoader(f.name).load()) splitter=RecursiveCharacterTextSplitter(chunk_size=int(chunk_size),chunk_overlap=int(overlap)) chunks=splitter.split_documents(docs) db=Chroma.from_documents(chunks,embeddings) retrieved=db.as_retriever(search_kwargs={"k":int(k)}).invoke(question) context="\n\n".join(d.page_content for d in retrieved) answer=chain.invoke({"context":context,"question":question}) sources="\n".join(f"{d.metadata.get('source')} | Page {d.metadata.get('page')}" for d in retrieved) return answer,sources gr.Interface( fn=ask, inputs=[ gr.File(file_count="multiple",file_types=[".pdf"]), gr.Textbox(label="Question"), gr.Slider(300,1500,value=800), gr.Slider(0,300,value=150), gr.Slider(1,10,value=4,step=1) ], outputs=[gr.Textbox(label="Answer"),gr.Textbox(label="Sources")], title="Document QA using Groq").launch()