概念:是指系统化设计和优化提示词来引导大语言模型产生预期的结果,是一门技术方法。不好理解的话,可以把“软件工程”做个类比,软件工程是教大家如何编写更好的软件,那么“提示词工程”也同理,是教大家写更好的提示词的。
模型设置
使用提示词时,您通常会通过 API 或直接与大语言模型进行交互。你可以通过配置一些参数以获得不同的提示结果。
1. Temperature:简单来说,temperature 的参数值越小,模型就会返回越确定的一个结果。如果调高该参数值,大语言模型可能会返回更随机的结果,也就是说这可能会带来更多样化或更具创造性的产出。
2. Top_p:同样,使用 top_p(与 temperature 一起称为核采样(nucleus sampling)的技术),可以用来控制模型返回结果的确定性。如果你需要准确和事实的答案,就把参数值调低。如果你在寻找更多样化的响应,可以将其值调高点。
3. Max Length:您可以通过调整 max length 来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。
4. Stop Sequences:stop sequence 是一个字符串,可以阻止模型生成 token,指定 stop sequences 是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为 stop sequence 来告诉模型生成不超过 10 个项的列表。
5. Frequency Penalty:frequency penalty 是对下一个生成的 token 进行惩罚,这个惩罚和 token 在响应和提示中已出现的次数成比例, frequency penalty 越高,某个词再次出现的可能性就越小,这个设置通过给 重复数量多的 Token 设置更高的惩罚来减少响应中单词的重复。
6. Presence Penalty:presence penalty 也是对重复的 token 施加惩罚,但与 frequency penalty 不同的是,惩罚对于所有重复 token 都是相同的。出现两次的 token 和出现 10 次的 token 会受到相同的惩罚。 此设置可防止模型在响应中过于频繁地生成重复的词。 如果您希望模型生成多样化或创造性的文本,您可以设置更高的 presence penalty,如果您希望模型生成更专注的内容,您可以设置更低的 presence penalty。
如果单独看概念过于抽象,我们不防注册任意一个大模型开放平台,在其playground中都会有对应参数的配置,我们可以调整不同的参数来看相同的提示词会返回什么不同的结果,例如: 百度智能云:console.bce.baidu.com/qianfan/ais…
openAI的playground上参数更加全一些,如图所示:
提示词要素
1. 指令:想要模型执行的特定任务或指令。
2. 上下文:包含外部信息或额外的上下文信息,引导语言模型更好地响应。
3. 输入数据:用户输入的内容或问题。
4. 输出指示:指定输出的类型或格式。
下面看一个例子
请将文本分为中性、否定或肯定
文本:我觉得食物还可以。
情绪:
在上面的提示示例中,指令是“将文本分类为中性、否定或肯定”。输入数据是“我认为食物还可以”部分,使用的输出指示是“情绪:”。请注意,此基本示例不使用上下文,但也可以作为提示的一部分提供。例如,此文本分类提示的上下文可以是作为提示的一部分提供的其他示例,以帮助模型更好地理解任务并引导预期的输出类型。
提示词基本使用
1. 文本概括
2. 信息提取
3. 问答
4. 文本分类
5. 对话
6. 代码生成
7. 推理
文本概括
自然语言生成中的一个标准任务是文本摘要。文本摘要可以涵盖许多不同的风格和领域。事实上,语言模型最有前景的应用之一就是将文章和概念概括成简洁易读的摘要。让我们尝试使用提示进行一个基本的摘要任务。
解释抗生素
信息提取
虽然语言模型是被训练用于执行自然语言生成及相关任务,但它同样非常擅长执行分类和一系列其他自然语言处理(NLP)任务。
研究论文中的作者贡献声明和致谢应清楚具体地说明作者是否以及在多大程度上使用了ChatGPT等人工智能技术来准备他们的手稿和分析。它们还应该表明使用了哪些法学硕士。这将提醒编辑和审稿人更仔细地审查手稿,以发现潜在的偏见、不准确和不适当的来源。同样,科学期刊应该对法学硕士的使用保持透明,例如在选择提交的手稿时。
提到上文提到的基于大型语言模型的产品:
有点像阅读理解
问答
让模型给出具体回答的最佳方法之一是改善提示的格式。如前所述,一个提示可以结合指令、上下文、输入和输出指示(output indicators)来获得更好的结果。虽然这些组成部分不是必需的,但随着你给出的指令越具体,你将获得越好的结果,这成为了一种良好的实践。下面是一个例子,展示了按照更结构化的提示词来会是什么样子的
根据下面的上下文回答问题。回答要简明扼要。如果不确定答案,回答“不确定答案”。
背景:Teplizumab可追溯到新泽西州一家名为Ortho Pharmaceutical的制药公司。在那里,科学家们产生了一种早期版本的抗体,称为OKT3。这种分子最初来源于老鼠,能够与T细胞表面结合,限制它们杀死细胞的潜力。1986年,它被批准用于帮助预防肾移植后的器官排斥反应,使其成为第一种允许用于人体的治疗性抗体。
问:OKT3最初的来源是什么?
答:
文本分类
到目前为止,你已经使用了简单的指令来执行任务。作为提示词工程师,你需要更擅长提供更好的指令。但这还不是全部!你还会发现,在更困难的用例中,仅仅提供指令是不够的。这就是你需要更多考虑上下文和其他元素(在提示词中使用)的地方。你可以提供的其他元素包括输入数据或示例。
将文章分为中性、否定或肯定。
我觉得食物还不错。
情绪:
对话
你可以通过提示工程进行更有趣的实验,比如指导大语言模型系统如何表现,指定它的行为意图和身份。 当你在构建对话系统,如客户服务聊天机器人时,这尤其有用。
比如,可以通过以下示例创建一个对话系统,该系统能够基于问题给出技术性和科学的回答。 你可以关注我们是如何通过指令明确地告诉模型应该如何表现。 这种应用场景有时也被称为角色提示(Role Prompting)。
以下是与一位人工智能研究助理的对话。辅音技术、科学。
人类:你好,你是谁?
人工智能:问候!我是人工智能研究助理。今天我能为您做些什么?
人类:你能告诉我黑洞是如何形成的吗?
人工智能:
此时看到的回答专业程度可能会比较高,我们可以修改一下
以下是与一位人工智能研究助理的对话。辅助回答应该是容易理解的,即使是小学生。
人类:你好,你是谁?
人工智能:问候!我是人工智能研究助理。今天我能为您做些什么?
人类:你能告诉我黑洞是如何形成的吗?
人工智能:
此时得到的答案就容易理解了
代码生成
大语言模型(LLMs)在代码生成方面非常有效。 在此方面,Copilot 就是一个很好的示例。通过巧妙的提示,你可以执行大量的代码生成任务。下面我们来看几个示例。
使用python写一个helloworld
推理
也许,当今大型语言模型(LLM)面临的最困难任务之一是需要某种形式的推理的任务。推理是最具吸引力的领域之一,因为有了推理,就可以从LLM中涌现出各种复杂的应用类型。
目前,涉及数学能力的推理任务已经有了一些改进。 对于当前的大型语言模型来说,执行推理任务可能会有一些难度,因此就需要更高级的提示词工程技术。 我们会在后面的指南中介绍这些高级技术。 现在,我们将介绍几个基本示例来展示算术功能。
这组中的奇数加起来是偶数:15、32、5、13、82、7、1。
答:
以前的模型处理这类问题可能会给出错误答案,需要我们去引导模型逐步进行计算,最新的模型已经可以直接出处理此类问题了,然后我们上个难度
从所给的四个选项中,选择最合适的一个填入问号处,使之呈现一定的规律性。
高级提示技术
零样本提示
提示:
将文本分类为中性、负面或正面。
文本:我认为这次假期还可以。
情感:
输出:
中性
请注意,在上面的提示中,我们没有向模型提供任何示例——这就是零样本能力的作用。
少量样本提示
虽然大型语言模型展示了惊人的零样本能力,但在使用零样本设置时,它们在更复杂的任务上仍然表现不佳。少样本提示可以作为一种技术,以启用上下文学习,我们在提示中提供演示以引导模型实现更好的性能。演示作为后续示例的条件,我们希望模型生成响应。
提示:
“whatpu”是坦桑尼亚的一种小型毛茸茸的动物。一个使用whatpu这个词的句子的例子是:
我们在非洲旅行时看到了这些非常可爱的whatpus。
“farduddle”是指快速跳上跳下。一个使用farduddle这个词的句子的例子是:
输出:
那只活泼的松鼠在树枝间farduddle,让人看了很是愉悦。
我们可以观察到,模型通过提供一个示例(即1-shot)已经学会了如何执行任务。
链式思考(CoT)提示
链式思考(CoT)提示通过中间推理步骤实现了复杂的推理能力。您可以将其与少样本提示相结合,以获得更好的结果,以便在回答之前进行推理的更复杂的任务。
提示:
这组数中的奇数加起来是偶数:17、9、10、12、13、4、2。
A:将所有奇数相加(17、9、13)得到39。答案为False。
这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。
A:
输出:
将所有奇数相加(15、5、13、7、1)得到41。答案为False。
哇!我们可以看到在提供推理步骤时得到了完美的结果。实际上,我们可以通过提供更少的示例来解决此任务,即仅一个示例似乎就足够了。其实目前的大模型基本都具备链式思考的能力,如下述例子
我去市场买了10个苹果。我给了邻居2个苹果和修理工2个苹果。然后我去买了5个苹果并吃了1个。我还剩下多少苹果?
自我一致性
自我一致性旨在“替换链式思维提示中使用的天真贪婪解码方法”。其想法是通过少样本 CoT 采样多个不同的推理路径,并使用生成结果选择最一致的答案。这有助于提高 CoT 提示在涉及算术和常识推理的任务中的性能。简而言之,就是多数投票,输出多个答案,再按少数服从多数的原则,选出出现次数最大的答案。
让我们尝试以下算术推理示例:
提示:
当我6岁时,我的妹妹是我的一半年龄。现在我70岁了,我的妹妹多大?
旧模型输出:
35
输出是错误的!我们如何通过自我一致性来改进这个问题?让我们试试。我们将使用 Wang 等人 2022 年的少量样本范例(表 17 ):
提示:
Q:林中有15棵树。林业工人今天将在林中种树。完成后,将有21棵树。林业工人今天种了多少棵树?
A:我们从15棵树开始。后来我们有21棵树。差异必须是他们种树的数量。因此,他们必须种了21-15 = 6棵树。答案是6。
Q:停车场有3辆汽车,又来了2辆汽车,停车场有多少辆汽车?
A:停车场已经有3辆汽车。又来了2辆。现在有3 + 2 = 5辆汽车。答案是5。
Q:Leah有32块巧克力,她的姐姐有42块。如果他们吃了35块,他们总共还剩多少块?
A:Leah有32块巧克力,Leah的姐姐有42块。这意味着最初有32 + 42 = 74块巧克力。已经吃了35块。因此,他们总共还剩74-35 = 39块巧克力。答案是39。
Q:Jason有20个棒棒糖。他给Denny一些棒棒糖。现在Jason只有12个棒棒糖。Jason给Denny多少棒棒糖?
A:Jason有20个棒棒糖。因为他现在只有12个,所以他必须把剩下的给Denny。他给Denny的棒棒糖数量必须是20-12 = 8个棒棒糖。答案是8。
Q:Shawn有五个玩具。圣诞节,他从他的父母那里得到了两个玩具。他现在有多少个玩具?
A:他有5个玩具。他从妈妈那里得到了2个,所以在那之后他有5 + 2 = 7个玩具。然后他从爸爸那里得到了2个,所以总共他有7 + 2 = 9个玩具。答案是9。
Q:服务器房间里有9台计算机。从周一到周四,每天都会安装5台计算机。现在服务器房间里有多少台计算机?
A:从周一到周四有4天。每天都添加了5台计算机。这意味着总共添加了4 * 5 =
20台计算机。一开始有9台计算机,所以现在有9 + 20 = 29台计算机。答案是29。
Q:Michael有58个高尔夫球。星期二,他丢失了23个高尔夫球。星期三,他又丢失了2个。星期三结束时他还剩多少个高尔夫球?
A:Michael最初有58个球。星期二他丢失了23个,所以在那之后他有58-23 = 35个球。星期三他又丢失了2个,所以现在他有35-2 = 33个球。答案是33。
Q:Olivia有23美元。她用每个3美元的价格买了五个百吉饼。她还剩多少钱?
A:她用每个3美元的价格买了5个百吉饼。这意味着她花了15美元。她还剩8美元。
Q:当我6岁时,我的妹妹是我的一半年龄。现在我70岁了,我的妹妹多大?
A:
输出 :
当我6岁时,我的妹妹是我的一半年龄,也就是3岁。现在我70岁了,所以她是70-3 = 67岁。答案是67。
计算最终答案涉及几个步骤,但为了简单起见,我们可以看到已经出现了大多数答案,因此这基本上将成为最终答案。
生成知识提示
LLM 继续得到改进,其中一种流行的技术是能够融合知识或信息,以帮助模型做出更准确的预测。
使用类似的思路,模型是否也可以在做出预测之前用于生成知识呢?这就是 Liu 等人 2022(opens in a new tab) 的论文所尝试的——生成知识以作为提示的一部分。特别是,这对于常识推理等任务有多大帮助?
让我们尝试一个简单的提示:
提示:
高尔夫球的一部分是试图获得比其他人更高的得分。是或否?
输出:
是。
这种错误揭示了 LLM 在执行需要更多关于世界的知识的任务时的局限性。我们如何通过生成知识来改进呢?
首先,我们生成一些“知识”(意思是把原来的问题分为两个步骤,第一个步骤是根据下面格式的提示词生成有关高尔夫球的知识,第二步再带着第一步生成的知识,去提问我们最开始的问题):
提示:
输入:希腊比墨西哥大。
知识:希腊的面积约为131,957平方公里,而墨西哥的面积约为1,964,375平方公里,使墨西哥比希腊大了1,389%。
输入:眼镜总是会起雾。
知识:当你的汗水、呼吸和周围的湿度中的水蒸气落在冷的表面上,冷却并变成微小的液滴时,会在眼镜镜片上产生冷凝。你看到的是一层薄膜。你的镜片相对于你的呼吸会比较凉,尤其是当外面的空气很冷时。
输入:鱼有思考能力。
知识:鱼比它们看起来更聪明。在许多领域,如记忆力,它们的认知能力与或超过非人类灵长类动物等“更高级”的脊椎动物。鱼的长期记忆帮助它们跟踪复杂的社交关系。
输入:一个人一生中吸烟很多香烟的常见影响是患肺癌的几率高于正常水平。
知识:那些一生中平均每天吸烟不到一支香烟的人,患肺癌的风险是从不吸烟者的9倍。在每天吸烟1到10支香烟之间的人群中,死于肺癌的风险几乎是从不吸烟者的12倍。
输入:一块石头和一颗卵石大小相同。
知识:卵石是一种根据Udden-Wentworth沉积学尺度的颗粒大小为4到64毫米的岩屑。卵石通常被认为比颗粒(直径2到4毫米)大,比卵石(直径64到256毫米)小。
输入:高尔夫球的一部分是试图获得比其他人更高的得分。
知识:
知识1:
高尔夫球的目标是以最少的杆数打完一组洞。一轮高尔夫球比赛通常包括18个洞。每个洞在标准高尔夫球场上一轮只打一次。每个杆计为一分,总杆数用于确定比赛的获胜者。
知识2:
高尔夫球是一项精密的球杆运动,竞争选手(或高尔夫球手)使用许多类型的球杆,用最少的杆数将球打入球场上一系列洞中。目标是以最低的分数完成比赛,该分数是通过将每个洞上所用的杆数相加计算出来的。得分最低的选手赢得比赛。
链式提示
为了提高大语言模型的性能使其更可靠,一个重要的提示工程技术是将任务分解为许多子任务。 确定子任务后,将子任务的提示词提供给语言模型,得到的结果作为新的提示词的一部分。 这就是所谓的链式提示(prompt chaining),一个任务被分解为多个子任务,根据子任务创建一系列提示操作
示例:
你是一个很有帮助的助手。你的任务是根据文档回答问题。第一步是从文档中提取与问题相关的引文,由####分隔。请使用<quotes></quotes>输出引文列表。如果没有找到相关引文,请回应“未找到相关引文!”。####链式提示简介: 为了提高大语言模型的性能使其更可靠,一个重要的提示工程技术是将任务分解为许多子任务。 确定子任务后,将子任务的提示词提供给语言模型,得到的结果作为新的提示词的一部分。 这就是所谓的链式提示(prompt chaining),一个任务被分解为多个子任务,根据子任务创建一系列提示操作。
链式提示可以完成很复杂的任务。LLM 可能无法仅用一个非常详细的提示完成这些任务。在链式提示中,提示链对生成的回应执行转换或其他处理,直到达到期望结果。
除了提高性能,链式提示还有助于提高 LLM 应用的透明度,增加控制性和可靠性。这意味着您可以更容易地定位模型中的问题,分析并改进需要提高的不同阶段的性能。
链式提示在构建 LLM 驱动的对话助手和提高应用程序的个性化用户体验方面非常有用。
链式提示使用示例
文档问答中的链式提示
提示链可以用于不同的场景,这些场景可能涉及多个操作或转换。例如,LLM 的一个常见用途是根据大型文本文档回答问题。想要更好阅读大文本文档,可以设计两个不同的提示,第一个提示负责提取相关引文以回答问题,第二个提示则以引文和原始文档为输入来回答给定的问题。换句话说,可以创建两个不同的提示来执行根据文档回答问题的任务。
####
AI项目实践
讲实践之前,我们再来了解几个关键概念:
- Token:是 LLM AI 处理文本或代码的基本单位(最小语义单元) 。
- 向量:比如将文本、图像等数据转换为向量形式来描述。
- Embedding:在机器学习和自然语言处理中,embedding 是指将高维度的数据(例如文字、图片、音频)映射到低维度空间的过程。
FlowiseAI
Flowise是基于LangChainJS构建的可免费供商业和个人使用的免费开源项目,它有着一个非常易用的图形用户界面,旨在让人们轻松地可视化和构建LLM应用程序,也就是nocode开发LLM应用。
官方网站:docs.flowiseai.com/
示意图:
下面记录几个flowiseAI实践过程中的碰到的几个问题:
- 安装运行:官方要求Node
v18.15.0orv20,这里最好安装v20以后的最新版本,我使用的是20.18.0,18.15.0本地尝试安装运行有些问题 - flowiseAI的文档中没有关于左侧拖拽的组件介绍,这部分内容需要我们去
langchain的文档中去查找学习 - 增加openAI的chatModel或者Embeddings时,第一个会遇到网络问题,参考网上的解决方案让配置Additional Parameters中的BasePath,如图
这里我尝试没有成功,后来使用小猫中的Tun模式解决了网络问题
下面是根据官方文档视频中配置的读取pdf文档示例,我读取了本地的一张电子发票,提问后可以正常解析文档
链式调用提示词的示例,原理是把提问分成两部分,第一部分根据提示词获得一个对文章的概括总结,再把总结作为第二次提问的输入提示词,并做出新的要求,例如(根据从文档中提取的相关引文(由分隔)和原始文档(由####分隔),请构建对问题的回答。请确保答案准确、语气友好且有帮助。),经过大语言模型的处理,得到最终的答案。
具体构建细节本文不做过多的介绍了,大家可以对照官方文档示例做两个demo,来自己尝试一下。如果大家科学上网不太方便,可以了解一下国内类似的框架,如字节出品的扣子,可以直接访问。 好了,大家有这方面尝试的,欢迎在评论区一起讨论学习,文章戛然而止!!!
参考链接:
提示词参考文章:www.promptingguide.ai/zh