prompt 工程案例

news2025/1/17 3:47:20

目录

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 pd


os.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 prompts


if __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 = 0
    batch_size = 32
    res = []
    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.prompt
            generated_text = output.outputs[0].text
            res.append(generated_text)

        cur_end_time = time.time()
        global_time += cur_end_time - cur_start_time
        print(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.coloradmin.cn/o/1569303.html

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

相关文章

Spark-Scala语言实战(12)

在之前的文章中,我们学习了如何在spark中使用键值对中的join,rightOuterJoin,leftOuterJoin三种方法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢…

数据结构课堂考勤管理系统

摘要 高校的不断扩张让在校学生数量不断的增加,对于教师和管理人员的需求也在不断地增强,对日常的学生考勤管理的工作量也在日益增加,传统的人工点名签到的考勤管理模式已经给无法适用于当前高校考勤管理的需求,同时手动录入的考…

Spring重点知识(个人整理笔记)

目录 1. 为什么要使用 spring? 2. 解释一下什么是 Aop? 3. AOP有哪些实现方式? 4. Spring AOP的实现原理 5. JDK动态代理和CGLIB动态代理的区别? 6. 解释一下什么是 ioc? 7. spring 有哪些主要模块?…

使用c语言libexpat开源库解析XML数据

1 libexpat简介 Expat 是一个用 C 语言编写的开源 XML 解析库,以其高性能和小巧的体积著称。Expat 兼容多种操作系统平台,包括但不限于 Windows、Linux、macOS 等。由于其跨平台特性和简单易用的API,Expat 成为了许多C/C程序员解析XML文档的…

【项目实战】【Docker】【Git】【Linux】部署V2rayA项目

今天着手了一个全新领域的项目,从完全没有头绪到成功运行,记录一下具体的部署流程 github项目链接V2rayA 一开始拿到以后完全没有抓手,去阅读了一下他的帮助文档 写着能用docker运行,就去下载了一个Docker配置了一下 拉取代码到…

LeetCode-543. 二叉树的直径【树 深度优先搜索 二叉树】

LeetCode-543. 二叉树的直径【树 深度优先搜索 二叉树】 题目描述:解题思路一:DFS解题思路二:另一种写法DFS解题思路三:0 题目描述: 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任…

【35分钟掌握金融风控策略3】场景概述3

目录 ​编辑 场景概述 贷前、贷中、贷后的划分及对应的风控场景 贷前风控场景简介 预授信 授信审批 定额 定价 人工审核 场景概述 贷前、贷中、贷后的划分及对应的风控场景 在金融风控全生命周期中,贷前主要是指授信成功及之前的阶段、贷中主要是指授信成…

ubuntu18.04图形界面卡死,鼠标键盘失灵, 通过MAC共享网络给Ubuntu解决!

ubuntu18.04图形界面卡死,鼠标键盘失灵, 通过MAC共享网络给Ubuntu解决! 1. 尝试从卡死的图形界面切换到命令行界面2. 进入bios和grub页面3. 更改Grub中的设置,以进入命令行4. 在命令行页面解决图形界面卡死的问题5. Mac共享WI-FI网…

【QT+QGIS跨平台编译】056:【pdalcpp+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdalcpp介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdalcpp介绍 pdalcpp 是 PDAL(Point Data Abstraction Library)的 C++ 接口,它允许开发人员在他们的 C++ 项目中直接使用 PDAL 的功能和特性。PDAL 是一个开源的库,用于处理…

探索未来外贸电商系统的创新架构

在全球化、数字化的时代背景下,外贸电商行业呈现出蓬勃发展的态势。为了适应市场竞争的激烈和用户需求的多样化,外贸电商系统的架构设计显得尤为重要。本文将深入探讨未来外贸电商系统的创新架构,以期为行业发展提供新的思路和方向。 随着全…

IDEA2023.1.1中文插件

1.启动IDEA 选中Customize 2.选择All settings 3.选中Plugins,再搜索栏里输入Chinese,找到 "Chinese (Simplified) Language"插件,点击 Install 进行安装。 4. 安装完成后,重启IntelliJ IDEA,即可看到界面语言已经变为中文。

Java 开发者必备:JDK 版本详解与选择策略(含安装与验证)

1. JDK 版本 (Oracle Java SE 支持路线图) 数据来源:Oracle Java SE 支持路线图 | 甲骨文中国: https://www.oracle.com/cn/java/technologies/java-se-support-roadmap.html 版本GA DatePremier Support UntilExtended Support Until(限 LTS&#xff09…

[C#]OpenCvSharp改变图像的对比度和亮度

目的 访问像素值mat.At<T>(y,x) 用0初始化矩阵Mat.Zeros 饱和操作SaturateCast.ToByte 亮度和对比度调整 g(x)αf(x)β 用α(>0)和β一般称作增益(gain)和偏置(bias)&#xff0c;分别控制对比度和亮度 把f(x)看成源图像像素&#xff0c;把g(x)看成输出图像像素…

如何利用待办事项清单提高工作效率?

你是否经常因为繁重的工作量而感到不堪重负&#xff1f;你是否在努力赶工期或经常忘记重要的电子邮件&#xff1f;你并不是特例。如何利用待办事项清单提高工作效率&#xff1f;这里有一个简单的方法可以帮你理清混乱并更高效地完成任务—待办事项清单。 这种类型的清单可以帮…

基于机器学习的木马检测模型的设计与实现(论文)_kaic

摘 要 科技的发展带来了人们生活的改变&#xff0c;近年来我国网民已突破十亿人口&#xff0c; 而且在后疫 情时代&#xff0c; 经历了疫情时期的一系列线上活动&#xff0c; 人们对网络的依赖比以往任何时期都要高 得多。高频次的上网行为也带来了一系列安全问题&#xff…

FPGA实现Canny算法(Verilog)

在边缘检测算法里面Sobel是比较简单的一个算法&#xff0c;但是其检测出来的边缘往往是比较粗的&#xff0c;效果不是很好&#xff0c;因为我们最理想的边缘肯定就是一个宽度为1的细线。 Canny算法在此基础上进行了改进&#xff0c;通过使用边缘的梯度信息进行非最大值抑制(NM…

面向作家的 ChatGPT 教程

原文&#xff1a;ChatGPT for authors 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍我坐在电脑前几个小时&#xff0c;盯着一张空白的 Word 文档。文字就是无法流畅地表达出来。这并不是什么新鲜事&#xff1b;称之为写作障碍&#xff0c;称之为缺乏灵感&#x…

大创项目推荐 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

51单片机入门_江协科技_19~20_OB记录的笔记

19. 串口通讯 19.1. 串口介绍&#xff1a; •串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。 •单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#xff0c;极大的…

STM32的CAN外设

我们的CAN控制器支持最高的通讯速率为1Mb/s&#xff0c;可以自动地接收和发送CAN报文&#xff0c;支持使用标准ID和扩展ID地报文&#xff0c;外设中具有3个发送邮箱&#xff0c;发送报文的优先级可以使用软件控制&#xff0c;还可以记录发送的时间&#xff0c;具有两个3级深度的…