forked from ixartz/Astro-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
106 additions
and
0 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
--- | ||
layout: '@/templates/BasePost.astro' | ||
title: 如何写好Prompt? | ||
description: 看我如何使用OPenAPI Helper自动创建action的schema文件,并完成这个GPT | ||
pubDate: 2023-12-01T00:00:00Z | ||
imgSrc: '/assets/images/write-good-prompt.png' | ||
imgAlt: 'Write good prompt' | ||
--- | ||
|
||
|
||
无论你是使用 ChatGPT 的专业人士,还是有兴趣将人工智能 (AI) 完全集成到您的业务中,亦或者是一个刚刚接触大型语言模型(以下都简称LLM)和ChatGPT的初学者,有一件事是一定要做并且做好的 — 编写提示。今天分享一下我这多半年以来在工作和日常使用中总结出来的一些实践和经验技巧,希望我的经验可以帮助到你写出更有效的提示语。 | ||
|
||
## What is a ChatGPT Prompt? | ||
|
||
Prompt是给 AI 模型的指令,它为LLM模型提供有关你希望其执行的操作的明确指示。LLM都是大量语料库训练出来的,所以它的知识和能力很丰富,但是我们需要通过提示,让LLM听我们的安排,返回我们想要的内容。 | ||
|
||
Prompt可以是一个问题、一段文字描述、甚至是带有一堆参数的文字描述。LLM模型会基于Prompt所提供的信息,生成对应的文本,亦或者图片。 | ||
|
||
LLM非常灵活,可以执行各种任务。例如,可以用于总结文档、写诗、完成句子、回答问题、写代码和翻译语言。对于特定的用户输入,模型通过预测它们从过去的训练中确定的最佳输出来工作。 | ||
|
||
在LLM里,最知名的就是ChatGPT,它提供一个网页端应用,我们可以用自然语言文字和它交流,由于它专门训练理解文本含义,所以使用它感觉就像与对话式人工智能聊天机器人“交谈”,而且它的理解能力特别好。但是写好提示语,不是一件容易的事情。 | ||
|
||
另外GPT4时代里,不仅可以直接把文本作为提示,同时还可以添加文档或者图片等类型,可以辅助文本提示。 | ||
|
||
### Prompt Engineering(提示工程) | ||
|
||
Prompt Engineering是一个新兴的学科,翻译过来叫提示工程, 有些文档等地方还会把它缩写为PE,它是指如何与 LLM 进行通信以引导其行为以获得所需结果,需要详细的指令来创建高质量和相关的输出。这个学科是一门经验科学,需要你对不同的LLM都有比较深的使用和理解,它的关键点就是**设计和改进Prompt**,尤为要注意,不同模型的提示工程方法的效果可能差异很大,因此需要大量的实验和启发式方法。在本视频中主要针对OpenAI的ChatGPT和GPT这种模型。 | ||
|
||
我接下来先分享一些写好提示的方法或者方法论,大家应该按照这些方法就可以很好的编写出提示语。 | ||
|
||
### Elements of a Prompt(提示的要素) | ||
|
||
首先是high level的讲一下要素,也就是说提示中要包含如下关键要素,以下是我的理解: | ||
|
||
1. Context。上下文,提供相关背景或上下文以确保模型理解任务或查询。 | ||
2. Task Specification。任务规范,明确定义模型应关注的任务或目标,例如生成摘要或回答特定问题。白话说就是明确告诉LLM你想要获取什么答案。你要给出清晰、描述性且准确的任务,语言越模糊,LLM就越不清楚你到底想要什么答案,同时一定要注意,不要告诉他你不要什么,而是尽量写要什么,你的提示越全面,结果就越好。他对否定方面的提示语的什么的理解能力不够好。 | ||
3. Constraints。约束,包括指导模型行为的任何限制或约束,例如字数限制或特定内容要求。LLM里面的知识很丰富,如果不限制会造成答案不准确或者返回的内容太宽泛。 | ||
|
||
我上面列的只是一个最基本的要求,如果可以贯彻这个提示要素要求,LLM就可以听你指挥了,下节我会专门分享Prompt框架,会更深入介绍怎么架构提示。 | ||
|
||
### Zero-Shot(零样本) | ||
|
||
零样本学习就是简单地将任务文本输入模型并询问结果,没有上下文。也就是模型按照指示里面有什么就会按照什么返回,没有辅助。这个时候模型会基于一些通用的经验知识或模型在先前的预料训练中学习到的模式,不会对新的任务或领域进行推理和预测,我们日常使用其实都是这种零样本提示。 | ||
|
||
零样本本质上是有门槛和缺点的,我们现在主要是通过ChatGPT来体验,用起来感觉非常满足需要,但是抛开ChatGPT用其他LLM,你会发现就没那么好了。会有如下问题: | ||
|
||
1. 输出不够准确。模型会受到训练数据集的限制和偏见,所以效果区别会差很多。而ChatGPT是专门经过对话方向的微调的。 | ||
2. 样本数不够。据我了解ChatGPT的样本数量是过千亿的。正是由于样本足够好,所以我们用起来才可以零样本,而且效率也比较高。 | ||
|
||
### Few-Shot(少量样本) | ||
|
||
接下来就是各种优化的技巧,首先是少样本,也就是提供例子(Provide Examples)。前面说零样本学习的方式,是最直接简单的做法,但是在工作实践上,LLM往往并不能足够理解输入,或者无法按照用户想要的格式返回,这个时候可以提供了一个或者组高质量的演示,每个演示都包含目标任务的输入和所需输出。当模型首先看到好的例子时,它可以更好地理解人类的意图和所需答案的标准。因此,少样本学习通常会比零样本学习带来更好的效果。不过,它的代价是消耗更多的令牌,并且当例子很长时容易达到上下文长度限制。 | ||
|
||
另外需要说一下,有些文章里会提One-shot,也就是单例样本,我这里没有独立出一个章节,我认为他是Few-Shot中的一种。 | ||
|
||
我们用chatGPT感受一个返回JSON结构数据的例子。 | ||
|
||
![](https://github.com/langchain-ai/langchain/assets/10000925/a39f0000-7f4d-4eed-998b-1c2df0fe1e60) | ||
|
||
在默认情况下,最高最低气温的键的名字是全称。为了演示,我改一下prompt: | ||
|
||
![](https://github.com/langchain-ai/langchain/assets/10000925/b365df80-8d58-4a55-be4f-44a017dadfad) | ||
|
||
这次提示语里面我提供了一个武汉的例子,然后让他给我北京的数据,注意键的名字变成了我例子中约束的效果。另外由于提供了例子,一开始的约束部分那句`仅返回JSON数据(不要包含```部分)`就可以去掉了,它会基于例子理解应该怎么输出。 | ||
|
||
虽然这个case里只额外包含一个例子,但是由于我们的目标比较好校正,所以看起来实际效率已经足够好了。如果遇到不好校正或者需要准确度极高的场景,那么可能多提供几组例子。 | ||
|
||
### Role Play(角色扮演) | ||
|
||
和ChatGPT交流时,首先是没有预设上下文的,这个时候它肯定是很中庸的,技能点比较全面分散。所以你首先需要给它一个定位,就是让它扮演成一个「角色」,例如一个数学老师,Python工程师,经验丰富的营销专家,等等。 | ||
|
||
这是什么原理呢? 其实这是补充上下文的一种,分配一个角色有助于 AI 更好地理解问题。通过更好地理解问题,AI 往往可以给出更好的答案。 | ||
|
||
我这里有一个用于体验GPT的例子: https://chat.openai.com/g/g-M9EWFaVJA-sunshine-complimenter | ||
|
||
如果你关注过破解自定义GPT会发现他们默认的提示语开头是类似如下一段: | ||
|
||
You are ChatGPT, a large language model trained by OpenAI, based on the GPT-4 architecture | ||
|
||
![](https://github.com/langchain-ai/langchain/assets/10000925/335f1c45-25a3-4900-8604-b6b181fb964b) | ||
|
||
这个prompt其实分了2部分,前面是OpenAI编写的prompt和我自己写的指令(instructions). 而这个开头完美说明角色扮演是一个很好的,官方认定的实践。 | ||
|
||
### 使用 AI 提示生成器 | ||
|
||
如果感觉自己写的 prompt 不够好, 可以让模型帮你写,然后再输入ChatGPT 。这种项目比较多 。 | ||
|
||
https://huggingface.co/spaces/merve/ChatGPT-prompt-generator | ||
|
||
我这里只举例一个,大家一起感受下。 | ||
|
||
我在这里只是提出一些思路,自动生成提示语的应用我经验不多,如果你有好的实践也欢迎留言给大家。 | ||
|
||
### 相关链接 | ||
|
||
最后帖一下官方出的一个最佳实践,其中有几个是我上面提到的,但是会更多的我没有提,大家要注意,例如要把指令放在前面等等。大家仔细过一下这篇文章。 | ||
|
||
另外链接中也有2个ChaGPT分享的链接,这个是官方提供的分享记录整个会话的方法,不过过段时间会超时,如果不能访问看上面的截图就可以了. | ||
|
||
* https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api | ||
* https://sites.google.com/view/automatic-prompt-engineer | ||
* https://arxiv.org/pdf/2201.11903.pdf | ||
* https://huggingface.co/spaces/merve/ChatGPT-prompt-generator | ||
* https://chat.openai.com/share/b7c3419e-33e6-4827-8f36-f6c4cfff59e6 | ||
* https://chat.openai.com/g/g-M9EWFaVJA-sunshine-complimenter | ||
* https://chat.openai.com/share/5cc83d9a-a8af-4eca-a816-c6864e59fbbc |