POML:提示编程语言

我遇到了微软的POML,提示编排标记语言,这在我和直接编写自然提示之间又多了一个步骤。那种感觉像真正的语言的提示。

POML:提示编程语言

我遇到了微软的POML,提示编排标记语言,这在我和直接编写自然提示之间又多了一个步骤。那种感觉像真正的语言的提示。

他们说POML为提示工程提供了“结构、可维护性和灵活性”。这是营销术语,意思是:

当提示变得冗长、混乱,并被三个时区中的五个不同团队重复使用时,你不会失去理智。

1、POML关键特性

当涉及到结构化提示工程时,POML看起来非常强大

1. 支持除图像以外的多种文件类型

  • Word文档PDFCSV音频文件,甚至整个文件夹都可以通过<document><table>等数据组件嵌入到提示中。
  • 你不再仅限于静态文本或图像。提示现在可以是数据丰富的,并且具有上下文,看起来更像一份完整的报告,而不是一个句子。

2. 在VS Code中的真实编码体验

  • 有一个专门用于POML的VS Code扩展,提供:
实时预览 在编辑器内直接测试 像写代码一样管理提示,这基本上将提示工程变成了软件工程。

3. 组件类别

  • 逻辑/格式组件:如段落或列表。
  • 意图组件:如<role><task><example>
  • 数据组件:如<image><document><table>,用于注入结构化的外部数据。

4. 实际提示工程构造的示例

  • 使用<example>进行少样本提示,带有明确标记的<input><output>子组件。
  • 多模态提示:例如,使用syntax="multimedia"嵌入图像,供支持视觉的LLM使用。
  • 替代文本回退:对于不支持图像的模型,使用替代文本。

5. 提示逻辑和控制流

  • 使用let变量
  • 使用for循环,访问loop.index
  • 使用index + 1动态生成编号列表

6. QA专用标签

  • 有一个<qa>标签,可以干净地将客户的问题与响应分开——将提示变成支持代理。

7. 通过样式表进行提示样式设置

  • 你可以附加样式表来全局强制执行视觉或结构规则(比如强制所有标题为大写)。
  • 这不仅仅是功能性的,还关乎让提示对人类来说易于阅读和维护。

8. 之前未提及的新标签

  • <hint>:添加上下文指导以帮助LLM
  • <cp>(带标题的段落):用于创建有标题的部分
  • <let><for>:将模板逻辑带入提示中

这些新增功能表明,POML远不止是一种更整洁的提示格式。它正在演变为一个完整的提示编程接口,数据感知、可重用、模块化且可测试,并且有紧密的IDE支持。新细节让它感觉像Jupyter Notebook与HTML结合用于LLM

2、POML到底是什么?

核心上,它是一种标记语言。这意味着它使用类似于HTML的标签。例如:<role><task><example>

你使用这些标签将提示分成部分。所以,与其把一个20行的提示块放入文本文件,你现在有了结构。想象一下,给你的LLM一个整齐打包的午餐盒,而不是一堆杂乱的剩菜。

你也可以嵌入:

<img>    — 用于图像    
<document> — 附加参考文本    
<table>  — 如果你的提示包含表格数据
现在你的提示可以说,“嘿模型,看看这个图表”或者“参考这个PDF”,而不需要将整个内容内联。

它甚至有一个样式系统,有点像CSS。你可以通过应用样式来调整提示的冗长或正式程度。想想看:你改变语气而不必重写内容。

而且,是的,模板化。这部分事情变得真正接近编程:

  • 你可以使用{{ variable_name }}设置变量
  • 添加<let>来定义它们
  • 使用条件语句如if语句
  • 即使是循环。
这意味着你的提示可以说:“如果用户的语言是法语,就做这个。否则,就做那个。”之类的事情。

3、微软的风格:开发工具

这不仅仅是一个规范。微软推出了一个完整的工具包。

  • VSCode扩展:自动补全、标签建议、错误高亮、预览。
  • Python和Node.js SDK:让你将POML提示插入你的应用程序逻辑。
  • 没有C#/.NET SDK,这很疯狂。微软创造了这个东西,却甚至没有给自己的主要开发生态系统一点支持。经典。
你在POML中编写提示,SDK将其编译成纯文本提示,然后发送给LLM。可以把POML看作是一个结构化的蓝图,在模型看到它之前就被扁平化了。

4、示例

<poml>  
  <role>你是一个风趣的科学传播者,使用类比和讽刺让复杂的想法变得有趣。</role>  
  <task>描述火箭如何进入太空,使用提供的图像作为参考。</task>  

  <img src="rocket_launch_diagram.png" alt="火箭发射图示" />  

  <output-format>  
    保持简洁、幽默,不超过120个字。  
    以“好了,系好安全带,太空中尉!”开头。  
  </output-format>  
</poml>

这个例子为LLM设定了一个轻松、讽刺的语气,定义了一个与火箭发射相关的任务,并包含了一张图像用于视觉基础。输出格式引导模型保持简洁和幽默,有特定的开头和字数限制。使用POML,这个结构化的提示可以清晰地组织、重用和测试,与支持视觉的LLM一起使用以保持一致的行为。

5、网上人们怎么说

我在Reddit和Hacker News上查找了一下。这里有一些反响:

  • “LLM不在意格式,除非它们被训练过。”
    公平。如果你的模型不知道如何读取标签,它可能会忽略它们,甚至更糟,会卡住。
  • “这感觉像是让LLM去编程。”
    是的。编写提示的工具现在成为一个程序,这个程序构建程序,然后生成代码。
  • “这不是为LLM设计的结构,而是为那些在混乱工作流中编写提示的开发者设计的。” 可能是最诚实的观点。这有助于人类保持理智,特别是当提示不只是单次使用的时候。
  • 是的,缺少C# SDK?这不只是我一个人的看法。其他人也提出了疑问。

6、我实际上喜欢它的地方

好了,现在我已经批评了一些……这里让我在扔掉它之前暂停一下:

  • 我现在的提示只是……一团糟。有时更改一个词就会破坏整个输出。添加结构可能有助于我看到什么在变化以及为什么
  • 重复的模式,比如在不同任务中使用相同的结构,可能会让模型更加可预测,尤其是如果它被训练过类似的标记的话。
  • 开发工具流畅。VSCode的自动补全是节省实际时间的东西,尤其是在语法变得笨拙的时候。
  • 使用变量和逻辑编写可重用的提示?这可能会减少很多复制粘贴的垃圾。

7、一些问题

  • 它是另一个抽象。我已经有了文本→LLM。现在是文本→标记→编译→LLM。更多的移动部件。更多的失败点。
  • 感觉很沉重。就像我们又在建造2005年的网站。冗长的标签。括号汤。这并不优雅。
  • 没有.NET支持。我用C#编写工具。这意味着我必须拼凑出一些东西才能在我的堆栈中使用它。
  • 而且说实话,除非模型被训练成期望这种格式……有什么意义呢?你只是用嘈杂的标签包装干净的文本。

8、如果你刚接触这个,我会告诉你什么

尝试一下。但不要承诺。

拿两个你已经写的提示。用POML重写它们。使用VSCode扩展。看看感觉如何。不要读完整个规范,只需模仿一些例子。

问问自己:

  • 更容易维护吗?
  • 是否帮助你更清楚地思考模型应该做什么?
  • 是否让与其他人的协作更容易?
关键的是:有没有破坏任何东西?

如果LLM的行为有所改善,或者至少没有变得更糟,那么可能值得使用。如果它让一切变慢、更复杂、更难读,那就放弃吧。回到纯文本。没有奖励去使用最新的格式。

是的,如果你想要写一个奇怪的、带有<let>循环或<img>嵌入的模板化提示,我会在这里。这些东西很混乱,但有时候好主意就藏在那里。


原文链接:Microsoft POML : Programming Language for Prompting

汇智网翻译整理,转载请标明出处