首页 > 其他分享 >[本科项目实训] 行动模拟实现 与 FastAPI 对应交互-V0

[本科项目实训] 行动模拟实现 与 FastAPI 对应交互-V0

时间:2024-06-22 15:42:46浏览次数:11  
标签:FastAPI lines V0 prefix 实训 act path model data

to 2024 / 06 / 01

行动模拟

该项目拟通过大语言模型分析拆解人类描述的任务,自动的调用行动库进行执行并完成内容的汇报。因而需要针对任务对大模型进行微调(比如本项目使用的p-tuning v2),行动模拟即针对微调结果将大模型与行动库进行对接,模拟实际场景下的函数输入输出。

第一步,即加载微调后的大模型,可参考之前博客中给出的cli_demo.py:

# load raw model
tokenizer = AutoTokenizer.from_pretrained(model_path % model_name, trust_remote_code=True)
config = AutoConfig.from_pretrained(model_path % model_name, trust_remote_code=True)
config.pre_seq_len = pre_seq_len
model = AutoModel.from_pretrained(model_path % model_name, config=config, trust_remote_code=True)

# feed ptuning model
prefix_state_dict = torch.load(os.path.join(model_path % ptuning_checkpoint, "pytorch_model.bin"))
new_prefix_state_dict = {}
for k, v in prefix_state_dict.items():
    if k.startswith("transformer.prefix_encoder."):
        new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)

# model config
model = model.quantize(quantization_bit)
model = model.half().cuda()
model.transformer.prefix_encoder.float().cuda()
model.eval()

第二步,即设计大模型与行动库的交互步骤,这里根据场景要求给出五步:

  • 语言模型基于人类输入文本进行任务类型判定和拆解
  • 行动库接受参数并模拟对应任务反馈给语言模型结果
  • 语言模型基于结果进行简单分析并给出任务结果报告
  • 整合输出结果以 PDF 的格式展示为报告方便下载打印
  • 记录所有内容并反馈给后端,供前后端交互
def simulate(uid, prompt, options, params, history_formatted, chat_tmp_path):
    # init
    data_lines = []; act_img_path = None
    prefix = ["【系统】","【核心】"]; suffix = "\n\n"; key = "KEY"
    act_map = {"零":__act0, "壹":__act1, "贰":__act2}
    template = ["步骤#理解并基于输入拆分函数参数\*语音#%s",
                "步骤#基于函数调用结果进行总结\*结果#%s"]

    # step1: LLM response -> understand & split
    data_lines.append("%s正在与LLM语言核心交互%s" %  (prefix[0], suffix))
    response0, _ = model.chat(tokenizer, template[0] % prompt, history_formatted, 
        max_length=params['max_length'], top_p=params['top_p'], temperature=params['temperature'])
    
    # WARN:TEST
    response0 = response0 + "KEY壹;济南"
    
    data_lines.append("%s%s%s" %  (prefix[1], response0, suffix))

    # step2: text split & action select( N=3 )
    kidx_st = response0.find(key)
    uf_flag = kidx_st==-1
    if not uf_flag:
        kidx_ed = response0.find(";", kidx_st)
        uf_flag = kidx_ed==-1
    if uf_flag:
        data_lines.append("%sLLM语言核心解析函数失败%s" %  (prefix[0], suffix))
    else:
        act_info, act_response, act_text, act_img_path = act_map[response0[kidx_st+3:kidx_ed]](response0[kidx_ed:])
        data_lines.append("%s%s%s" %  (prefix[0], act_info, suffix))
        data_lines.append("%s%s%s" %  (prefix[0], "默认查询日期:" + str(datetime.date.today()), suffix))
        data_lines.append("%s%s%s" %  (prefix[0], act_response, suffix))

    # step4: LLM response -> analysis
        response1, _ = model.chat(tokenizer, template[1] % act_response, history_formatted, 
            max_length=params['max_length'], top_p=params['top_p'], temperature=params['temperature'])
        data_lines.append("%s%s%s" %  (prefix[1], response1, suffix))

    # step4: pdf generate
        if __gen_pdf(uid, act_text):
            data_lines.append("%s任务报告输出完成%s" %  (prefix[1], suffix))
        else:
            data_lines.append("%s任务报告生成失败%s" %  (prefix[1], suffix))

    # step5: write to the tmp_file
    with open(chat_tmp_path, mode="w", encoding='utf-8') as f:
        f.writelines(data_lines)

    # step6: send back sim_img_path
    return act_img_path

这里需要设计好大语言模型微调时的prompt,确保模型交互没有问题。实际上这里模型参与了多种问题的处理,我尝试了基于不同的prompt模板训练不同的微调模型,使其对于当前的多任务情况更加适配,这在之后的博客中会有所提及。但这里的行动库并不完善,其中模拟操作可能需要返回图片等佐证。

FastAPI 交互

在行动模拟程序与后端的交互中,我写了一个样例:

img_path = simulate(uid, prompt, options, params, history_formatted, chat_tmp_path)
    
# gen stream_obj
def __itf():
    cline=""
    with open(chat_tmp_path, mode="r", encoding='utf-8') as f:
        for line in f:
            cline = cline + line; time.sleep(tdelay)
            yield ("data: " + json.dumps( 
                        dict(
                            role="AI", id=uid, 
                            parentMessageId=None, 
                            text=cline + footer
                        ) 
                    ))
    
# return stream response
return StreamingResponse(content=__itf(), headers=stream_response_headers,
                         media_type="text/event-stream")

行动模拟程序最后一步将所有交互过程写回到临时文件,FastAPI 后端生成一个文件的字节流以相应的格式传给前端进行展示,这里使用了StreamingResponse,其实际上还可以传递图片,文件可以通过FileResponse进行传输。目前为测试版,仅供参考。

参考资料

[1] ChatGLM-6B/ptuning at main · THUDM/ChatGLM-6B · GitHub

[2] 自定义响应 - HTML,流,文件和其他 - FastAPI (tiangolo.com)

标签:FastAPI,lines,V0,prefix,实训,act,path,model,data
From: https://www.cnblogs.com/yichengliu0219/p/18262396

相关文章

  • python web框架哪家强?Flask、Django、FastAPI对比
    前言当你掌握了python的基础知识,并且会用和HTML和CSS编写简单的静态网页。现在你只需再掌握一个pythonweb框架的知识,就可以开始编写一个动态的网站了。目前市面比较流程的pythonweb框架有三个flask、Django、FastAPI。接下来我们对比一下。他们三个各自有什么特点。Flas......
  • 头歌机器学习实训答案 第1关:集成学习常用算法详解
    任务描述本关任务:学习集成学习的基本概念以及常用算法并编程熟悉sklearn。相关知识为了完成本关任务,你需要掌握:1.个体与集成的概念,2.常用的集成学习算法。个体和集成集成学习(ensemblelearning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-class......
  • 【fastapi】定时任务管理
    在FastApi框架搭建的WBE系统中如何实现定时任务的管理?Python中常见的定时任务框架包括Celery、APScheduler和Huey。以下是每个框架的简单对比和示例代码。1.Celery:分布式任务队列,适合处理长时间运行的任务。#安装celery#pipinstallcelery#celery_task.pyfrom......
  • 基于fastapi+vue登记系统
    1.创建fastapi项目2.创建vue项目npmcreatevue@latestcdwebnpminstallnpminstallelement-plus修改main.js注册elementui和routerimport'./assets/main.css'importAppfrom'./App.vue'import{createApp}from'vue'importrouterfrom......
  • Java计算机毕业设计+Vue实习实训管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,实习实训已成为高等教育中不可或缺的一部分,对于学生实践能力和职业素养的提升具有重要意义。然而,传统的实习实训管理方式存在着诸多不便,如......
  • fastapi+https
    docker-fastapi-celeryhttps://github.com/fanqingsong/docker-fastapi-celery 设置了https证书,可以运行查看效果。 RunonlocalmachineInstalldockeranddocker-composeRunentireappwithonecommandshlocal_env_up.sh contentoflocal_env_up.shs......
  • 实训日记十:Python文本挖掘数据分析-part1
    目录数据分析流程项目背景&产品架构数据说明分析流程加载数据清洗数据-驱虫市场潜力分析整体市场-驱虫市场的潜力分析数据分析流程每个环节都有具体的要求,例如需求文档要求包含:目的,分析思路,预期效果业务部门出问题和需求,以及对算法&数据部门输出报告的理解和......
  • Javaweb实训太难不会做,哪里有代做Javaweb实训的?
    需要代做请发布需求**要接单:https://www.yaojiedan.com**理解基本概念:深入研究Web开发的基础,包括网络协议、Web应用的生命周期、MVC(模型-视图-控制器)架构模式等。理解浏览器和服务器之间的通信是如何进行的,以及它们是如何通过HTML、CSS和JavaScript进行交互的。学习......
  • Unity制作透明材质直接方法——6.15山大软院项目实训
    之前没有在unity里面接触过材质的问题,一般都是在maya或这是其他建模软件里面直接得到编辑好材质的模型,然后将他导入Unity里面,然后现在碰到了需要自己在Unity制作透明材质的情况,所以先搜索了一下有没有现成的方法,很多博客都是使用自己手搓shader的方法,如果对于透明材质的投射折......
  • JSON响应中提取特定的信息——6.14山大软院项目实训2
    在收到的JSON响应中提取特定的信息(如response字段中的文本)并进行输出,需要进行JSON解析。在Unity中,可以使用JsonUtility进行简单的解析,但由于JsonUtility对嵌套对象的支持有限,通常推荐使用第三方库如Newtonsoft.Json来处理复杂的JSON结构。首先,确保Unity项目中已经包含了Newton......