【AI 大模型】提示工程 ③ ( 提示词用法 | 提示词 Prompt 构成 | 提示词位置对权重的影响 | 提示词 Prompt 调优 | OpenAI 的 API 类型 | 提示词重要参数说明 )

CSDN 2024-07-03 08:31:01 阅读 53

文章目录

一、提示词用法二、提示词 Prompt 构成1、提示词构成2、提示词位置对权重的影响3、定义角色的好处

三、提示词 Prompt 调优1、结合 训练数据 写提示词2、不知道训练数据的情况 - 不断尝试3、高质量提示词特征 - 小作文

四、OpenAI 的 API 类型1、续写文本 API 示例2、对话 API 示例

五、OpenAI API 中的重要参数说明

一、提示词用法


提示词 Prompt 的 两种用法 :

直接提问 : 直接向 GPT 大模型提问 , 得到一个具体问题的答案 , 如 : XXX 错误如何处理 ;集成应用 : 将 提示词 Prompt 集成到自己开发的应用程序中 , 结合自己公司的实际业务状况 , 生成与自己业务相关的一系列提示词 , 如 : 基于公司的一套知识库 + GPT 大模型 进行使用 ;

二、提示词 Prompt 构成


1、提示词构成

提示词 Prompt 构成 :

指定角色 : 为 大模型 指定一个角色 , 明确指出 " 你是一个 XX " 是很有用的 ;

如 : 你是一位软件工程师 , 请写出 XXX 代码 ;GPT 大模型 在训练文本 时 , 没有想过角色 , 后来使用时发现添加 " 你是一个 XX " 角色设置 非常有效 , 慢慢后面 训练 大模型时 , 都会将角色作为一个 参数 设置到训练中, 之后就越来越有效 ;将 指定角色 " 你是一个 XX " 提示词 , 必须放在最前面 , 已经有论文研究过了 , 指定角色提示词放在最前面 , 生成的结果最准确 ;大模型 对 提示词 Prompt 开头和结尾的文本更加敏感 , 最重要的内容要放在开头和结尾 , 开头 > 结尾 ; 任务描述 : 给出一个具体的 任务 , 信息越丰富越好 ;

如 : 写出 XX 代码 , 实现以下功能 : XX ; 案例说明 : 期望 大模型 生成 特定 的 输出时 , 给出一个例子 , 可以帮助模型更好地理解任务并生成正确的输出 , 提升输出质量 ;

如 : 你是程序员 , 实现 XX 功能 , 例如 下面的代码 : XX , 在上述代码的基础上进行微调 ; 输入信息 : 任务的输入信息 要在 提示词 中 明确的标识出来 ;

如 : 写出的函数 输入参数 有 X 个 , 分别是 X / X … ; 输出信息 : 详细的描述你对输出信息的要求 , 比如 : 输出格式 , 输出结果个数 , 输出语言 ;

如 : 输出 MarkDown 格式的文本 , 输出为英文 , 300 字 ;

2、提示词位置对权重的影响

大模型 对 提示词 Prompt 开头和结尾的文本更加敏感 , 最重要的内容要放在开头和结尾 , 开头 > 结尾 ;

相对来说 重要性不太强的内容 , 放在中间位置 ;

3、定义角色的好处

在文章开头 定义角色 , 会将 问题领域 收窄 , 减少歧义 ,

比如 : 你定义 " 你是一个 程序员 " 提示词 , 就会将整个问题领域 局限在 编程领域 , 当我们提出 " 模式 " 一词 时 ,

大模型 就会想到 设计模式 , 开发模式 ,而不会想到 做饭模式 , 睡觉模式 ,

这样能极大的提升准确性 , 得到更好的输出结果 ;

三、提示词 Prompt 调优


提示词 Prompt 需要 不断的进行调优 , 每当 通过 提示词 得到的结果不满意 , 我们就对 提示词 进行迭代修改 , 不断进行调优 , 直到得到 令我们满意的输出为止 ;

1、结合 训练数据 写提示词

知道训练数据 : 了解 提示词 的 训练数据 , 如果是 自己训练的数据 , 肯定知道 写什么提示词 能得到最佳结果 ;

2、不知道训练数据的情况 - 不断尝试

不知道训练数据 : 如果不知道 GPT 的训练数据 , 那就需要 不断与 大模型 进行聊天 , 了解 GPT 都训练了哪些数据 , 都输出了哪些数据 ;

如何 知道 GPT 大模型训练了哪些数据 , 借助这些数据 进行 提示词 Prompt 的 调优 , 以 " 西游记 " 为例 ,

如果知道 GPT ( Generative Pre-trained Transformer ) 大模型 训练 " 西游记 " 相关知识文本 的 数据 , 参考 该方面知识 的 " 训练数据 " 进行 提示词 Prompt 调优 , 是最佳途径 ;

跟 GPT 大模型聊天 , 就 聊 " 西游记 " 相关内容 , 聊 几十轮 对话 , 看看 大模型 都训练了哪些数据 ;

尽量选择 与 GPT 输出的内容 类似的 文本 作为 提示词 ;

不断尝试 修改 提示词 , 增加一个字 , 减少一个字 , 使用不同的间隔 和 标点符号 , 对输出结果都有一定的影响 ;

该方案有一定的运气成分 , 门槛比较低 ;

3、高质量提示词特征 - 小作文

高质量提示词 有如下特点 :

描述具体 : 提示词不能太概括 , 描述的越具体越好 ;信息丰富 : 提供丰富的上下文信息 , 给出 几百上千字 的参考信息 ;没有歧义 : 目标必须明确 , 不能有歧义 , 不能让 大模型 理解错方向 , 反面案例就是 " 武汉市长江大桥 " ;

高质量的提示词 , 都是 几百字 或者 上千字 的 , 内容丰富 的 " 小作文 " ;

四、OpenAI 的 API 类型


OpenAI 的大模型 出现最早 , 其它的大模型的 API 基本都参考 OpenAI 的大模型 , 学会使用 OpenAI 的 API , 基本其它的大模型提供的 API 都可以很快学会 ;

OpenAI 提供了两种 API 版本 :

续写文本 API : https://platform.openai.com/docs/api-reference/completions/create对话 API : https://platform.openai.com/docs/api-reference/chat/create

基本上使用 对话 API 就可以解决所有问题 , 续写文本 API 几乎很少使用 ;

1、续写文本 API 示例

续写文本 API : https://platform.openai.com/docs/api-reference/completions/create

在这里插入图片描述

官方给出了一个 调用 OpenAI 续写文本 API 的 Python 示例代码 :

from openai import OpenAI

client = OpenAI()

client.completions.create(

model="gpt-3.5-turbo-instruct",

prompt="Say this is a test",

max_tokens=7,

temperature=0

)

在之前的博客 【AI 大模型】OpenAI 接口调用 ① ( 安装 openai 软件包 | 查看 openai 软件包版本 | PyCharm 中开发 Python 程序调用 OpenAI 接口 ) 中 , 购买了 API-KEY , 设置 API-KEY 和 请求地址 ,

API-KEY 为 sk-6o3KJuuocEXpb1Ug39D0A4913a844fCaBa892eDe9814Df8a ,请求地址是 https://api.xiaoai.plus/v1 ,

这是一个 GPT 3.5 的 API-KEY ;

from openai import OpenAI

client = OpenAI(

api_key="sk-6o3KJuuocEXpb1Ug39D0A4913a844fCaBa892eDe9814Df8a",

base_url="https://api.xiaoai.plus/v1",

)

completion = client.completions.create(

model="gpt-3.5-turbo-instruct",

prompt="Say this is a test",

max_tokens=7,

temperature=0

)

print(completion.choices[0].message)

在 PyCharm 中 直接执行该代码 , 这个代码执行的时间比较长 , 需要等待 几分钟 左右 , 执行结果如下 :

{ 'role': 'assistant', 'content': '*nods* Understood. I am now roleplaying as an AI assistant with broad knowledge'}

在这里插入图片描述

2、对话 API 示例

对话 API : https://platform.openai.com/docs/api-reference/chat/create

在这里插入图片描述

官方给出的示例如下 :

from openai import OpenAI

client = OpenAI()

completion = client.chat.completions.create(

model="gpt-4o",

messages=[

{ "role": "system", "content": "You are a helpful assistant."},

{ "role": "user", "content": "Hello!"}

]

)

print(completion.choices[0].message)

同理 , 设置 API-KEY 和 请求地址 ,

API-KEY 为 sk-6o3KJuuocEXpb1Ug39D0A4913a844fCaBa892eDe9814Df8a ,请求地址是 https://api.xiaoai.plus/v1 ,

这是一个 GPT 3.5 的 API-KEY ;

最终代码如下 :

from openai import OpenAI

client = OpenAI(

api_key="sk-6o3KJuuocEXpb1Ug39D0A4913a844fCaBa892eDe9814Df8a",

base_url="https://api.xiaoai.plus/v1",

)

completion = client.chat.completions.create(

model="gpt-3.5-turbo",

messages=[

{ "role": "system", "content": "You are a helpful assistant."},

{ "role": "user", "content": "Hello!"}

]

)

print(completion.choices[0].message)

在 PyCharm 中执行上述代码 , 执行结果为 :

ChatCompletionMessage(content='Hello! How can I assist you today?', role='assistant', function_call=None, tool_calls=None)

在这里插入图片描述

五、OpenAI API 中的重要参数说明


OpenAI API 中的重要参数说明 :

temperature 参数 : 控制生成结果的多样性 ; 默认值为 0 , 取值范围 0 ~ 2 ;

值越高 , 生成的结果越随机 , 设置为 2 基本胡说八道 ;值越低 , 生成的结果越固定 , 0 的时候基本固定 ; seed 参数 : 随机种子 , 如果不指定 则 OpenAI 自己随机决定用什么随机种子 ;

指定该 seed 参数后 , 如果 temperature = 0 , 则固定的种子生成的结果是固定的 ; stream 参数 : 控制是否以数据流模式进行生成 ; 默认值为 False ;

如果设置为 True , 在数据流模式下 , 一个字一个字的输出 , 浪费流量 ;默认 False , 整个生成完了 , 在一次性返回 ; top_p 参数 : 在随机采样时 , 只考虑累计概率前百分之多少的 token , 有助于控制生成文本的多样性 ;

与 temperature 参数作用相似 , 不建议与 temperature 一起使用 ; n 参数 : 一次生成的结果数量 ;

使用提示词的 自洽性 时使用 , 一次返回多个结果再进行比较 ; max_tokens 参数 : 每条生成结果的最大 token 数量 , 超过这个限制的部分会被截断 ;

省钱方案 , 防止某个用户大量消耗 token ; presence_penalty 参数 : 对已经出现过的 token 的概率进行降权 , 帮助生成更多样化的文本结果 ;

避免输出很多重复的话 , 浪费 token ; frequency_penalty 参数 : 根据 token 的出现频次 , 对其生成概率进行降权 ;logit_bias 参数 : 对指定的 token 进行手工加权或降权 , 可以通过这个参数来调整特定 token 的生成概率 , 但不常用 ;

OpenAI 参数示例 :

from openai import OpenAI

client = OpenAI(

api_key="sk-6o3KJuuocEXpb1Ug39D0A4913a844fCaBa892eDe9814Df8a",

base_url="https://api.xiaoai.plus/v1",

)

completion = client.chat.completions.create(

model="gpt-3.5-turbo",

messages=[

{ "role": "system", "content": "You are a helpful assistant."},

{ "role": "user", "content": "Hello!"}

],

# 下面的参数都是默认参数值

temperature=1, # 控制生成结果的多样性

stream=False, # 控制是否以数据流模式进行生成

top_p=1, # 在随机采样时 只考虑累计概率前百分之多少的 token

n=1, # 一次生成的结果数量

max_tokens=100, # 每条生成结果的最大 token 数量

presence_penalty=0, # 对已经出现过的 token 的概率进行降权

frequency_penalty=0, # 根据 token 的出现频次 对其生成概率进行降权

logit_bias={ }, # 对指定的 token 进行手工加权或降权

)

print(completion.choices[0].message)

执行上述代码结果 :

ChatCompletionMessage(content='Hello! How can I assist you today?', role='assistant', function_call=None, tool_calls=None)

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。