POML Meta 元素与运行配置(Meta, Stylesheet, Output Schema, Tools, Runtime)

POML Meta 元素与运行配置(Meta, Stylesheet, Output Schema, Tools, Runtime)

参考官方文档:


概览

  • Meta 元素:为 POML 文档提供"版本约束、组件启用/禁用"等核心配置。
  • 类 Meta 组件 :不直接渲染为 LLM 消息,但影响渲染/执行:
    • <stylesheet>:样式(以 JSON 方式批量设置组件属性)。
    • <output-schema>:响应模式(约束模型输出结构)。
    • <tool-definition> / <tool>:工具注册(为模型声明可调用函数)。
    • <runtime>:运行时参数(温度、top-p、模型名、最大输出 token 等)。

基本用法(不产生可见输出)

  • 位置:通常放在 <poml> 开头;一个文档内可出现多次,但需避免冲突。
  • 常用属性:
    • minVersion / maxVersion:版本范围(语义化版本号)。
    • components:启用/禁用组件与别名(见下文)。

示例:

poml 复制代码
<poml>
  <meta minVersion="0.5.0" maxVersion="2.0.0" />
  <p>Your content here</p>
</poml>

组件开关(Component Control)

  • components 中使用前缀 - 禁用组件:
poml 复制代码
<poml>
  <meta components="-table,-image" />
  <p>Now <table> and <image> will throw errors if used.</p>
</poml>
  • 使用前缀 + 重新启用:
poml 复制代码
<poml>
  <meta components="-table" />
  <!-- later -->
  <meta components="+table" />
</poml>
  • 可独立禁用"别名"(alias),而不影响主组件名。

样式表(批量设置组件属性)

  • 写法:根 <poml> 下的一个 JSON 对象,键为组件名或类选择器,值为要设置的属性集合。
  • 作用:相当于用"样式"给组件批量对齐属性(如语法、渲染选项)。

示例 1:为所有 <p> 设置 syntax="json"

poml 复制代码
<poml>
  <stylesheet>
    { "p": { "syntax": "json" } }
  </stylesheet>
  <p>{"name":"Alice"}</p>
</poml>

示例 2:使用 className + 选择器(.csv)并设置 writerOptions(注意转义)

poml 复制代码
<poml>
  <table className="csv" records="[[1,2,3],[4,5,6]]"/>
  <stylesheet>
    {
      ".csv": {
        "syntax": "csv",
        "writerOptions": "{\\\"csvSeparator\\\": \\\";\\\", \\\"csvHeader\\\": false}"
      }
    }
  </stylesheet>
</poml>

提示:writerOptions 当前为实验性 API,字符串中的 JSON 需正确转义反斜杠与引号。


响应模式(让输出可解析、可验证)

  • 目的:将自由文本输出约束为结构化数据(JSON Schema、或 JS 表达式返回 Zod/JSON Schema)。
  • 仅允许文档内出现一个 <output-schema>
  • 格式一(JSON Schema):
poml 复制代码
<poml>
  <output-schema parser="json">
    {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "age":  { "type": "number" }
      },
      "required": ["name"]
    }
  </output-schema>
</poml>
  • 支持模板表达式:
poml 复制代码
<poml>
  <let name="maxAge" value="100" />
  <output-schema parser="json">
    {
      "type": "object",
      "properties": {
        "age": { "type": "number", "minimum": 0, "maximum": {{ maxAge }} }
      }
    }
  </output-schema>
</poml>
  • 格式二(表达式 eval → Zod/JSON Schema):
poml 复制代码
<poml>
  <let name="fields" value='["name", "email", "age"]' />
  <output-schema parser="eval">
    z.object(Object.fromEntries(fields.map(f => [f, z.string()])))
  </output-schema>
</poml>

工具注册: /

  • 目的:让模型在对话中"可调用函数"。
  • 两种格式与响应模式一致:parser="json"parser="eval"(Zod)。

JSON Schema 格式:

poml 复制代码
<poml>
  <tool-definition name="getWeather" description="Get weather information">
    {
      "type": "object",
      "properties": {
        "location": { "type": "string" },
        "unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
      },
      "required": ["location"]
    }
  </tool-definition>
</poml>

表达式(Zod)格式:

poml 复制代码
<poml>
  <tool-definition name="calculate" description="Perform calculation" parser="eval">
    z.object({
      operation: z.enum(['add', 'subtract', 'multiply', 'divide']),
      a: z.number(),
      b: z.number()
    })
  </tool-definition>
</poml>

属性也可用模板表达式:

poml 复制代码
<poml>
  <let name="toolName">calculate</let>
  <let name="toolDesc">Perform mathematical calculations</let>
  <let name="schemaParser">json</let>
  <tool-definition name="{{toolName}}" description="{{toolDesc}}" parser="{{schemaParser}}">
    { "type": "object", "properties": { "operation": { "type": "string" } } }
  </tool-definition>
</poml>

注:与响应模式配合的工具使用,取决于所选模型/提供商(OpenAI 等)。


运行参数(类型自动转换 + 键名转换)

  • 示例:
poml 复制代码
<poml>
  <runtime
    provider="openai"
    model="gpt-5"
    temperature="0.7"
    top-p="0.9"
    max-output-tokens="1000"
    frequency-penalty="0.2"
    presence-penalty="0.1"
    stop='["END", "STOP"]'
  />
</poml>
  • 键名转换:kebab-case → camelCase(如 max-output-tokensmaxOutputTokenstop-ptopP)。
  • 值转换:
    • 布尔字符串:"true" / "false" → true / false
    • 数字字符串:"1000"、"0.7" → 1000、0.7
    • JSON 字符串:'[...]'、'{...}' → 解析为数组/对象
  • VS Code 内置运行器基于 Vercel AI SDK,参数支持以其为准。
  • Python SDK :运行参数键将转为 snake_case 返回,如 maxOutputTokensmax_output_tokenstopPtop_p

实战组合小例(版本 + 组件开关 + 样式 + 结构化输出 + 运行参数)

poml 复制代码
<poml>
  <meta minVersion="0.5.0" />
  <meta components="-image" />

  <stylesheet>
    { "p": { "syntax": "json" } }
  </stylesheet>

  <let name="maxAge" value="120" />
  <output-schema parser="json">
    {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "age":  { "type": "number", "maximum": {{ maxAge }} }
      },
      "required": ["name"]
    }
  </output-schema>

  <runtime model="gpt-5" temperature="0.6" max-output-tokens="800" />

  <p>{"task":"Return a JSON object with name and age"}</p>
</poml>

常见坑与建议

  • 多个 <meta>:允许但要避免相互矛盾(如同一组件反复启/禁)。
  • 样式 JSON 格式 :必须是合法 JSON;字符串中的 JSON(如 writerOptions)要正确转义。
  • 响应模式唯一性 :一个文档仅允许一个 <output-schema>
  • 工具 + 响应模式:仅部分模型/提供商支持二者联用,按实际 SDK 能力确认。
  • 运行参数:理解键名/值的自动转换;注意 VS Code 运行器与 Python SDK 的差异。

参考与下一步

相关推荐
AI大模型12 小时前
GitHub 狂飙 72k Star,这本大模型书凭啥能圈粉无数?
程序员·llm·agent
堆栈future15 小时前
秒级生成4K图!字节豆包Seedream 4.0实测:完爆GPT-4o和Nano Banana
llm·aigc
大模型教程16 小时前
小白学大模型:从零搭建LLaMA
程序员·llm·llama
AI大模型17 小时前
一篇文章看懂RAG + 实战,看不懂来揍我
程序员·llm·agent
聚客AI17 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
智泊AI21 小时前
Transformer之词嵌入 | 为什么要做词嵌入?
llm
库森学长1 天前
一文带你 "看见" MCP 的过程,彻底理解 MCP 的概念
llm·ai编程·mcp
MrSYJ1 天前
Chat Memory你知道怎么用吗
llm·openai·ai编程
Baihai_IDP1 天前
AI Agents 能自己开发工具自己使用吗?一项智能体自迭代能力研究
人工智能·面试·llm
大模型教程2 天前
8GB显存笔记本能跑多大AI模型?这个计算公式90%的人都不知道!
程序员·llm·agent