|
from datetime import datetime |
|
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader |
|
from llama_index.embeddings.huggingface import HuggingFaceEmbedding |
|
from llama_parse import LlamaParse |
|
from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI |
|
import os |
|
from dotenv import load_dotenv |
|
import gradio as gr |
|
|
|
|
|
load_dotenv() |
|
|
|
models = [ |
|
"mistralai/Mixtral-8x7B-Instruct-v0.1", |
|
"meta-llama/Meta-Llama-3-8B-Instruct", |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"mistralai/Mistral-7B-Instruct-v0.2", |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"tiiuae/falcon-7b-instruct", |
|
"google/flan-t5-xxl" |
|
|
|
|
|
] |
|
|
|
|
|
selected_model_name = models[0] |
|
|
|
|
|
parser = LlamaParse(api_key=os.getenv("LLAMA_INDEX_API"), result_type='markdown') |
|
|
|
file_extractor = { |
|
'.pdf': parser, |
|
'.docx': parser, |
|
'.doc': parser, |
|
'.txt': parser, |
|
'.csv': parser, |
|
'.xlsx': parser, |
|
'.pptx': parser, |
|
'.html': parser, |
|
|
|
|
|
|
|
|
|
|
|
'.jpg': parser, |
|
'.jpeg': parser, |
|
'.png': parser, |
|
|
|
|
|
|
|
|
|
|
|
|
|
'.webp': parser, |
|
'.svg': parser, |
|
} |
|
|
|
|
|
embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5") |
|
|
|
|
|
|
|
vector_index = None |
|
|
|
|
|
|
|
def load_files(file_path: str): |
|
try: |
|
global vector_index |
|
document = SimpleDirectoryReader(input_files=[file_path], file_extractor=file_extractor).load_data() |
|
vector_index = VectorStoreIndex.from_documents(document, embed_model=embed_model) |
|
print(f"Parsing done for {file_path}") |
|
filename = os.path.basename(file_path) |
|
return f"Ready to give response on {filename}" |
|
except Exception as e: |
|
return f"An error occurred: {e}" |
|
|
|
|
|
|
|
def set_model(selected_model): |
|
global selected_model_name |
|
selected_model_name = selected_model |
|
|
|
|
|
|
|
|
|
|
|
def respond(message, history): |
|
try: |
|
|
|
llm = HuggingFaceInferenceAPI( |
|
model_name=selected_model_name, |
|
token=os.getenv("TOKEN") |
|
) |
|
|
|
|
|
|
|
|
|
|
|
query_engine = vector_index.as_query_engine(llm=llm) |
|
bot_message = query_engine.query(message) |
|
|
|
print(f"\n{datetime.now()}:{selected_model_name}:: {message} --> {str(bot_message)}\n") |
|
return f"{selected_model_name}:\n{str(bot_message)}" |
|
except Exception as e: |
|
if str(e) == "'NoneType' object has no attribute 'as_query_engine'": |
|
return "Please upload a file." |
|
return f"An error occurred: {e}" |
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
file_input = gr.File(file_count="single", type='filepath') |
|
with gr.Row(): |
|
clear = gr.ClearButton() |
|
btn = gr.Button("Submit", variant='primary') |
|
output = gr.Text(label='Vector Index') |
|
model_dropdown = gr.Dropdown(models, label="Select Model", interactive=True) |
|
|
|
with gr.Column(scale=3): |
|
gr.ChatInterface( |
|
fn=respond, |
|
chatbot=gr.Chatbot(height=500), |
|
textbox=gr.Textbox(placeholder="Ask me questions on the uploaded document!", container=False, scale=7) |
|
) |
|
|
|
|
|
model_dropdown.change(fn=set_model, inputs=model_dropdown) |
|
btn.click(fn=load_files, inputs=file_input, outputs=output) |
|
clear.click(lambda: [None] * 2, outputs=[file_input, output]) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |