Spaces:
Sleeping
Sleeping
import gradio as gr | |
import base64 | |
import os | |
from openai import OpenAI | |
api_key = os.getenv('API_KEY') | |
base_url = os.getenv("BASE_URL") | |
client = OpenAI( | |
api_key=api_key, | |
base_url=base_url, | |
) | |
def extract_pdf_pypdf(pdf_dir): | |
import fitz | |
path = pdf_dir | |
try: | |
doc = fitz.open(path) | |
except: | |
print("can not read pdf") | |
return None | |
page_count = doc.page_count | |
file_content = "" | |
for page in range(page_count): | |
text = doc.load_page(page).get_text("text") | |
# 防止目录中包含References | |
file_content += text + "\n\n" | |
return file_content | |
def openai_api(messages): | |
try: | |
completion = client.chat.completions.create( | |
model="claude-3-5-sonnet-20240620", | |
messages=messages, | |
temperature=0.1, | |
max_tokens=8192, | |
# timeout=300, | |
stream=True | |
) | |
except Exception as ex: | |
print("api 出现如下异常%s" % ex) | |
return None | |
if completion: | |
try: | |
response_2_list = [chunk.choices[0].delta.content if chunk.choices[0].delta.content else "" for chunk in | |
completion] | |
print("response tokens:", len(response_2_list)) | |
response_2_content = ''.join(response_2_list) | |
return response_2_content | |
except Exception as ex: | |
print("第二轮 出现如下异常%s" % ex) | |
return None | |
else: | |
print("第二轮出现异常") | |
return None | |
def predict(input_text, pdf_file): | |
if pdf_file is None: | |
return "Please upload a PDF file to proceed." | |
file_content = extract_pdf_pypdf(pdf_file.name) | |
messages = [ | |
{ | |
"role": "system", | |
"content": "You are an expert in information extraction from scientific literature.", | |
}, | |
{"role": "user", "content": """Provided Text: | |
''' | |
{{""" + file_content + """}} | |
''' | |
""" + input_text} | |
] | |
extract_result = openai_api(messages) | |
return extract_result or "Too many users. Please wait a moment!" | |
def view_pdf(pdf_file, max_pages=3): | |
if pdf_file is None: | |
return "Please upload a PDF file to view." | |
try: | |
# Open the PDF file | |
doc = fitz.open(pdf_file.name) | |
# Only read up to `max_pages` pages to reduce size for large PDFs | |
preview_pdf = fitz.open() # Create an empty PDF for the preview | |
for page_num in range(min(max_pages, doc.page_count)): | |
preview_pdf.insert_pdf(doc, from_page=page_num, to_page=page_num) | |
# Save the preview as a temporary in-memory file | |
pdf_data = preview_pdf.tobytes() | |
# Encode as base64 for embedding in HTML | |
b64_data = base64.b64encode(pdf_data).decode('utf-8') | |
return f"<embed src='data:application/pdf;base64,{b64_data}' type='application/pdf' width='100%' height='700px' />" | |
except Exception as e: | |
print(f"Error displaying PDF: {e}") | |
return "Error displaying PDF. Please try re-uploading." | |
en_1 = """Could you please help me extract the information of 'title'/'journal'/'year'/'author'/'institution'/'email' from the previous content in a markdown table format? | |
If any of this information was not available in the paper, please replace it with the string `""`. If the property contains multiple entities, please use a list to contain. | |
""" | |
en_2 = """Could you please help me extract the information of 'title'/'journal'/'year'/'author'/'institution'/'email' from the previous content in a JSON format? | |
If any of this information was not available in the paper, please replace it with the string `""`. If the property contains multiple entities, please use a list to contain. | |
""" | |
examples = [[en_1], [en_2]] | |
with gr.Blocks(title="PaperExtractGPT") as demo: | |
gr.Markdown( | |
'''<p align="center"> | |
<h1 align="center"> Paper Extract GPT </h1> | |
<p> How to use: | |
<br> <strong>1</strong>: Upload your PDF. | |
<br> <strong>2</strong>: Click "View PDF" to preview it. | |
<br> <strong>3</strong>: Enter your extraction prompt in the input box. | |
<br> <strong>4</strong>: Click "Generate" to extract, and the extracted information will display below. | |
</p> | |
''' | |
) | |
with gr.Row(): | |
with gr.Column(): | |
gr.Markdown('## Upload PDF') | |
file_input = gr.File(label="Upload your PDF", type="filepath") | |
viewer_button = gr.Button("View PDF") | |
file_out = gr.HTML(label="PDF Preview") | |
with gr.Column(): | |
model_input = gr.Textbox(lines=7, placeholder='Enter your extraction prompt here', label='Input Prompt') | |
example = gr.Examples(examples=examples, inputs=model_input) | |
with gr.Row(): | |
gen = gr.Button("Generate") | |
clr = gr.Button("Clear") | |
outputs = gr.Markdown(label='Output', show_label=True, value="""| Title | Journal | Year | Author | Institution | Email | | |
|---------------------------------------------|--------------------|------|-----------------------------------------------|-------------------------------------------------------|-----------------------| | |
| Paleomagnetic Study of Deccan Traps from Jabalpur to Amarkantak, Central India | J. Geomag. Geoelectr. | 1973 | R. K. VERMA, G. PULLAIAH, G.R. ANJANEYULU, P. K. MALLIK | National Geophysical Research Institute, Hyderabad, and Indian School o f Mines, Dhanbad | "" | | |
""") | |
gen.click(fn=predict, inputs=[model_input, file_input], outputs=outputs) | |
clr.click(fn=lambda: [gr.update(value=""), gr.update(value="")], inputs=None, outputs=[model_input, outputs]) | |
viewer_button.click(view_pdf, inputs=file_input, outputs=file_out) | |
demo.launch() | |