Prompt learning 教学基础篇:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案

Posted ✨汀、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prompt learning 教学基础篇:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案相关的知识,希望对你有一定的参考价值。

Prompt learning 教学基础篇:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案

Prompt learning 教学[基础篇]:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案

  • 如果你想系统学习
    • 如果你对 AI 和 Prompt Engineering 不是很了解,甚至连 ChatGPT 也不是很了解,那我建议你从基础篇开始读起。基础篇更多的会从用户的角度教你如何使用 AI 产品,或者换句话说,会讲更多 prompt 的内容。
    • 如果你已经了解基本的用法,并且想要学习如何更好地开发 AI 产品,想了解更多 prompt engineering 的内容。那可以直接跳去高级篇阅读。
  • 如果你只是想快速学会使用
    • 如果你只是想快速了解使用 AI 产品的技巧,你可以直接读技巧篇,那里汇总了所有使用技巧。
    • 如果你已经了解如何使用了,但想了解更多使用场景,可以看看资料 & 产品推荐篇。

0.Dyno Prompt Engineering介绍

Dyno Prompt Engineering IDE是一款基于人工智能技术的集成开发环境(IDE),它可以帮助开发者更快速、更高效地进行软件开发。Dyno Prompt Engineering IDE的主要特点包括以下几个方面:

  • 智能代码提示:Dyno Prompt Engineering IDE可以通过分析代码语法和上下文,智能地提供代码提示和自动补全功能,帮助开发者更快速地编写代码。

  • 智能错误检测:Dyno Prompt Engineering IDE可以通过分析代码语法和逻辑,智能地检测代码中的错误和潜在问题,并提供相应的修复建议,帮助开发者更快速地调试代码。

  • 智能重构:Dyno Prompt Engineering IDE可以通过分析代码结构和依赖关系,智能地进行代码重构和优化,帮助开发者更高效地改进代码质量和性能。

  • 智能集成:Dyno Prompt Engineering IDE可以与其他开发工具和平台进行智能集成,例如版本控制系统、测试工具、部署平台等,帮助开发者更高效地进行软件开发和管理。

Dyno Prompt Engineering IDE是一款基于人工智能技术的集成开发环境,它可以帮助开发者更快速、更高效地进行软件开发,提高开发效率和代码质量。

Dyno:Prompt Engineering IDE

1.Prompt Engineering简介

解释这个词之前,首先需要解释 prompt 这个词。简单的理解它是给 AI 模型的指令。可以是一个问题、一段文字描述,甚至可以是带有一堆参数的文字描述。AI 模型会基于 prompt 所提供的信息,生成对应的文本,亦或者图片。比如,我们在 ChatGPT 里输入 What is the capital of China? (中国的首都是什么?),这个问题就是 prompt。

而 Prompt Engineering (中文意思为提示工程,后缩写为 PE)则是:

Prompt Engineering 是一种人工智能(AI)技术,它通过设计和改进 AI 的 prompt 来提高 AI 的表现。Prompt Engineering 的目标是创建高度有效和可控的 AI 系统,使其能够准确、可靠地执行特定任务。

看上去很难懂,我试着换个方式让你理解。你可能用过不少 AI 相关的产品,你或许会觉得好像只需要会说话、会打字,就能让 AI 输出答案。好像不需要什么技术。的确,如果你只想让 AI 给你答案,你不需要额外做什么,只需要输入文字即可。但如果你想要得到满意的答案,甚至精确的答案。就需要用到 PE 这个技术。因为人类的语言从根本上说是不精确的,目前机器还没法很好地理解人类说的话,所以才会出现 PE 这个技术。另外,受制于目前大语言模型 AI 的实现原理,部分逻辑运算问题,需要额外对 AI 进行提示(这里你不需要深究原因,暂时先知道这是个问题即可)。

举个例子,如果我们在 ChatGPT 里输入这样的一段话:

What is 100*100/400*56?

ChatGPT 会返回一个错误的答案 0.4464(注意,如果你用下方的 Dyno 运行,答案应该也是错误的,API 版本的回答是 14):但如果我们对 prompt 进行一些修改,答案则会是正确的。注意,如果你用下方的 Dyno 运行旧版的模型 API 的版本,做了修改后,答案应该还是错误的,需要用到 Role Prompting 才能生成正确答案。(这个后续章节会讲解)另外,目前的 AI 产品还比较早期,因为各种原因,产品设置了很多限制,如果你想要绕过一些限制,或者更好地发挥 AI 的能力,也需要用到 Prompt Engineering 技术。这个我们在后续的章节会讲到。

所以,总的来说,Prompt Engineering 是一种重要的 AI 技术:

  • 如果你是 AI 产品用户,可以通过这个技术,充分发挥 AI 产品的能力,获得更好的体验,从而提高工作效率。
  • 如果你是产品设计师,或者研发人员,你可以通过它来设计和改进 AI 系统的提示,从而提高 AI 系统的性能和准确性,为用户带来更好的 AI 体验。

2.prompt基本原则

在和 ChatGPT 对话时,亦或者在使用和设计 prompt 时,有以下几个原则与建议。记住这几个原则,能让你写出更好的 prompt。如果你是直接使用 AI 产品,比如 ChatGPT 或者 Midjourney,那无需在意这个原则。如果你是通过 API 或者 OpenAI Playground 的方式使用,则建议你先使用最新的模型测试。

2.1 Prompt 里最好包含完整的信息

这个是对结果影响最大的因素。比如如果你想让 AI 写一首关于 OpenAI 的诗。

Less effective prompt:

Write a poem about OpenAI.

它生成的答案可能就会很宽泛,而更好的方式是增加更多的信息。

Better prompt:

Write a short inspiring poem about OpenAI, focusing on the recent DALL-E product launch (DALL-E is a text to image ML model) in the style of a famous poet

2.2 Prompt 最好简洁易懂,并减少歧义

这个比较好理解,即使你跟人说话,说一些简单的短句,对方也会更容易听懂,AI 也是这样。另外,在 prompt 里也需要减少一些歧义,少用模棱两可的词语。

比如像这个就很不明确,什么叫 not too much more?

The description for this product should be fairly short, a few sentences only, and not too much more.

更好的 prompt 是这样的,明确告知要写多少句话,就比较明确:

Use a 3 to 5 sentence paragraph to describe this product.

另外需要注意的是,简单并不代表简短。你的 prompt 也可以很长,只要你的 prompt 描述更充分就可以,即使长一点也没有关系。

2.3 Prompt 要使用正确的语法、拼写,以及标点,从简单的先开始,并给产品多一点耐心

最后一点算是我个人的建议。如我在前面提到的例子 What is 100*100/40*56?一样,如果发现机器理解错误,不妨补充点信息,不妨多实验几次,给 AI 多一点耐心。

3.基本使用场景和使用技巧

3.1场景1:问答问题

这个场景应该是使用 AI 产品最常见的方法。以 ChatGPT 为例,一般就是你提一个问题,ChatGPT 会给你答案,比如像这样:

在这个场景下,prompt 只要满足前面提到的基本原则,基本上就没有什么问题。但需要注意,不同的 AI 模型擅长的东西都不太一样,prompt 可能需要针对该模型进行微调。另外,目前的 AI 产品,也不是无所不能,有些问题你再怎么优化 prompt 它也没法回答你。以 ChatGPT 为例:

  1. ChatGPT 比较擅长回答基本事实的问题,比如问 什么是牛顿第三定律? 。但不太擅长回答意见类的问题,比如问它 谁是世界第一足球运动员?,它就没法回答了。
  2. 另外,ChatGPT 的数据仅有 2021 年 9 月以前的,如果你问这个时间以后的问题,比如 现在的美国总统是谁?它的答案是「截至2021年9月,现任美国总统是乔·拜登(Joe Biden)。」

另外,正如我在前面基础用法一章中提到的那样,问答场景里还有一个很重要的玩法,就是多轮聊天,你可以针对某个问题,进行多轮的提问。

使用技巧一:To do and Not To do

我介绍的技巧其实在各个场景都可以使用,我将其放在某个场景下解释,只是因为我觉得它更有可能在这个场景用到。你也会更容易记住这个用法。并不意味着这个技巧仅能在此场景使用。并且多技巧混用也是个不错的用法。

在问答场景里,为了让 AI 回答更加准确,一般会在问题里加条件。比如让 AI 推荐一部电影给你 Recommend a movie to me 。但这个 prompt 太空泛了,AI 无法直接回答,接着它会问你想要什么类型的电影,但这样你就需要跟 AI 聊很多轮,效率比较低。

所以,为了提高效率,一般会在 prompt 里看到类似这样的话(意思是不要询问我对什么感兴趣,或者问我的个人信息):

DO NOT ASK FOR INTERESTS. DO NOT ASK FOR PERSONAL INFORMATION.

如果你在 ChatGPT 里这样提问,或者使用 ChatGPT 最新的 API ,它就不会问你问题,而是直接推荐一部电影给你,它的 Output 是这样的:

Certainly! If you\'re in the mood for an action-packed movie, you might enjoy "John Wick" (2014), directed by Chad Stahelski and starring Keanu Reeves. The movie follows a retired hitman named John Wick who seeks vengeance against the people who wronged him. It\'s a fast-paced and stylish film with lots of thrilling action sequences and an engaging story. If you\'re looking for something that will keep you on the edge of your seat, "John Wick" is definitely worth a watch!

但如果你使用的是如 Davinci-003 这样的模型,它的 Output 很可能是这样的,它还会问你的兴趣爱好:

Sure, I can recommend a movie based on your interests. What kind of movie would you like to watch? Do you prefer action, comedy, romance, or something else?

所以 OpenAI 的 API 最佳实践文档里,提到了一个这样的最佳实践:

Instead of just saying what not to do, say what to do instead. 与其告知模型不能干什么,不妨告诉模型能干什么。

我自己的实践是,虽然现在最新的模型已经理解什么是 Not Todo ,但如果你想要的是明确的答案,加入更多限定词,告知模型能干什么,回答的效率会更高,且预期会更明确。还是电影推荐这个案例,你可以加入一个限定词:

Recommend a movie from the top global trending movies to me.

当然并不是 Not Todo 就不能用,如果:

  • 你已经告知模型很明确的点,然后你想缩小范围,那增加一些 Not Todo 会提高不少效率。
  • 你是在做一些探索,比如你不知道如何做精准限定,你只知道不要什么。那可以先加入 Not Todo ,让 AI 先发散给你答案,当探索完成后,再去优化 prompt。

以下是一些场景案例,我整理了两个 Less Effective(不太有效的) 和 Better(更好的) prompt,你可以自己尝试下这些案例:

场景 Less Effective Better 原因
推荐雅思必背英文单词 Please suggest me some essential words for IELTS Please suggest me 10 essential words for IELTS 后者 prompt 会更加明确,前者会给大概 20 个单词。这个仍然有提升的空间,比如增加更多的限定词语,像字母 A 开头的词语。
推荐香港值得游玩的地方 Please recommend me some places to visit in Hong Kong. Do not recommend museums. Please recommend me some places to visit in Hong Kong including amusement parks. 后者的推荐会更准确高效一些,但如果你想进行一些探索,那前者也能用。

3.2 基于实例回答

在某些场景下,我们能比较简单地向 AI 描述出什么能做,什么不能做。但有些场景,有些需求很难通过文字指令传递给 AI,即使描述出来了,AI 也不能很好地理解。

比如给宠物起英文名,里面会夹杂着一些所谓的名字风格。此时你就可以在 prompt 里增加一些例子,我们看看这个例子。

这个是没有任何示例的 Prompt:

Suggest three names for a horse that is a superhero.

Output 如下所示。第一个感觉还行,第二个 Captain 有 hero 的感觉,但 Canter 就像是说这匹马跑得很慢,感觉不太合适,而且三个都比较一般,不够酷。

Thunder Hooves, Captain Canter, Mighty Gallop

技巧 2:增加示例

如果你无法用文字准确解释问题或指示,你可以在 prompt 里增加一些案例:

Suggest three names for an animal that is a superhero.

Animal: Cat
Names: Captain Sharpclaw, Agent Fluffball, The Incredible Feline
Animal: Dog
Names: Ruff the Protector, Wonder Canine, Sir Barks-a-Lot
Animal: Horse
Names:

增加例子后,Output 的结果就更酷一些,或者说是接近我想要的那种风格的名字。

Gallop Guardian, Equine Avenger, The Mighty Stallion

以下是一些场景案例,我整理了两个 Less Effective(不太有效的)和 Better(更好的)prompt,你可以自己尝试下这些案例:

场景 Less Effective Better 原因
起产品名 Product description: A pair of shoes that can fit any foot size.
Seed words: adaptable, fit, omni-fit.
Product names:
Product description: A home milkshake maker
Seed words: fast, healthy, compact.
Product names: HomeShaker, Fit Shaker, QuickShake, Shake Maker
Product description: A pair of shoes that can fit any foot size.
Seed words: adaptable, fit, omni-fit.
Product names:
可以在下方运行这个案例,在不给示例的情况下 AI 会给你什么答案。
将电影名称转为 emoji Convert Star Wars into emoji Convert movie titles into emoji.
Back to the Future:

Prompt Learning——Template

template(可以是特定的文本tokens或抽象的新的tokens ,唯一的区别是初始化)是提示学习框架中最重要的模块之一。

Soft & Mix Template

  • hard template 就是由具体的中文或英文词汇组成提示,它是人工可读的提示。这类template的定义我们在之前的《Prompt Learning——basic & 【EACL 2021】PET》中有举例过。
  • soft template 是在向量空间优化出来的提示,可以从一个hard template开始(初始化)通过梯度搜索之类的方式进行优化,不改变原始的提示向量的数量和位置,在它的空间进行搜索。
    让我们尝试一些 soft token,如果你使用‘soft’,token将被随机初始化。如果您在值位置添加一些普通token,hard token 将由这些token初始化:
from openprompt.prompts import MixedTemplate

mytemplate1 = MixedTemplate(model=plm, tokenizer=tokenizer, text='"placeholder":"text_a" "soft": "Question:" "placeholder":"text_b"? Is it correct? "mask".')

mytemplate = MixedTemplate(model=plm, tokenizer=tokenizer, text='"placeholder":"text_a" "soft" "soft" "soft" "placeholder":"text_b" "soft" "mask".')

请注意,hard template 将使用模型进行优化,而 soft token 将被单独优化。初始化也是有区别的:

    def process_batch(self, batch: Union[Dict, InputFeatures]) -> Union[Dict, InputFeatures]:
        """
        将 input_ids 转换为 inputs_embeds
		对于普通token,使用 PLM 的embed层
		对于soft token,使用一个新的embed层,该层使用相应的 hard token embed 进行初始化
        """
        raw_embeds = self.raw_embedding(batch['input_ids'])
        soft_embeds = self.soft_embedding(batch['soft_token_ids'])
        inputs_embeds = torch.where((batch['soft_token_ids'] > 0).unsqueeze(-1), soft_embeds, raw_embeds)

        batch['input_ids'] = None
        batch['inputs_embeds'] = inputs_embeds
        return batch

注意如果两个soft token具有相同soft_ids的 ,它们将共享嵌入:

"meta": "premise" "meta": "hypothesis" "soft": "Does" "soft": "the", "soft_id": 1 first sentence entails "soft_id": 1 second?

如果尝试定义 10000 个 soft token,可以使用关键词 duplicate

"soft": None, "duplicate": 10000 "meta": "text" "mask"

如果您尝试定义 10000 个相同的soft token,可以使用关键词 same

"soft": None, "duplicate": 10000, "same": True

Post processing

OpenPrompt还支持后处理。例如,编写一个 lambda 表达式来去除数据中的最终标点符号:

"meta": 'context', "post_processing": lambda s: s.rstrip(string.punctuation). "soft": "It was" "mask"

还可以应用 MLP 来对token 进行后处理:

"text": "This sentence is", "post_processing": "mlp" "soft": None, "post_processing": "mlp"

以上是关于Prompt learning 教学基础篇:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案的主要内容,如果未能解决你的问题,请参考以下文章

Prompt learning 教学[最终篇]:Chatgpt使用场景推荐优秀学习资料推荐AI工具推荐

ICLR 2023Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt

大模型系统和应用——Prompt-learning & Delta Tuning

Midjourney|文心一格prompt教程[Text Prompt(下篇)]:游戏实物人物风景动漫邮票海报等生成,终极模板教学

Prompt Learning 简介

Prompt Learning——Template

(c)2006-2024 SYSTEM All Rights Reserved IT常识