import os from dotenv import load_dotenv from gradio.components import upload_button from llama_index.llms.groq import Groq from llama_index.llms.openai import OpenAI from llama_index.core import Settings from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.core.node_parser import SentenceSplitter from llama_parse import LlamaParse from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from llama_index.core.retrievers import VectorIndexRetriever from llama_index.core import get_response_synthesizer from llama_index.core.query_engine import RetrieverQueryEngine from llama_index.core.postprocessor import SimilarityPostprocessor #from llama_index.embeddings.huggingface import HuggingFaceEmbedding import gradio as gr import shutil load_dotenv() OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') #GROQ_API_KEY = os.getenv('GROQ_API_KEY') LLAMAINDEX_API_KEY = os.getenv('LLAMAINDEX_API_KEY') # llm = Groq(model="llama-3.1-70b-versatile", api_key=GROQ_API_KEY) llm = OpenAI(model="gpt-4o-mini",api_key = OPENAI_API_KEY) # response = llm.complete("Explain the importance of low latency LLMs") # response.text Settings.llm = llm # set up embedding model # embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5") embed_model = OpenAIEmbedding() Settings.embed_model = embed_model # create splitter splitter = SentenceSplitter(chunk_size=10000, chunk_overlap=100) Settings.transformations = [splitter] def upload_file(file_ls): try: shutil.rmtree('./data') except: pass UPLOAD_FOLDER = './data' if not os.path.exists(UPLOAD_FOLDER): os.mkdir(UPLOAD_FOLDER) for file in file_ls: shutil.copy(file, UPLOAD_FOLDER) gr.Info("File uploaded") def process_documents(): # create parser parser = LlamaParse( api_key=LLAMAINDEX_API_KEY, result_type="markdown", # "markdown" and "text" are available verbose=True, ) filename_fn = lambda filename: {"file_name": filename} required_exts = [".pdf",".docx"] file_extractor = {".pdf": parser} reader = SimpleDirectoryReader( input_dir="./data", file_extractor=file_extractor, required_exts=required_exts, recursive=True, file_metadata=filename_fn ) documents = reader.load_data() len_docs = len(documents) print("index creating with `%d` documents", len(documents)) global index index = VectorStoreIndex.from_documents(documents, embed_model=embed_model, transformations=[splitter]) index.storage_context.persist(persist_dir="./vectordb") return f"Processed {len_docs} documents successfully.{len_docs}" def query_index(query_input): # set up retriever retriever = VectorIndexRetriever( index=index, similarity_top_k = 15, #vector_store_query_mode="mmr", #vector_store_kwargs={"mmr_threshold": 0.4} ) # set up response synthesizer # response_synthesizer = get_response_synthesizer() # setting up query engine query_engine = RetrieverQueryEngine( retriever = retriever, node_postprocessors=[SimilarityPostprocessor(similarity_cutoff=0.53)], response_synthesizer=get_response_synthesizer(response_mode="tree_summarize",verbose=True) ) # print(query_engine.get_prompts()) output = query_engine.query(query_input) return output.response # source_nodes_list = output.source_nodes # Gradio interface with gr.Blocks() as demo: gr.Markdown("# RAG with Llamaindex") upload_button = gr.UploadButton("Click to upload a file", file_count="multiple") upload_button.upload(upload_file, upload_button) # File upload interface # with gr.Row(): # docs = gr.Files(label="Upload Documents", file_types=[".txt", ".pdf"]) # Process button process_button = gr.Button("Process Documents") # Output for document processing process_output = gr.Textbox(label="Processing Output") # Query interface query_input = gr.Textbox(label="Enter your query") query_button = gr.Button("Submit Query") query_output = gr.Textbox(label="Response") # Create Gradio interface for document upload # upload_interface = gr.Interface( # fn=process_documents, # inputs=gr.inputs.File(file_count="multiple"), # outputs="text", # title="Upload Documents", # description="Upload text files to index them for querying." # ) # # Linking the processing function process_button.click(fn=process_documents, inputs=None, outputs=process_output) # Linking the query function query_button.click(fn=query_index, inputs=query_input, outputs=query_output) # Run the interface if __name__ == "__main__": demo.launch()