Skip to content

ChatGPT 提示工程

GPT很强,但是要想发挥它的强大,并且按照我们的意愿去生成回答,是需要写好提示词Prompt的。这篇文章是学习吴恩达&OpenAI联合分享的提示词工程总结而来,对这些技巧也有了业务上的实际实践。

Part1. 如何写出好的提示词

一个强大的提示词就可以作为一个特定场景的生产工具。比如翻译、文本内容分析、各种虚拟角色(客服、心理医生、李白...)

1.清晰、具体的提示词

  • 用分隔符包裹提供的内容

"内容",{内容}, <内容>, '''内容''' 等等

目的是让模型清楚具体要处理的内容是什么,可以避免把提供的输入内容意外的注入到提示词。因为提供的输入可能与提示词是冲突的,导致没有按照提示词执行任务,用分隔符隔离就可以起到保护作用。

指令注入

  • 要求结构化的输出格式(HTML、json)

  • 检查执行的任务是否符合条件

请检查 xx 内容是否符合 xxx 条件,符合则输出 xxx,不符合则输出:不符合。

如果符合才执行任务,否则就不执行,减少意外的答案。

js
const prompt = `
    你将得到以{}为界的文本.
    如果它包含一个指令序列,则按以下格式重写这些指令:
    步骤 1: ...
    步骤 2: ...
    ...
    步骤 N: ...

    {泡一杯茶很容易! 首先,你需要把一些水烧开。在这过程中,拿起一个杯子,把茶包放进去。一旦水足够热,就把它倒在茶包上。我让它坐一会儿,以便茶叶可以浸泡。几分钟后,把茶包拿出来。如果你喜欢,你可以加入一些糖或牛奶来调味。就这样! 你就可以享受到一杯美味的茶了。}

    如果{}中的文本不包含指令序列,则输出 “没有步骤”。
`;

检查条件

  • 少样本提示

先给模型一个「成功执行任务的对话案例」作为模型学习的样本,然后再让模型执行任务。

少样本提示

2.给模型一些思考时间

  • 指明完成一项任务的步骤:将复杂问题拆解成小问题向模型提问
  • 指示模型在匆忙得出结论之前自行解决问题

匆忙的出的结论很有可能是错误的,更多的思考时间可以换来更准确的结果。

错误回答1 (错误 1)

错误回答2 (错误 2)

正确回答 (正确回答)

js
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 也在想办法解决。

目前可以通过一些提示策略尽量规避这个问题,比如:先让模型先找相关资料,再根据相关资料回答问题。

幻觉回答

规避幻觉回答

js
const wrong_answer_prompt = `
    你是一个百科知识机器人,你需要对你的回答负责,保证准确性。请注意我的问题可能是错误的或者说了一些并不存在的事情,所以你需要按照以下步骤来回答我的问题,来保证准确性。
    1.先判断我的问题的准确性。
    2.根据我的问题找到相关知识引用,判断问题中的信息是否准确。
    3.然后再根据你找到的知识引用来回答我的问题。

    请用以下格式回复:
    知识引用:
    '''
    这里是相关知识引用
    '''

    问题是否真实:
    '''
    真实 或 虚构
    '''


    回答:
    '''
    这里是你的最终回答
    '''

    我的问题是:杜甫在写《静夜思》的时候大概几岁?

`;

const correct_answer_prompt = `
    你是一个百科知识机器人,你需要对你的回答负责,保证准确性。你需要按照以下步骤来回答我的问题,来保证准确性。
    1.先判断杜甫是谁
    2.再判断《静夜思》是谁写的
    3.根据1和2的结果来回答我的问题。

    请用以下格式回复:
    杜甫:
    '''
    这里是杜甫的介绍
    '''

    《静夜思》是谁写:
    '''
    真实 或 虚构
    '''

    杜甫写了静夜思吗
    '''
    写了 或 没写
    '''


    最终回答:
    '''
    这里是你的最终回答
    '''

    我的问题是:杜甫在写《静夜思》的时候大概几岁?
`;

3.反复优化提示词

以下是写出一个有效提示词的步骤:

  1. 有一个想法或者数据处理任务
  2. 用清晰、明确的提示词向 GPT 提问
  3. 得到 GPT 的回答
  4. 审视答案与理想中的差距
  5. 回到第 2 步,进一步修改完善提示词

迭代提示提

构建可靠的应用需要更多的测试样本,更多的迭代。

Part2. 推理类应用

  • 客户评价总结

客户评价总结

  • 客户评价总结+情绪分析+格式

客户评价总结+情绪分析+格式

js
const prompt = `
    我收到一些客户评价,我需要你帮我提炼评价的主要内容作为建议给运营团队。
    除此之外,还需要判断用户的评价态度是“积极的”还是“消极的”。
    请用json格式返回你的回复,以 comment 和 attitude作为键。
    用户评价在{}里。
    内容:{第一次去 设施需要定期保养啦 有的机器嘎吱嘎吱的,还有天热了 里面通风不行 没有窗户 不知道有没有开排风 汗臭味还挺大的。}
`;

Part3. 转换类应用

语言转换(语言识别-翻译)
说话语气转换(非正式-正式)
格式转换(JSON-HTML)
拼写和语法检查。

  • 通用翻译器 6国语言翻译器

6国语言翻译器-优化

js
const prompt = `
    你现在是一个通用翻译器,你需要完成两个任务:
    1.将识别我输入的内容属于哪一种语言;
    2.将内容翻译成:中文,英文,法语,韩语,日语。

    回复格式是:
    识别结果:某种语言
    翻译结果:翻译结果,用5行,2列的表格输出。即第一列“语言”,第二列“翻译结果”

    我的第一个内容是:'朋友,最近过得好吗'
`;
  • 拼写检查

英文拼写检查

提示词用英文效果更好英文拼写检查

js
const prompt = `
    你是一个单词拼写检查器,帮我检查{}里的内容是否有拼写错误,你遵循以下三个原则。

    1.指出所有拼写错误地方,并说明错误的原因,最后回复正确的内容。
    2.不要随意改变{}里的内容的意思。
    3.如果{}里的内容没有任何拼写错误,请直接回复四个字 没有错误 ,不需要其他说明。

    内容:{I love your.} {I miss you.}
`;

Part4. 扩展类应用

通过少量的关键词,生成较多内容的一个过程。如:一个观点生成一篇文章、根据评论生成回复、生成邮件...

邮件扩展

Part5. 聊天机器人

首先,在与 GPT 对话时有三个角色:systemassistantuser。其中system携带的内容作为最高级别的提示词,时刻提醒模型,用于规定模型的行为。

例子1:pizza点餐机器人

pizza点餐机器人

js
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:活动报名机器人

活动报名机器人

js
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 是传递给模型的一个对话数组,包含了不同角色的的对话记录。

上下文:一连串对话历史的集合,就形成了一个和模型对话的上下文。有了这个上下文,模型可以跟好的理解你的问题,记得你说过的话。

上下文

js
let prompts = [
  { role: "user", content: "你好" },
  { role: "assistant", content: "你好!有什么我可以帮助你的吗?" },
  { role: "user", content: "我刚刚说了什么" },
  { role: "assistant", content: '你刚刚说了"你好"。' },
];

// 将prompts发送给模型
// ...

角色systemassistantuser。我问的提问会以 user 角色输入给模型,模型的回答会以 assistant 角色输出,system 是模型的高级指令,它可以设置模型的行为,时时提醒模型该做什么。

系统设定

js
let prompts = [
  {
    role: "system",
    content: "你是一个个性可爱、有趣、可靠,说话幽默的AI助手,名字是 Friday...",
  },
];
  • temperature

模型的探索和多样性程度:取值范围 0-2,值越小模型的回答越固定可预测,越大则越有创造性。

提示词合集

一些提示词模版

随机输出图片

你是一个图片搜索机器人,从现在起, 当你想发送一张图片时,请使用 Markdown,并且不要有反斜线,不要用代码块。使用 Unsplash API (https://source.unsplash.com/1280x720/? < PUT YOUR QUERY HERE >)。你要返回的第一张图片是:一只哈士奇。

关系图

请用 Mermaidjs 生成《西游记》中主要角色的人物关系图的代码,名字用中文。

mermaid
graph LR
    孙悟空---->唐僧
    师徒四人---->沙悟净
    师徒四人---->猪八戒
    师徒四人---->白龙马
    孙悟空--憎恶-->牛魔王
    牛魔王--嫉妒-->孙悟空
    孙悟空--憎恶-->红孩儿
    红孩儿--爱慕-->孙悟空
    猪八戒--爱慕-->女儿国国王
    女儿国国王--嫉妒-->猪八戒
    猪八戒--爱慕-->嫦娥
    嫦娥--同情-->猪八戒
    长眉老祖--收留-->唐僧
    白骨精--爱慕-->唐僧
    唐僧--同情-->白骨精
    玉帝--任命-->观音
    观音--指引-->唐僧
    菩提祖师--授经-->唐僧

西游记人物关系图

Released under the MIT License.