看过前面文章的朋友们,应该还记得一句话,那就是prompt是应用程序跟大模型交互的唯一通道。作为与AI交流的桥梁,Prompt Engineering(提示工程)正在成为一个非常值得关注的领域。
那么,什么是提示工程呢?它的重要性何在?在业务中又是如何应用的?接下来,我们将用浅显易懂的语言,深入探讨这个概念。
什么是Prompt Engineering?
"Prompt"(提示)这个词在AI领域的含义,简单来说,"Prompt"就是你跟一个AI系统交流时所提出的请求或者指令,比如"讲个笑话"、"写首诗"。就好比你在与一个全能的助手对话时,你所提出的问题或任务是"prompt"。
而Prompt Engineering,则是关于如何设计这些"提示",以便能够有效地指导AI生成你需要的输出。
Prompt的重要性
Prompt看起来好像很简单,Prompt的设计好坏直接影响到AI生成的结果。
好的prompt能够明确地传达你的意图,并且促使AI提供准确、相关且高质量的答案或解决方案。
可以说,Prompt是AI时代的"编程语言",Prompt Engineering是AI时代的"软件工程"。
大家应该也听说过现在有一种职业叫"提示词工程师",还非常吃香,我们可以理解为这就是AI时代的"软件工程师"。
因此,掌握提示的艺术,对于任何使用AI技术的人来说,都是一项非常宝贵的技能。
如何设计Prompt
设计Prompt本质上可以从以下两类来考虑:
答案指示型prompt
根据任务的目标、答案的类型设计prompt,通过prompt引出答案。
任务提示型prompt
提醒模型是要做什么任务,因为同样输入一句话,可以做的任务太多了,通过prompt让模型知道这次是要做什么任务。
优秀prompt的构成
如果您接触过大量提示工程相关的示例和应用,您会注意到提示词通常包含以下一些要素:
- 1、角色。发起一个提示时,先给AI定义一个当前任务的角色,比如"你是一名忧郁的诗人"、"你是一名资深的系统架构师"...
- 2、指示。对当前任务描述,高质量Prompt的核心要素:具体、丰富、少歧义。
- 3、上下文。给出与任务相关的其他背景信息,尤其是在跟AI多轮的交互中。
- 4、例子。可以举一些例子,能起到很大的作用,在学术中称为one-shot learing, few-shot learing或in-context learing。
- 5、输入。在提示词中明确的标识任务输入的信息。
- 6、输出。可以指定要输出的格式,比如Markdown、JSON、XML等。
注意,提示词所需的格式取决于您想要语言模型完成的任务类型,并非所有以上要素都是必须的。
几个建议
- 1、记住:把AI当人看!把AI当人看!把AI当人看!
- 2、强烈建议多看看chatGPT官方文档,中文的提示工程指南:github.com/yunwei37/Pr... , www.promptingguide.ai/zh
- 3、chatGPT对Marhdown格式非常友好。
- 4、多尝试,有时真的需要运气,一字之差,对结果生成的概率也有很大的影响,要多做尝试才能找到更优秀的Prompt。
提示应用
生成数据
LLMs有强大的文本生成能力。使用有效的提示策略可以引导模型产生更好、更一致和更准确的回复。LLMs还可以特别有用于生成有用于运行各种实验数据。
例如,我们可以使用它生成快速样本以用于情感分类器,就像这样: 提示:
makefile
生成6个情感分析例子。将示例归类为积极或消极。生成4个积极的示例和2个消极的示例。使用以下格式进行示例:
问: <句子>
答: <情感>
输出:
makefile
问: 我今天过得非常愉快,享受了美好的阳光和新鲜空气。
答: 积极
问: 我非常喜欢这部电影,它让我笑了很久。
答: 积极
问: 这次旅行让我感到无比放松和平静,我真的感到精神焕发。
答: 积极
问: 我刚刚得知我通过了考试,我感到非常兴奋和自豪。
答: 积极
问: 我觉得自己好像一无是处,无论我怎么做都得不到别人的认可。
答: 消极
问: 我对工作感到厌倦,每天上班都觉得沮丧和无聊。
答: 消极
PAL(程序辅助语言模型)
程序辅助语言模型(PAL)是一种使用LLMs阅读自然语言问题并生成程序作为中间推理步骤的方法。
例如,我们需要AI理解日历,下面是使用LangChain和OpenAI GPT-3的示例:
python
import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenv
load_dotenv()
# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")
# for LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
# 设置实例模型
llm = OpenAI(model_name='text-davinci-003', temperature=0)
# 设置提示
question = "2024年的第一天是星期一,今天是2024年的第9个星期二,请问今天的日期是什么?格式为YYYY/MM/DD。"
DATE_UNDERSTANDING_PROMPT = """
# Q:2015还有36小时就要到了。从今天算起一周后的日期是什么(以MM/DD/YYYY的格式呈现)?
# 如果2015年还有36小时就要到了,那么今天就是36小时前。
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# 从今天算起一周后,
one_week_from_today = today + relativedelta(weeks=1)
# 用%m/%d/%Y格式呈现的答案是
one_week_from_today.strftime('%m /% d /%Y')。
"""
代码生成
chatGPT是很擅长写代码的。
简单例子
与OpenAI的所有聊天模型一样,如:
请用python写一度啊代码,询问用户他们的名字并向他们说"你好"。
那么chatGPT回复如下:
python
# 询问用户的名字并向他们打招呼
name = input("你叫什么名字? ")
print("你好," + name + "!")
将注释转换成代码
举例,提示:
python
请将下面注释转成python代码
"""
创建一个电影名称列表
创建这些电影的评分列表
组合他们并创建一个包含10部电影及其评级的json对象
"""
输出:
ini
import json
# 创建电影名称列表
movies = [
"阿凡达",
"泰坦尼克号",
"复仇者联盟",
"星球大战",
"盗梦空间",
"少年派的奇幻漂流",
"哈利波特与魔法石",
"指环王",
"美丽心灵",
"当幸福来敲门"
]
# 创建电影评分列表
ratings = [
9.2,
8.8,
9.0,
8.7,
8.9,
8.5,
8.6,
9.1,
8.4,
8.7
]
# 组合电影名称和评分并创建JSON对象
movie_data = []
for i in range(len(movies)):
movie = {
"电影名称": movies[i],
"评分": ratings[i]
}
movie_data.append(movie)
json_data = json.dumps(movie_data, ensure_ascii=False, indent=4)
print(json_data)
Function calling
前面的文章讲过,通过Function calling可以让用户能够高效的使用外部工具、外部API进行交互,来实现一些基础大模型无法完成的推理。 后面我们将专门写一篇文章来介绍如何使用Function calling,这里就不做多的说明了。
如何进行Prompt调优
Prompt调优是一种艺术与科学的结合。一开始,你的prompt可能不够完美。但通过不断实践和调整,你可以提高其效能。
以下是一些调优的基本步骤:
-
明确目标: 确定你想要AI完成什么任务,你期待的输出是什么样的。
-
逐步迭代: 开始时用一个基本的prompt,然后根据AI的反馈逐步调整。
-
简化清晰: 确保你的prompt简单明了,避免使用复杂或含糊的语言。
-
测试不同的变体: 实验不同的措辞和结构,看看哪种效果最好。
-
分析结果: 检查AI的输出,决定哪些部分已经满足需求,哪些需要改进。
-
使用数据: 如果可能的话,收集数据分析哪些类型的prompt产生了最好的结果。
-
获取反馈: 让用户或其他团队成员对AI的响应给出反馈,进一步完善你的prompt。
Prompts精选
最后,推荐一个中文prompts精选:github.com/yzfly/wonde...
这是一个《ChatGPT 中文指南》的作者优化、精选的系列中文ChatGPT Prompts,有上百个高质量prompt,并提供图文使用示例,让大家能够更好的学习使用 ChatGPT。
其实,Prompt Engineering并不神秘,在你掌握了基本的原则和技巧后,你就可以开始有效地与AI进行交流了。就像学习一门新语言一样,越多的练习和实践,你的技能就会越精湛。
欢迎关注我的公众号"小门小道",原创文章第一时间推送。