免费POC,零成本试错

AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


POML:体验微软开源的Prompt工程语言

发布日期:2025-08-15 12:19:20 浏览次数: 1543
作者:零一瓦舍

微信搜一搜,关注“零一瓦舍”

推荐语

微软开源POML语言,让Prompt工程更标准化、结构化,提升开发效率与可维护性。

核心内容:
1. POML语言的设计理念与核心优势
2. 实际应用示例与标签元素解析
3. 与传统字符串模板的对比分析

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

#大模型 #AI #Prompt #编程

发现微软开源了一个专门用来写Prompt的标记语言POML

下午试玩了一下,配合Claude Code把自己很久之前一个小项目中的 prompt 用 POML 重构了下。大概体验了一下这个语言的特点。

一、概述

简而言之,POML 就是一个标准的「标记语言」的定位,类似HTML是网页格式的标准化一样,POML尝试把 Prompt 的书写给「标准化」了,另外,也把「内容」和「渲染」分离开来。

相比传统的字符串模板,提供了:

  1. 结构化组织: 语义化的组件如 <role><task><stepwise-instructions>
  2. 更好的可读性: 清晰的层级结构和组件分离
  3. 类型安全: 组件参数验证和自动补全
  4. 多格式输出: 可渲染为 Markdown、JSON、HTML 等多种格式
  5. 模板复用:组件化设计便于维护和复用

二、示例

我重构的一个例子(这个prompt因为年代太久,其实现在已经用处不大了,参考它其中的标签元素用法即可):

<poml>
  <role>你是一名资深的内容策略专家和主题分析师,具有10年以上的学术研究和内容策划经验。你善于从复杂的多源信息中提炼出核心主题,并能准确把握不同领域的专业术语和概念关联。</role>
  
  <task>基于提供的资源内容,运用系统性分析方法推断出最佳的文章主题</task>
  
  <input caption="待分析资源内容">{{resources_content}}</input>
  
  <examples captionStyle="header" caption="学习示例">
    <example captionStyle="bold" caption="示例一:计算机视觉主题">
      <input caption="资源内容" syntax="text">论文1: 深度学习在图像识别中的应用研究
论文2: 卷积神经网络优化算法分析  
论文3: 计算机视觉领域的最新进展</input>
      
      <output caption="完整分析过程">
        <section>
          <h>第一步:关键概念提取</h>
          <list listStyle="dash">
            <item>深度学习、图像识别、卷积神经网络、优化算法、计算机视觉</item>
          </list>
        </section>
        
        <section>
          <h>第二步:主题域识别</h>
          <list listStyle="dash">
            <item>核心领域:人工智能/机器学习</item>
            <item>具体方向:计算机视觉</item>
            <item>技术焦点:深度学习算法</item>
          </list>
        </section>
        
        <section>
          <h>第三步:重要性评估</h>
          <list listStyle="dash">
            <item>图像识别是计算机视觉的核心应用</item>
            <item>深度学习是当前主流技术</item>
            <item>优化是实用性关键</item>
          </list>
        </section>
        
        <section>
          <h>第四步:主题综合</h>
          <p>基于频次分析和重要性权衡,核心主题围绕"深度学习在计算机视觉中的应用与优化"</p>
        </section>
        
        <section>
          <h>最终主题</h>
          <p><b>深度学习驱动的计算机视觉</b></p>
        </section>
      </output>
    </example>
    
    <example captionStyle="bold" caption="示例二:区块链金融主题">
      <input caption="资源内容" syntax="text">报告1: 区块链技术在金融行业的应用现状
报告2: 数字货币监管政策分析
报告3: 分布式账本技术的安全性研究</input>
      
      <output caption="完整分析过程">
        <section>
          <h>第一步:关键概念提取</h>
          <list listStyle="dash">
            <item>区块链、金融、数字货币、监管政策、分布式账本、安全性</item>
          </list>
        </section>
        
        <section>
          <h>第二步:主题域识别</h>
          <list listStyle="dash">
            <item>核心领域:金融科技</item>
            <item>技术基础:区块链技术</item>
            <item>关注点:应用与监管</item>
          </list>
        </section>
        
        <section>
          <h>第三步:重要性评估</h>
          <list listStyle="dash">
            <item>金融是区块链最重要的应用场景</item>
            <item>监管是行业发展的关键因素</item>
            <item>安全性是技术可信度基础</item>
          </list>
        </section>
        
        <section>
          <h>第四步:主题综合</h>
          <p>主题应该涵盖技术应用、政策环境和安全保障三个维度</p>
        </section>
        
        <section>
          <h>最终主题</h>
          <p><b>区块链金融应用与监管</b></p>
        </section>
      </output>
    </example>
  </examples>
  
  <stepwise-instructions caption="分析步骤指南">
    <list listStyle="decimal">
      <item><b>深度阅读</b>:逐一仔细阅读所有资源内容,理解每个资源的核心观点和专业词汇</item>
      <item><b>概念提取</b>:识别并列出所有关键概念、技术术语、方法论和研究对象</item>
      <item><b>主题域映射</b>:确定资源所属的学科领域、技术方向或应用场景</item>
      <item><b>关联分析</b>:分析不同资源间的概念重叠、逻辑关系和层次结构</item>
      <item><b>重要性权衡</b>:基于出现频次、技术重要性和实际影响力评估各概念的权重</item>
      <item><b>主题综合</b>:整合分析结果,提炼出能够统领所有资源的核心主题</item>
      <item><b>质量检验</b>:验证主题的准确性、完整性和表达效果</item>
    </list>
  </stepwise-instructions>
  
  <cp caption="思维链分析结构">
    <p>请严格按照以下结构进行逐步分析,展示你的完整推理过程:</p>
    <list listStyle="decimal">
      <item><b>第一步:关键概念提取</b> 列出从各个资源中识别出的关键术语、概念和主题词</item>
      <item><b>第二步:主题域识别</b> 确定资源涉及的核心学科领域、技术方向或应用场景</item>
      <item><b>第三步:重要性评估</b> 分析各概念的重要性权重和相互关系</item>
      <item><b>第四步:主题综合</b> 说明如何整合分析结果得出最终主题</item>
    </list>
  </cp>
  
  <cp caption="质量标准">
    <p>主题必须满足以下要求:</p>
    <list listStyle="star">
      <item><b>准确性</b>:准确反映所有资源的核心内容</item>
      <item><b>完整性</b>:涵盖资源的主要维度,不遗漏重要方面</item>
      <item><b>简洁性</b>:控制在8-15个汉字,便于理解和记忆</item>
      <item><b>专业性</b>:使用准确的专业术语,体现学术严谨性</item>
      <item><b>吸引力</b>:具有一定的概括性和表达力</item>
    </list>
  </cp>
  
  <cp caption="常见错误预防">
    <p>避免以下问题:</p>
    <list listStyle="dash">
      <item>主题过于宽泛,缺乏针对性(如"人工智能研究")</item>
      <item>主题过于具体,无法覆盖所有资源</item>
      <item>使用过时或不准确的术语</item>
      <item>忽略资源间的重要关联</item>
      <item>主题表达冗长或模糊</item>
    </list>
  </cp>
  
  <output-format caption="输出格式要求">
    <p>请严格按照以下格式输出:</p>
    
    <section>
      <h>思维链分析</h>
      <p>[按照上述四个步骤展示完整推理过程]</p>
    </section>
    
    <section>
      <h>最终结果</h>
      <p>主题:[8-15个汉字的主题名称]</p>
    </section>
    
    <section>
      <h>主题说明</h>
      <p>[用1-2句话简要说明主题的核心内涵和覆盖范围]</p>
    </section>
  </output-format>
</poml>

可以用VSCode中的POML插件预览渲染后的结果:


也可以看渲染成Markdown的样子:


三、程序集成

在程序中使用,配合SDK(我的项目是Python语言):

import asyncio
from pathlib import Path
from typing import Any

import poml

class POMLLoader:
    """POML 提示词加载器"""

    def __init__(self, prompts_dir: str | Path = None):
        """初始化加载器

        Args:
            prompts_dir: POML 提示词文件目录,默认为当前模块的 prompts 目录
        """

        if prompts_dir is None:
            prompts_dir = Path(__file__).parent / 'prompts'
        self.prompts_dir = Path(prompts_dir)

    async def load_prompt(self, name: str, variables: dict[str, Any] = None) -> str:
        """加载并渲染 POML 提示词

        Args:
            name: 提示词名称(不含扩展名)
            variables: 传入的变量字典

        Returns:
            渲染后的提示词文本

        Raises:
            FileNotFoundError: 当提示词文件不存在时
        """

        poml_file = self.prompts_dir / f'{name}.poml'

        if not poml_file.exists():
            raise FileNotFoundError(f'POML 文件不存在: {poml_file}')

        # 使用 POML SDK 的 context 参数进行变量注入
        messages = poml.poml(poml_file, context=variables, parse_output=True)

        # 从消息列表中提取内容
        if isinstance(messages, list) and messages:
            # 合并所有消息的content字段
            contents = []
            for msg in messages:
                if isinstance(msg, dict) and 'content' in msg:
                    contents.append(msg['content'])
            return '\n\n'.join(contents)

        return str(messages)

    def load_prompt_sync(self, name: str, variables: dict[str, Any] = None) -> str:
        """同步版本的加载提示词方法"""
        return asyncio.run(self.load_prompt(name, variables))

# 默认加载器实例
default_loader = POMLLoader()

async def load_theme_infer_prompt(resources_content: str) -> str:
    """加载主题推断提示词"""
    return await default_loader.load_prompt('theme_infer', {'resources_content': resources_content})

在写这个加载器的时候,发现这个库目前还非常不成熟,文档中poml函数有一个format参数,但是最近的稳定版0.0.7并不支持,这一点让 Claude Code 写的很纠结,最后只好不那么优雅地自己额外提取并拼接了一下渲染后的结果。


总结

  • 有点用处,如果你的prompt比较多,可以更程序化地管理
  • 内容与渲染分离,理论上也更有拓展性,不过我目前的场景基本只用markdown,所以这部分好处还显现不太出来,只有心理作用会感觉更「干净」一点。
  • 目前项目还不是很稳定,期待未来能逐渐成熟

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询