• 大模型应用: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导致非预期输出的问题,被称为“提示词注入”。
    为了避免提示词注入,我们可以在输入文本中使用特定分隔符,强制将不同内容分隔出来,让大模型更好地理解。
    常用的分隔符为```、{}、“”、<>等。

    • promptDelimiter
    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\n-总结文本:%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\n-总结文本:%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美元。"
    } 
    
  • 相关阅读:
    c++字符串相关接口
    mac通过docker一键部署Jenkins
    组件库开发
    如何将用户导入自己的私域流量?“分享购“案例分享
    【IT面试新理解】
    数据库高级 III
    Jinja2渲染的两种方式
    TensorFlow 的基本概念和使用场景
    android user版本(不分平台+不分安卓几)实现root功能
    Halcon 常用通道Scale灰度元操作整理
  • 原文地址:https://blog.csdn.net/pbrlovejava/article/details/139389247