一、什么是提示工程(Prompt Engineering)
提示工程,也称为"Γ指令工程"。在人工智能领域,Prompt指的是用户给大型语言模型发出的指令。例如,“Γ讲个笑话”、“Γ用Python编个贪吃蛇游戏”、“Γ给男/女朋友写封情书"等。虽然看似简单,但实际上,Prompt在人工智能时代扮演着非常重要的角色。它被誉为AGI时代的"编程语言”,而提示工程则被视为AGI时代的"软件工程"。因此,掌握提示工程技能就像学会使用鼠标和键盘一样,是适应AGI时代的基本技能。目前,提示工程呈现出"门槛低,落地难"的特点,因此有人戏称prompt为"Γ咒语"。不过,专门的"提示工程师"这个职业可能不会长久存在,因为随着AI的进化,提示工程会变得越来越简单,每个人都需要掌握提示工程技能。
二、我们的优势
我们理解大模型生成内容的原理是基于概率生成下一个字,因此我们能够判断为什么有些指令有效,有些指令无效,以及同样的指令为何有时有效,有时无效。我们也清楚如何提升指令有效的概率。此外,我们具备编程知识,能够判断哪些问题更适合使用提示工程解决,哪些问题更适合使用传统编程解决。我们能够实现提示工程与业务系统的对接,从而充分发挥其效能。
三、使用Prompt的两种目的
获取针对具体问题的具体结果,例如"我该学Vue还是React?“或者"PHP为什么是最好的语言?”。
将一组Prompt固化到程序中,使其成为系统功能的一部分,例如"每天生成本公司的简报"、“AI客服系统"或"基于公司知识库的问答”。对于前者,主要通过ChatGPT、ChatALL等界面进行操作。对于后者,则需要编写代码。我们专注于后者,因为掌握后者能轻松完成前者,并且后者是我们的独特优势。
四、Prompt调优
寻找好的prompt是一个持续迭代的过程,需要不断调优。如果了解训练数据,那么参考训练数据来构造prompt是最佳方法。例如,如果你知道某人喜欢读红楼梦,就可以和他聊红楼梦;如果你知道某人在阿里工作十年,就可以多说阿里黑话;如果你知道某人是日漫迷,就可以夸赞他卡哇伊。如果不了解训练数据,那么就需要不断尝试。尝试是常用的方法,虽然存在运气因素,但这也是提示工程"门槛低、落地难"的原因之一。高质量的prompt应具备具体、丰富、少歧义的特点。我们的"群聊天"习惯与prompt背道而驰,而欧美的"群发邮件"习惯则更为有利。
五、Prompt的典型构成
角色:为AI定义一个最匹配任务的角色,例如"你是一位软件工程师"或"你是一位小学老师"。
指示:对任务进行描述。
上下文:提供与任务相关的其他背景信息,尤其在多轮交互中。
例子:必要时给出举例,这在学术上称为one-shot learning, few-shot learning或in-context learning。实践证明,举例有助于提高输出的正确性。
输入:任务的输入信息;在提示词中明确标识出输入。
输出:输出的格式描述,以便后续模块自动解析模型的输出结果,例如JSON、XML等。"定义角色"实际上并非必需,这完全是大家"把AI当人看"玩出的一个用法。然而,由于这种用法广为传播,现在的大型模型在训练数据中基本都包含了这一元素。有一个已被论文证实的现象可以解释为什么"你是一个xxx"这样的定义有效:大型模型对prompt开头和结尾的内容更敏感。因此,先定义角色实际上是在开头将问题域收窄,减少歧义性。
使用Prompt进行文本生成的方法可以分为以下几个步骤:
选择一个合适的预训练语言模型,并了解它的使用方法。
确定要生成的文本类型和风格,例如诗歌、小说、新闻、广告语等。
构造Prompt语句,即输入给模型的指令。Prompt语句应该尽可能具体、清晰,并包含足够的上下文信息,以便模型能够生成符合要求的文本。例如,如果要生成一首关于春天的诗歌,Prompt语句可以是“请写一首描述春天的诗歌,要求包含花朵、绿草和阳光等元素”。
将Prompt语句输入到模型中,并等待模型生成文本。这个过程可能需要一定的时间,具体取决于模型的复杂度和生成文本的长度。
对生成的文本进行评估和修改。生成的文本可能不完全符合要求,或者存在语法、语义等方面的错误。因此,需要对生成的文本进行评估和修改,以便得到更好的结果。
业务场景:办理流量包的智能客服
流量包产品:
经济套餐:10GB/月,50元/月,无限制
畅游套餐:100GB/月,180元/月,无限制
无限套餐:1000GB/月,300元/月,无限制
校园套餐:200GB/月,150元/月,在校生
2.2、对话系统的基本模块
对话系统通常由以下几个模块组成:自然语言理解(NLU),对话状态跟踪(DST),对话策略学习(DPL)和自然语言生成(NLG)。
NLU负责识别用户的输入,DST负责跟踪对话的上下文和状态,DPL负责根据当前状态选择下一步的动作,NLG负责将系统的动作转换成自然语言输出。
对话流程举例:
用户:我想办理一个流量包。
NLU识别用户的意图为办理流量包。
DST更新对话状态为办理流量包。
DPL根据当前状态选择推荐流量包的动作。
NLG生成推荐流量包的自然语言输出。
系统:好的,您更倾向于畅游套餐,每月100GB流量,180元。
2.3、用Prompt实现上述模块功能
在Prompt中,我们可以使用自然语言来描述任务,模型会自动生成相应的代码或文本。下面是一个用Prompt实现对话系统的例子。
环境搭建:
调试Prompt的过程通常在图形界面里开始会更方便,但为了方便演示和大家上手体验,我们直接在代码里调试。首先,需要加载环境变量和OpenAI的API密钥。然后,定义一个基于Prompt生成文本的函数get_completion()。该函数接受一个Prompt作为输入,调用OpenAI的API生成文本输出。为了简化调试过程,我们可以在代码中直接定义Prompt,并调用get_completion()函数生成输出。下面是一个用Prompt实现NLU和DST的例子。
2.3.1、实现一个NLU
任务描述+输入:
你的任务是识别用户对手机流量套餐产品的选择条件。每种流量套餐产品包含三个属性:名称,月费价格,月流量。根据用户输入,识别用户在上述三种属性上的倾向。例如,用户输入“办个100G的套餐”,则表明用户对月流量的选择条件是100GB或更高。请编写一个函数parse_user_input(),接受用户输入作为参数,返回一个包含用户对流量、价格和适用人群的选择条件的字典。为了方便调试和输出,请使用print()函数打印输出结果。下面是一个用Prompt实现该函数的例子。
In [7]:
任务描述
instruction = “”"
你的任务是识别用户对手机流量套餐产品的选择条件。每种流量套餐产品包含三个属性:名称,月费价格,月流量。根据用户输入,识别用户在上述三种属性上的倾向。例如,用户输入“办个100G的套餐”,则表明用户对月流量的选择条件是100GB或更高。请编写一个函数parse_user_input(),接受用户输入作为参数,返回一个包含用户对流量、价格和适用人群的选择条件的字典。为了方便调试和输出,请使用print()函数打印输出结果。"""
用户输入
input_text = “”"
办个100G的套餐。
“”"
Prompt模版
prompt = f"""
{instruction}
用户输入:
{input_text}
“”"
response = get_completion(prompt)
print(response)
根据用户输入, 可以得出以下结论:
名称:用户倾向于选择100G的套餐, 因此名称可能包含"100G"或类似的关键词。
月费价格:用户没有提及对月费价格的倾向, 因此无法确定用户对月费价格的选择条件。
月流量:用户明确表示希望办理100G的套餐, 因此用户对月流量的选择条件是100G或更高的流量。
综上所述 ,用户对手机流量套餐产品的选择条件是名称中包含"100G"或类似的关键词, 以及月流量为100G或更高。下面是一个用Prompt实现该函数的完整代码示例:
纯用 OpenAI API 实现完整功能
In [6]: # 加载环境变量
import os
from openai import OpenAI from dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv()) # 读取本地 .env 文件, client =
(api_key=os.getenv(“_API_KEY”),base_url=os.getenv(“_API_BASE”)
)
session = [
{
“role”: “system”,
“content”: “”"
你是一个手机流量套餐的客服代表 ,你叫小瓜 。可以帮助用户选择最合适的流量套餐产品 。可以选择的套餐包括: 经济套餐, 月费50元, 10G流量;
畅游套餐, 月费180元, 100G流量;
无限套餐, 月费300元, 1000G流量;
校园套餐, 月费150元, 200G流量 ,仅限在校生。
“”"
}
]
def get_completion(prompt, model=“gpt-3.5-turbo”):
session.append({“role”: “user”, “content”: prompt})
response = client.chat.completions.create(
model=model,
messages=session,
temperature=0, # 模型输出的随机性,0 表示随机性最小
)
msg = response.choices [0].message.content
session.append({“role”: “assistant”, “content”: msg})
return msg
get_completion("有没有土豪套餐? ")
get_completion("多少钱? ")
[
{
“role”: “system”,
“content”: “\n你是⼀ 个⼿机流量套餐的客服代表 ,你叫⼩⽠ 。可以帮助⽤户选择最合适的流量套餐产 品 。可以选择的套餐包括:\n经济套餐, ⽉费50元, 10G流量;\n畅游套餐, ⽉费180元, 100G流量;\n无限套餐, ⽉费300元, 1000G流量;\n校园套餐, ⽉费150元, 200G流量 ,仅限在校⽣ 。\n”
},
{
“role”: “user”,
“content”: "有没有土豪套餐? "
},
{
“role”: “assistant”,
“content”: “很抱歉, 我们暂时没有土豪套餐 。但是我们有无限套餐, 它提供1000G的流量, 适合⼤流 量⽤户 。如果您有其他需求, 我可以帮您选择其他适合的套餐 。”
},
{
“role”: “user”,
“content”: "多少钱? "
},
{
“role”: “assistant”,
“content”: “无限套餐的⽉费是300元 。它提供1000G的流量, 适合⼤流量⽤户 。如果您有其他需求, 我 可以帮您选择其他适合的套餐 。”
},
{
“role”: “user”,
“content”: “给我办⼀ 个”
},
{
“role”: “assistant”,
“content”: “好的 ,请问您的⼿机号码是多少?我将为您办理无限套餐 。”
}
]
想要站在AI科技的前沿,掌握大模型的核心技术吗?是否觉得无从下手,渴望有一个系统化的学习路径?那么,你的等待结束了!零基础起步,逐层深入,直至掌握大模型的核心技术。课程内容丰富,覆盖自然语言处理、计算机视觉、推荐系统等多个热门领域。
五大学习层次,从AIGC产品基础操作到独立构建大型语言模型,我们带你一步步攀升AI技术之巅:
入门:熟悉AIGC产品,掌握基本操作,感受AI魅力。
进阶:学习微调大模型,让通用模型适应特定需求。
深化:构建垂直领域大模型,为特定行业定制AI解决方案。
精进:增量预训练大模型,结合复杂知识库、Agent和API,开发AI原生产品。
巅峰:从零开始训练大型语言模型基座,掌握多领域通用能力。
强大的讲师团队,由经验丰富的Aiden博士领衔,资深工程师共同研发。他们来自世界一流学府,拥有深厚的实战经验和前沿技术洞察力,愿意与你分享他们的知识与智慧。