prompt基础:组成元素

0 阅读11分钟

prompt的定义

在大型语言模型的集成中,prompt可以是一个问题、一段描述、一个任务说明,甚至是一部分对话历史记录等。它作为用户与大模型交互的输入代称,旨在引导模型生成特定的输出。设计prompt时,关键原则包括编写清晰、具体的指令和给予模型充足思考时间,以确保模型能够准确理解并生成符合要求的输出。

此外,提示工程(Prompt Engineering)是一种在大模型中使用的技巧,通过提供清晰、简洁的指令或问题,充分发挥大模型的能力,让模型更好地理解我们的需求,从而得到更好的模型输出。这表明,给大模型提示语时,用户扮演着类似产品经理的角色,需要思考如何利用大模型提升工作效率。

提示工程是一个新兴的重要领域,它的核心是设计提示和交互,以提升语言技术的能力、解决其弱点,以及深入了解其运作情况。提示工程为我们提供了策略和技术,助力我们突破语言模型及其应用的可能性边界。

prompt也可以比如说是向一种语言模型提供信息。因此,如果你想让它写点东西或分析一些东西,那么当你说出来时,它总是有帮助的。然后给它一个非常具体的单词、名字或你想让它用来触发输出的东西。

因此,为了打破常见的模式,你需要在输入中注入你想要的更具体的想法,或者你需要注入有助于挖掘那些更具体的东西的模式。因此,这是一个重要的方面,如果你只是使用它然后问它一些一般性的问题,你就会得到通用的答案。如果你问它普通的问题和普通的问题,你会得到普通的答案。要真正有力地使用它,你必须运用自己的创造力和思想来具体说明你想讨论的内容的细节。然后想一想在你的提示中加入哪些正确的模式来触发你想要的行为。

prompt的组成元素

讲了这么多那么一个完整的prompt到底是应该怎么写呢?一般来讲一个完整的提示词应该包含如下几个部分:

  • 有关的上下文
  • 角色的设定
  • 简明扼要的任务描述
  • 更多限制的细节
  • 提供回答示例(可选)

我将他抽象成一个万能公式就是:

prompt = 上下文 + 角色人设 + 任务目标 +负向提示 + 示例模板(最后一个可选)prompt = 上下文 + 角色人设 + 任务目标 + 负向提示 + 示例模板(最后一个可选)

上下文

上下文的提供对于生成高质量的回应至关重要。上下文包括当前对话的背景信息、相关背景故事、用户的意图等。这个部分帮助模型更好地理解问题的背景,并生成更符合期望的回应。需要分清楚的是,我们这里说的上下文不是我们与大模型进行对话的上下文,这里的上下文说的是我们写这一个prompt提示词的上下文,你也可以简单理解为“背景”。例如,如果你在写作一个关于人工智能的文章,你可能需要提供有关技术发展的背景信息和当前的研究趋势等等你掌握的信息帮助AI对你的信息进行处理加工,将他的大模型搜索范围缩小得到更加精切的答案。我们可以通过下面这个函数格式client.files.create将你的文件发送过去。

from pathlib import Path
from openai import OpenAI

client = OpenAI()

client.files.create(
    file=Path("input.jsonl"),
    purpose="fine-tune",
)

角色人设

角色是我们可以用来挖掘大型语言模型行为的最强大模式之一。

角色的设定有助于模型以适当的语气和视角进行回应。这可以包括设定模型作为某个领域的专家、某个特定的角色(例如,客服代表、历史学家、科学家等),或者以特定的身份和态度进行回复。角色的设定可以帮助模型更好地把握回答的角度和深度。将大模型从他庞大的训练数据锁定特定的领域,例如,如果你希望模型以专业科学家的身份解释复杂的技术概念,你需要在提示词中明确指出这一点,比如:请扮演一个专业科学家或者你是一个专业的科学家。

from openai import OpenAI

client = OpenAI(api_key="sk-")
completion = client.chat.completions.create(
    
    model="gpt-4",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "请扮演一个专业的科学家,介绍一下神经网络/介绍一下神经网络"},
    ],
    
    
)
print(completion.choices[0].message.content)
  • 请扮演一个专业的科学家,介绍一下神经网络

  • 介绍一下神经网络

我们可以看到加了角色效果会好很多,上面这个例子就可以看出,没加角色时,大模型不会详细告诉你输入层,隐藏层,输出层具体是什么,也不会告诉你所谓的“学习”具体就叫反向传播,也不会告诉你所谓的“权重”具体是通过激活函数实现的等等。

任务目标

清晰的任务描述是确保模型生成的回应符合预期的关键。这部分需要详细说明你希望模型完成的具体任务,包括回答的问题、解决的问题、或需要执行的操作。描述应简洁明了,避免歧义。例如,如果你希望模型撰写一篇关于环境保护的文章,你需要明确说明文章的主题、目的和目标读者。这里其实就是为什么人们会认为一个领域专家可能会写出更好的提示词,因为他理解行业,理解规则,理解任务的具体逻辑。我们有些时候其实在写一个任务的时候都是主观臆断的,并不够理解具体的实施步骤或者说具体的窍门,这些可能需要一些行业沉淀,才可以把他描述得更加的清楚,更好的让大模型清楚你要干什么,从而更好地完成目标。目前这一次高阶的用法是COT,TOT等等做法,这是下一章的内容我就不在这里介绍了。而且我们基础的做法就是尽量具体的描述和拆分任务,比如不要简单的说写一篇小说,而是说写一篇科幻小说;不要简单的说生病了应该吃什么药,而是说我发烧了,高烧不退,应该吃什么药。尽量用清晰简洁的话语描述你的需要你的任务。

from openai import OpenAI

client = OpenAI(api_key="sk-")
completion = client.chat.completions.create(
    
    model="gpt-4",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user",
         "content": "撰写一篇关于环境保护的短文,文章的主题:黄河环境保护,目的:呼吁政府加大对黄河保护的投入,目标读者:相关政府官员。"},
    ],
    
    
)
print(completion.choices[0].message.content)

负向提示

提供额外的限制和要求可以进一步引导模型生成符合特定需求的回答。这些细节可以包括格式要求、语言风格、信息来源、回答的长度限制等。通过提供这些限制,用户可以更好地控制生成内容的质量和一致性。例如,如果你希望生成的文本保持正式的语气,并且不超过500字,你需要在提示词中明确这些要求。你可能需要对大模型生成的东西有比较高的精准度的要求,那么你就应该着重考虑你不要什么,你不要生成超过500字的文字、你不要生成没有存在的东西、基于事实回答、基于安全回答等等,你要想清楚你不要什么。这个部分是迭代的重点,因为你会在一次次的测试和尝试中发现这些问题并不断加入到prompt中的这个部分中,这样子就可以一步步得到好的结果。

from openai import OpenAI

client = OpenAI(api_key="sk-")
completion = client.chat.completions.create(
    
    model="gpt-4",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "写一首关于花的诗,但是不要带花这个字,不要超过8句"},
    ],
   
    
    stream=False
    
)
print(completion.choices[0].message.content)

这个部分是非常有用的,而且是一个不断完善的过程,你可以看到上面这首诗严格按照我们的要求来,没有带“花”字,没有超过8句话,如果你觉得这样不行要把叶字也删掉,那么你就可以在这个部分进行补充,不断完善你的提示词,直到你得到满意的结果。

示例模板

提供一个或多个回答示例可以帮助模型理解预期的回答格式和内容。这些示例可以作为参考,让模型更好地把握任务的具体要求和期望。这在创建复杂任务时尤其有用,可以显著提高生成内容的质量和相关性。例如,如果你希望模型生成客户服务邮件,你可以提供一封你认为合适的邮件作为示例,以便模型更好地模仿和生成类似的内容。我需要强调的是提供一个示例模板到prompt中,将有助于你想得到一些规范性强的回答,或者说准确的回答。因为他是按照你给的模板生成的内容,他不会改你的模板改你的规则,而且这种方式是最为直接的,也是见效最快的。

from openai import OpenAI

client = OpenAI(api_key="sk-")
completion = client.chat.completions.create(
    
    model="gpt-4",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "请写一句牙膏的宣传语,示例:让笑容焕发光彩,让口腔焕然一新"},
    ],
   
    
    stream=False
    
)
print(completion.choices[0].message.content)

像这个例子中大模型就是很好的按照我们给出的例子从微笑和口腔这两个关键词出发,写出我们的答案。而且是前后两个分段的小句子,格式也很统一。不会产生输出一大段大段的文字,而是我们规定的示例出发考虑内容和结构的同时,对我们的问题做出他的回答,从而得到一个比较准确的结果。

prompt是一门艺术

如果我们把像 ChatGPT 这样的大型语言模型当作一种工具,你可以想象米开朗基罗得到了一把新锤子。他会找到一块石头,然后开始将那块石头雕刻成一些精美的雕塑,比如《大卫》或者他创作的其他作品。米开朗基罗拿着锤子走到石头前,用力一击,石头上掉下一块。他停下来观察,接着又用锤子击打,石头上再掉下一块。他不停地重复这个过程,一块接一块地打掉石头的碎片,慢慢地,雕像的形状开始显现。

他并不会在第一击之后看着雕塑然后失望地说:“这是一座糟糕的雕塑”,然后把锤子扔到地上转身离开。米开朗基罗是怎么做的?他一次又一次地拿起锤子击打石头,精细地打磨、塑造和雕刻。随着时间的推移,他反复地完善那块岩石,直到它变成一座漂亮的雕塑。

对于大型语言模型,我们需要采取类似的心态。这不是要立即从一个提示中得到完美的答案,而是要通过与模型进行多次互动和对话,逐步引导模型朝着我们期望的方向生成输出。与大型语言模型的交互往往涉及一系列提示,每个提示都会带来一些微调和改进。通过不断地调整和反馈,我们可以引导模型生成高质量的输出,甚至是其他有趣的产品。

稍后我们将详细讨论这些交互是如何进行的,以及如何通过一系列提示和回应来实现我们的目标。总体来说,与大型语言模型的对话就像是米开朗基罗雕刻大理石一样,是一个不断打磨和完善的过程,最终会带来令人满意的结果。