在大模型领域,输入通常被称为“提示词”(prompt),它们是引导LLM(大语言模型)生成相应输出的关键。对于那些能处理多样化任务的LLM来说,一个合理设计的prompt会极大地影响模型的表现。

提示工程(prompt engineering)正是关于如何为特定任务构建能够充分发挥大模型能力的prompt技巧。本文将深入探讨提示工程,内容涵盖基本原理、一些重要概念以及常用的辅助工具。

1. 基本原理

设计高效的 prompt 有两个关键原则:编写清晰具体的指令给予模型充足的思考时间

01 编写清晰具体的指令

模型无法读懂你的想法,因此你需要在 prompt 中清晰明确地表达自己的需求。如果你觉得输出过长,可以在 prompt 中要求简短回复;如果输出太简单,可以要求详细回复。减少模型对你需求的猜测,你就越有可能得到满意的结果。

实现指令清晰具体的 4 个技巧:

- 使用分隔符清楚地表示输入的不同部分

在编写 prompt 时,可以使用各种标点符号(如 “”", ```, <>, —)将不同的文本部分区分开来。

import openai
import os
   
openai.api_key = os.environ.get("OPENAI_API_KEY", "your-api-key")
   
# 定义调用opanai api函数
def get_completion(prompt,model="gpt-3.5-turbo"):
  messages = [{"role":"user","content":prompt}]
    response = openai.chat.completions.create(
        model = model,
            messages = messages,
                temperature = 0,
                  )
                    return response.choices[0].message.content
                     text = f"""
端午节,又称端阳节、龙舟节,是中国传统节日之一,每年农历五月初五举行。端午节源于中国古代,起源于楚国,最初是为了纪念爱国诗人屈原而设立的。端午节有着悠久的历史和丰富的文化内涵,在中国民间流传着许多丰富多彩的习俗和传统活动。\n
端午节的主要习俗之一是赛龙舟。人们会组织龙舟竞赛,以纪念屈原投江自尽、渔民划船救他的故事。龙舟竞赛是端午节最具特色和魅力的活动之一,吸引着无数人观看和参与。此外,端午节还有吃粽子、挂艾草、饮雄黄酒、穿香囊等传统习俗,每个习俗都有其独特的寓意和象征意义。\n
粽子是端午节必不可少的传统食品,其形状象征着包裹屈原的荷叶,内含糯米和各种馅料,味道鲜美。挂艾草则是为了驱邪避疫,保佑家人健康平安。饮雄黄酒和穿香囊也都是为了驱邪求吉,祈福平安。\n
端午节是中华民族传统文化的重要组成部分,也是中华民族的节日之一。随着时代的变迁,端午节的庆祝方式和形式也在不断发展和变化,但人们对于这个节日的热爱和传统习俗的传承始终如一。
"""
   
#输入内容
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
 ```{text}```
"""
#指令输出
response = get_completion(prompt)
print(response)

输出:

端午节是中国传统节日之一,源于古代楚国,纪念爱国诗人屈原,有赛龙舟、吃粽子、挂艾草等丰富多彩的习俗和传统活动,体现着中华民族的传统文化和节日热爱。

- 要求模型结构化输出

例如 JSON 或 HTML 格式,这不仅能让模型稳定输出你想要的格式,还便于后续处理。

prompt = f"""请生成包括书名、作者和类别的三本虚构的、非真实存在的中文书籍清单。
要求以JSON格式输出,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)

输出:

[
    {
        "book_id": 1,
        "title": "幻境之门",
        "author": "王小明",
        "genre": "奇幻"
    },
    {
        "book_id": 2,
        "title": "星际迷航",
        "author": "张小红",
        "genre": "科幻"
    },
    {
        "book_id": 3,
        "title": "时间漩涡",
        "author": "李大山",
        "genre": "冒险"
    }
]

- 要求模型检查是否满足条件

如果任务包含一些假设或条件,可以在 prompt 中告诉模型先检查这些假设。如果不满足,则直接输出检查结果并停止后续流程。考虑边缘情况及模型的应对,可以避免意外结果或错误。

text = f"""
泡一杯茶很容易。首先,需要把水烧开。在等待期间,拿一个杯子并把茶包放进去。一旦水足够热,就把它倒在茶包上。等待一会儿,让茶叶浸泡。几分钟后,取出茶包。如果您愿意,可以加一些糖或牛奶调味。就这样,您可以享受一杯美味的茶了。
"""
prompt = f"""
您将得到由三个引号括起来的文本。
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:

第一步 - ...
第二步 - ...
...
第N步 - ...

如果文本中不包含一系列的指令,则直接写"未提供步骤"
\"\"\"{text}\"\"\"
"""
response = get_completion(prompt)
print(response)

输出:

第一步 - 把水烧开。
第二步 - 拿一个杯子并把茶包放进去。
第三步 - 把烧开的水倒在茶包上。
第四步 - 等待几分钟,让茶叶浸泡。
第五步 - 取出茶包。
第六步 - 如果愿意,可以加糖或牛奶调味。
第七步 - 尽情享受您的茶。

- 少样本提示 (Few-shot prompting)

在要求模型执行任务前,提供一些成功执行任务的示例,然后再要求模型执行任务。

prompt = f"""
您的任务是以一致的风格回答问题。

<孩子>: 请教我何为耐心。

<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。

<孩子>: 请教我何为韧性。
"""
response = get_completion(prompt)
print(response)

输出:

<祖父母>: 韧性就像是一棵顽强的树,能够经受风雨的洗礼而不倒;就像是一块坚硬的石头,能够经受岁月的磨砺而不碎;就像是一条强壮的绳索,能够承受重压而不断裂。韧性是一种坚韧不拔的品质,让人在逆境中坚持不懈,永不放弃。

其他策略:

- 在查询中包含详细信息以获得更相关的答案

- 要求模型采用某种角色

- 指定输出的期望长度(用单词数、句子数、段落数、项目符号等指定)

- 将复杂任务拆分为简单子任务

02 给予模型充足时间思考

当你被问到“17 乘以 28 等于多少”时,你可能不会立刻知道答案,但可以通过时间推算出来。同样,模型如果试图立即回答,会犯更多的推理错误。因此,prompt 应该加入逐步推理的要求,给模型留出充分思考时间,这样生成的结果才更准确可靠。

- 指定任务完成需要的步骤


text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
他们一边唱着欢乐的歌,一边往上爬,\
然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
虽然略有些摔伤,但他们还是回到了温馨的家中。\
尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
"""

prompt = f"""
1-用一句话概括下面用<>括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个人名。
4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。

请使用以下格式:
文本:<要总结的文本>
摘要:<摘要>
翻译:<摘要的翻译>
名称:<英语摘要中的名字列表>
输出 JSON:<带有 English_summary 和 num_names 的 JSON>

Text: <{text}>
"""
response = get_completion(prompt)
print(response)

输出:

摘要: 在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水,不幸中途发生意外,但他们的冒险精神依然坚定。
翻译: In a charming village, siblings Jack and Jill set out to fetch water from a well on top of a hill, unfortunately encountering an accident along the way, but their adventurous spirit remains strong.
名称: Jack, Jill
输出 JSON: {"English_summary": "In a charming village, siblings Jack and Jill set out to fetch water from a well on top of a hill, unfortunately encountering an accident along the way, but their adventurous spirit remains strong.", "num_names": 2}

- 指示模型在匆忙下结论之前思考解决方案


prompt = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:

步骤:

    首先,自己解决问题。
    然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。
    在自己完成问题之前,请勿决定学生的解决方案是否正确。

使用以下格式:

    问题:问题文本
    学生的解决方案:学生的解决方案文本
    实际解决方案和步骤:实际解决方案和步骤文本
    学生计算的总费用:学生计算得到的总费用
    实际计算的总费用:实际计算出的总费用
    学生计算的费用和实际计算的费用是否相同:是或否
    学生的解决方案和实际解决方案是否相同:是或否
    学生的成绩:正确或不正确

问题:

    我正在建造一个太阳能发电站,需要帮助计算财务。
    - 土地费用为每平方英尺100美元
    - 我可以以每平方英尺250美元的价格购买太阳能电池板
    - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;

    作为平方英尺数的函数,首年运营的总费用是多少。

学生的解决方案:

    设x为发电站的大小,单位为平方英尺。
    费用:
    1. 土地费用:100x美元
    2. 太阳能电池板费用:250x美元
    3. 维护费用:100,000+100x=10万美元+10x美元
    总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元

实际解决方案和步骤:
"""
response = get_completion(prompt)
print(response)

输出:

实际解决方案和步骤:

1. 土地费用:100美元/平方英尺
2. 太阳能电池板费用:250美元/平方英尺
3. 维护费用:10万美元固定费用 + 10美元/平方英尺

总费用 = 土地费用 + 太阳能电池板费用 + 维护费用
总费用 = 100x + 250x + 10万 + 10x
总费用 = 360x + 10万

学生计算的总费用:450x + 10万美元
实际计算的总费用:360x + 10万美元
学生计算的费用和实际计算的费用是否相同:否
学生的解决方案和实际解决方案是否相同:否
学生的成绩:不正确

需要注意的是,掌握这些技巧可以帮助我们编写好的 prompt,但在实际项目中,一个完美的 prompt 需要根据输出与需求之间的差异不断迭代优化。作为 Prompt 工程师,关键不是一开始就要求完美的 Prompt,而是掌握有效的 Prompt 开发流程。

另外,在使用 LLM 应用时,还需要注意大模型的幻觉问题,即模型偶尔会生成一些看似真实但实则编造的内容。

2. 一些概念

01.零样本提示 (Zero-Shot Prompting) vs. 少样本提示 (Few-Shot Prompting)

在大规模语言模型(LLM)的使用中,零样本提示和少样本提示是两种常见的提示技术,分别在为模型提供背景信息和指令方面有不同的应用和效果。

- 零样本提示:在没有提供具体示例的情况下,仅通过描述任务或问题本身,让模型进行生成和推理。模型需要根据对问题的理解直接生成答案,适用于任务相对简单或模型已经有较多相关知识的情况。

- 少样本提示:在提供少量示例的情况下,让模型学习任务的具体模式和要求。这些示例帮助模型更好地理解任务,并提高其生成答案的准确性,适用于任务较为复杂或需要特定格式输出的情况。

02. 思维链 (Chain of Thought, CoT) vs. 自洽性 (Self-Consistency) vs. 思维树 (Tree of Thoughts, ToT)

在大规模语言模型(LLM)的开发和应用中,思维链、自洽性以及思维树等概念被用来提升模型的推理能力和生成内容的质量。

- 思维链 (CoT):通过分步推理来解决复杂问题的方法。模型不仅生成最终答案,还生成一系列中间推理步骤,使问题的解决过程变得透明和可追溯。通常在 prompt 中增加 `Think step-by-step` 实现。

- 自洽性:通过生成多个可能的答案和对应的推理路径,然后选择最一致或最常见的答案,以提高模型的可靠性。例如,`请列出所有可能的原因,解释为什么最近几年全球变暖的速度加快了,并选择那些在不同原因解释中保持一致的答案。`

- 思维树 (ToT):扩展思维链的方法,通过探索多条可能的推理路径(树状结构)来找到解决问题的最佳路径,特别适用于复杂的、多步骤的问题。例如,`请为每个可能导致最近几年全球变暖速度加快的原因生成一个思维树,包括支持该假设的直接和间接证据,以及可能的反对观点。`

3. 辅助工具

以上技巧针对开发者,也可以用于 web 应用中。以下介绍一些辅助工具,帮助 ChatGPT 更高效地完成日常工作。具体操作是先使用 ChatGPT 生成对应网站指定格式(比如 Markdown 等)的内容,然后把内容粘贴到对应网站上一键生成。

1. PPT制作:MINDSHOW

2. 思维导图制作:MARKMAP

3. 流程图制作:Mermaid

4. 图片制作:Midjourney

5. PDF阅读:ChatPDF

通过掌握提示工程,我们能够更精确地控制和引导大语言模型的输出,使其能够在不同的应用场景中发挥更大的作用和价值。这门技术不仅可以提高模型的准确性和效率,还能够使人机交互更加智能和自然。

2024最新全套大模型学习资料:大模型学习成长路线、书籍&学习文档、视频教程、项目实战、面试题汇总等,免费分享~

有需要的同学可以通过【微信扫描下方二维码】,即可免费领取!!!

一、大模型学习成长路线

学习新技能,方向至关重要。 正确的学习路线图可以为你节省时间,少走弯路;方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

二、大模型书籍&学习文档

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

在这里插入图片描述

在这里插入图片描述

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

四、大模型实战项目

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

五、大模型面试题汇总

面试,不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

上述的资料已经全部打包好,有需要这份全套的大模型学习资料的同学,可以通过【微信扫描下方二维码】,免费领取!!!

机会总是留给有准备的人。 如果你需要学习大模型,那么请不要犹豫,立刻行动起来!早掌握,早享受。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐