提示词工程

1.提示词的含义

提示词工程(Prompt Engineering) ,也叫做上下文提示(In-Context Prompting),指的是通过结构化文本等方式来完善提示词,引导LLM输出我们期望的结果。通过提示词工程可以在不更新模型权重的情况下,让LLM完成不同类型的任务。其主要依赖于经验,而且提示词工程方法的效果在不同的模型中可能会有很大的差异,因此需要大量的实验和探索。

2.提示的组成部分

以下是在一个提示中将时常看到的一些组成部分:

  • 角色:通过为 AI 分配一个角色,我们给它提供了一些上下文。这个上下文有助于 AI 更好地理解问题。通过更好地理解问题,AI 往往可以给出更好的答案。
  • 指令/任务:想要让LLM完成的任务,上文中提到的通常和指令一同使用的信息,如主要内容和支持内容也归为指令部分
  • 问题:希望从LLM得到回答的问题等,此处跟指令做了一个区分,更多的是知识性的回答
  • 上下文:提供给LLM的一些额外信息,引导它给出更好的回答,例如时事信息、垂直领域的知识等,包含上文中提到的示例、支持内容中的辅助信息等都可归为上下文信息
  • 示例:根据实际场景,对输入和输出结果进行举例,可以对输出结果类型和结果的一些限制

3.提示的基本方式

  • Zero-Shot Prompting

    • Zero-shot提示法(Zero-shot Prompting)是一种利用大型预训练模型(如语言模型)的能力,在没有针对特定任务进行额外训练的情况下解决新任务的方法。它依赖于模型固有的数据来回答问题,在实际应用中,Zero-shot提示法可以通过简单地输入指令或问题(可以包含上下文信息和输出格式等内容)来引导模型输出期望的结果。例如,在文本情感分析任务中,可以输入“将文本分类为中性、负面或积极”作为提示,然后给出待分析的文本,模型即可根据提示进行情感分类。或者可以需要注意的是,虽然Zero-shot提示法在许多情况下都能取得不错的效果,但在面对更复杂的任务时,其表现可能会受到限制。在这种情况下,可以考虑使用其他提示方法,如Few-shot提示法,通过提供少量示例来引导模型更好地完成任务。 但Zero-Shot Prompting 技术依赖于预训练的语言模型,这些模型可能会受到训练数据集的限制和偏见。它的输出有时可能不够准确,或不符合预期。这可能需要对模型进⾏进⼀步的微调或添加更多的提示⽂本来纠正。
    • 示例
       Q:以下是一段描述,请告诉我这是哪种动物。描述:这是一种黑白相间的动物,有着长长的条纹,生活在非洲草原上。
       A:斑马
      
  • Few-shot Prompting

    • Few-shot learning 在目标任务上提供了一组高质量的演示,每个演示都包含输入和期望的输出。 当模型首先看到好的例子时,它可以更好地理解人类的意图和需要什么样的答案的标准。 因此,少样本学习通常比零样本学习有更好的性能。 然而,它是以更多的 token 消耗为代价的,并且当输入和输出文本很长时可能会达到上下文长度限制。
    • 示例
      Add 3+3: 6
      Add 5+5: 10
      Add 2+2:
      这是我们向模型展示了至少 2 个完整的示例(“Add 3+3: 6”和“Add 5+5: 10”)。通常,展示给模型的示例越多,输出结果就越好,因此在大多数情况下,多范例提示比另外两种提示更受欢迎。
      
  • 结构化延伸
    多范例提示的一个关键场景是当我们需要以特定的结构输出结果,但是又很难向模型进行描述的时候。为了理解这一点,让我们看这样一个例子:假设您需要通过分析当地的报纸文章来汇编附近城镇公民的姓名和职业。您希望模型读取每篇文章并以Last, First [OCCUPATION]格式输出姓名和职业列表。为了让模型做到这一点,您可以向它展示一些示例:

    • 在繁华的翡翠山镇,一群不同的人留下了自己的印记。莎拉·马丁内斯是一名敬业的护士,她在当地医院以富有同情心的护理而闻名。大卫·汤普森是一位创新的软件工程师,他不知疲倦地致力于突破性的项目,这些项目将彻底改变科技行业。与此同时,才华横溢的艺术家和壁画家Emily Nakamura创作了充满活力和发人深省的作品,装饰着建筑物和画廊的墙壁。最后,雄心勃勃的企业家Michael O’Connell开设了一家独特的环保咖啡馆,迅速成为该镇最受欢迎的聚会场所。这些人中的每一个人都为翡翠山社区的丰富多彩做出了贡献。
      1.莎拉·马丁内斯[护士]
      2.大卫·汤普[软件工程师]
      3.Emily Nakamura[艺术家]
      4.迈克尔·奥康奈尔[企业家]
      在市中心,厨师奥利弗·汉密尔顿通过他的农场到餐桌餐厅Green Plate改变了烹饪界。奥利弗致力于采购当地有机食材,赢得了食品评论家和当地人的好评。
      就在街对面,你会发现河滨格罗夫图书馆,图书馆馆长伊丽莎白·陈在那里辛勤工作,为所有人创造了一个温馨包容的空间。她努力扩大图书馆的服务范围,并为儿童建立阅读项目,这对该镇的识字率产生了重大影响。
      当你漫步在迷人的城镇广场时,你会被墙上装饰的美丽壁画所吸引。这些杰作是著名艺术家伊莎贝拉·托雷斯的作品,她捕捉河滨格罗夫精髓的天赋使这座城镇充满活力。
      河滨格罗夫的运动成就也值得注意,这要归功于前奥运会游泳运动员兼教练马库斯·詹金斯。马库斯凭借自己的经验和激情训练了该镇的年轻人,带领河滨格罗夫游泳队获得了几次地区冠军。
      1.奥利弗·汉密尔顿[厨师]
      2.伊丽莎白·陈[图书馆员]
      3.伊莎贝拉·托雷斯[艺术家]
      4.马库斯·詹金斯[教练]
  • 思维链(Chain-of-Thought, CoT)提示

    • 思维链提示也叫做推理链,指的是逐步描述推理逻辑,引导LLM得出最终答案。推理能力是LLM参数量不断提升后,涌现出的一个重要能力,CoT的好处在使用LLM解决复杂推理任务时更明显,对简单任务的提升效果有限。
    • Few-shot CoT:通过在prompt中包含高质量的推理链的示例,来让LLM完成推理,这些示例可以是自己编写的,或者由模型生成的
      • 输入
      • 问:罗杰有5个网球,他又买了2罐网球,每罐有3个网球。他现在有多少个网球?
        罗杰从5个网球开始,2罐3个网球,每罐6个,5+6=11,答案是11。
        问:食堂有23个苹果,如果他们用20个做午餐,再买6个,他们有多少个苹果?
      • 输出
      • 自助餐厅本来有23个苹果,他们用20个做午餐,所以他们有23-20=3,他们又买了6个苹果所以他们有了3+6=9,答案是9。
    • Zero-shot CoT:触发LLM的推理能力并不一定要提供示例,也可以通过一些话术来实现,例如 让我们一步一步思考。
      • 输入
      • 问:一个杂要者可以杂耍16个球,其中一半是高尔夫球,一半是蓝色的,请问有多少个蓝色的高尔夫球?我们一步一步来想吧。
      • 输出
        总共有16个球,其中一半是高尔夫球,也就是说有8个是蓝色的,也就是说共有4个蓝色的高尔夫球。
  • 指令提示(Instruction Prompting)

    • 指令提示旨在向大语言模型提供指令提示示例,以便它可以消除训练或测试差异(模型是在Web规模语料库上训练并在大多数指令上进行测试),并模拟聊天机器人的实际使用场景。指令提示使用(任务说明,输入,真实输出)元组对预训练模型进行微调,以使模型更好地与用户意图对齐并遵循说明。与说明模型交互时,应该详细描述任务要求,尽量具体和准确,清楚地指定要做什么(而不是说不要做某事)。
    • 现在你是一名面辅料专业管理员,现有一份物料卡图片文字识别的结果,需要你完成解析任务。##背景说明 1.物料信息以文字形式提供 2. 你能准确的识别出物料卡中,编号、成分包括但不限于的内容。 1. 使用{{}}框选输出内容, 不要自行总结,无需多换行. \n" + "2. 请从\“输入:<<Content>>\“中抽取 Content 进行识别. \n” + “3. 你只能识别出物料卡信息的内容,不要输出多余内容. " + “4. [ingredient]表示物料卡的的<面料成分>检测结果. + “5. 如果无法识别出服装的面料成分和对应的百分比, [ingredient]的取值为[] \n” + “6. 如果识别出多个面料成分和百分比, [ingredient]取值为[<面料成分1>,<百分比1>,<面料成分2>,<百分比2>],如果只有一个面料成分,百分比则为100 ,如果面料成分为英文单词,将其映射为中文,必须从以下映射关系中找出,映射关系如下 C 棉 S 真丝 J 黄麻 T 涤纶 A 腈纶 R 人棉 t/c 涤/棉 t/r 涤/人造丝 SP 氨纶 N 锦纶(尼龙) L 亚麻 Tel 天丝 RY 人造丝 RA 苎麻 PP 丙纶 Ms 桑蚕丝 Md 莫代尔 LY 莱卡 CL 含氯纤维 AL 羊驼毛 YH 牦牛毛 CH 驼毛 Ts 柞蚕丝 WS 羊绒 PV 维纶 AC 醋酸纤维 EL 弹性纤维 AL 蛹蛋白纤维 ME 金属纤维 op 奥佩纶 p/c 聚酯棉 CUP 酮氨 AvL 罗布麻 CF 碳纤维 W 羊毛 M 马海毛 V 粘胶 CA 醋酯纤维 GE 玻璃纤维 RH 兔毛 LA 羊羔毛 WA 安哥拉山羊毛 BM 竹纤维 PE 聚酯纤维 PA 聚酰胺纤维 SB 大豆纤维 CU 铜纤维 LC 莱赛尔纤维 VI 粘胶人造丝 BEM 酮氨丝宾霸 PIMA 比马棉 PE 乙纶 f 长丝 DY 拉伸丝 FDY 全牵伸丝 POY 预取向丝(高速纺丝,聚酯半延伸丝) BCF 膨体(变形)长丝 SILKOOL 大豆蛋白纤维 WD 拉伸整经丝 UDY 拉伸丝 FDY 全拉伸丝 TY 变形丝 HDIY 重旦产业用丝 SDTY 纺拉变形丝 WDS 拉伸整经上浆丝 TTY 变形加弹丝 m 单丝 (鬃丝) DW 拉伸络筒丝 LOY 低速纺丝 DTY 拉伸变形丝(假捻加工丝) NOY 免浆丝 PT 牵伸丝 LDIY 轻旦产业用丝 MOY 中速纺丝 HOY 中、超高速纺丝 SDY 纺丝拉伸丝 DT 拉伸加捻丝 ATY 吹捻空气变形丝 HWM 高湿模量纤维 Polynosic 波纤、富纤、高湿模量粘胶 PSF 聚酯短纤维\n\n7.识别面辅料编号等内容,用[code]\n 8.名称用name代表9.当识别未提取到相关编号、成分等信息则不输出\n10.克重用[grammage],统一单位用克,如果没有具体单位无需处理\n11.幅宽用[width],如果是厘米,统一将单位转成米,如果是范围输出最小值\n12.大货价格用[price]\n13.空差的值用[gap]\n14.直接输出JSON格式,不需要Markdown修饰等其他文字修饰 举例1.输入:自 TEXTILE 健康 创新] 编号: 11682 名称: 柔肤棉 幅宽: 160cm 克重: 350g 上 成分: 45粘纤49涤6氨纶 大货价格 100 备注: “\n输出: {“ingredient”:[“45,粘纤”,“49,涤”,“6,氨纶”],“name”:“柔肤棉”,“grammage”:“350”,“code”:“11682”,“width”:“1.6”,“price”:“100”,“gap”:“98”}##举例2.输入:“adasdasdads dfgdvdvdfv aww-” “\n输出: {“ingredient”:[]”,“name”:””,“code”:””} 举例3.编号 85506 工艺/备注 品名 SPH3/1斜四面弹 成份 PSF100% 克重/门幅 180g/m? x1.5m输出:{“ingredient”:[“100%,聚酯短纤维”],“name”:“SPH3/1斜四面弹”,“grammage”:“180”,“width”:“1.5”,“code”:“85506”}\n举例4.布品左 编号: 9005#品名: 精梳砂洗棉(斜纹) 幅宽: 150cm-156cm克重: 165g UANG 成分: 全棉输出:{“ingredient”:[“100%,棉”],“name”:“精梳砂洗棉(斜纹)”,“grammage”:“165”,“width”:“1.50”,“code”:“9005#”}\n\n## 指令 :=> 输入内容如下, 请问输出是什么? \n7 =><<${ocr_result}>> \n输出:”}
    • 解析
      • 1.首先让LLM指定角色,在本次案例中指定为一个面辅料专业管理员
      • 2.问题则是指出需要其根据文字识别的结果转换成固定格式的JSON格式字符串
      • 3.上下文信息中指出需要转换的字段以及行业内可能存在面辅料由英文组成,需要由他进行映射转换,以及个别字段单位需要指定
      • 4.案例
        • 案例1主要以正常识别信息进行提示,给出正向提示,结合结构化延伸,要求以固定格式输出
        • 案例2主要以毫无相关的信息进行反向提示,避免LLM输出与我们毫无相关的其他信息
        • 案例3我主要考虑是以成分为英文缩写,需要LLM通过映射关系进行转换
        • 案例4则主要以存在部分成分组成有特殊含义,例如成分全棉在系统中则代表为100%棉,以及在编号中9005#,存在#号,因此在输出的结果中,特殊指出需要包含该符号,不然存在一定概率仅仅输出9005
      • 5.指令
        • 根据提示将OCR识别结果,输出预期的结果

4.总结

  1. 清晰性:使用简洁明确的语言,确保提示词清楚表达了你的请求,避免模棱两可。

  2. 具体性:提供足够的信息使模型能够理解上下文,特别是在提供指令或请求时,应该具体到足够操作或回答的程度。

  3. 自然性:尽量使提示词听起来像自然语言对话,减少正式和专业的语言,这样模型更易于理解和生成自然对话。

  4. 相关性:所提供的提示词应直接相关于要完成的任务,避免引入不必要的信息,以免混淆模型。

  5. 可理解性:确保提示词对模型来说是可理解的。对于更复杂的请求,可能需要简化或分解成多个步骤。

  6. 多样性:如果可能,为同一任务使用多种方式的提示词,以便找到最适合模型和最能产生所需结果的表达方式。

  7. 适应性:根据模型的反馈和学习情况随时调整提示词,以提高其响应的质量和准确性。

  8. 上下文敏感:注意提示词所处的上下文环境,同一句提示词在不同上下文中的含义可能会有所不同。

  9. 避免歧义:尽量避免使用多义词或短语,以减少模型的理解歧义。

  10. 先验知识:在提示词中可能需要引用或给出一些先验知识,以帮助模型更好地理解任务。

  11. 避免误导:避免使用可能导致模型误解的提示词,例如,如果模型擅长某类问题但不擅长另一类,那么不要误导它去尝试不擅长的类。

  12. 适时反馈:在提示词工程实践中,适时反馈至关重要,通过不断收集模型的输出结果,保持耐心,调整提示词,优化输出质量。

5.参考

https://zhuanlan.zhihu.com/p/666572032

https://download.csdn.net/blog/column/12545383/135497369

https://learnprompting.org/zh-Hans/docs/basics/few_shot

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值