[博客翻译]Prompts是程序


原文地址:https://blog.sigplan.org/2024/10/22/prompts-are-programs/


Prompts are Programs

在这篇文章中,我们强调理解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,已被证明是有效的。

还有人努力将编程语言构造更深入地集成到提示本身中,包括 GuidanceLMQL 语言,这些语言允许更多的规范。所有这些方法 (1) 观察到在提示中更明确和精确的规范的价值,并 (2) 利用任何机会对模型输出进行系统检查。

随着 LLMs 可以互动的丰富基础设施的可用性,自然语言提示将不断发展。扩展 LLM 功能以采取行动(如检索增强生成、搜索或代码执行)的工具成为 LLM 可用的抽象,但必须在提示中表达清楚用户意图以利用它们。需要大量编程语言研究来定义这些工具抽象,帮助 LLM 有效选择它们,并帮助提示编写者有效表达他们的意图。

提示的软件工程

如果我们理解提示是程序,那么我们如何将构建普通软件的知识和工具转化为创建健壯和有效的提示呢?需要编写、调试、部署和维护提示的工具,而现有的普通软件工具不能直接转移。

提示与传统软件的一个主要区别在于解释提示的底层引擎——LLM——不是确定性的,因此相同的提示在不同的调用中即使使用相同的 LLM 也可能产生不同的结果。此外,由于 LLM 的类型和种类越来越多,确保相同的提示在不同的 LLM 上产生相同的结果变得更加困难。实际上,LLM 正在迅速发展,在推断成本、输出质量和本地模型与云托管模型之间存在重要的权衡。这一事实意味着当底层模型发生变化时,提示可能也需要改变,这表明随着模型的发展,提示将需要不断微调。

已经有一些现有的研究方法自动优化和更新提示,例如 DSPy,但这些技术仍处于初级阶段。此外,一个给定的 AI 软件应用程序可能会在不同的时间选择使用不同的模型以提高效率,因此像支持多种 ISA 的二进制格式(例如,Apple Universal binary 格式)一样,提示可能需要支持多个目标 LLM 的结构。

最终,支持测试、调试和优化提示/模型配对的工具将是必要的并广泛使用。因为提示表示的标准或提示如何集成到现有软件应用程序的方法尚未被采用,因此需要研究这些问题的最有效方法。

提示研究的下一步

由于提示是程序,软件工程和编程语言社区在改善我们对提示的理解和能力方面有很多贡献。有许多研究机会有待探索,这些研究的影响将为基于 AISW 的下一代软件系统提供信息。此外,因为编写提示对非程序员来说更容易访问,所以我们研究的一个全新挑战是支持非专业开发人员通过编写有效、表达良好、健壯和可重用的提示来利用 LLMs。

在本文中,我们讨论了单个提示应被视为程序,但在实际应用中,许多利用AI的应用包含多个通过传统软件连接在一起的提示。多提示系统带来了更大的软件工程挑战,例如如何确保提示组合的健壮性和可预测性。这个领域正在迅速发展。像AutoGenSwarm这样的代理系统,其中基于AI的代理被定义并相互交互,已经广泛可用。我们现有的构建健壮软件的理解如何应用于这些新场景?了解这些系统的能力以及如何健壮地构建它们,对研究社区来说越来越重要。

创建健壮提示的挑战和有效策略尚未完全理解,并将随着底层LLM模型和系统的快速发展而迅速演变。编程语言(PL)和软件工程(SE)社区必须灵活且积极地将数十年来构建健壮软件开发语言和工具的研究和经验带入这一新的重要领域。

个人简介:
Tommy Guy
是微软Copilot AI团队的首席架构师。他的研究兴趣包括AI辅助数据挖掘、大规模AB测试以及AI的产品化。

Peli de Halleux 是位于华盛顿州雷德蒙德的Microsoft Research的研究软件开发工程师,隶属于软件工程研究(RiSE)小组。他的研究兴趣包括赋能个体更高效地构建LLM驱动的应用。

Reshabh K Sharma 是华盛顿大学的博士生。他的研究领域位于编程语言和安全性的交叉点,专注于开发用于创建安全系统的基础设施,并通过软件缓解措施改进现有系统,以解决各种漏洞,包括LLM系统中的漏洞。

Ben Zorn 是位于华盛顿州雷德蒙德的Microsoft Research的研究员,目前在软件工程研究(RiSE)小组工作(并曾管理该小组)。他的研究兴趣包括编程语言设计与实现、最终用户编程以及通过负责任的人工智能使用来赋能个体。

免责声明: 这些帖子由个人贡献者撰写,旨在分享他们在SIGPLAN博客上的观点。任何观点或意见仅代表博主个人观点,不代表AI千集的观点。

阅读全文(20积分)