prompt 工程案例

目录

prompt 工程是什么?

案例

vllm 推理加速框架


prompt 工程是什么?

prompt:提示词,也就是我们使用网页版输入给大模型的内容就叫 prompt,那什么是 prompt 工程呢?

简单理解其实就是利用编写的 prompt 去让大模型完成我们想要完成的任务,一般网页版本的都是多轮对话,通过多轮对话完成想要实现的事情也是一种 prompt 的使用;

另外一种是在实际业务中的使用,实际业务中到底怎么使用 prompt 呢?

prompt 工程 = prompt + 算法,这里的算法并不是指什么高升算法,是指通过编程解析大模型的输出,以及结合一些工具预处理文本这方面的编程代码。

prompt 入门门槛我觉得比较低,网上随便找资料大概都知道编写模版套路,但效果得结合实际业务情况调优好几天,有些还得通过编程进行辅助,比如预处理工具,提取地名啥的,匹配标签啥的,再去输入给大模型。

总结来说入门低,但要想在业务中用好,也没那么容易。

案例

我找了一个案例来说明下完整的 prompt 工程到底是在干啥,

模型:qwen-7b-chat

显存:24G

数据,专业描述的文本,还有对应的 label,

任务:通过编写 prompt ,传入专业列表,让大模型去判断是哪个专业

评判标准:其实就是文本分类任务,已经有数据标注了,让大模型预测出来后,计算准确率就可以评判效果好不好

数据链接:https://pan.baidu.com/s/1EvvNSWb9RXQm4TqHeg52fA 
提取码:2jh3 

链接:https://pan.baidu.com/s/1fdNsI35eiQAPsiIDeaTsAQ 
提取码:6mem 

直接给代码:

import pandas as pd
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig
import time# 加载词表,模型,配置
tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp",trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("/root/autodl-tmp",device_map="auto",trust_remote_code=True).eval()
model.generation_config = GenerationConfig.from_pretrained("/root/autodl-tmp",trust_remote_code=True,temperature=0.6)  # 可指定不同的生成长度、top_p等相关超参def prompt_predit(content, labels):"""prompt 预测 content 属于哪个类别"""prompt = f"""【学科分类解析】 
角色设定:
作为一名资深学者,对各个专业有着深入的了解,擅长通过描述精准判断出是哪一个专业,你的任务是从给定的专业列表中找出与描述最相关的10个专业。已知条件:
[描述]: {content} 
[专业列表]: {labels} 决策规则:
1. 专业必须来源于[专业列表]列表; 
2. 描述中的专业名词是否指向特定的专业,例如:“数据库=》计算机科学与技术”;
3. 从描述中抽取出关键专业术语,对比`[专业列表]`内的专业名称及其涵盖范围,寻找紧密相关的匹配项。要求: 
- 请直接输出专业,无需解释说明; 
- 不得拒绝回答;
- 当描述中明确指向某个特定专业时,优先选择该专业;
- 若描述较为模糊或包含多个专业元素,需根据专业知识和经验作出最佳推断。输出格式严格按照列表格式输出:
[专业1, 专业2, 专业3......] 
"""response, history = model.chat(tokenizer, prompt, history=None)return response.replace('\n', '').replace(' ', '')if __name__ == '__main__':data = pd.read_csv('../output/classfield_data.csv')data = data.head(100)with open('../data/分类提取/labels_all.txt', 'r', encoding='utf8') as f:labels = f.readlines()res = []start_time = time.time()for index, row in data.iterrows():content = row['content']label = row['label']print(f'---------- {index + 1} / {len(data)} -----------')print(f'当前 content:{content} 正确 label:{label}')try:response = prompt_predit(content, labels)except Exception as e:response = str(e)print(f'解析错误:', response)print(f'预测结果:', '=>', response)res.append(response)data['llm_res'] = res# data['correct'] = (data['llm_res'] == data['label'])data['correct'] = data.apply(lambda row: True if row['label'] in row['llm_res'] else False, axis=1)print(f'预测正确率:', round(sum(data['correct']) / len(data) * 100, 2))data.to_excel('../output/classfield_data_predit.xlsx', index=False)end_time = time.time()print(f'用时:{end_time - start_time}')

这是最简单可以说明什么是 prompt 工程的案例,下面来讲一下思路。

1、加载模型

2、读入要处理的数据

3、把要传递给大模型的数据拿出来(content,labels)

4、调用大模型,prompt 编写好再去调用

5、如果需要,需要单独编写解析大模型返回的解析结果

6、最后保存所有结果

以上就是 prompt 工程整体流程,可以看出流程还是挺简单的,但想要想过真的没那么容易,有几方面:

1、不同模型,想通 prompt 效果不一样

2、不同词语描述,效果也不一样

3、哪怕改一个字,效果也会不一样

所以 prompt 要说什么技巧套路,我觉得有点扯淡,基本模版的技巧大家看了都会,但想要效果好得不停地调。

而且评判的数据挺重要的,就像我这个需求应该是分类任务对吧,那结果应该有一个,对就对,不对就不对,我调了几版 prompt ,最好的准确率是 39%,就去数据及理由,有些数据光是人去判断都不太好判断,或是有歧义的,更别说模型了,例如

content:20012014年对青海省主要水体中外来鱼类组成、分布和生态习性进行了系统调查。野外调查采集到外来鱼类30种,隶属6目12科25属,已建群外来鱼类16种。其中,黄河水系拥有的外来鱼类最多,共26种;长江上游有4种,为该河段首次记录;可鲁克湖12种,是内陆水体中外来鱼类最多的水域。结合历史文献记录,截至2013年,全省记录外来鱼类7目13科31属36种,已远超土著鱼类物种数(50种和亚种)的一半。调查分析发现外来鱼类呈现数量持续增多、分布范围向高海拔扩张的趋势。已建群外来鱼类主要是分布于我国东部平原地区的广布型物种。虹鳟( Oncorhynchus myskiss)是代表性外来种,现已在黄河上游干流部分河段形成自然繁殖群体,其食物组成包括水生无脊椎动物和高原鳅等土著鱼类。建立水产种质资源保护区和开展外来鱼类影响研究是防控高原地区外来鱼类的必要措施。 正确 label:地理学

这段文本大家可以看看觉得他是在描述什么专业,我看了后觉得跟水产有关,大模型预测结果也是水产:

预测结果: => [水产|根据描述中提到的“外来鱼类”、“黄河水系拥有最多外来鱼类”、“已在黄河上游干流部分河段形成自然繁殖群体”等内容,可以推断出描述涉及的是水产专业。]

再去看数据标注的答案,摸不着头脑,可能从描述看最相关的水产,其次再是地理学之类的,

所以我改了 prompt ,选出10 个专业,只要 label 再里面就算对,准确率直接就 67 了。

所以标注的数据也挺重要的。

vllm 推理加速框架

上面我们通过一个最基本的案例明白了什么是 prompt 工程,现在来看一个框架 vllm ,是推理加速用的,意思就是说加速模型生成的速度。

把上面的代码改为 vllm 框架,改用批次,最大化利用 gpu 效率,利用 1000 条来测试一下速度有多少提升

from vllm import LLM, SamplingParams
import os
import time
import pandas as pdos.environ['CUDA_VISIBLE_DEVICES'] = '0'
model_path = "/root/autodl-tmp"
llm = LLM(model=model_path, trust_remote_code=True, tokenizer=model_path, tokenizer_mode='slow', tensor_parallel_size=1)
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)def batch_prompt(cur_batch_data):prompts = []for index, row in cur_batch_data.iterrows():content = row['content']prompt = f"""【学科分类解析】 
角色设定:
作为一名资深学者,对各个专业有着深入的了解,擅长通过描述精准判断出是哪一个专业,你的任务是从给定的专业列表中找出与描述最相关的个专业。已知条件:
[描述]: {content} 
[专业列表]: {labels} 决策规则:
1. 专业必须来源于[专业列表]列表; 
2. 描述中的专业名词是否指向特定的专业,例如:“数据库=》计算机科学与技术”;
3. 从描述中抽取出关键专业术语,对比`[专业列表]`内的专业名称及其涵盖范围,寻找紧密相关的匹配项。要求: 
- 请直接输出专业,无需解释说明; 
- 不得拒绝回答;
- 当描述中明确指向某个特定专业时,优先选择该专业;
- 若描述较为模糊或包含多个专业元素,需根据专业知识和经验作出最佳推断。输出:
[专业] 
"""prompts.append(prompt)return promptsif __name__ == '__main__':data = pd.read_csv('../output/classfield_data.csv')data = data.head(1000)with open('../data/分类提取/labels_all.txt', 'r', encoding='utf8') as f:labels = f.readlines()global_time = 0batch_size = 32res = []for i in range(0, len(data), batch_size):cur_start_time = time.time()cur_batch_data = data[i:i + batch_size]cur_batch_prompt = batch_prompt(cur_batch_data)outputs = llm.generate(cur_batch_prompt, sampling_params)for output in outputs:prompt = output.promptgenerated_text = output.outputs[0].textres.append(generated_text)cur_end_time = time.time()global_time += cur_end_time - cur_start_timeprint(f'当前批次用时 {cur_end_time - cur_start_time}   目前已使用使用时间 {global_time}   进度 {i + batch_size}')data['llm_res'] = res# data['correct'] = (data['llm_res'] == data['label'])data['correct'] = data.apply(lambda row: True if row['label'] in row['llm_res'] else False, axis=1)print(f'预测正确率:', round(sum(data['correct']) / len(data) * 100, 2))data.to_excel('../output/classfield_data_predit.xlsx', index=False)print(f'总用时:{global_time}')

vllm 用时

之前的代码用时:

可以看出,真的能像网上说的那样提速 2 倍左右,但准确率下降了,我把输出打印出来看,发现是输出内容没有按照之前的来了,说明 vllm 会对输出有影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用自己训练的superpoint与superglue模型进行图像配准

基于官方团队发布的预训练模型,使用SuperPoint与SuperGlue实现图像配准,可以参考https://blog.csdn.net/a486259/article/details/129093084 基于官方团队发布的代码训练自己的模型,可以参考https://blog.csdn.net/a486259/article/details/…

如何理解UDP 和 TCP? 区别? 应用场景?

文章目录 一、UDP二、TCP三、区别参考文献 一、UDP UDP(User Datagram Protocol),用户数据包协议,是一个简单的面向数据报的通信协议,即对应用层交下来的报文,不合并,不拆分,只是在…

什么是运放噪声频率曲线?怎么算噪声有效值?只需要3个公式!

原文来自微信公众号:工程师看海,与我联系:chunhou0820 看海原创视频教程:《运放秘籍》 大家好,我是工程师看海,原创文章欢迎点赞分享! 运放有哪些噪声源?什么是噪声频率曲线&#x…

使用Autodl与Xftp远程训练模型及管理远程文件

1 AutoDL网站登录创建实例 AutoDL网站:AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL 1)进入算力市场,选取可用显卡(工作日一般白天抢不到,晚上才能抢到) 2)选择配置环境 3)创建成功实例…

蓝桥集训之阶乘分解

蓝桥集训之阶乘分解 核心思想&#xff1a;线性筛质数 筛出每一个质数后 只要将所有质数的1 2 3 … 次方个数都加上即可 #include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N 1e610;int …

python中如何使用help()

help()函数帮助我们了解模块、类型、对象、方法、属性的详细信息。 1、帮助查看类型详细信息&#xff0c;包含类的创建方式、属性、方法 >>> help(list) Help on class list in module builtins: class list(object)| list() -> new empty list| list(iterable)…

企微知识库优缺点解析:如何让其效益最大化

企业搭建企微知识库&#xff0c;作为企业内部知识的集中存储和共享平台&#xff0c;为企业带来了很多便利。但是&#xff0c;任何事物都有其两面性&#xff0c;企微知识库也不例外。今天我们就来详细探讨搭建企微知识库的优点和缺点&#xff0c;如何在使用企微知识库时使其发挥…

联达动力OA 多处任意文件上传漏洞复现

0x01 产品简介 联达动力OA是PHPOA推出的新一代OA系统,系统支持性好、安全、数据高速缓存化;支持100+应用自行安装与定义,应用表单自定义,支持应用无代码开发,支持多语言。 0x02 漏洞概述 联达动力OA /FileManage/UpLoadFile.aspx、/Hosp_Portal/uploadLogo.aspx、/Dept_Por…

7.stack容器的使用

文章目录 stack容器常用接口代码工程运行结果 stack容器 常用接口 /*1.push - 入栈*/ /*2.top - 查看栈顶元素*/ /*3.pop - 出栈*/代码工程 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stack>using namespace std;/*1.push - 入栈*/ /*2.top…

Linux-Arm GDB调试(本地和远程)

目录 问题描述 已有coredump 没有coredump 小结 问题描述 Linux本机调试使用GDB非常方便&#xff0c;但嵌入式Linux设备资源有限&#xff0c;通常并没有交叉编译工具&#xff0c;那嵌入式设备上的应用发生问题如何查找问题&#xff1f;通常IDE有远程DEBUG功能&#xff0c;这…

3.冒泡排序

冒泡排序 基本思想&#xff1a;每次比较两个相邻的元素 如果它们的顺序错误就把它们交换过来 重点&#xff1a;交换 时间复杂度为&#xff1a;O(n^2)&#xff08;平均情况、最坏情况&#xff09; 最优情况&#xff1a;输入的数组已经是完全有序的时候 冒泡排序只需要进行一…

IT外包服务:企业数据资产化加速利器

随着数字化时代的兴起&#xff0c;数据成为企业最为重要的资源之一。数据驱动创新对于企业的竞争力和可持续发展至关重要。在这一进程中&#xff0c;IT外包服务发挥着关键作用&#xff0c;加速企业数据资产化进程&#xff0c;为企业提供了重要支持。 首先&#xff0c;IT外包服务…

第七讲 索引并发控制

我们假设迄今为止讨论的所有数据结构都是单线程访问的。 但 DBMS 需要允许多个线程安全地访问数据结构&#xff0c;以充分利用额外的 CPU &#xff0c;并隐藏磁盘 I/O 停顿。 并发控制协议【concurrency control protocol】是 DBMS 用于确保在共享对象上的并发操作得到“正确”…

【React】基于JS 3D引擎库实现关系图(图graph)

主角&#xff1a;3D Force-Directed Graph 简介&#xff1a;一个使用ThreeJS/WebGL进行3D渲染的Graph图库 GitHub: https://github.com/vasturiano/3d-force-graph Ps: 较为复杂或节点巨大时&#xff0c;对GPU>CPU消耗较大&#xff0c;同量级节点对比下优于AntV G6和Echarts…

树(Tree) - 概念与基础

树的基本概念 树(Tree)是一种重要的数据结构&#xff0c;它在计算机科学中被广泛应用于各种算法和程序中。树是由节点(node)组成的层次结构&#xff0c;其中每个节点都有一个父节点&#xff0c;除了根节点外&#xff0c;每个节点都有零个或多个子节点。树的一个关键特点是没有…

【算法每日一练]-数论(保姆级教程 篇1 埃氏筛,欧拉筛)

目录 保证给你讲透讲懂 第一种&#xff1a;埃氏筛法 第二种&#xff1a;欧拉筛法 题目&#xff1a;质数率 题目&#xff1a;不喜欢的数 思路&#xff1a; 问题&#xff1a;1~n 中筛选出所有素数&#xff08;质数&#xff09; 有两种经典的时间复杂度较低的筛法&#xff0…

蓝桥杯真题:路径

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {int n 2022; //从下标为1开始&#xff0c;方便计算int[] q new int[n]; //存储最短路q[1] 0; //起始条件for (int i 2; i < 202…

C语言 | Leetcode C语言题解之3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; int lengthOfLongestSubstring(char * s) {//类似于hash的思想//滑动窗口维护int left 0;int right 0;int max 0;int i,j;int len strlen(s);int haveSameChar 0;for(i 0; i < len ; i ){if(left < right){ //检测是否出现重…

5.2 通用代码,数组求和,拷贝数组,si配合di翻转数组

5.2 通用代码&#xff0c;数组求和&#xff0c;拷贝数组&#xff0c;si配合di翻转数组 1. 通用代码 通用代码类似于一个用汇编语言写程序的一个框架&#xff0c;也类似于c语言的头文件编写 assume cs:code,ds:data,ss:stack data segmentdata endsstack segmentstack endsco…

谷歌浏览器必用AI插件 - elmo,好用,还免费

功能&#xff1a; 1、即时生成网站内容摘要&#xff1b; 2、支持提问并从页面获得直接回答&#xff1b; 3、通过关键词获取相关信息&#xff1b; 4、可以与 PDF 对话&#xff0c;方便理解大型文档、学习或审阅报告&#xff1b; 5、与 YouTube 视频交互问答&#xff08;测试…