大模型提示词Prompt学习

news2024/11/18 14:16:59

引言

        关于chatGPT的Prompt Engineer,大家肯定耳朵都听起茧了。但是它的来由?,怎么能用好?很多人可能并不觉得并不是一个问题,或者说认定是一个很快会过时的概念。但其实也不能说得非常清楚(因为觉得没必要深究)。但我觉得,它毕竟存在过,火过,我们还是必须对它有更深入的理解,所以,我花时间认真了解了一下。

        对于提示词的理解,我也是经历过好几个阶段。

        最初,我第一次听说什么提示词工程,认为是chatGPT的缺陷所致,也就是GPT不够聪明,提示词是为了让我们迁就它,绕开它的一些不足。但仔细一看,发现不对,大多数提示词的技巧,实际上就是对人与人进行良好沟通的要求,并不过分,不能认为是GPT的缺陷。

        于是,我开始关注提示词的细节和原理,但始终是记不住,感觉无非就是要学会说人话,要和人好好沟通,要能理解你想问领域的基础知识,似乎并没啥可学的,也就没关注了。

        后来,Agent开始火热,开始了解Agent,才发现,原来提示词在这里有用,因为基于GPT编程,实际上很多时候是在使用提示词。那就不能象在chat里那么随意了,需要固化下来,抽象出模板,而且要关注这里提示词在不同版本的准确度。可以理解,提示词就是在编程序,只是在使用自然语言编程。

        讲到这里,容我打一下岔。我们一定要来说说人与计算机如何交互的问题:

        人与计算机交互的方式,也就是人给计算机派任务。经历了几个阶段,因为计算机本质是在处理0/1数据,处理计算任务。最早,我们可以认为计算机比较蠢,人自然就要多做一些事情,就像你的邻家小孩很笨沟通起来很困难,你就得牵就他。所以,人需要写晦涩的汇编指令(甚至用过打孔纸带),没办法,谁让它那么笨。但慢慢的,机器变得越来越聪明,人就开始使用C语言,C++语言,然后是 Java语言,到现在,最流行的Python,与计算机的交互变得越来越简单,我们可以理解为计算机变聪明了,对于人的要求,不断在后退,计算机理解能力提升,不断在前进。

        直到今天,GPT的出现,人可能再退一步,使用自然语言来和计算机交流。这可是人类倒退的一小步,计算机进步的一大步。我们在使用Prompt的时候,发现使用自然语言就可以让计算机完成任务。所以,你不得不重视提示词,它不仅仅是用来聊天的输入,是未来与AI交流的第一语言(当然,也可能会被工程化,变成GPT的内置功能,但至少目前没有)

        我不知道有没有引起大家的好奇。铺垫就说这么多了。

Prompt 的产生

        对于大模型的技术,有一种四阶的说法,提示词工程应该属于最上层的,应用层技术,面向的人群是所有终端用户,门槛最低,最易于上手。

        我们今天的重点是讲提示词工程,也就是Prompt。

  简单来说,Prompt就是我们与大模型之间的沟通话术。

        我们以前经常会接触一些职场沟通,销售话术,和大模型一起工作,就象人与人配合工作一样,需要有很好的沟通技巧。好了,言归正传,我们说说Prompt的来源。

        那Promtpt是如何产生的呢?我们必须从GPT的历史说起。

        我们来看看GPT的历史:

        1.0 时代:在Goolge发明Transformer之后,开始大力发展BERT,OpenAI 的同学觉得Transformer挺好的,把Transformer改了改,用了解码器的生成式架构,改成了可以纯并发的架构,并且采用无监督的方法(省了标注),使用了约50G数据(7000本书),通过预训练 + 专业数据fine-tune的方式,生成一个 1 亿参数的模型,效果还行,在特定的测试集上获得一定的结果。方法嘛 ,那是相当的简单粗暴。但产生一个重要理论范式:PreTrain + Fine-tune 的模式。这个时候,并没有什么人关注GPT。那时是BERT的天下。

        2.0 时代:继续扩大参数,扩到15亿(12倍相对于GPT-1),预训练使用了更多的数据。将Fine-tune的量减少,争取一次搞定预训练和微调,变成一个阶段。PreTrain做更多的事情。无监督学习,增加掩码语言模型(增强自监督)。这仍然是一个暴力美学,但效果确实得到很大增强,相应的范式发生变化,PreTrain做了更多的事情,基础模型的能力大大增强。

In-context learning的产生

        到了3.0:增加更多的数据(4100亿tokens),模型参数量更大(1700亿参数,相对于GPT-2大了100倍),这时就有问题了,如果要传统的fine-tune,成本会太高。因此,这时候出现了 In-Context learning ,让模型能够在上下文中学习,其实就是把问题前移,要求提问的人把问题问得更清楚,并且给出一些解答问题的示例 。这样,可以让大模型针对上下文进行推理,做到在不改变预训练模型的情况下,通过增强输入,达到最好的结果。

        这和提示词有啥关系?当然有关系,这实际上就是提示词一个原理,就是提示词的前身,这是一个很简单的道理,一点不深奥,仍然是敌退我进的方法,邻家傻儿子能力不强,咋办呢,我把问题讲清楚一点。它减少了对fine-tune的依赖,支持对上下文的推理,但要求对方把上下文给清楚,甚至给出示例 ,然后根据模型的常识能力,直接获得答案。对于in-context learning有三类:

        1:Zero shot  不给示例 ,给明确的指示

        2: One-shot  给一个示例 

        3: Few-shot 给小于10个以内的多个案例

        上图可以看出,参考示例越多,效果越好。模型越大,效果越好。

       再回顾一下,GPT的发展过程如下:

即然 In-Context learning的效果这么好,那我们提问者是不是可以更进一步呢?

Prompt 实际上是在In-context learning的基础上更进一步

 In-Context Learing:提供参考示例的学习方式。

 Prompt-Learning 是在 in-context learning的基础上更进一步,利用好上下文来影响模型的输出。

        两者的区别是:Prompt Learning 是设计好的提示来引导更好的输出。而 in-context learning则关注的是如何利用输入序列的上下文信息来影响模型输出。其实,我觉得大概都是一回事。

Prompt的理论

在学习如何写好提示词之前,我们先看看理论,虽然理论实际上我觉得有点扯。

其实就是三篇论文

1:Chain-of-Throught (思维链)

论文:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

原理:作为用户,把需求描述更清楚(更适合对方的理解),具体的方法如下

* 大问题分解成小问题。职场OKR的做法。逐步思考,按问题解决的步骤。让LLM多步骤思考。会消耗额外资源,但会多次思考。

* 多步骤输出如何解决。让LLM给出中间结果。就象高中生数学考试,不给过程,要扣分滴。这样更容易发现错误(可以从错误的步聚重新开始)

* 对于数学应用题,一定要用步骤,逐步解决问题

* 只能在大模型上,用少量样本包含思路。才有用。小模型没啥效果。原因是什么?越是复杂的问题,越有效。类似 Few-Shot 

举例 :

提问中给出推理过程,帮助大模型在上下文中学习知识。然后举一反三,答对问题:有点相当于老师把饭给你喂到嘴边,先告诉你大概的解题思路。

说实话,这个有点扯,一般我们并不会为了问第二个问题,去构造那么复杂的例子一。这实际上是有一定复杂度的。

我的理解就是为了让大模型具备某一些能力,可以找到解决该类问题的多步骤解决的方法。把它当成上下文给到模型,然后模型可以学会按上下文的解法,来分步骤解决新问题。

对于ChatGPT的高版本,可能已经内置了相应的提示词模板,会自动带上模板,提升准确率,当然,因为是分步骤执行,可能会导致消耗更多的算力。对于GPT API,你需要自行按CoT的思想去构造提示词。

除了添加按步骤示例的方法以外,还有一个小技巧:

在问题的后面追加说明:Think step-by-step  (请按步骤思考和回答这个问题)

在某些情况,会获得更好的答案。

2:  自洽性(多路径推理)

论文:self-consistency improve Chain of Throught Reasoning in Language Models

原理:多路径推理,如何提升思维链的能力。三个臭皮匠顶个诸葛亮,多回答几次,投票选择最优解。

初一看到这个,觉得挺好笑,为啥这也是重要的论文之一,这顶维期刊的论文,也太显而易见了吧?

如上图所示,可以根据多个路径形成多解,然后投票获取答案。

非常可惜的是,目前大模型在计算方面的能力不强,另外,对于人脑具德的有意识的行为,大模型基本上是做不到的。我们通过CoT 其实可以看出,大模型并没有带来意识,展开来看,它仍然是一种复读机式的鹦鹉学舌式的智能。

好消息是:通过规模提升,带来智能拥现。好像有智能了。坏肖息是,看起来还是鹦鹉学䇢,还是很弱智,并非产生了意识。对于意识:是脑科学范畴,人类自已也没有弄明白,人到底是怎么回事,人类的本质是复读机吗?

        今天看到腾讯小马哥提出:人工智能的技术必须是可知的,也就是可以掌握,可以解释的。其实有一定到底,否则到时可能控制不住,会出大问题。目前深度学习比较黑盒,不知是好事还是坏事。

3: 思维树(Tree of Throughts)

论文:Tree of thought:Deliberate Problem Solving with Large Language Models

原理:能不能打破从左到右的有局限性的问题解决顺序。类似BIRT的做法。

如下图,类似搜索算法,可以进行遍历解空间,找到全局最优解。

从理论上,可以看看ToT的思路,正如人是如何解决复杂问题的?

那就是不断发掘,如何做:

Step 1:利用CoT,把问按多步骤拆解,思维分解。

Step 2:思维生成器——给出K个侯选项,进行抽样,提供多样性。

Step 3:选择,进行价值评估。对每个状态进行独立评估。或者进行投票。

              或者让大语言模型自已来评估。

注意:在寻找答案时,需要搜索。可以使用广度或者深度。

说实话,并没有弄明白,我们如何使用ToT?至少感觉在ChatGPT中简单利用提示词很难,如果是编程,在做AutoGPT或者Agent时,好像可以按此思路来解决问题。但这和大模型本身的关系不大,确实又是一个工程方法。

提示词如何写?

        好了,我们终于写到重点了(以下都是网上截抄的,但我自已实验过)

原则,把大模型当成你的同事,一个小伙伴。

    这里提供的思路,并不是实际的例子,对于不同应用的例子,可以在网上搜索,或者选择提示词工具和插件。

角色设定:减少范围,有点相当于直接选了MoE

       下面的示例中,System就是系统级的设定,如果在ChatGPT中,可以先单独开一条消息,提前做一下说明,后续就不用再重复了。

指令注入:强调本次上下文一直要注意的信息

问题拆解:帮计算机拆解一下问题,不要太为难它

这个例子不太好,大概的意思就是把问题的步骤帮助做一下拆解。

分层设计:这个知道答案是分层的,那就按层来提问

编程思维:注意,大模型是可以支持自然语言编程的

问题实际上就是一段程序,可以有逻辑判断,可以有输出定义。

Few-Shot:给例子,给例子,给例子。

对于打样,给例子,上面已经给出例子。

另外,网上提供的一个比较好的例子:生成标注数据,挺好用。

这个例子也很有用,在分析BUG时可以参考。

提示词工程是啥?

        随着ChatGPT的工程能力越来越强,可能写好提示词的价值会越来越小。你可能在使用chatGPT过程中会发现,之前的一些提示词黑魔法,在高版ChatGPT会变得没必要了。因为相应的提示词会在ChatGPT中自动引用。但目前而言,GPT API是没有开放相应的能力的,还需要我们通过程序来进行封装。

        我们需要将手工变成自动,把手工的Prompt变成程序自动生成(实际上是抽象变量)。这样变成一个固定的做法。变成一个工程问题。可以通过抽象模板来完成。

        比如:我要将{文字}翻译成{中文}   这实际上就是一个翻译工具

        比如:我要创作一个{}的文案。

        定义模板,抽取参数,它就变成一个自动化的工具。

        将Prompt当作编程语言,把多个prompt串在一起,就可以完成复杂的任务。

        作为提示词工程师,会按照一定的规则去写提示词。

使用LangChane时,可以很好的使用Prompt,因为它有一个Promt Templates:

1:PromtTemplate.from_template(""),可以添加变量,使用时传入。输出格式也可以规范。

可以检查传参。无变量也是可以的。

2:使用构造函数生成PromptTemplate。和1没啥区别。只是更严格,确定参数

这个有点怪,但你可以认为实际上就是将自然语言封装了变量。

ChatPromptTemplate 与之类似。

可以在System中添加变量。要以在user_input中定义变量。

使用fromatf进行参数传入

FewShotPromptTemplate——给参考示例。

给示例集,解包,定义字典,模板还可以嵌套。

注意:SematicSimilarityExampleSelector 可以查找相近的语义词。这个很有用噢。

如下是一个简单的示例图,只要学过一点点编程,很容易理解这个。

对于复杂的情况,我们还可以生成思维链,完成复杂的流程,也就是类似上面讲到的ToT了。我觉得ToT的落地,就在这里了。

比如:我需要提供一个工具,有大模型来生成戏剧,另外,针对生成的戏剧在理解后进行评论,使用另一个大模型。对于此类的问题,就需要比较复杂的对待了。

(如下使用的框架是开源的LangChain框架)

好了,大概写这么多,提示词大家确实没必要太关注,我也觉得它是一个过渡的技术。

它的起因是为了给基础大模型减压(模型能力问题)
它的发展是因为低版本的ChatGPT的工程能力弱(没有对提示词封装),API没有提供相应的模板支持,但是,很可能后续很快会被补上。

当然,了解一下原理,并没有什么坏处。

但没有必要满世界去学习提示词模板,在需要的时候,去搜一下就好了。
但是要注意,提示词模板并不是通用的,要看具体的大模型和大模型的版本。

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

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

相关文章

x264 码率控制中实现 VBV 算法源码分析

关于 VBV 的解释与原理可以参考x264 码率控制 VBV 原理。 x264中 VBV 算法执行的流程 vbv 参数配置相关函数 x264_param_default函数 功能:编码参数默认设置,关于 vbv的参数的默认设置;函数内vbv相关代码:/* ... */ //代码有删减 param->rc.i_vbv_max_bitrate = 0; par…

《软件方法(下)》8.3.4.3 关于“整体-部分”结构

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.2 关联的进一步细分 是否进一步细分各种关联,各种面向对象方法学观点不同。有的认为关联就是关联,…

mvc的常见注解

问文心一言的,记录一下。 PathVariable 路径变量注解 PathVariable 是 Spring MVC 提供的一个注解,它用于从 URI 模板变量中绑定值到控制器方法的参数上。当你在 RequestMapping、GetMapping、PostMapping、PutMapping、DeleteMapping 等注解的 URL 路…

maven默认src下的xml,properties文件不打包到classes文件夹下

一、第一种是建立src/main/resources文件夹,将xml,properties等资源文件放置到这个目录中。maven工具默认在编译的时候,会将resources文件夹中的资源文件一块打包进classes目录中。 这时候注意把resources设置成resource目录,已经…

操作系统 c语言模仿 动态分区存储管理方式的主存分配回收

1.实验目的 深入了解动态分区存储管理方式的主存分配回收的实现。 2.实验预备知识 存储管理中动态分区的管理方式。 3.实验内容 编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括:首先确定主存空间分配表&…

Android 布局中@NULL的使用和代码实现方式详解

文章目录 1、使用场景2、示例代码实现2.1、移除背景2.2 、移除文本2.3、移除布局宽度或高度2.4、移除提示文本2.5、移除图像资源 3、综合示例3.1、布局文件 activity_main.xml3.2、主活动文件 MainActivity.java3.4、资源文件3.5、运行结果 4、优点5、缺点6、综合分析6.1、适用…

地下城游戏(leetcode)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 图解分析&#xff1a; 代码 class Solution { public:int calculateMinimumHP(vector<vector<int>>& vv) {int row vv.size(), col …

【云原生】Kubernetes基础命令合集

目录 引言 一、命令概述 &#xff08;一&#xff09;命令分类 &#xff08;二&#xff09;基本语法 二、查看基本信息 &#xff08;一&#xff09;环境指令 1.查看版本信息 2.查看资源对象简写 3.添加补全信息 4.查看日志 5.查看集群信息 &#xff08;二&#xff0…

5月26号总结

目录 刷题记录(Codeforces Round 947 &#xff08;Div. 1 Div. 2&#xff09;前三题) 1.A. Bazoka and Mochas Array 2.B. 378QAQ and Mochas Array 3.C. Chamo and Mochas Array 刷题记录(Codeforces Round 947 &#xff08;Div. 1 Div. 2&#xff09;前三题) 1.A. Bazok…

力扣 滑动窗口题目总结

Leetcode3.无重复字符的最长子串 思路&#xff1a; 这道题主要用到思路是&#xff1a;滑动窗口 什么是滑动窗口&#xff1f; 其实就是一个队列,比如例题中的 abcabcbb&#xff0c;进入这个队列&#xff08;窗口&#xff09;为 abc 满足题目要求&#xff0c;当再进入 a&#x…

使用 LangFuse 意外被挂马!我是怎么恢复系统稳定的?

在使用 LangFuse 过程中,被意外挂马!通过一番折腾服务恢复正常~ 本文将详细介绍应对恶意脚本和进程的完整方案,包括识别、清理、恢复和预防步骤。 阿里云扫到的信息 被执行的 Base64 SUlaQnRTCmV4ZWMgJj4vZGV2L251bGwKSUhDa0hQbmQ9Li8uJChkYXRlfG1kNXN1bXxoZWFkIC1jMjApCl…

(2024,attention,可并行计算的 RNN,并行前缀扫描)将注意力当作 RNN

Attention as an RNN 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 注意力作为一种&#xff08;多对一的&#xff09;RNN 3.2 注意力作为&#xff08;多对多&…

9.4 Go语言入门(运算符)

Go语言入门&#xff08;运算符&#xff09; 目录三、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符7. 运算符优先级 目录 Go 语言&#xff08;Golang&#xff09;是一种静态类型、编译型语言&#xff0c;由 Google 开发&#xff0c;专注…

异步那些事01

首先我们肯定先说创建线程 1.继承Thread类 o定义一个类MyThread继承Thread类 o在MyThread类中重写run()方法 o创建MyThread类的对象 o启动线程 package Java.thread;public class first extends Thread{public void run(){for(int i0;i<50;i){System.out.println("我…

go ast语义分析实现指标计算器

什么是AST 首先我们要知道AST是什么&#xff08;Abstract Syntax Tree&#xff0c;AST&#xff09;&#xff0c;简称为语法树&#xff0c;是go语言源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构&#xff0c;树上的每个节点都表示源代码中的一种结构。 …

英语四级翻译练习笔记①——大学英语四级考试2023年12月真题(第一套)——用ChatGPT修改训练四级翻译

目录 引言&#xff08;必看&#xff09; 翻译原文 我的翻译 得分&#xff08;1-3分&#xff09; 原文&#xff1a; 你的翻译&#xff1a; 修改后的翻译&#xff1a; 详细错误讲解&#xff1a; 引言&#xff08;必看&#xff09; 这是一篇英语四级翻译的练习的专栏&…

Java刷题总结(面试)

1、String类 String不可变 java 中String是 immutable的&#xff0c;也就是不可变&#xff0c;一旦初始化&#xff0c;其引用指向的内容是不可变的。 也就是说&#xff0c;String str “aa”&#xff1b;str“bb”&#xff1b;第二句不是改变“aa”所存储地址的内容&#xf…

计算机毕业设计 | SSM汽车租赁系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。用户生活水平的不断提高&#xff0c;日常生活中用户对汽车租赁系统方面的要求也在不断提高&#xff0c;需要汽车租赁系统查询的人数更是不断增加&#xff0c;使得汽车租赁系统的…

项目管理:敏捷实践框架

一、初识敏捷 什么是敏捷(Agile)?敏捷是思维方式。 传统开发模型 央企,国企50%-60%需求分析。整体是由文档控制的过程管理。 传统软件开发面临的问题: 交付周期长:3-6个月甚至更长沟通效果差:文档化沟通不及时按时发布低:技术债增多无法发版团队士气弱:死亡行军不关注…

数据库SQL语言实战(十)(最后一篇)

目录 前言 练习题 实验八 实验九 题目一 题目二 总结 前言 本篇练习题的重点有两个&#xff1a; 一、测试提交commit和回滚rollback的作用,了解锁等待、授权等知识。 二、学会复制表结构、学会插入数据&#xff0c;特别是学会如何避免重复插入&#xff0c;也就是如何避…