在这篇文章中,我们强调理解AI模型提示与传统软件程序有很多共同点的重要性。采取这一观点为编程语言和软件工程社区创造了重要的机遇和挑战,我们敦促这些社区开展新的研究议程来解决这些问题。
超越聊天
ChatGPT 在 2022 年 12 月发布,对我们理解大型语言模型(LLMs)可以做什么以及如何使用它们产生了巨大的影响。数百万使用过它的人理解什么是提示以及它们可以有多么强大。我们对 AI 模型理解和回应我们的能力及其能够进行有见地的对话的能力感到惊叹,这使我们可以根据需要细化其响应。
话虽如此,许多聊天机器人的用户在让 LLMs 做他们想要的事情时遇到了挑战。在向聊天机器人输入内容时,需要技巧以使其正确解释用户意图。同样,用户可能对聊天机器人生成的内容有非常具体的要求(例如,以特定方式格式化的数据,如 JSON 对象),这一点在提示中非常重要。
此外,与 LLMs 的聊天互动在提示措辞上的挑战之外还存在显著限制。与编写和调试代码不同,互动会话不会产生可以重复使用、共享或参数化等的工件。因此,对于一次性使用,聊天是一种良好的体验,但对于重复应用解决方案,聊天就显得不足。
提示是程序
当 LLM 交互被嵌入支持自动化、重用等的软件系统中时,可以克服聊天机器人的不足。我们将这样的系统称为 AI 软件系统(AISW),以区别于在运行时不利用 LLM 的普通软件系统(Plain Ordinary Software, POSW)。在这种背景下,LLM 提示必须被视为更广泛的软件系统的一部分,并且具有与任何软件相同的健壮性、安全性等要求。在相关博客中,我们概述了 AISW 的发展将如何影响整个系统堆栈。在这篇文章中,我们重点关注提示在这个新软件生态系统中的重要性以及它们为现有创建健壮软件的方法带来的新挑战。
在继续之前,我们澄清一下我们所说的“提示”是什么意思。首先,我们最熟悉的提示体验是我们键入聊天机器人的内容。我们将直接输入聊天机器人的内容称为用户提示。另一种更复杂的提示是用于处理用户提示的提示,通常称为系统提示。系统提示包含应用程序特定的指令(例如,“你是一个聊天机器人……”),并与其他输入(如用户提示、文档等)结合后发送给 LLM。系统提示是一组固定的指令,定义了要完成的任务性质、预期的其他输入以及输出应如何生成。通过这种方式,系统提示指导 LLM 计算特定结果,就像任何软件函数一样。在以下讨论中,我们的重点主要是将系统提示视为程序,但许多观察结果也同样直接适用于用户提示。
提示的示例
我们使用以下提示作为示例,该示例改编自最近一篇关于提示优化的论文,以说明我们的讨论。
你获得了两个项目:1)一个句子和 2)该句子中的一个词。返回该句中给定词的词性标签。
这个系统提示描述了它期望的输入(在这种情况下是一对句子,如“猫吃了帽子。”和一个词,如“帽子”)、要执行的转换以及预期的输出结构。从这个例子中可以很容易地看出,我们需要重新思考所有使软件健壮的方法,以便它们适用于提示。
如果提示是程序,那么编程语言是什么?
有许多问题与理解最佳提示语言模型的方式有关,这是一个活跃的编程语言和 AI 研究话题。在实践中,纯自然语言表达提示可以是有效的。此外,编写提示的最佳实践指南通常建议使用传统的文档结构机制(如使用Markdown)和明确划分部分,如示例部分、输出规范等。模板化方法也很受欢迎,其中提示的部分可以被程序化地替换。控制模型训练过程中和外部规范中的提示输出结构和内容的方法,如 OpenAI JSON 模式或 Pydantic Validator,已被证明是有效的。
还有人努力将编程语言构造更深入地集成到提示本身中,包括 Guidance 和 LMQL 语言,这些语言允许更多的规范。所有这些方法 (1) 观察到在提示中更明确和精确的规范的价值,并 (2) 利用任何机会对模型输出进行系统检查。
随着 LLMs 可以互动的丰富基础设施的可用性,自然语言提示将不断发展。扩展 LLM 功能以采取行动(如检索增强生成、搜索或代码执行)的工具成为 LLM 可用的抽象,但必须在提示中表达清楚用户意图以利用它们。需要大量编程语言研究来定义这些工具抽象,帮助 LLM 有效选择它们,并帮助提示编写者有效表达他们的意图。
提示的软件工程
如果我们理解提示是程序,那么我们如何将构建普通软件的知识和工具转化为创建健壯和有效的提示呢?需要编写、调试、部署和维护提示的工具,