概念

  • Prompt template 是生成语言模型提示词的预定义方案。模板包括说明、少量示例以及给定任务的特定上下文和问题。
  • PromptTemplate创建字符串提示的模板。支持任意数量的变量,包括无变量。一般使用在单轮对话中
  • ChatPromptTemplate 聊天消息列表,每条聊天消息都有内容以及附加参数相关联 role

高质量 prompt 核心要点

具体、丰富、少歧义

Prompt 的典型构成(把AI当人看)

  • 角色:给 AI 定义一个最匹配任务的角色,比如:「你是一位软件工程师」「你是一位小学老师」。通过角色定义,在开头收紧问题域,减少二义性。
  • 指示:对任务进行描述
  • 上下文:给出与任务相关的其它背景信息(尤其在多轮交互中)
  • 例子:必要时给出举例,学术中称为 one-shot learning, few-shot learning 或 in-context learning;实践证明其对输出正确性有很大帮助
  • 输入:任务的输入信息;在提示词中明确的标识出输入
  • 输出:输出的格式描述,以便后继模块自动解析模型的输出结果,比如(JSON、XML)

大模型对 prompt 开头和结尾的内容更敏感。

改变习惯,优先用Prompt解决问题,可以减轻预处理和后处理的工作量和复杂度。

Prompt多轮对话案例

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import json
import pprint
from openai import OpenAI


client = OpenAI()

# 定义消息历史。先加入 system 消息,里面放入对话内容以外的 prompt
messages = [
{
"role": "system",
"content": """
你是一个手机流量套餐的客服代表,你叫小瓜。可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:
经济套餐,月费50元,10G流量;
畅游套餐,月费180元,100G流量;
无限套餐,月费300元,1000G流量;
校园套餐,月费150元,200G流量,仅限在校生。
"""
}
]


def get_completion(prompt, model="gpt-3.5-turbo"):

# 把用户输入加入消息历史
messages.append({"role": "user", "content": prompt})

response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0,
)
msg = response.choices[0].message.content

# 把模型生成的回复加入消息历史。很重要,否则下次调用模型时,模型不知道上下文
messages.append({"role": "assistant", "content": msg})
return msg


get_completion("有没有大流量套餐?")
get_completion("多少钱?")
get_completion("给我办一个")
pprint.pprint(messages)

Prompt进阶技巧

  • 思维链。

    Chain of Thoughts, CoT

    以「Let’s think step by step」开头, AI 会把问题分解成多个步骤,然后逐步解决,使得输出的结果更加准确。

    让 AI 生成更多相关的内容,构成更丰富的「上文」,从而提升「下文」正确的概率

    对涉及计算和逻辑推理等复杂问题,尤为有效

  • 自洽性

    Self-Consistency

    对抗「幻觉」,多次验算

  • 思维树

    Tree-of-thought, ToT

    在思维链的每一步,采样多个分支,展开成一棵思维树

    判断每个分支的任务完成度,以便进行启发式搜索

    设计搜索算法,判断叶子节点的任务完成的正确性

    TOT

  1. 官方教程
  2. 官方示例

一些好用的 Prompt 共享网站

上述内容主要摘抄自知乎知学堂 AI 大模型全栈工程师培养计划