Spaces:
Running
on
Zero
Running
on
Zero
| import gradio as gr | |
| import tempfile | |
| import os | |
| import fitz # PyMuPDF | |
| import uuid | |
| from middleware import Middleware | |
| from rag import Rag | |
| rag = Rag() | |
| def generate_uuid(state): | |
| # Check if UUID already exists in session state | |
| if state["user_uuid"] is None: | |
| # Generate a new UUID if not already set | |
| state["user_uuid"] = str(uuid.uuid4()) | |
| return state["user_uuid"] | |
| class PDFSearchApp: | |
| def __init__(self): | |
| self.indexed_docs = {} | |
| self.current_pdf = None | |
| def upload_and_convert(self, state, file, max_pages): | |
| id = generate_uuid(state) | |
| if file is None: | |
| return "No file uploaded" | |
| print(f"Uploading file: {file.name}, id: {id}") | |
| try: | |
| self.current_pdf = file.name | |
| middleware = Middleware(id, create_collection=True) | |
| pages = middleware.index(pdf_path=file.name, id=id, max_pages=max_pages) | |
| self.indexed_docs[id] = True | |
| return f"Uploaded and extracted {len(pages)} pages" | |
| except Exception as e: | |
| return f"Error processing PDF: {str(e)}" | |
| def search_documents(self, state, query, num_results=1): | |
| print(f"Searching for query: {query}") | |
| id = generate_uuid(state) | |
| if not self.indexed_docs[id]: | |
| print("Please index documents first") | |
| return "Please index documents first", "--" | |
| if not query: | |
| print("Please enter a search query") | |
| return "Please enter a search query", "--" | |
| try: | |
| middleware = Middleware(id, create_collection=False) | |
| search_results = middleware.search([query])[0] | |
| page_num = search_results[0][1] + 1 | |
| print(f"Retrieved page number: {page_num}") | |
| img_path = f"pages/{id}/page_{page_num}.png" | |
| print(f"Retrieved image path: {img_path}") | |
| rag_response = rag.get_answer_from_gemini(query, [img_path]) | |
| return img_path, rag_response | |
| except Exception as e: | |
| return f"Error during search: {str(e)}", "--" | |
| def create_ui(): | |
| app = PDFSearchApp() | |
| with gr.Blocks() as demo: | |
| state = gr.State(value={"user_uuid": None}) | |
| gr.Markdown("# Colpali Milvus Multimodal RAG Demo") | |
| gr.Markdown("This demo showcases how to use [Colpali](https://github.com/illuin-tech/colpali) embeddings with [Milvus](https://milvus.io/) and utilizing Gemini/OpenAI multimodal RAG for pdf search and Q&A. Blog at https://saumitra.me/2024/2024-11-15-colpali-milvus-rag/") | |
| with gr.Tab("Upload PDF"): | |
| with gr.Column(): | |
| file_input = gr.File(label="Upload PDF") | |
| max_pages_input = gr.Slider( | |
| minimum=1, | |
| maximum=100, | |
| value=20, | |
| step=10, | |
| label="Max pages to extract and index" | |
| ) | |
| status = gr.Textbox(label="Indexing Status", interactive=False) | |
| with gr.Tab("Query"): | |
| with gr.Column(): | |
| query_input = gr.Textbox(label="Enter query") | |
| # num_results = gr.Slider( | |
| # minimum=1, | |
| # maximum=10, | |
| # value=5, | |
| # step=1, | |
| # label="Number of results" | |
| # ) | |
| search_btn = gr.Button("Query") | |
| llm_answer = gr.Textbox(label="RAG Response", interactive=False) | |
| images = gr.Image(label="Top page matching query") | |
| # Event handlers | |
| file_input.change( | |
| fn=app.upload_and_convert, | |
| inputs=[state, file_input, max_pages_input], | |
| outputs=[status] | |
| ) | |
| search_btn.click( | |
| fn=app.search_documents, | |
| inputs=[state, query_input], | |
| outputs=[images, llm_answer] | |
| ) | |
| return demo | |
| if __name__ == "__main__": | |
| demo = create_ui() | |
| demo.launch() | |