Chatgpt Promopt: 优化对话模型输出的技巧

AI 摘要: 本文通过介绍使用ChatGPT进行对话的提示工程技巧,强调了正确输入的重要性和GIGO原则,以及保持专业性、具体说明上下文和结果、使用零样本、少量样本和COT提示、使用知识提示和代码提示等技巧。同时还介绍了OpenAPI参数限制。

1. 内容概要

简要介绍了在使用 ChatGPT 进行对话时的提示工程技巧。根据 GIGO 原则,正确和准确的输入对于获得正确和有效的输出结果至关重要。提供了一系列技巧,如保持专业性、具体说明上下文和结果、使用零样本、少量样本和 COT 提示进行对话、使用知识提示引导对话模型等。此外,还有代码提示的示例,以及对 OpenAPI 参数的限制的介绍。

  1. GIGO 原则: 使用 ChatGPT 进行对话时,正确和准确的输入非常重要,即**垃圾进入,垃圾出去(GIGO) **,只有拥有高质量、可靠和准确的输入数据才能得到正确而有效的输出结果。文章强调了 GIGO 原则在计算机系统和其他领域的重要性。
  2. 专业性: 在提示中保持专业性,指明期望的回答的具体格式、长度、样式等,避免蓬松和不精确的描述。同时,根据不同的受众,可以调整语言风格和内容的难度。
  3. 具体说明: 在提示中具体说明上下文、结果、长度、格式、样式等要求,尽量避免不清晰的描述。使用示例阐明所需的输出格式和样式,也可以通过描述步骤来引导模型生成特定模式的代码。
  4. **零样本、少量样本和 COT 提示 **: 对于不同的任务,可以使用零样本、少量样本和 COT 提示进行对话。零样本是指没有向模型提供示例的情况下的对话能力。少量样本是指提供少量示例的情况下的对话能力。COT 提示是同时使用少量和零样本提示的方式,可以进行更复杂的推理和问题求解任务,将问题分解成多个步骤,并向模型演示每个步骤。
  5. 知识提示: 在对话中使用知识提示,指示模型以特定的风格、特定的意图、行为和身份进行对话。可以为模型提供特定的规则和标签,以更好地引导对话模型的行为。
  6. 代码提示: 提供代码提示的示例,可以引导模型生成特定格式的代码,例如 JavaScript 或 MySQL 等。代码提示可以帮助开发人员更好地使用对话模型完成编程任务。
  7. OpenAPI 参数限制: 文章介绍了 OpenAPI 中的一些参数限制,如模型性能、温度、最大长度、停止序列和流等参数的使用和影响。

ps. 实操过程,Prompt 改善有一些还是有作用(比如指令清晰、格式描述等),OpenAI 接口还是偏黑盒,在实操中还是有一些问题,继续探索中…

2. 香农定律

1
C = B * log2(1 + S/N)
  1. S/N信噪比越高时,可以传输更多的数据 – ChatGPT 页
  2. B带宽越大,传输速率越快

2.1. GIGO

代表“垃圾进入,垃圾出去”(Garbage In, Garbage Out)。它指的是如果输入数据有误或不完整,则输出结果也会受到影响。2023-06-21 这个概念强调了正确性和准确性在计算机系统中的重要性。

GIGO 原则同样适用于其他领域,如商业决策、科学研究等。在任何情况下,只有当我们拥有高质量、可靠和准确的输入数据时才能得到正确而有效的输出结果。

3. ChatGPT 提示词技巧

3.1. 提示词应指令具体,避免不清晰 - SMART

  • Bad:解释提示工程的概念。保持解释简短,只有几句话,不要过于描述
  • Good:使用 2-3 句话向高中学生解释提示工程的概念。

3.2. 提示词应具体描述清楚,包含上下文、结果、长度、格式、样式等

  1. Good: Write a short inspiring poem about OpenAI, focusing on the recent DALL-E product launch (DALL-E is a text to image ML model) in the style of a {famous poet}
  2. Bad:Write a poem about OpenAI.
1
2
3
4
5
// 专业性
The following is a conversation with an AI research assistant. The assistant tone is technical and scientific.

// 小学生都能懂
The following is a conversation with an AI research assistant. The assistant answers should be easy to understand even by primary school students.

3.3. 提示时候,可以提供占位符和格式示例描述

1
2
3
4
5
6
7
8
9
Extract the important entities mentioned in the text below. First extract all company names, then extract all people names, then extract specific topics which fit the content and finally extract general overarching themes

Desired format:
Company names: <comma_separated_list_of_company_names>
People names: -||-
Specific topics: -||-
General themes: -||-

Text: {text}

3.4. 基于少量示例, 从 zero-shot 开始,然后是 few-shot(示例),然后微调

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[system]
Extract keywords from the corresponding texts below.

Text 1: Stripe provides APIs that web developers can use to integrate payment processing into their websites and mobile applications.
Keywords 1: Stripe, payment processing, APIs, web developers, websites, mobile applications

##
Text 2: OpenAI has trained cutting-edge language models that are very good at understanding and generating text. Our API provides access to these models and can be used to solve virtually any task that involves processing language.
Keywords 2: OpenAI, language models, text processing, API.

##
Text 3: {text}
Keywords 3: {keywords
}
1
2
3
4
5
Classify the text into neutral, negative or positive.
Text: I think the vacation is okay.
Sentiment: neutral
Text: I think the food was okay.
Sentiment:

3.5. 提示词应减少“蓬松”和“不精确”的描述

  1. Good: 使用 3 到 5 个句子描述此产品。
  2. Bad: 此产品的描述应该相当简短,只有几句话,并且不要太多。

3.6. 提示词与其说什么不该做,不如说什么该做

因为 GPT 模型是基于tokens进行概率匹配,无法像人一样直观排除

Bad:

1
2
3
4
The following is a conversation between an Agent and a Customer. DO NOT ASK USERNAME OR PASSWORD. DO NOT REPEAT.

Customer: I can’t log in to my account.
Agent:

Better:

1
2
3
4
The following is a conversation between an Agent and a Customer. The agent will attempt to diagnose the problem and suggest a solution, whilst refraining from asking any questions related to PII. Instead of asking for PII, such as username or password, refer the user to the help article www.samplewebsite.com/help/faq

Customer: I can’t log in to my account.
Agent:

3.7. 引导词语: 代码生成时候使用“引导词”将模型推向特定模式

1
2
3
4
5
# Write a simple python function that
# 1. Ask me for a number in mile
# 2. It converts miles to kilometers

import

3.8. 样本提示影响

3.8.1. 零样本

我们没有向模型提供任何示例——这就是零样本能力的作用。

1
2
3
4
5
6
将文本分类为中性、负面或正面。
文本:我认为这次假期还可以。
情感:

// 输出
中性

3.8.2. 少量样本

  1. 对于更困难的任务,我们可以尝试增加演示(例如 3-shot、5-shot、10-shot 等)
  2. 新 GPT 模型甚至对随机格式也变得更加稳健
  3. 少样本提示不足以获得这种类型的推理问题的可靠响应(将问题分解成步骤并向模型演示,这可能会有所帮助。CoT - Chain-of-Thought: 思维链 ,分治思想,以解决更复杂的算术、常识和符号推理任务)

【example1】

1
2
3
4
5
6
7
这太棒了!// Negative
这太糟糕了!// Positive
哇,那部电影太棒了!// Positive
多么可怕的节目!//

// 输出
Negative

【example2】

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
我去市场买了10个苹果。我给了邻居2个苹果和修理工2个苹果。然后我去买了5个苹果并吃了1个。然后我又碰到了一家水果店促销,又购买了5个苹果,我还剩下多少苹果?

按下面的格式一步一步计算:
Step1: 我去市场买了10个苹果,当前我有10个苹果
Step2: 我给了邻居2个苹果,当前我剩下8个苹果

// 输出
Step3: 我给了修理工2个苹果,当前我剩下6个苹果
Step4: 我去买了5个苹果,当前我有11个苹果
Step5: 我吃了1个苹果,现在我还剩下10个苹果
Step6: 我碰到了一家水果店促销,又购买了5个苹果,现在我有15个苹果。

3.8.3. 少量+零样本 COT 提示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
我去市场买了10个苹果。我给了邻居2个苹果和修理工2个苹果。然后我去买了5个苹果并吃了1个。然后我又碰到了一家水果店促销,又购买了5个苹果,我还剩下多少苹果?

按下面的格式一步一步计算:
Step1: 我去市场买了10个苹果,当前我有10个苹果
Step2: 我给了邻居2个苹果,当前我剩下8个苹果

// 输出
Step3: 我给了修理工2个苹果,当前我剩下6个苹果
Step4: 我去买了5个苹果,当前我有11个苹果
Step5: 我吃了1个苹果,现在我还剩下10个苹果
Step6: 我碰到了一家水果店促销,又购买了5个苹果,现在我有15个苹果。

// 然后继续提问
我去市场买了20个苹果,袋子破了个洞掉了10个没有发现,到家后,我给了邻居2个苹果和修理工2个苹果,然后我又去买了5个苹果并吃了1个,然后我又碰到了一家水果店促销,又购买了5个苹果,我还剩下多少苹果?
一步一步计算,得到结果

Step1: 我去市场买了20个苹果,但因为袋子破了个洞掉了10个苹果,所以我只剩下了10个苹果。
Step2: 我给了邻居2个苹果,当前我剩下8个苹果。
Step3: 我给了修理工2个苹果,现在我还剩下6个苹果。
Step4: 我去买了5个苹果,现在我有11个苹果。
Step5: 我吃了1个苹果,现在我还剩下10个苹果。
Step6: 我又碰到了一家水果店促销,又购买了5个苹果,现在我有15个苹果。

3.9. 知识提示

  1. 提问题的同时,给与一个规则
  2. 指示 LLM 以特定的风格、特定的意图、行为和身份进行对话。
  3. “用户”和“助手”标签以更好地演示如何使用 ChatGPT 执行任务

3.10. 提示应用

  1. Gao 等人(2022)(opens in a new tab)提出了一种使用 LLMs 读取自然语言问题并生成程序作为中间推理步骤的方法。被称为程序辅助语言模型(PAL),它与思维链提示不同,因为它不是使用自由形式文本来获得解决方案,而是将解决步骤卸载到类似 Python 解释器的编程运行时中。
  2. https://www.promptingguide.ai/zh/applications/pal

3.11. 代码提示

JS

1
2
3
4
5
6
/*
询问用户的姓名并说“ Hello”
*/

let name = prompt("What is your name?");
console.log(`Hello, ${name}!`);

Mysql

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
"""
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
Create a MySQL query for all students in the Computer Science Department
"""

//输出
SELECT StudentId, StudentName
FROM students
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = 'Computer Science');

4. OpenAPI 参数限制

  1. model: 更高性能的模型更昂贵并且具有更高的延迟
  2. temperature: 衡量模型输出和 token 是相识度,如果temperature越高,输出越随机(并且通常具有创造性)。对于大多数事实用例,例如数据提取和如实问答, temperature 为 0 是最好的
  3. max_tokens: (最大长度)- 不控制输出的长度,而是令牌生成的硬截止限制
  4. stop : 停止序列)- 一组字符(标记),在生成时会导致文本生成停止
  5. stream: bool 值,如果设置,一旦它们令牌可以,服务会将 token 将作为数据服务器推送事件发送,当流遇到[DONE]消息就会终止流

更多参考: https://platform.openai.com/docs/api-reference/completions/create

5. 参考链接

  1. OpenAI 提示词最佳实践: https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api
  2. 提示词工程系统介: https://www.promptingguide.ai/zh/introduction/tips