from huggingface_hub import InferenceClient import os import sqlite3 import requests import fitz # PyMuPDF import faiss import numpy as np from sentence_transformers import SentenceTransformer import gradio as gr # Configure Hugging Face API URL and headers model_name = "meta-llama/Meta-Llama-3.1-8B-Instruct" huggingface_api_key = os.getenv("HUGGINGFACE_API_KEY") headers = {"Authorization": f"Bearer {huggingface_api_key}"} # Function to query Hugging Face model def query_huggingface(payload): response = requests.post(f"https://api-inference.huggingface.co/models/{model_name}", headers=headers, json=payload) return response.json() # Function to extract text from PDF def extract_text_from_pdf(pdf_file): text = "" pdf_document = fitz.open(stream=pdf_file.read(), filetype="pdf") for page_num in range(len(pdf_document)): page = pdf_document.load_page(page_num) text += page.get_text() return text # Initialize SQLite database def init_db(): conn = sqlite3.connect('storage_warehouse.db') c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS context ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, content TEXT ) ''') conn.commit() conn.close() # Add context to the database def add_context(name, content): conn = sqlite3.connect('storage_warehouse.db') c = conn.cursor() c.execute('INSERT INTO context (name, content) VALUES (?, ?)', (name, content)) conn.commit() conn.close() # Retrieve context from the database def get_context(): conn = sqlite3.connect('storage_warehouse.db') c = conn.cursor() c.execute('SELECT content FROM context') context = c.fetchall() conn.close() return [c[0] for c in context] # Function to create or update the FAISS index def update_faiss_index(): contexts = get_context() if len(contexts) == 0: return None, contexts embeddings = model.encode(contexts, convert_to_tensor=True) index = faiss.IndexFlatL2(embeddings.shape[1]) index.add(embeddings.cpu().numpy()) return index, contexts # Retrieve relevant context from the FAISS index def retrieve_relevant_context(index, contexts, query, top_k=5): if index is None or len(contexts) == 0: return [] query_embedding = model.encode([query], convert_to_tensor=True).cpu().numpy() distances, indices = index.search(query_embedding, top_k) relevant_contexts = [contexts[i] for i in indices[0]] return relevant_contexts # Initialize the database and FAISS model init_db() model = SentenceTransformer('all-MiniLM-L6-v2') faiss_index, context_list = update_faiss_index() # Gradio interface for chatbot def chatbot(question): relevant_contexts = retrieve_relevant_context(faiss_index, context_list, question) user_input = f"question: {question} context: {' '.join(relevant_contexts)}" response = query_huggingface({"inputs": user_input}) response_text = response[0].get("generated_text", "Sorry, I couldn't generate a response.") if isinstance(response, list) else response.get("generated_text", "Sorry, I couldn't generate a response.") return response_text # File upload function def upload_pdf(file): context = extract_text_from_pdf(file) add_context(file.name, context) global faiss_index, context_list faiss_index, context_list = update_faiss_index() return "PDF content added to context." # Gradio interface iface = gr.Interface( fn=chatbot, inputs=gr.Textbox(), outputs=gr.Textbox(), title="Storage Warehouse Customer Service Chatbot" ) file_upload = gr.Interface(fn=upload_pdf, inputs=gr.File(), outputs=gr.Textbox(), title="Upload PDF for Context") app = gr.TabbedInterface([iface, file_upload], ["Chatbot", "Upload PDF"]) app.launch(share=True)