Spaces:
Runtime error
Runtime error
import logging | |
import os | |
import gradio as gr | |
from langchain import OpenAI, HuggingFaceHub | |
from langchain.chains import ConversationalRetrievalChain | |
from langchain.document_loaders import PyPDFLoader | |
from langchain.embeddings import OpenAIEmbeddings, HuggingFaceEmbeddings | |
from langchain.text_splitter import CharacterTextSplitter | |
from langchain.vectorstores import Chroma | |
documents = [] | |
qa = None | |
def get_file(file): | |
try: | |
global documents | |
data = PyPDFLoader(file.name) | |
documents = data.load_and_split(CharacterTextSplitter(chunk_size=2000, chunk_overlap=0)) | |
except Exception as e: | |
logging.error(e, exc_info=True) | |
return "Failed to upload." | |
return "File Uploaded." | |
def model_configuration(model_name, api_key=None, hug_model=None, hug_token=None, temperature=0, max_length=512): | |
try: | |
embeddings, llm = None, None | |
if not documents: | |
return gr.update(value="Please upload correct PDF!", visible=True) | |
global qa | |
if model_name == "OpenAI": | |
os.environ["OPENAI_API_KEY"] = api_key or os.getenv("OPENAI_API_KEY") | |
embeddings = OpenAIEmbeddings() | |
llm = OpenAI(temperature=temperature, max_tokens=max_length) | |
elif model_name == "HuggingFace": | |
os.environ["HUGGINGFACEHUB_API_TOKEN"] = hug_token or os.getenv("HUGGINGFACE_API_KEY") | |
embeddings = HuggingFaceEmbeddings(model_name=hug_model, model_kwargs={'device': 'cpu'}) | |
llm = HuggingFaceHub(repo_id=hug_model, model_kwargs={"temperature": temperature, "max_length": max_length}) | |
if embeddings: | |
db = Chroma.from_documents(documents, embeddings) | |
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 2}) | |
qa = ConversationalRetrievalChain.from_llm(llm, chain_type="map_reduce", retriever=retriever, | |
return_source_documents=True, verbose=False) | |
except Exception as e: | |
logging.error(e, exc_info=True) | |
return gr.update(value="Error occurred!", visible=True) | |
return gr.update(value="Model Built", visible=True) | |
def response(msg, chat_history): | |
global qa | |
result = qa({"question": msg, "chat_history": map(tuple, chat_history)}) | |
final_resp = result.get("answer", "").strip() | |
chat_history.append((msg, final_resp)) | |
docs = result.get("source_documents") | |
return "", chat_history | |
with gr.Blocks() as demo: | |
with gr.Tab("PDF Ingestion") as pdf_input: | |
file = None | |
with gr.Column() as r1: | |
file = gr.File(file_types=[".pdf"]) | |
op_txt = gr.Label(value="", label="") | |
fl_btn = gr.Button("Upload & Ingest π") | |
fl_btn.click(get_file, inputs=[file], outputs=op_txt) | |
with gr.Tab("Select Model") as model: | |
model_name = gr.Dropdown( | |
["NA", "OpenAI", "HuggingFace"], | |
show_label=True, | |
label="Model Name", | |
multiselect=False, | |
value="NA" | |
) | |
with gr.Column(visible=False) as openai_config: | |
api_key = gr.Textbox(value="", label="OPENAI API KEY", placeholder="sk-...", visible=True, interactive=True, | |
type="password") | |
with gr.Column(visible=False) as huggy_config: | |
hug_model = gr.Dropdown(["google/flan-t5-xl"], | |
value="google/flan-t5-xl", multiselect=False) | |
hug_token = gr.Textbox(value="", placeholder="hf_...", interactive=True, type="password") | |
with gr.Accordion("Advance Settings", open=False, visible=False) as advance_settings: | |
temperature = gr.Slider(0, 1, label="Temperature") | |
max_length = gr.components.Number(value=512, label="Max Token Length") | |
def show_configuration(model_name): | |
match model_name: | |
case "OpenAI": | |
return { | |
openai_config: gr.update(visible=True), | |
huggy_config: gr.update(visible=False), | |
advance_settings: gr.update(visible=True) | |
} | |
case "HuggingFace": | |
return { | |
openai_config: gr.update(visible=False), | |
huggy_config: gr.update(visible=True), | |
advance_settings: gr.update(visible=True) | |
} | |
case _: | |
return { | |
openai_config: gr.update(visible=False), | |
huggy_config: gr.update(visible=False), | |
advance_settings: gr.update(visible=False) | |
} | |
model_name.change(show_configuration, inputs=[model_name], | |
outputs=[openai_config, huggy_config, advance_settings]) | |
model_updated = gr.Label("", show_label=False, visible=True) | |
btn = gr.Button("Configure Model π€") | |
btn.click(model_configuration, inputs=[model_name, api_key, hug_model, hug_token, temperature, max_length], | |
outputs=model_updated) | |
with gr.Tab("Q&A") as qna: | |
with gr.Column() as r: | |
chatbot = gr.Chatbot(show_label=True) | |
msg = gr.Textbox(placeholder="Ask Something") | |
clear = gr.Button("Clear") | |
msg.submit(response, [msg, chatbot], [msg, chatbot]) | |
clear.click(lambda: None, None, chatbot, queue=False) | |
if __name__ == "__main__": | |
demo.launch() | |