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

文章目录

  • 一、提示词用法
  • [二、提示词 Prompt 构成](#二、提示词 Prompt 构成)
  • [三、提示词 Prompt 调优](#三、提示词 Prompt 调优)
    • [1、结合 训练数据 写提示词](#1、结合 训练数据 写提示词)
    • [2、不知道训练数据的情况 - 不断尝试](#2、不知道训练数据的情况 - 不断尝试)
    • [3、高质量提示词特征 - 小作文](#3、高质量提示词特征 - 小作文)
  • [四、OpenAI 的 API 类型](#四、OpenAI 的 API 类型)
    • [1、续写文本 API 示例](#1、续写文本 API 示例)
    • [2、对话 API 示例](#2、对话 API 示例)
  • [五、OpenAI 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 就可以解决所有问题 , 续写文本 API 几乎很少使用 ;

1、续写文本 API 示例

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

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

javascript 复制代码
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 ;

javascript 复制代码
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 中 直接执行该代码 , 这个代码执行的时间比较长 , 需要等待 几分钟 左右 , 执行结果如下 :

javascript 复制代码
{'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

官方给出的示例如下 :

javascript 复制代码
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 ;

最终代码如下 :

javascript 复制代码
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 中执行上述代码 , 执行结果为 :

javascript 复制代码
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 参数示例 :

javascript 复制代码
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)

执行上述代码结果 :

javascript 复制代码
ChatCompletionMessage(content='Hello! How can I assist you today?', role='assistant', function_call=None, tool_calls=None)
相关推荐
阿里云大数据AI技术6 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO6 小时前
GEO技术服务选型指南
大数据·人工智能·python
普通攻击往后拉6 小时前
Leetcode 206. 反转链表
算法·leetcode·链表
阿里云大数据AI技术7 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架7 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab7 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI7 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
@syh.7 小时前
【贪心】矩阵消除游戏
算法·游戏·矩阵
冬奇Lab7 小时前
【无标题】
人工智能·开源
IT小盘7 小时前
13-企业Prompt模板-角色任务约束与输出格式
java·前端·prompt