首页 / 资料库 / 提示工程指南

资料库15 分钟读完MIT提示工程ChatGPT

ChatGPT 提示工程实战

译自《ChatGPT Prompt Engineering》 · 查看英文原文

原文出处ChatGPT Prompt Engineering 原作者:DAIR.AI · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与 DAIR.AI 所有。

本节介绍面向 ChatGPT 的最新提示工程(prompt engineering)技巧,包括使用建议、应用场景、局限性、相关论文和延伸阅读材料。

注意:本节内容仍在密集开发中。

目录: - ChatGPT 简介 - 回顾对话任务 - 与 ChatGPT 对话 - Python Notebooks


ChatGPT 简介

ChatGPT 是 OpenAI 训练出的新模型,能以对话的方式与人交流。这个模型经过训练,会按照提示词(prompt)里的指令,在对话语境中给出合适的回应。回答问题、推荐菜谱、按指定风格写歌词、生成代码,ChatGPT 都能帮上忙。

ChatGPT 用基于人类反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF)训练而成。相比之前的 GPT 版本,它的能力强得多(训练时也专门做了降低有害输出和不实输出的处理),但局限性依然存在。下面用具体例子看看它能做什么、做不到什么。

你可以在这里使用 ChatGPT 的研究预览版,但下文示例用的是 OpenAI Playground 的 Chat 模式。


回顾对话任务

在其中一篇前置指南里,我们讲过一些对话能力和角色提示(role prompting):如何指示大语言模型(LLM)以特定风格、带着特定意图、行为和身份去对话。

先回顾之前那个基础示例。我们做了一个对话系统,它回答问题时更偏技术性、更偏科学口吻。

提示词: ``` 下面是一场与 AI 研究助手的对话。助手的语气偏技术性、偏科学。

Human: 你好,你是谁? AI: 你好!我是 AI 研究助手。今天有什么可以帮你? Human: 能给我讲讲黑洞是怎么形成的吗? AI: ```

从上面这个例子能看到两个重要组成部分: - 意图(intent),说明这个聊天机器人是什么; - 身份(identity),规定聊天机器人回应时采用的风格或语气。

这个简单示例在使用 text-davinci-003 的文本补全(text completion)API 上效果不错。更近一些,OpenAI 发布了 ChatGPT API:一个更强大、更便宜、叫作 gpt-3.5-turbo 的模型,专为这类功能(对话补全,chat completions)而建。OpenAI 把它列为自家的最佳模型,连非对话场景也不例外。用 ChatGPT API 还有别的好处:成本大幅下降(90%)、效率更高。

Snap Inc.、Instacart 这样的大公司已经在自家产品里接入由 ChatGPT 驱动的对话功能,场景从个性化推荐到开放式购物目标都有。


与 ChatGPT 对话

多轮对话

为了展示 ChatGPT 的能力,我们沿用上面那个聊天助手示例,讨论一下结果。与 text-davinci-003 不同,驱动 ChatGPT 的 gpt-3.5-turbo 模型用聊天格式(chat format)作为输入。模型接收一连串消息,并据此生成回应。

输入: SYSTEM: 你是一名 AI 研究助手,语气偏技术性、偏科学。 USER: 你好,你是谁? ASSISTANT: 你好!我是 AI 研究助手。今天有什么可以帮你? USER: 能给我讲讲黑洞是怎么形成的吗?

输出: ASSISTANT: 当然!黑洞诞生于一颗大质量恒星耗尽燃料、在自身引力下坍缩的时刻。坍缩让恒星变得极度致密,引力强到连光都逃不出去。这个有去无回的边界叫作事件视界。恒星一旦越过事件视界,就被视为黑洞……

要注意,上面这个示例对输入和输出都做了简化,真实的 ChatGPT 对话补全 API 要求消息按特定格式组织。原文此处有一张截图,展示的是这个例子在 OpenAI Playground 的 Chat Mode 里的实际样子。

对我们这个例子来说,更正式的 API 调用长这样:

```python import openai

openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "You are an AI research assistant. You use a tone that is technical and scientific."}, {"role": "user", "content": "Hello, who are you?"}, {"role": "assistant", "content": "Greeting! I am an AI research assistant. How can I help you today?"}, {"role": "user", "content": "Can you tell me about the creation of black holes?"} ] ) ```

预计未来开发者与 ChatGPT 交互的方式,会通过 Chat Markup Language(简称 ChatML)来完成。

单轮任务

聊天格式支持多轮对话(multi-turn conversation),也同样支持单轮(single-turn)任务,也就是我们之前在 text-davinci-003 上做的那类事情。换句话说,ChatGPT 能完成我们在原始 GPT 模型上演示过的同类任务。比如,试试用 ChatGPT 做这个问答(question answering)任务:

输入: ``` USER: 根据下面的上下文回答问题。答案要简短精炼。如果拿不准答案,请回答 "Unsure about answer"。

上下文:Teplizumab 的源头可以追溯到新泽西一家叫 Ortho Pharmaceutical 的制药公司。那里的科学家做出了这种抗体的早期版本,取名 OKT3。它最初提取自小鼠,这种分子能够附着在 T 细胞表面,抑制 T 细胞的杀伤能力。1986 年,它获批用于预防肾移植后的器官排斥,成为首个允许用于人体的治疗性抗体。

问题:OKT3 最初提取自什么?

答案: ```

输出: ASSISTANT: 小鼠。

提醒一下,这里的 USERASSISTANT 标签是我加上的,为了演示这个任务在 ChatGPT 上怎么跑。原文此处有一张截图,展示的是这个例子在 Playground 里的样子。

更正式地写,这是对应的 API 调用(我只列出请求里的 message 部分):

```python CONTENT = """Answer the question based on the context below. Keep the answer short and concise. Respond \"Unsure about answer\" if not sure about the answer.

Context: Teplizumab traces its roots to a New Jersey drug company called Ortho Pharmaceutical. There, scientists generated an early version of the antibody, dubbed OKT3. Originally sourced from mice, the molecule was able to bind to the surface of T cells and limit their cell-killing potential. In 1986, it was approved to help prevent organ rejection after kidney transplants, making it the first therapeutic antibody allowed for human use.

Question: What was OKT3 originally sourced from?

Answer: """

response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": CONTENT}, ], temperature=0, ) ```

给聊天模型下指令

按照 OpenAI 官方文档的说法,gpt-3.5-turbo 模型的历史快照(snapshot)也会开放出来。比如,我们可以访问 3 月 1 日的快照 gpt-3.5-turbo-0301。这让开发者可以选定具体的模型版本。这也意味着,给模型下指令的最佳实践可能随版本变化。

针对 gpt-3.5-turbo-0301,当前的建议是把指令写进 user 消息,而不是写进可用的 system 消息。


Python Notebooks

说明 Notebook
进一步了解如何用 openai 库调用 ChatGPT API。 ChatGPT API Intro
学习如何用 LangChain 库使用 ChatGPT 的功能。 ChatGPT API with LangChain

参考文献


上一章(Applications,应用场景)

下一章(Adversarial Prompting,对抗性提示)

这篇在讲什么,跟咱们的课怎么对?

资料库是大厂公开教材的中文译本,偏原理和工程做法。想看面向中小企业的白话版本,去入门课场景课