|
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 |
|
import markdowm as md |
|
import base64 |
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
llm_display_names = { |
|
"tiiuae/falcon-7b-instruct": "HundAI", |
|
"mistralai/Mixtral-8x7B-Instruct-v0.1": "Mixtral-8x7B", |
|
"meta-llama/Meta-Llama-3-8B-Instruct": "Meta-Llama-3", |
|
"mistralai/Mistral-7B-Instruct-v0.2": "Mistral-7B", |
|
} |
|
embed_models = [ |
|
"BAAI/bge-small-en-v1.5", |
|
"NeuML/pubmedbert-base-embeddings", |
|
"BAAI/llm-embedder", |
|
"BAAI/bge-large-en" |
|
] |
|
|
|
|
|
llm_reverse_mapping = {v: k for k, v in llm_display_names.items()} |
|
|
|
|
|
def set_llm_model(display_name): |
|
global selected_llm_model_name |
|
|
|
selected_llm_model_name = llm_reverse_mapping.get(display_name, display_name) |
|
print(f"Model selected: {selected_llm_model_name}") |
|
|
|
|
|
def respond(message, history): |
|
try: |
|
|
|
llm = HuggingFaceInferenceAPI( |
|
model_name=selected_llm_model_name, |
|
contextWindow=8192, |
|
maxTokens=1024, |
|
temperature=0.3, |
|
topP=0.9, |
|
frequencyPenalty=0.5, |
|
presencePenalty=0.5, |
|
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_llm_model_name}:: {message} --> {str(bot_message)}\n") |
|
return f"{selected_llm_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(theme=gr.themes.Soft(font=[gr.themes.GoogleFont("Roboto Mono")]), css='footer {visibility: hidden}') as demo: |
|
gr.Markdown("") |
|
with gr.Tabs(): |
|
with gr.TabItem("Introduction"): |
|
gr.Markdown(md.description) |
|
|
|
with gr.TabItem("Chatbot"): |
|
with gr.Accordion("IMPORTANT: READ ME FIRST", open=False): |
|
guid = gr.Markdown(md.guide) |
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
file_input = gr.File(file_count="single", type='filepath', label="Upload document") |
|
embed_model_dropdown = gr.Dropdown(embed_models, label="Select Embedding", interactive=True) |
|
with gr.Row(): |
|
btn = gr.Button("Submit", variant='primary') |
|
clear = gr.ClearButton() |
|
output = gr.Text(label='Vector Index') |
|
|
|
|
|
llm_model_dropdown = gr.Dropdown( |
|
list(llm_display_names.values()), |
|
label="Select LLM", |
|
interactive=True |
|
) |
|
|
|
with gr.Column(scale=3): |
|
gr.ChatInterface( |
|
fn=respond, |
|
chatbot=gr.Chatbot(height=500), |
|
show_progress='full', |
|
textbox=gr.Textbox(placeholder="Ask me any questions on the uploaded document!", container=False) |
|
) |
|
|
|
|
|
llm_model_dropdown.change(fn=set_llm_model, inputs=llm_model_dropdown) |
|
btn.click(fn=load_files, inputs=[file_input, embed_model_dropdown], outputs=output) |
|
clear.click(lambda: [None] * 3, outputs=[file_input, embed_model_dropdown, output]) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|