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

我遇到了微软的POML,提示编排标记语言,这在我和直接编写自然提示之间又多了一个步骤。那种感觉像真正的语言的提示。
他们说POML为提示工程提供了“结构、可维护性和灵活性”。这是营销术语,意思是:
当提示变得冗长、混乱,并被三个时区中的五个不同团队重复使用时,你不会失去理智。
1、POML关键特性
当涉及到结构化提示工程时,POML看起来非常强大
1. 支持除图像以外的多种文件类型
- Word文档、PDF、CSV、音频文件,甚至整个文件夹都可以通过
<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
汇智网翻译整理,转载请标明出处
