jojortz's picture
add initial llm4research app
e874a08
raw
history blame
6.63 kB
import gradio as gr
import pandas as pd
from extract_answer import extract_endpoint_llama
from generate_answers_matrix import generate_answers
example_queries = [
"What is the size, shape, and energy (watt hour) or capacity (Amp hour) of battery discussed in the paper?",
"What specific mechanical testing methods were used to quantify strength?",
"What parameters they used to quantify the benefit of their individual design (mass saving, increased run time, etc.)?",
"What material chemistry combination (on the anode, cathode, separator, and electrolyte) was used in these papers?",
"What kind of end use application they targeted?",
]
MAX_CATEGORIES = 10
def change_button(text):
if len(text) > 0:
return gr.Button(interactive=True)
else:
return gr.Button(interactive=False)
def generate_category_btn(cluster_output):
unique_categories = set()
for item in cluster_output:
unique_categories.update(item["categories"])
update_show = [gr.Button(visible=True, value=w) for w in unique_categories]
update_hide = [
gr.Button(visible=False, value="")
for _ in range(MAX_CATEGORIES - len(unique_categories))
]
return update_show + update_hide
def add_query(this_query, query_list):
if not query_list:
query_list = [this_query]
elif this_query not in query_list:
query_list.append(this_query)
df = pd.DataFrame(query_list, columns=["Queries"])
return query_list, df
def reset_queries():
return [], pd.DataFrame(columns=["Queries"])
btn_list = []
with gr.Blocks() as app:
gr.Markdown(
"""
# Paper Query Matrix
This app extracts text from papers and then searches for relevant excerpts based on user queries.
### Input
1. A group of research papers that you want to run the queries on.
1. Queries that you would like to know about these papers.
### Output
Table containing the relevant excerpts from the papers for each of the queries.
# 1. Upload + Extract
First, upload the papers you want to analyze. Currently, we only support PDFs. Once they're uploaded, you can extract the text data from the papers.
"""
)
file_upload = gr.Files()
extract_btn = gr.Button("Extract", interactive=False)
with gr.Tab(label="Table"):
extract_df = gr.Dataframe(
datatype="markdown", column_widths=[100, 400], wrap=True
)
with gr.Tab(label="JSON"):
extract_output = gr.JSON(label="Extract Output")
gr.Markdown(
"""
----------------
# 2. Create Queries
Enter a the queries that you would like to know about these papers. This will search the papers to find the most relevant excerpts.
"""
)
gr.Markdown(
"""
### Input
"""
)
query = gr.Textbox(
label="Query", value=example_queries[1], lines=3, placeholder="Enter a query"
)
add_query_btn = gr.Button("Add Query", interactive=False)
gr.Markdown(
"""
You can also select some example queries below.
"""
)
with gr.Row():
q0_btn = gr.Button(example_queries[0], interactive=False)
q1_btn = gr.Button(example_queries[1], interactive=False)
q2_btn = gr.Button(example_queries[2], interactive=False)
q3_btn = gr.Button(example_queries[3], interactive=False)
q4_btn = gr.Button(example_queries[4], interactive=False)
gr.Markdown(
"""
### Output
"""
)
with gr.Tab(label="Queries Table"):
query_df = gr.Dataframe(
datatype="markdown", column_widths=[100, 100, 300], wrap=True
)
with gr.Tab(label="JSON"):
query_output = gr.JSON(label="Queries")
reset_query_btn = gr.Button("Clear Queries", interactive=False)
gr.Markdown(
"""
----------------
# 3. Extract Answers
Gather the relevant excerpts from each of the papers
"""
)
with gr.Row():
with gr.Column():
gr.Markdown(
"""
### Input
"""
)
generate_answers_btn = gr.Button("Extract Answers", interactive=False)
gr.Markdown(
"""
### Answer Matrix
"""
)
with gr.Tab(label="Output Table"):
answers_df = gr.Dataframe(
datatype="markdown", column_widths=[100, 100, 300], wrap=True
)
with gr.Tab(label="JSON"):
answers_output = gr.JSON(label="Answer Output")
# Event handlers
file_upload.change(fn=change_button, inputs=[file_upload], outputs=[extract_btn])
extract_output.change(
fn=change_button, inputs=[extract_output], outputs=[add_query_btn]
)
extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q0_btn])
extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q1_btn])
extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q2_btn])
extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q3_btn])
extract_output.change(fn=change_button, inputs=[extract_output], outputs=[q4_btn])
extract_output.change(
fn=change_button, inputs=[extract_output], outputs=[reset_query_btn]
)
extract_btn.click(
fn=extract_endpoint_llama,
inputs=[file_upload],
outputs=[extract_output, extract_df],
)
q0_btn.click(
fn=add_query,
inputs=[q0_btn, query_output],
outputs=[query_output, query_df],
)
q1_btn.click(
fn=add_query,
inputs=[q1_btn, query_output],
outputs=[query_output, query_df],
)
q2_btn.click(
fn=add_query,
inputs=[q2_btn, query_output],
outputs=[query_output, query_df],
)
q3_btn.click(
fn=add_query,
inputs=[q3_btn, query_output],
outputs=[query_output, query_df],
)
q4_btn.click(
fn=add_query,
inputs=[q4_btn, query_output],
outputs=[query_output, query_df],
)
add_query_btn.click(
fn=add_query,
inputs=[query, query_output],
outputs=[query_output, query_df],
)
reset_query_btn.click(
fn=reset_queries,
inputs=[],
outputs=[query_output, query_df],
)
query_output.change(
fn=change_button, inputs=[query_output], outputs=[generate_answers_btn]
)
generate_answers_btn.click(
fn=generate_answers,
inputs=[extract_output, query_output],
outputs=[answers_output, answers_df],
# api_name="cluster",
)
if __name__ == "__main__":
app.launch()