大模型应用:Prompt-Engineering优化原则

作者 : admin 本文共9185个字,预计阅读时间需要23分钟 发布时间: 2024-06-2 共1人阅读

大模型应用:Prompt-Engineering优化原则插图

1.Prompt-Engineering

随着大模型的出现及应用,出现了一门新兴“技术”,该技术被称为Prompt-Enginerring。Prompt Engineering即提示工程,是指在使用大语言模型时,编写高效、准确的Prompt(提示词)的过程。通过不同的表述、细节和关键词,使大模型更好服务于特定任务。

为什么需要提示词工程
如果把大模型看作一个灯神,我们在向灯神许愿,那么我们许愿的“愿望”就是提示词,如果我们说的愿望无法被灯神很好理解,那么灯神给我们的还愿就会出现歧义。

比如:我许愿想要100万,没有指明币种,可能灯神会认为我想要的是100万津巴布韦币。

2.具体优化原则

Prompt-Enginerring的优化原则为:

  1. 指定角色及随机度
  2. 编写清晰、具体的指令
  3. 给予执行步骤及思考过程

2.1.指定角色及温度值

角色

指定角色可以让大模型更好地约束自己的行为,给到更专业的输出结果,如在Prompt中指定:

  1. 你是一个认真的审核员
  2. 你是一个高级软件工程师
  3. 你是一个小红书文案生成器
  4. 你是一个数学老师

温度值

在OpenAPI接口或者Playground中,可以指定大模型的输出温度值(temperature)。
温度值越高,大模型的输出越具有不确定性和跳脱性,一般在文科类或情感类需求中,会指定较高的温度值。
温度值越低,大模型的输出会越严格和逻辑慎密,一般在理科类或工程推理等需求中,会指定较低温度值,一般设置为0。

2.2.编写清晰具体的指令

使用分隔符

在编写Prompt时常会出现大模型阅读上下文混淆的问题,比如输入的文本包含与预设Prompt相冲突的内容,如果不加分隔,这些输入就可能“注入”并操纵大模型,导致模型产生毫无关联的乱七八糟的输出。
这种由输入文本影响预设Prompt导致非预期输出的问题,被称为“提示词注入”。
为了避免提示词注入,我们可以在输入文本中使用特定分隔符,强制将不同内容分隔出来,让大模型更好地理解。
常用的分隔符为“`、{}、“”、等。

func promptDelimiter(ctx context.Context) {
   systemText := `你是一个文本总结器,可以把{}扩起来的内容总结为20个字内的概要`
   gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemText, 0.0, 512)
   if err != nil {
      logrus.Errorf("gpt caller init fail, err = %v,", err)
      return
   }

   {
      text := `大模型问世仅仅一年,就迎来了免费时代。
在字节跳动的大模型喊出比行业便宜99.3%之后,其“行业最低价”正在被不断打破。近日,阿里云、百度等巨头公司纷纷宣布将大模型价格降到更低,百度甚至直接宣布免费。科大讯飞更是宣布,其讯飞星火API能力正式免费开放。其中,讯飞星火Lite API永久免费开放。
多位业内人士在接受《中国经营报》记者采访时表示,尽管宣布降价的模型产品众多,但真正大规模、高性能并且支持高并发的大模型推理仍然需要收费,降价幅度有限。不过,可以明确的是,这场关于大模型免费使用的价格战才刚刚开始。也许很快人们就会看到,在大模型这场比赛中,大多数的大模型公司都将被淘汰。
没有最低,只有更低
5月22日,腾讯云正式对外宣布了全新的大模型升级方案,其核心模型之一的混元-lite模型价格策略发生重要调整,由原先的0.008元/千tokens调整为全面免费使用。同时,最高配置的万亿参数模型混元-pro也进行了价格优化,从原有的0.1元/千tokens下降至0.03元/千tokens。
短短数日,百度、阿里云、腾讯、字节跳动、科大讯飞等各家大模型厂商均已投入到这场“价格战”中。而国内这场“价格战”最早可追溯到5月6日,幻方量化旗下DeepSeek发布第二代MoE(专家模型)DeepSeek-V2,API定价为每百万tokens输入1元、输出2元(32K上下文),价格为GPT-4-Turbo的近百分之一。`
      resp, err := gptCaller.Call(ctx, fmt.Sprintf("{%v}", text))
      if err != nil {
         logrus.Errorf("gpt caller call fail, err = %v", err)
         return
      }
      logrus.Infof("-原始文本:%v
-总结文本:%v", text, resp)
   }

   {
      text := `百度文心大模型5.0将在2025年发布
据知情人士消息,百度或将于2025年百度世界大会期间发布新一代文心大模型5.0。目前,文心大模型最新版本为4.0版本,具备理解、生成、逻辑和记忆四大核心能力。公开信息显示,百度文心大模型于2019年3月首发,同年7月迭代至2.0版本,2021年7月发布3.0版本,2023年10月升级至4.0版本。截至目前,百度方面暂未就此传闻给出回应。
OpenAI宣布已启动下一代前沿模型训练
当地时间周二,OpenAI发布公告称董事会成立了一个负责把控AI开发方向的安全委员会。同时,OpenAI还在公告中表示,近些日子已经开始训练公司的“下一代前沿模型”,该新模型预计带来更高水平的能力,将成为聊天机器人、智能助手、搜索引擎和图像生成器在内的各类人工智能产品的核心引擎,助力Open AI实现“通用人工智能”(AGI)的目标。`
      resp, err := gptCaller.Call(ctx, fmt.Sprintf("{%v}", text))
      if err != nil {
         logrus.Errorf("gpt caller call fail, err = %v", err)
         return
      }
      logrus.Infof("-原始文本:%v
-总结文本:%v", text, resp)
   }
}
  • 输出
-原始文本:大模型问世仅仅一年,就迎来了免费时代。
在字节跳动的大模型喊出比行业便宜99.3%之后,其“行业最低价”正在被不断打破。近日,阿里云、百度等巨头公司纷纷宣布将大模型价API永久免费开放。
多位业内人士在接受《中国经营报》记者采访时表示,尽管宣布降价的模型产品众多,但真正大规模、高性能并且支持高并发的大模型大模型这场比赛中,大多数的大模型公司都将被淘汰。
没有最低,只有更低
522日,腾讯云正式对外宣布了全新的大模型升级方案,其核心模型之一的混元-lite模型价格策略发生重要调整,由原先的0.008/1/千tokens下降至0.03/千tokens。
短短数日,百度、阿里云、腾讯、字节跳动、科大讯飞等各家大模型厂商均已投入到这场“价格战”中。而国内这场“价格战”最早可追溯kens输入1元、输出2元(32K上下文),价格为GPT-4-Turbo的近百分之一。
-总结文本:大模型价格战:巨头公司纷纷降价,部分免费使用,行业竞争激烈,价格不断下降。 

-原始文本:百度文心大模型5.0将在2025年发布
据知情人士消息,百度或将于2025年百度世界大会期间发布新一代文心大模型5.0。目前,文心大模型最新版本为4.0版本,具备理解、0217月发布3.0版本,202310月升级至4.0版本。截至目前,百度方面暂未就此传闻给出回应。
OpenAI宣布已启动下一代前沿模型训练
当地时间周二,OpenAI发布公告称董事会成立了一个负责把控AI开发方向的安全委员会。同时,OpenAI还在公告中表示,近些日子已经图像生成器在内的各类人工智能产品的核心引擎,助力Open AI实现“通用人工智能”(AGI)的目标。
-总结文本:百度计划2025年发布文心大模型5.0,OpenAI启动下一代前沿模型训练,旨在实现通用人工智能目标。 

结构化的输出

许多时候我们需要大模型给我们一些结构化的输出,而不仅仅是连续的文本,例如JSON、HTML等。这种输出非常适合在代码中进一步解析和处理。

  • promptJSON
func promptJSON(ctx context.Context) {
   systemText := `你是一个文本总结器,可以把{}括起来的内容总结并提炼出对应的关键字。
你需要以JSON形式返回提炼文本、文本中涉及到的关键字列表,对应的Key分别为summarizeText、keywords`
   gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemText, 0.0, 512)
   if err != nil {
      logrus.Errorf("gpt caller init fail, err = %v,", err)
      return
   }
   {
      text := `大模型问世仅仅一年,就迎来了免费时代。
在字节跳动的大模型喊出比行业便宜99.3%之后,其“行业最低价”正在被不断打破。近日,阿里云、百度等巨头公司纷纷宣布将大模型价格降到更低,百度甚至直接宣布免费。科大讯飞更是宣布,其讯飞星火API能力正式免费开放。其中,讯飞星火Lite API永久免费开放。
多位业内人士在接受《中国经营报》记者采访时表示,尽管宣布降价的模型产品众多,但真正大规模、高性能并且支持高并发的大模型推理仍然需要收费,降价幅度有限。不过,可以明确的是,这场关于大模型免费使用的价格战才刚刚开始。也许很快人们就会看到,在大模型这场比赛中,大多数的大模型公司都将被淘汰。
没有最低,只有更低
5月22日,腾讯云正式对外宣布了全新的大模型升级方案,其核心模型之一的混元-lite模型价格策略发生重要调整,由原先的0.008元/千tokens调整为全面免费使用。同时,最高配置的万亿参数模型混元-pro也进行了价格优化,从原有的0.1元/千tokens下降至0.03元/千tokens。
短短数日,百度、阿里云、腾讯、字节跳动、科大讯飞等各家大模型厂商均已投入到这场“价格战”中。而国内这场“价格战”最早可追溯到5月6日,幻方量化旗下DeepSeek发布第二代MoE(专家模型)DeepSeek-V2,API定价为每百万tokens输入1元、输出2元(32K上下文),价格为GPT-4-Turbo的近百分之一。`
      resp, err := gptCaller.Call(ctx, fmt.Sprintf("{%v}", text))
      if err != nil {
         logrus.Errorf("gpt caller call fail, err = %v", err)
         return
      }
      logrus.Info(resp)
   }

   {
      text := `百度文心大模型5.0将在2025年发布
据知情人士消息,百度或将于2025年百度世界大会期间发布新一代文心大模型5.0。目前,文心大模型最新版本为4.0版本,具备理解、生成、逻辑和记忆四大核心能力。公开信息显示,百度文心大模型于2019年3月首发,同年7月迭代至2.0版本,2021年7月发布3.0版本,2023年10月升级至4.0版本。截至目前,百度方面暂未就此传闻给出回应。
OpenAI宣布已启动下一代前沿模型训练
当地时间周二,OpenAI发布公告称董事会成立了一个负责把控AI开发方向的安全委员会。同时,OpenAI还在公告中表示,近些日子已经开始训练公司的“下一代前沿模型”,该新模型预计带来更高水平的能力,将成为聊天机器人、智能助手、搜索引擎和图像生成器在内的各类人工智能产品的核心引擎,助力Open AI实现“通用人工智能”(AGI)的目标。`
      resp, err := gptCaller.Call(ctx, fmt.Sprintf("{%v}", text))
      if err != nil {
         logrus.Errorf("gpt caller call fail, err = %v", err)
         return
      }
      logrus.Info(resp)
   }
}
  • 输出
{
    "summarizeText": "大模型问世仅仅一年,就迎来了免费时代。多家巨头公司宣布大模型价格降低甚至免费,引发了一场关于大模型免费使用的价格战。各家厂商纷纷加入这场价格战,价格不断被打破。",
    "keywords": ["大模型", "免费时代", "字节跳动", "阿里云", "百度", "科大讯飞", "价格战", "腾讯云", "混元-lite模型", ", "MoE", "GPT-4-Turbo"]
} 

{
    "summarizeText": "百度计划在2025年百度世界大会期间发布新一代文心大模型5.0,该模型具备理解、生成、逻辑和记忆四大核心类人工智能产品的核心引擎,助力实现通用人工智能的目标。",
    "keywords": ["百度", "文心大模型", "5.0版本", "OpenAI", "前沿模型", "训练", "人工智能", "通用人工智能", "AGI"]
} 

检查是否满足条件

如果任务包含不一定能满足的假设(条件),我们可以告诉大模型先检查这些假设,如果不满足,则会指出并停止执行后续的完整流程。

  • promptCheck
func promptCheck(ctx context.Context) {
   systemText := `你是一个操作步骤总结器,请阅读{}括起来的输入内容,并提炼出输入内容中提到的执行步骤。
提炼出的步骤按以下格式返回:
- 第一步:...
- 第二步:...
注意,对于不存在明确步骤的输入内容,直接说"不存在步骤"`
   gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemText, 0.0, 512)
   if err != nil {
      logrus.Errorf("gpt caller init fail, err = %v,", err)
      return
   }
   {
      text := `制作牛排首先需要准备材料有牛肉1块,洋葱半个,蒜头2个,黄油1小块,黑胡椒粉少许。
首先把牛肉切成半个巴掌大小的块状,然后往肉上撒盐和黑椒粉,两面抹匀,腌制一两小时。剁碎蒜头和洋葱放入
热锅,待油融化后摆好牛排,慢火煎至你想要的成熟度。制作完成后将牛排装盘,用锅中的余油把蒜头碎和洋葱碎爆香。
随后把洋葱碎炒软后,加入一碗清水煮开,放几滴酒,再用盐和黑椒粉调味,慢慢炒匀成稠汁状。将熬好的黑椒汁淋到牛排上即可`
      resp, err := gptCaller.Call(ctx, fmt.Sprintf("{%v}", text))
      if err != nil {
         logrus.Errorf("gpt caller call fail, err = %v", err)
         return
      }
      logrus.Info(resp)
   }
   {
      text := `今天天气很不错,也不会下雨,也没有多云,阳光明媚`
      resp, err := gptCaller.Call(ctx, fmt.Sprintf("{%v}", text))
      if err != nil {
         logrus.Errorf("gpt caller call fail, err = %v", err)
         return
      }
      logrus.Info(resp)
   }
}
  • 输出
- 第一步:将牛肉切成半个巴掌大小的块状,撒盐和黑椒粉,腌制一两小时。
- 第二步:剁碎蒜头和洋葱,放入热锅,摆好牛排,慢火煎至理想的成熟度。
- 第三步:将煎好的牛排装盘,用余油爆香蒜头碎和洋葱碎。
- 第四步:炒软洋葱碎后,加入清水煮开,加入几滴酒,用盐和黑椒粉调味,慢慢炒匀成稠汁状。
- 第五步:将熬好的黑椒汁淋到牛排上即可。 

不存在步骤

提供少量示例

对于不提供任何示例直接给出提示词并要求模型给出结论的过程,被称为zero-shot(零样本提示),对于某些比较复杂的、需要让大模型先参考一些示例的情况被称为few-shot(少样本提示),通过few-shot可以更好地让大模型了解自己应该输出怎么样的内容,以及完成怎样特定的任务。

  • promptFewShot
func promptFewShot(ctx context.Context) {
   systemText := `你是一个小红书文案生成器,你需要将{}括起来的输入内容改写为小红书的文案风格并输出改写后的文案。以下是几段小红书风格的博文参考:
1、嘴上说不要,钱包却很诚实嘛。
2、原谅我一生放浪不羁爱shopping!
3、草!我又拔草了!
4、工资已经到账,快递还会远吗?
5、掐指一算,姑娘你命中缺钱。
注意,只需要给出一句话作为文案,不要有多余的特殊符号输出`
   gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemText, 0.0, 512)
   if err != nil {
      logrus.Errorf("gpt caller init fail, err = %v,", err)
      return
   }
   text := `大模型是当今的潮流,学习及应用大模型是一个大趋势,让我们一起学习大模型`
   resp, err := gptCaller.Call(ctx, fmt.Sprintf("输入内容为{%v}", text))
   if err != nil {
      logrus.Errorf("gpt caller call fail, err = %v", err)
      return
   }
   logrus.Info(resp)
}
  • 输出
大模型是当今的潮流,学习及应用大模型是一个大趋势,让我们一起探索大模型的魅力吧!

2.3.指定执行步骤及思考过程

语言模型与人类一样,需要时间来思考并解决复杂问题。如果让语言模型匆忙给出结论,其结果很可能不准确。在让大模型处理复杂的推理逻辑类问题时,可以指明执行步骤,并要求其输出思考过程,这样可以大提高大模型处理复杂问题的效果。

指定执行步骤

对于一个复杂任务,我们可以给出完成该任务的一系列步骤让大模型遵守,一步步完成并给到最终的输出。

  • promptStructure
func promptStructure(ctx context.Context) {
   systemText := `请你对{}括起来的文本执行以下操作:
1.首先判断该文本属于哪类语言
2.将该文本翻译为英文
3.总结出中文文本中有哪些地点
4.总结出中文文本中有哪些人物

使用JSON形式表达上述操作结果,输出以下Key及值:原始语言、英文翻译、地点汇总、人物汇总`
   gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemText, 0.0, 512)
   if err != nil {
      logrus.Errorf("gpt caller init fail, err = %v,", err)
      return
   }
   text := `小村庄里,老师小林找到了一把古老的钥匙,决定带领李雷和韩梅梅探索传说中的秘密花园。
他们穿过幽深的森林,解开了一系列谜题,最终发现花园中隐藏的是一座知识的宝库,让整个村庄的孩子们受益无穷。`
   resp, err := gptCaller.Call(ctx, fmt.Sprintf("输入文本:{%v}", text))
   if err != nil {
      logrus.Errorf("gpt caller call fail, err = %v", err)
      return
   }
   logrus.Info(resp)
}
  • 输出
{
    "原始语言": "中文",
    "英文翻译": "In a small village, teacher Xiao Lin found an ancient key and decided to lead Li Lei and Han Meimei tplore the legendary secret garden. They passed through a deep forest, solved a series of puzzles, and finally discovered that the hidden treasure in the garden was a treasury of knowledge, benefiting all the children in the village.",
    "地点汇总": ["小村庄", "秘密花园", "幽深的森林"],
    "人物汇总": ["小林", "李雷", "韩梅梅"]
} 

思考过程

在设计Prompt时,我们还可以通过明确指导语言模型进行自主思考,来获得更好的效果。举个例子,假设我们要语言模型判断一个数学问题的解答是否正确。仅仅提供问题和解答是不够的,模型可能会匆忙做出错误判断。
相反,我们可以在Prompt中先要求语言模型自己尝试解决这个问题,给出思考过程,然后再与提供的解答进行对比,判断正确性。这种先让语言模型自主思考的方式,能帮助它更深入理解问题,做出更准确的判断。

  • promptCoT
func promptCoT(ctx context.Context) {
   systemText := `你是一个数学老师,请你批改{}括起来的含有作业题目及答案的文本,执行以下操作:
1.首先阅读题目,并自己计算得到答案,写下推理过程
2.将你的推理过程与文本中的答案比对
3.判断文本中的答案是否正确
4.总结文本中的答案错在了哪里

最后,上述操作无需输出,只需要使用JSON格式输出以下Key及值:推理过程、答案是否正确、答案错在哪里

对于JSON格式中Key的说明:
1.推理过程:你解答这个题目的推理过程
2.答案是否正确:输入文本中的答案是否正确,输出值为:正确、不正确  
3.答案错在哪里:输入文本中的答案错在哪里`
   gptCaller, err := llm_caller.NewGptLLMCaller(ctx, systemText, 0.0, 1024)
   if err != nil {
      logrus.Errorf("gpt caller init fail, err = %v,", err)
      return
   }
   text := `题目:
土地费用为 100美元/平方英尺
我可以以 250美元/平方英尺的价格购买太阳能电池板
我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
作为平方英尺数的函数,首年运营的总费用是多少。
答案:
设x为发电站的大小,单位为平方英尺。
费用:
土地费用:100x
太阳能电池板费用:250x
维护费用:100,000美元+100x
总费用:100x+250x+100,000美元+100x=450x+100,000美元`
   resp, err := gptCaller.Call(ctx, fmt.Sprintf("输入文本:{%v}", text))
   if err != nil {
      logrus.Errorf("gpt caller call fail, err = %v", err)
      return
   }
   logrus.Info(resp)
}
  • 输出
{
"推理过程": "首年运营的总费用应包括土地费用、太阳能电池板费用和维护费用。土地费用为100x,太阳能电池板费用为250x,维护费100,000美元。",
"答案是否正确": "不正确",
"答案错在哪里": "计算总费用时,维护费用额外支付每平方英尺10美元,而不是10,000美元。因此,总费用应为360x+10x+100,000美元=370x+100,000美元。"
} 
本站无任何商业行为
个人在线分享 » 大模型应用:Prompt-Engineering优化原则
E-->