|
import os |
|
import base64 |
|
import gradio as gr |
|
from gradio_client import Client |
|
|
|
MODEL_NAME = "QWEN" |
|
client_chat = os.environ.get("CHAT_URL") |
|
client_vl = os.environ.get("VL_URL") |
|
|
|
def read(filename): |
|
with open(filename) as f: |
|
data = f.read() |
|
return data |
|
|
|
SYS_PROMPT = read('system_prompt.txt') |
|
|
|
|
|
DESCRIPTION = ''' |
|
<div> |
|
<h1 style="text-align: center;">家庭医生demo</h1> |
|
<p>🩺一个帮助您分析症状和检验报告的家庭医生(AI诊疗助手)。</p> |
|
<p>🔎 选择您需要咨询的科室医生,在输入框中输入症状描述或者体检信息等;您也可以在图片框中上传检测报告图。</p> |
|
<p>🦕 请注意生成信息可能不准确,且不具备任何实际参考价值,如有需要请联系专业医生。</p> |
|
</div> |
|
''' |
|
|
|
|
|
css = """ |
|
h1 { |
|
text-align: center; |
|
display: block; |
|
} |
|
footer { |
|
display:none !important |
|
} |
|
""" |
|
|
|
|
|
LICENSE = '采用 ' + MODEL_NAME + ' 模型' |
|
|
|
|
|
|
|
|
|
def process_text(text_input, unit): |
|
client = Client(client_chat) |
|
client.predict( |
|
system=f" You are a experienced {unit} doctor AI assistant." + SYS_PROMPT, |
|
api_name="/modify_system_session" |
|
) |
|
response = client.predict( |
|
query=text_input, |
|
api_name="/model_chat" |
|
) |
|
return response[1] |
|
|
|
|
|
def encode_image_to_base64(image_input): |
|
buffered = io.BytesIO() |
|
image_input.save(buffered, format="JPEG") |
|
img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") |
|
return img_str |
|
|
|
def process_image(image_input, unit): |
|
if image_input is not None: |
|
print(image_input) |
|
with open(image_input, "rb") as f: |
|
base64_image = base64.b64encode(f.read()).decode("utf-8") |
|
client = Client(client_vl) |
|
|
|
prompt = f" You are a experienced {unit} doctor AI assistant." + SYS_PROMPT + "Help me understand what is in this picture and analysis." |
|
response = client.predict( |
|
base64_image, |
|
prompt, |
|
fn_index=0 |
|
) |
|
return response |
|
|
|
|
|
def main(text_input="", image_input=None, unit=""): |
|
if text_input and image_input is None: |
|
return process_text(text_input,unit) |
|
elif image_input is not None: |
|
return process_image(image_input,unit) |
|
|
|
with gr.Blocks(theme='shivi/calm_seafoam', css=css, title="家庭医生AI助手") as iface: |
|
with gr.Accordion(""): |
|
gr.Markdown(DESCRIPTION) |
|
unit = gr.Dropdown(label="🩺科室", value='中医科', elem_id="units", |
|
choices=["中医科", "内科", "外科", "妇产科", "儿科", \ |
|
"五官科", "男科", "皮肤性病科", "传染科", "精神心理科", \ |
|
"整形美容科", "营养科", "生殖中心", "麻醉医学科", "医学影像科", \ |
|
"骨科", "肿瘤科", "急诊科", "检验科"]) |
|
with gr.Row(): |
|
output_box = gr.Markdown(label="分析") |
|
with gr.Row(): |
|
image_input = gr.Image(type="filepath", label="上传图片") |
|
text_input = gr.Textbox(label="输入") |
|
with gr.Row(): |
|
submit_btn = gr.Button("🚀 确认") |
|
clear_btn = gr.ClearButton([output_box,image_input,text_input], value="🗑️ 清空") |
|
|
|
|
|
submit_btn.click(main, inputs=[text_input, image_input, unit], outputs=output_box) |
|
|
|
gr.Markdown(LICENSE) |
|
|
|
|
|
|
|
iface.queue().launch(show_api=False) |