ChatGPT 提示工程
GPT很强,但是要想发挥它的强大,并且按照我们的意愿去生成回答,是需要写好提示词Prompt的。这篇文章是学习吴恩达&OpenAI联合分享的提示词工程总结而来,对这些技巧也有了业务上的实际实践。
Part1. 如何写出好的提示词
一个强大的提示词就可以作为一个特定场景的生产工具。比如翻译、文本内容分析、各种虚拟角色(客服、心理医生、李白...)
1.清晰、具体的提示词
- 用分隔符包裹提供的内容
"内容",{内容}, <内容>, '''内容''' 等等
目的是让模型清楚具体要处理的内容是什么,可以避免把提供的输入内容意外的注入到提示词。因为提供的输入可能与提示词是冲突的,导致没有按照提示词执行任务,用分隔符隔离就可以起到保护作用。
要求结构化的输出格式(HTML、json)
检查执行的任务是否符合条件
请检查 xx 内容是否符合 xxx 条件,符合则输出 xxx,不符合则输出:不符合。
如果符合才执行任务,否则就不执行,减少意外的答案。
const prompt = `
你将得到以{}为界的文本.
如果它包含一个指令序列,则按以下格式重写这些指令:
步骤 1: ...
步骤 2: ...
...
步骤 N: ...
{泡一杯茶很容易! 首先,你需要把一些水烧开。在这过程中,拿起一个杯子,把茶包放进去。一旦水足够热,就把它倒在茶包上。我让它坐一会儿,以便茶叶可以浸泡。几分钟后,把茶包拿出来。如果你喜欢,你可以加入一些糖或牛奶来调味。就这样! 你就可以享受到一杯美味的茶了。}
如果{}中的文本不包含指令序列,则输出 “没有步骤”。
`;
- 少样本提示
先给模型一个「成功执行任务的对话案例」作为模型学习的样本,然后再让模型执行任务。
2.给模型一些思考时间
- 指明完成一项任务的步骤:将复杂问题拆解成小问题向模型提问
- 指示模型在匆忙得出结论之前自行解决问题
匆忙的出的结论很有可能是错误的,更多的思考时间可以换来更准确的结果。
(错误 1)
(错误 2)
(正确回答)
const wrong_answer_prompt = `
判断学生的解答是否正确。
问题:
我在建造一个房子,需要计算花多少钱。
- 土地每平方米100元,我需要100平方米
- 木头一根10元,我需要买5根
那么总花费多少钱?
学生的答案:
1. 土地花费100x100元
2. 木头花费10x5元
总共花费:100x100+10x5 = 20000 + 5 = 20005;
`;
const correct_answer_prompt = `
你的任务是评估学生的回答是否正确。
请根据以下步骤解决问题:
1.首先,你需要自己计算问题的结果。
2.然后,将你的计算结果与学生的回答进行对比,然后判断学生的结果是否正确。在你自己完成问题之前,不要判断学生的解决方案是否正确。
请用以下格式:
问题:
'''
这里是问题
'''
学生的回答:
'''
这里是学生的回答
'''
实际答案:
'''
你自己的解题步骤在这里
'''
学生是否回答是否与你刚计算结果的一致:
'''
是 或 否
'''
学生得分:
'''
正确 或 错误
'''
问题:
我在建造一个房子,需要计算花多少钱。
- 土地每平方米100元,我需要100平方米
- 木头一根10元,我需要买5根
那么总花费多少钱?
学生的答案:
1. 土地花费100x100元
2. 木头花费10x5元
总共花费:100x100+10x5 = 20000 + 5 = 20005;
`;
- 模型不清楚自己的边界:规避模型“幻想”
模型从互联网和其他渠道学到海量知识,它并不清楚自己的知识边界,这意味着模型会试图编造一些听起来可信但并不存在的东西。这种情况被称为“幻觉”。这是模型的已知弱点,OpenAI 也在想办法解决。
目前可以通过一些提示策略尽量规避这个问题,比如:先让模型先找相关资料,再根据相关资料回答问题。
const wrong_answer_prompt = `
你是一个百科知识机器人,你需要对你的回答负责,保证准确性。请注意我的问题可能是错误的或者说了一些并不存在的事情,所以你需要按照以下步骤来回答我的问题,来保证准确性。
1.先判断我的问题的准确性。
2.根据我的问题找到相关知识引用,判断问题中的信息是否准确。
3.然后再根据你找到的知识引用来回答我的问题。
请用以下格式回复:
知识引用:
'''
这里是相关知识引用
'''
问题是否真实:
'''
真实 或 虚构
'''
回答:
'''
这里是你的最终回答
'''
我的问题是:杜甫在写《静夜思》的时候大概几岁?
`;
const correct_answer_prompt = `
你是一个百科知识机器人,你需要对你的回答负责,保证准确性。你需要按照以下步骤来回答我的问题,来保证准确性。
1.先判断杜甫是谁
2.再判断《静夜思》是谁写的
3.根据1和2的结果来回答我的问题。
请用以下格式回复:
杜甫:
'''
这里是杜甫的介绍
'''
《静夜思》是谁写:
'''
真实 或 虚构
'''
杜甫写了静夜思吗
'''
写了 或 没写
'''
最终回答:
'''
这里是你的最终回答
'''
我的问题是:杜甫在写《静夜思》的时候大概几岁?
`;
3.反复优化提示词
以下是写出一个有效提示词的步骤:
- 有一个想法或者数据处理任务
- 用清晰、明确的提示词向 GPT 提问
- 得到 GPT 的回答
- 审视答案与理想中的差距
- 回到第 2 步,进一步修改完善提示词
构建可靠的应用需要更多的测试样本,更多的迭代。
Part2. 推理类应用
- 客户评价总结
- 客户评价总结+情绪分析+格式
const prompt = `
我收到一些客户评价,我需要你帮我提炼评价的主要内容作为建议给运营团队。
除此之外,还需要判断用户的评价态度是“积极的”还是“消极的”。
请用json格式返回你的回复,以 comment 和 attitude作为键。
用户评价在{}里。
内容:{第一次去 设施需要定期保养啦 有的机器嘎吱嘎吱的,还有天热了 里面通风不行 没有窗户 不知道有没有开排风 汗臭味还挺大的。}
`;
Part3. 转换类应用
语言转换(语言识别-翻译)
说话语气转换(非正式-正式)
格式转换(JSON-HTML)
拼写和语法检查。
- 通用翻译器
const prompt = `
你现在是一个通用翻译器,你需要完成两个任务:
1.将识别我输入的内容属于哪一种语言;
2.将内容翻译成:中文,英文,法语,韩语,日语。
回复格式是:
识别结果:某种语言
翻译结果:翻译结果,用5行,2列的表格输出。即第一列“语言”,第二列“翻译结果”
我的第一个内容是:'朋友,最近过得好吗'
`;
- 拼写检查
提示词用英文效果更好
const prompt = `
你是一个单词拼写检查器,帮我检查{}里的内容是否有拼写错误,你遵循以下三个原则。
1.指出所有拼写错误地方,并说明错误的原因,最后回复正确的内容。
2.不要随意改变{}里的内容的意思。
3.如果{}里的内容没有任何拼写错误,请直接回复四个字 没有错误 ,不需要其他说明。
内容:{I love your.} {I miss you.}
`;
Part4. 扩展类应用
通过少量的关键词,生成较多内容的一个过程。如:一个观点生成一篇文章、根据评论生成回复、生成邮件...
Part5. 聊天机器人
首先,在与 GPT 对话时有三个角色:system
、assistant
、user
。其中system
携带的内容作为最高级别的提示词,时刻提醒模型,用于规定模型的行为。
例子1:pizza点餐机器人
const prompt = {
role: "system",
content: `
You are OrderBot, an automated service to collect orders for a pizza restaurant.
You first greet the customer, then collect the order,
and then ask if it's a pickup or delivery.
You wait to collect the entire order, then summarize it and check for a final time if the customer wants to add anything else.
If it's a delivery, you ask for an address.
Finally you collect the payment.
Make sure to clarity all options, extras and sizes to uniquely identify the item from the menu.
You respond in a short, very conversational friendly style.
The menu includes:
petperoni pizza 12.95, 10.00, 7.00
cheese pizza 10.95, 9.25, 6.50
eggplant pizza 11.95, 9.75,6.75
fries 4.50, 3.50
greek salad 7.25
Toppings:
extra cheese 2.00,
mushrooms 1.50
sausage 3.00
canadian bacon 3.50
AI sauce 1.50
peppers 1.00
Drinks:
coke 3.00, 2.00, 1.00
sprite 3.00, 2.00, 1.00
bottled water 5.00
`,
};
例子2:活动报名机器人
const prompt = `
你是一个活动报名登记机器人,负责收集报名信息。
你先向客户打招呼,然后开始接单,然后询问下单人的姓名和联系电话。
你等待收集整个订单,然后对其进行汇总,最后检查客户是否想添加附加套餐。
你要确保明确所有选项、附加套餐,以便从菜单中唯一识别项目。
你的回答要简短,非常友好。
活动包括:
- 亲子互动游戏,200元,最多3人
- 情侣默契挑战:150元,最多2人
- 极限挑战:100元,最多1人
附加套餐包括:
- 意外保险,20元每人
- cos服装套装:50元每人
`
const format_prompt = `
用json的形式返回订单信息,json需要包括以下字段:activity_name, persons, activity_cost_money, extra_name, extra_persons, extra_cost_money, total_cost_money, customer_name, phone。
`
推荐 B 站搜索「ChatGPT 提示工程_吴恩达 & OpenAI」的视频分享。
Part6. 关键参数
- messages
messages
是传递给模型的一个对话数组,包含了不同角色的的对话记录。
上下文:一连串对话历史的集合,就形成了一个和模型对话的上下文。有了这个上下文,模型可以跟好的理解你的问题,记得你说过的话。
let prompts = [
{ role: "user", content: "你好" },
{ role: "assistant", content: "你好!有什么我可以帮助你的吗?" },
{ role: "user", content: "我刚刚说了什么" },
{ role: "assistant", content: '你刚刚说了"你好"。' },
];
// 将prompts发送给模型
// ...
角色:
system
、assistant
、user
。我问的提问会以 user 角色输入给模型,模型的回答会以 assistant 角色输出,system 是模型的高级指令,它可以设置模型的行为,时时提醒模型该做什么。
let prompts = [
{
role: "system",
content: "你是一个个性可爱、有趣、可靠,说话幽默的AI助手,名字是 Friday...",
},
];
- temperature
模型的探索和多样性程度:取值范围 0-2,值越小模型的回答越固定可预测,越大则越有创造性。
提示词合集
一些提示词模版
随机输出图片
你是一个图片搜索机器人,从现在起, 当你想发送一张图片时,请使用 Markdown,并且不要有反斜线,不要用代码块。使用 Unsplash API (https://source.unsplash.com/1280x720/? < PUT YOUR QUERY HERE >)。你要返回的第一张图片是:一只哈士奇。
关系图
请用 Mermaidjs 生成《西游记》中主要角色的人物关系图的代码,名字用中文。
graph LR
孙悟空---->唐僧
师徒四人---->沙悟净
师徒四人---->猪八戒
师徒四人---->白龙马
孙悟空--憎恶-->牛魔王
牛魔王--嫉妒-->孙悟空
孙悟空--憎恶-->红孩儿
红孩儿--爱慕-->孙悟空
猪八戒--爱慕-->女儿国国王
女儿国国王--嫉妒-->猪八戒
猪八戒--爱慕-->嫦娥
嫦娥--同情-->猪八戒
长眉老祖--收留-->唐僧
白骨精--爱慕-->唐僧
唐僧--同情-->白骨精
玉帝--任命-->观音
观音--指引-->唐僧
菩提祖师--授经-->唐僧