赞
踩
- 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。