CVchat / app.py
Aitor's picture
Working with examples
8c871de
raw
history blame
2.58 kB
import os
import gradio as gr
import requests
from langchain.chains import RetrievalQA
from langchain.document_loaders import PDFMinerLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.llms import OpenAI
def set_openai_key(raw_key):
# Check if the API is valid
headers = {"Authorization": f"Bearer {raw_key}"}
response = requests.get("https://api.openai.com/v1/engines", headers=headers)
if response.status_code != 200:
raise gr.Error("API key is not valid. Check the key and try again.")
os.environ["OPENAI_API_KEY"] = raw_key
return gr.File.update(interactive=True), gr.Button.update(interactive=True)
def create_langchain(pdf_object):
loader = PDFMinerLoader(pdf_object.name)
index_creator = VectorstoreIndexCreator()
docsearch = index_creator.from_loaders([loader])
chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=docsearch.vectorstore.as_retriever(),
input_key="question",
verbose=True,
return_source_documents=True,
)
return chain, gr.Button.update(interactive=True)
def ask_question(chain, question_text):
return chain({"question": question_text})["result"]
with gr.Blocks() as demo:
# Sate objects
chain_state = gr.State()
# Layout
oai_token = gr.Textbox(
label="OpenAI Token",
placeholder="Lm-iIas452gaw3erGtPar26gERGSA5RVkFJQST23WEG524EWEl",
)
pdf_object = gr.File(
label="Upload your CV in PDF format",
file_count="single",
type="file",
interactive=False,
)
gr.Examples(
examples=[
os.path.join(os.path.abspath(""), "sample_data", "CV_AITOR_MIRA.pdf")
],
inputs=pdf_object,
label="Example CV",
)
create_chain_btn = gr.Button(value="Create CVchat", interactive=False)
question_placeholder = """Enumerate the candidate's top 5 hard skills and rate them by importance from 0 to 5.
Example:
- Algebra 5/5"""
question_box = gr.Textbox(label="Question", value=question_placeholder)
qa_button = gr.Button(value="Submit question", interactive=False)
# Actions
oai_token.change(
set_openai_key, inputs=oai_token, outputs=[pdf_object, create_chain_btn]
)
lchain = create_chain_btn.click(
create_langchain, inputs=pdf_object, outputs=[chain_state, qa_button]
)
qa_button.click(
ask_question,
inputs=[chain_state, question_box],
outputs=gr.Textbox(label="Answer"),
)
demo.launch(debug=True)