flask部署千问qwen教程

本文介绍了一个使用FastAPI构建的应用,结合Pydantic和预训练的多模态模型(如Qwen-Qwen),实现在接收到病历信息后生成专业医学诊疗建议的功能。背景调度器确保定时执行。代码展示了如何构造请求、选择合适的提示模板以及调用模型进行对话。
摘要由CSDN通过智能技术生成
from fastapi import FastAPI
from pydantic import BaseModel

import time
import dispather
import uuid
import numpy as np
import random
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler(timezone='MST', job_defaults={'max_instances': 5})
# import torch
# from transformers import AutoTokenizer,AutoModelForCausalLM
# import os

# os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 默认使用0号显卡,避免Windows用户忘记修改该处
# device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# print(device)

# # 指定模型名称或路径
# qwen_model_name_or_path = "/home/weideshan/Qwen-Qwen-7B-Chat-Int4/"
# tokenizer = AutoTokenizer.from_pretrained(qwen_model_name_or_path, trust_remote_code=True)
# model = AutoModelForCausalLM.from_pretrained(qwen_model_name_or_path, device_map="auto",
#                                              trust_remote_code=True).eval()
# model.to(device)


app = FastAPI()

class DFRequest(BaseModel):
    request_str: str = ""
    key: str = ""

def get_prompt(request_code,ocr_res):

    # prompt_standard_1 ="从现在开始,你是医学领域的全学科专家,我会输入一段病历文本,如下###病历: {case_str}###请用中文帮我输出10条与病历中现患疾病相关的专业诊疗建议,并且用数字给每条建议添加序号,这些建议要具有针对性和专业性,不要过于笼统和宽泛,禁止出现药品名,禁止输出与医疗健康建议无关的任何内容。"
    # prompt_standard_2 = "我希望你充任医学领域的全学科专家,我需你用中文根据病历文本给出10条针对性的诊疗建议,病历如下###{case_str}###请用数字给每条建议前添加序号,禁止出现药品名,禁止输出与医疗健康建议无关的任何内容。"
    # prompt_standard_3 = "假设你是医学领域的专家,可以根据患者的病历给出相应的中文健康建议,现在有一个病历如下###{case_str}###,请针对该病历给出专业性的解读和分析并提供健康建议,禁止涉及药品名,不允许出现和病例无关的内容。"
    # prompt_standard_4 = "如果你是一位经验丰富临床经验的医学领域专家,这时有一个病历,如下###{case_str}###,我需要你用中文给出针对这个病历的健康建议和治疗方案,禁止涉及药品名,不要回答任何和病历描述不相关的语句。"
    # prompt_standard_5 = "现在你将扮演医学方面的权威人士,你可以根据患者的病历给出专业性的见解,假设现在有一个病历,如下###{case_str}###,请在禁止涉及药品名的情况下发挥你的主观能动性,用中文给出你认为专业的病历解读结果,解读不要出现任何和医生诊疗无关的内容。"
    # prompt_standard_6 = "如果你将有多年的临床诊疗经验,现在有一个病历,如下###{case_str}###,请根据以上病历文本内容先用中文一句话概括综合诊疗结论,并在下一段给出更多的诊疗建议。注意,不要过于笼统和宽泛,禁止出现药品名,更不要回答任何和病历无关的内容。"
    # prompt_standard_7 = "现在有一个病患的病历,如下###{case_str}###,请根据以上病历文本用中文总结出诊疗结果,并根据你总结出的诊疗方案,给出就有专业性和参考性的健康建议和治疗方案,禁止出现药品名,回答内容一定和医疗健康关系密切。"
    # prompt_standard_8 = "我希望你是一个经验丰富的医学专业人士,我希望你根据提供的病历用中文给出健康建议和治疗方案,现在病历如下###{case_str}###,在禁止出现药品名的情况下,给出医学领域专业人士可能的健康建议和方案,不允许出现和病历无关的内容。"
    # prompt_standard_9 = "如果现在有一个病历,如下###{case_str}###,在禁止出现药品名的情况下,用经丰富医生的口吻先用中文总结病历中的结论和一系列医学信息,然后根据总结出的信息,给出更多专业性的健康建议和诊疗方案,回答要和该病历内容强相关。"
    # prompt_standard_10 = "现在你是医学专家,假如有一个病例如下###{case_str}###请根据以上病历文本内容首先用一句中文概括综合诊疗问询结论,并在下一段给出更多的诊疗建议,不要过于笼统和宽泛,禁止出现药品名,不要返回任何和病情无关的描述。"
    # choiced_prompt = random.sample([prompt_standard_1,prompt_standard_2,prompt_standard_3,prompt_standard_4,prompt_standard_5,prompt_standard_6,prompt_standard_7,prompt_standard_8,prompt_standard_9,prompt_standard_10],1)[0].format(case_str=ocr_res)
    
    # prompt_standard_1 = "从现在开始,你是医学领域的全学科专家,请根据以下描述给出诊疗建议###病历:{case_str}###这些建议要具有针对性和专业性,不要过于笼统和宽泛,禁止出现药品名,禁止输出与医疗健康建议无关的任何内容。如果不是病情描述相关的内容,就不要给出建议。"
    prompt_standard_new = "<|im_start|>system\n你是医学领域的全学科专家,有一个病历编号!!!!!!{request_code}!!!!!!,请根据用户输入的病历信息,严格按固定格式输出以下5个信息:[可能的疾病名称(只允许输出疾病名称。如果输入文本中有诊断的疾病名称,则首先根据病情描述判断该诊断是否准确,如果输入文本中诊断的疾病有误或者未出现疾病名,则输出最可能的疾病)。\n诊断逻辑(在输入病历中出现的内容)。\n疾病科普(可以涉及生活方式和健康知识等)。\n注意事项。\n如需确诊该疾病需补充完善的辅助检查项。] 以上括号中的描述是输出结果的要求。以上输出结果禁止出现药品名,禁止输出与医疗健康建议无关的任何内容。<|im_end|>\n<|im_start|>user\n输入病历信息如下###{case_str}###<|im_end|>\n<|im_start|>assistant\n"    
    choiced_prompt =prompt_standard_new.format(request_code=request_code,case_str=ocr_res)
#    logger.info('使用的prompt为:{choiced_prompt}'.format(choiced_prompt = choiced_prompt))
#    advice = llm_advice(choiced_prompt)
    return choiced_prompt   
    
@app.post("/DFApi")
async def qwen(req: DFRequest):
    
    start_time = time.time()
    param = req.model_dump()
    prompt  = param.get('request_str')
    key  = param.get('key') if   param.get('key')  else str(uuid.uuid1()) 
    # response, history = model.chat(tokenizer, prompt, history=None)
    if not prompt and not key:
        return False
    prompt = get_prompt(key,prompt)
    # print("请求入参 : ",key,prompt)
    rest = dispather.add_data_to_queue(prompt)
    
    end_time = time.time()
    # print("执行的时间:  ",(end_time - start_time))
    return rest


  
@app.on_event("startup")
async def start_scheduler():
    # 添加定时任务,每10s执行一次
    scheduler.add_job(dispather.infer_excute, 'interval', seconds=10)
    # 创建调度器
    try:
        # 启动调度器
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        # 处理Ctrl+C等中断信号,关闭调度器
        scheduler.shutdown()


if __name__ == "__main__":
    import uvicorn
    uvicorn.run("DF_api:app", host="0.0.0.0", port=6078)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值