面向开发者的 ChatGPT 提词指南

Description
OpenAI x DeepLearning.ai
Published
May 12, 2023
Tags
AI
LLM
OpenAI 与 DeepLearning.AI 合作推出的短课程:ChatGPT Prompt Engineering for Developers 主讲人:Isa Fulford(OpenAI)和 吴恩达教授(Andrew Ng,DeepLearning.AI)

介绍 Introduction

网页版 ChatGPT 主要面向普通用户,除了体验,多用于一些临时性对话任务。而大语言模型更大的潜能在于开发者可以通过调用其 API 更快地构建智能应用。
基于此,课程后续安排了 7 个小节,每小节约十几分钟,概括讲授了提词开发的「道」与「术」——
  • 道,即宏观思想,包括普遍原则、迭代开发两节
  • 术,则侧重场景,包括文本摘要、推理、转换、扩写、聊天等
最后课程收尾,留下一个小小的总结。

指导原则 Guidelines

要想充分发挥模型能力,核心要点在于提示词(prompt)。须知提示词是在与模型交互,应清晰明确、引导其思考,并提防胡言乱语。

指令清晰且明确

  1. 划定用户输入的边界,e.g. 包裹在 ```
  1. 指定格式,让模型结构化输出,以供后续程序利用,e.g. 以 JSON 格式输出,并指定应包含哪些键
  1. 加上条件判断,满足与否做不同操作,e.g. 从文本中提取步骤,若无便答🈚️
  1. 加入案例,让模型现学,也称 few-shot learning、in-context learning
# 格式化输出 prompt = f""" Generate a list of three made-up book titles along with their authors and genres. Provide them in JSON format with the following keys: book_id, title, author, genre. """
# few-shot prompt = f""" Your task is to answer in a consistent style. <child>: Teach me about patience. <grandparent>: The river that carves the deepest valley flows from a modest spring; the grandest symphony originates from a single note; the most intricate tapestry begins with a solitary thread. <child>: Teach me about resilience. """

引导模型思考

  1. 指定步骤,让模型一步一步来,e.g. 包含总结翻译提取的复杂任务,显示要求模型按顺序处理指定任务,然后以固定格式组合呈现结果
  1. 独立完成后再对比结论,e.g. 批改学生作业应先让模型自做一遍,再与学生提交结果对比,否则模型很可能会发生误判
# step by step prompt = f""" Your task is to perform the following actions: 1 - Summarize the following text delimited by <> with 1 sentence. 2 - Translate the summary into French. 3 - List each name in the French summary. 4 - Output a json object that contains the following keys: french_summary, num_names. Use the following format: Text: <text to summarize> Summary: <summary> Translation: <summary translation> Names: <list of names in Italian summary> Output JSON: <json with summary and num_names> Text: <{text}> """

注意模型编造

语言模型本质是在对后续词进行预测,有可能编造出不存在的事物,此时模型放佛出现幻觉(Hallucination)还说得头头是道。作为开发者,应当本着负责任的态度着力避免。

迭代优化 Iterative

在与 LLM 交互的过程中,很少有人能一步到位地给到完美提词,这也是为什么市面上会出现 prompt engineer、prompts market 等。所以正确的思路是:心怀原则,逐步逼近。
notion image
 
在介绍完指导思想后,课程针对五个主要应用场景进行讲解,带领开发者入门。

文本摘要 Summarizing

摘要即对输入的长文本进行总结提炼,LLM 的优势在于用户可以通过自然语言对摘要进行不同维度的约束:
  • 限制摘要长度,可以是词数、句子数、符号数,需注意 LLM 作为语言模型,不一定能精确地满足数字限制
  • 指定关注角度,比如对于一段较长的客户评价,其中可能包含针对商品、物流、场景、包装等不同维度的点评,传统做法需要基于细粒度文本分析,大模型则可直接提取并摘要,通过在提示词中指定摘要维度如主要关心物流评价,则可令其总结出客户对物流方面的点评。
最佳实践:
  • 注意「总结」与「提取」会有不同的效果,结合实际需求选用

文本推理 Inferring

主要讲解情感和主题两种推理,也是传统 NLP 领域的经典任务。在海量语料上训练出来的 LLM 胜任此类任务,具体而言:
  • 可以判断一段文本的情感倾向,是正面还是负面
  • 可以识别一段文本中包含的情感,以若干情感词来总结
  • 可以判断是否具有某种指定情感,如生气
  • 可以提取文本主题,指定提取数量
最佳实践:
  • 要求模型以特定格式输出,比如简单的 Yes/No、Positive/Negative,或是 JSON 格式的 {topic1: true, topic2: false}
  • 一次性多维度推理,e.g. 对同一份客户评价直接提取多角度的反馈情绪,并结构化输出,不失为一种省钱的办法
  • 在做主题提取时,可预设关键词,如果模型认为输入文本的主题包含关键词,触发后续提醒等操作,一个场景是相关文章内容推送

文本转换 Transforming

转换通常是指在不改变文本大意的情况下对其语种、语气等进行变换,LLM 在此方面的能力包括但不限于:
  • 不同语种翻译,包括陌生语种识别
  • 不同语气转换,如敬语/谦语、日常/书面等
  • 文本格式转换,e.g. JSON → HTML
  • 文本语法纠错及润色
最佳实践:
notion image

文本扩写 Expanding

扩写最能体现生成式模型的「生成」,即按给定短句的要求生成长文本,课程中的案例是以 AI 客服的身份回复客户评价。
最佳实践:
  • 应负责任地使用,通过标注、落款等让用户知道内容由 AI 生成
  • 通过 temperature 参数来调整文本生成的多样性
notion image

聊天机器人 Chatbot

聊天机器人侧重对话,对话生成与其他指令型任务最大的区别在于需为模型添加聊天历史以构建上下文,这也是 ChatGPT 维持会话的方式,在开发时的做法是将历史消息以列表形式传回模型。
调用 OpenAI API 时,每条消息都有其归属类型,包含三类不同角色:
  • system:为聊天机器人注入灵魂、固定人设、性格、能力及边界
  • user:用户消息
  • assistant:模型生成消息
比如,一个对话点单机器人,需要告知其如何一步步响应顾客(问候-点单-堂食外带等)、响应方式(友好对话),并录入菜单:
context = [ { 'role':'system', 'content':""" You are OrderBot, an automated service to collect orders for a pizza restaurant. You first greet the customer, then collects the order, and then asks 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 clarify 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 pepperoni 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 """ } ] # accumulate messages
然后在每一次客户回答后,将消息追加至上下文列表中去,以使点单机器人明确服务。

总结 Conclusion

该系列短课程累积不过一个多小时,十分推荐大家能去 DeepLearning.AI 官网学习,因为其课程视频旁边就有 Notebook,且已配置好了 OpenAI 的 API key,能够在听课过程中随时暂停,跟着两位老师操作,感受不同提示词的效果。另外,绝大部分录屏视频都作为竖版,适配了双栏页面,脚本字幕(可能是 AI 识别的)亦可在页面上找到,除了网络,其他体验极好。
当然,更重要的是听完之后有机会应当快速起手写个应用跑一跑,如 Isa 所言:
No application is too small.