提示词高级阶段学习day1
今天我们首先来介绍一下LangGPT
以 ChatGPT 为代表的大型语言模型(Large Language Models, LLMs)可以基于强大的语言理解能力、推理能力和生成能力执行各种各样的任务。此外,注入领域知识还能让 LLM 执行与领域相关的特定任务,要充分发挥 LLM 的这些能力,就需要构造高质量的提示。因此,提示工程 (Prompt Engineering) 吸引了许多研究人员的关注。
提示工程是典型的经验科学,主要涉及提示设计和提示优化。由于 LLM 具备自然语言理解能力,可以通过非结构化的自然语言指令直接要求 LLM 执行任务。在此基础上,研究人员首先探索并总结出了一些优化提示的技巧。
[Bsharat等人,2023年]介绍了26条指导原则,旨在让 LLMs 表现得更好。除了这些直接作用于提示的优化技巧外,一些研究人员还基于历史数据的提出了提示优化方法。
[Sun 等人,2023a] 引导 LLM 从不正确的推理中得出特定实例的新提示,然后总结每个实例的对应提示,作为优化原始提示的参考。
[Pryzant等人,2023年]定义了自然语言"梯度",利用小批量数据求解该"梯度"并利用波束搜索和 Bandit 选择程序,按照梯度的相反语义方向编辑当前提示。[Fan 等人,2023 年]对一个大型提示数据库进行分析,并提出了一个自动提示优化框架。
基于历史数据的直接提示优化原则和方法需要丰富的经验。因此,这些方法通常只在特定任务或领域中表现良好。为了提高通用性,一些研究人员提出了自适应提示优化方法。
[Guo 等人,2023 年] 将 LLM 与进化算法联系起来,提出了一种新的离散提示优化框架,称为 EvoPrompt。
[Li等人,2023a]设计了一种多轮对话对齐策略,并利用GPT-4[Achiam等人,2023]生成易读的提示集。同时,他们还提出了一种高效的提示筛选指标,能以线性复杂度筛选出高质量的提示。
[Wang等人,2023b]引入了PromptAgent,它可以反思模型错误并产生建设性的错误反馈,以诱导精确的专家级见解和深入的指导。[Hao等人,2022] 和 [Cheng等人,2023] 还从协调人类和 LLM 偏好风格的角度优化了提示。
提示优化可以大大提高 LLM 的性能,但由于缺乏系统性设计,高质量提示的可复用性很差。因此,一些研究人员设计了构建提示的规则。
[Nigh, 2023]收集了大量高质量提示,并总结了用于提示设计的 CRISPE 规则。
[ZamfirescuPereira等人,2023年]以基于LLM的聊天机器人设计工具原型为设计探针,支持非人工智能专家参与"终端用户提示工程"。
此外,一些研究人员为不同领域的应用设计了提示构建规则。
[Cao 等人,2023 年]为 ChatGPT 提出了各种利用深度学习执行程序修复任务的提示模板。
[Yeh等人,2022年]将生物医学关系提取任务重新表述为简单提示表述下的 cloze 测试任务,从而系统地生成全面的提示语。
[Liu和Chilton,2022年]在文生图任务的五个实验中评估了涵盖51个主题和51种风格的5493个生成提示,并总结了提示设计指南。
但是面临的主要问题:
1.这些方法以AI专家大量的使用经验为基础,
2.主要依赖列出的设计规则,缺乏系统性。
3.此外,这些规则具有较强的领域相关性和模型相关性,但通用性、灵活性和可复用性较低。
为了推广基于 LLM 的应用,进一步激发 LLM 的潜力,我们希望设计一个高质量、可复用的提示模板。
该模板应具有通用性和可扩展性。
此外,该模板还应该易学易用。
受 prompt 是 LLM 时代的编程语言这一观点的启发 [Alouani, 2023; Mund, 2023],
我们设计了一种面向 LLM 的编程语言,
即一种 prompt 设计框架 Language for GPT-like LLMs (LangGPT)。
特点:
LangGPT 具有编程语言的系统性、规范性和可复用性的特点,
并保留了自然语言的灵活性和可扩展性。
我们首先分析了自然语言和编程语言之间的差异,以确定提示模板应具备的属性。
LangGPT 设计为双层结构,由模块和内部元素组成。
———————————————————————————————————————————
LangGPT 中的模块可分为两类:
内置模块和扩展模块
———————————————————————————————————————————
对于内置模块:
我们详细设计了每个模块的必要内部元素,并给出了示例模板。
对于扩展模块:
我们统一了基本内部元素的设计。
实验证明两个现象:
1.在引导 LLM 方面,LangGPT 比基线提示更好。
2.此外,LLM 可以利用这一框架自动生成提示,就像生成代码一样。
2. 参考编程语言构造提示设计规则
与自然语言相比,编程语言更具标准化和可复用性。为了设计高质量的可复用的提示,我们分析了自然语言和编程语言之间的差异,并提出了提示设计原则。
2.1 自然语言与编程语言的区别
自然语言主要用于交流,而编程语言则是为机器执行任务定义的指令[GeeksforGeeks, 2023]。
不同的应用目的导致这两种语言的创造和演变背景截然不同。
1:目标受众:
自然语言是由人类对人类说的[Grune等人,2012],而编程语言是由人类为机器准备的[Chakray,2018]。
2理解:
计算机只能理解固定的指令,这要求编程语言具有严格、严谨的语法和语义。相反,自然语言具有宽松而灵活的语法和语义,允许创造和变化,并具有高度的容错性。
3模糊性:
自然语言更加模棱两可,但人类有能力明确自然语言表达的意思。例如,顺序混乱和打字错误等问题对阅读的影响较小,发音错误也可以理解[Chakray,2018;Aho,2007]。
编程语言比较准确,因为它们需要为计算机提供明确的指令[GeeksforGeek,2023]。
4演变与更新:
自然语言通过人类的使用和交流,随着时间的推移自然演变[Sipser,1996]。自然语言在增加新词与新的意义,以及摒弃过时用法方面是比较灵活的[Fromkin等人,2018年]。相反地,编程语言是专门为与机器通信而设计的[Sebesta,2012],新的语法规则和功能需要明确的升级或正式发布[Pratt等人,1984]。
总而言之,这两种语言的主要区别在于,自然语言更模糊、更灵活,而编程语言更规范、更精确。LLM本质上执行大量计算,与机器有许多相似之处。因此,我们借鉴了编程语言的特点,结合自然语言的优势,提出了一种面向 LLM 的自然语言编程框架--LangGPT。
2.2 提示设计规则
我们参考编程语言的设计思想来优化提示。
在分析了编程语言和自然语言的区别之后,我们提出了提示的设计原则:
(1)提示应具有规范化的格式。
灵活和模糊的自然语言对于LLM来说是很难理解的。格式规范的提示使用户的目的和要求更加突出。
(2)提示的结构应该是可扩展的。
自定义结构便于用户根据自己的领域和任务设计合适的提示。
(3)具体要求必须明确、完整。
指令和附加要求都应明确和完整,以避免误解或偏见。
(4)语言要灵活。
在需求明确的情况下,灵活的语言可以更好地适应不同的领域。此外,灵活的语言也便于用户学习。
3 面向大语言模型的自然语言编程框架
基于这些设计规则,我们提出了一种面向 LLM 的双层自然语言编程框架--LangGPT。
3.1 整体双层结构
为了系统地设计符合规则的提示,我们充分参考了面向对象编程语言的设计思想和结构[Rentsch,1982;Lutz,2010]。
我们将提示视为一个软件项目,并将提示设计过程类比为软件开发过程。对应关系如图1所示。
图 1:编程语言和自然语言提示之间的类比。
依据层次结构分析了两种语言之间的相似性。
不同大小的圆圈表示不同的层。较小的圆圈表示更靠近内层,对应于较深的颜色。
通过类比分析可以发现,自然语言提示与编程语言具有相似的多层次结构。
因此,我们参考编程语言的结构,提出了提示设计的双层结构,
并定义了提示的模块和元素的概念。
一个完整的提示包含几个模块。
模块类似于编程语言中的类,每个模块代表要求LLM的一个方面。
例如,可以在Constraint、Goal、Profile等方面增加提示。
在一个模块中,包括许多内部元素。
元素类似于编程语言中的函数和属性,表示对LLM的直接和特定指令的内容。
例如“输出不应超过500字”可以是提示中属于Constraint模块的元素。
双层结构可以很好地标准化提示的格式。
然而,
过度严格遵循定义的不利结果:
1.如果过于严格地要求提示遵循预定义的内置模块和基本元素,无法利用自然语言的灵活性的优势。
2.此外,还会降低LangGPT对不同领域不同任务的通用性,不利于高质量提示的复用。
为了解决这些问题,我们将模块和元素的类型进行了划分。
1.
我们首先定义了内置模块和基本元素作为预定义的双层提示模板。
2.
此外,我们还构建了支持自定义的扩展模块和自定义元素。
我们为内置模块和扩展模块提供Markdown[Gruber,2012]和JSON[Pezoa等人,2016]格式。
此外,我们为不同的模块编写了基本元素,并定义了编写自定义元素的规则。
3.2 内置模块的构造
该模块作为完整提示和指令单元之间的连接部分,对于控制提示的结构有非常重要的作用。
我们为所有提示所需的关键方面定义了内置模块。
此外,我们还针对与应用程序相关的某些场景定义了内置模块,以便于学习和使用。表1展示了我们为某些场景定义的内置模块。