DPML 一种结构化的 Prompt 标记语言设计方案

基本定义

DPML(Deepractice Prompt Markup Language)是一种专为AI提示词工程设计的标记语言,采用XML风格的语法结构,旨在提供结构化、可扩展且易于使用的提示词编写框架。

设计思想

当提示词的量级和复杂度达到一定水平后,我们需要一种通用的模式去管理提示词。这种通用的模式既要考虑人与大模型的易理解性(易读,职责单一,逻辑清晰),也要考虑计算机的可解释性(方便未来计算机系统解析,运算,验证,可视化等功能)。我们综合考虑后,选择适用 Markup Language 结合 Markdown 作为 提示词的结构化语言。遂提出了 Deepractice Prompt Markup Language

我们的设计原则是 简单(奥卡姆剃刀),模块化(可复用),可扩展(支持迭代)

我们信奉 Unix 的设计哲学 "Everything is a file.", 这在AI 时代非常具有意义,将 AI 人类 计算机 有效的连接在一起。

核心特点

  1. 结构化

    : 使用标签定义不同功能模块

  2. 可扩展

    : 支持模块化设计和渐进式复杂性

  3. 易于理解

    : 对人类和机器都友好的语法结构

  4. 可视化潜力

    : 便于开发编辑器和可视化工具

文件规则

支持解析 .dpml.prompt 后缀的文件

顶层结构

<prompt>
  <role>...</role>           <!-- 对应RRP:角色定义、职责、权限 -->
<thinking>...</thinking>   <!-- 对应CoT:思考过程、推理链 -->
<executing>...</executing><!-- 对应ESP:执行步骤、方法 -->
<testing>...</testing>     <!-- 对应质量控制、验证标准 -->
<protocol>...</protocol>   <!-- 对应交互协议、规则 -->
<context>...</context>     <!-- 对应背景信息、环境 -->
<task>...</task>           <!-- 对应任务定义、目标 -->
<workflow>...</workflow>   <!-- 对应CWP:工作流、协作模式 -->
<evaluation>...</evaluation><!-- 对应评估标准、成功指标 -->
</prompt>

属性定义规则

通用属性

DPML中的通用属性是可以应用于多种标签的核心属性,用于提供标签的元数据和行为控制:

  • id

    : 标签的唯一标识

  • version

    : 版本号

  • ref

    : 引用,支持组件的相对路径,绝对路径,id引用,http引用

  • schema

    : 提供验证规则元文档

id 定义规则

id属性用于为DPML元素提供唯一标识符,便于引用和管理:

  1. 唯一性范围

    • id在单个DPML文档内必须唯一

    • 不同文档中可以使用相同的id

  2. 命名规则

    • 必须以字母或下划线开头

    • 只能包含字母、数字、下划线、连字符和点

    • 区分大小写

  3. 最佳实践

    • 使用有意义的描述性名称

    • 可采用层次结构(例如section-subsection-element

    • 避免过于通用的名称,如"section1"、"item"等

  4. 冲突处理

    • 同一文档中的ID冲突被视为错误

    • 应在验证阶段检测并报告冲突

    • 需开发者手动修正冲突

<!-- id使用示例 -->
<prompt id="financial-analysis-template">
  <role id="financial-analyst">...</role>
  </executing>
</prompt>
version 定义以及引用规则

version属性用于标识DPML文档遵循的规范版本和文档自身版本:

  1. 格式规范

    • 采用语义化版本格式:主版本号.次版本号(如"2.0")

    • 主版本号表示不兼容的结构变化

    • 次版本号表示向后兼容的功能增加

  2. 用途

    • DPML规范版本声明

      :声明文档遵循的DPML核心规范版本

    • 处理引擎兼容性

      :帮助处理引擎确定如何解析文档

    • 功能可用性检查

      :确定文档中可使用的功能特性

  3. 处理规则

    • 处理引擎首先检查是否支持该版本

    • 不支持的版本应产生明确的错误信息

    • 可以指定兼容性处理模式

<!-- version使用示例 -->
<prompt version="2.0">
  <!-- 使用DPML 2.0规范的功能和结构 -->
</prompt>
  1. 与schema的关系

    • version主要控制DPML核心规范和处理模型

    • schema主要控制具体验证规则和领域扩展

ref 引用功能定义

ref属性用于引用其他DPML元素或外部资源,实现内容重用和模块化:

  1. 引用类型

    • ID引用

      :引用当前文档中的元素

    • 文件路径引用

      :引用本地文件系统中的文档

    • HTTP/HTTPS引用

      :引用网络资源

    • URI模式引用

      :使用特定协议引用资源

  2. 引用格式

    • ID引用:ref="#element-id"

    • 相对路径:ref="./templates/finance.xml#analyst-role"

    • 绝对路径:ref="/usr/local/dpml/templates/finance.xml#analyst-role"

    • HTTP引用:ref="https://dpml.org/templates/finance.xml#analyst-role"

    • DPML协议:ref="dpml:templates/finance#analyst-role"

  3. 引用行为

    • 默认情况下,引用作为基础模板,本地定义可以覆盖和扩展引用内容

    • 可以通过ref-mode属性控制引用行为:

      <role ref="./templates/analyst.xml" ref-mode="extend">
        <!-- 覆盖或扩展引用内容 -->
      </role>
    • ref-mode="extend"

      (默认):引用内容作为基础,可覆盖和扩展

    • ref-mode="replace"

      :引用内容完全替换当前元素内容

  4. 合并规则(当ref-mode="extend"):

    • 当前元素的属性优先于引用元素的属性

    • 同名子元素被覆盖,其他元素被保留

    • 具有相同ID的子元素会被合并

<!-- ref使用示例 -->
<!-- 引用当前文档中的元素 -->
<context ref="#market-data" />
​
<!-- 引用外部文件中的元素 -->
<role ref="./templates/analyst.xml">
  <!-- 覆盖部分内容 -->
  <identity>资深金融分析师</identity>
  <!-- 添加新内容 -->
  <specialization>新兴市场</specialization>
</role>

schema 验证规则元文档

schema属性用于指定DPML文档的验证规则来源:

  1. 用途

    • 定义文档结构的验证规则

    • 指定领域特定的标签和属性

    • 提供自动验证和智能提示支持

  2. 引用格式

    • URI引用:schema="http://dpml.deepracticex.com/schemas/finance-v2.xsd"

  3. 验证流程

    • 解析器加载指定的schema定义

    • 验证DPML文档是否符合schema规范

    • 提供详细的错误信息和位置

  4. 与version的关系

    • schema关注具体的验证规则和结构定义

    • version关注DPML核心语法和处理模型

    • 两者结合确保文档的完整性和正确性

<!-- schema使用示例 -->
<prompt 
  version="2.0" 
  schema="http://dpml.deepracticex.com/schemas/finance-v2.xsd">
  <!-- 内容将根据finance-v2模式进行验证 -->
</prompt>

渐进式复杂性

因为大模型本身具有类人的思考能力,无需像计算机一样制定非常详细的规则,所以我们决定暂时不深化制定二级标签下的子标签定义。而是随着实践经验逐步迭代,或者为不同行业提供最佳实践版本。

我们目前可以基于 dpml 和 markdown 的结合,在二级标签之下使用 markdown 定义提示词,即提供了灵活性,可读性,又实现了 结构化,模块化。

应用实例

以下是一个针对前端工程师的完整DPML示例,展示了如何使用DPML结构化提示词:

frontend-developer-assistant.prompt
<prompt
  version="1.0"
  id="frontend-developer-assistant"
  schema="http://dpml.deepracticex.com/schemas/v1.xsd"
  lang="zh-CN">
  

<role id="frontend-engineer">
    # 资深前端工程师
    
    ## 专业背景
    * 5年以上前端开发经验
    * 精通HTML5、CSS3和JavaScript(ES6+)
    * 熟悉主流前端框架:React、Vue、Angular
    * 深入了解现代前端工程化工具:Webpack、Vite、Babel等
    * 具备良好的性能优化、跨浏览器兼容性和响应式设计经验
    * 掌握前端安全最佳实践和无障碍设计
    
    ## 专业优势
    * 代码质量和工程化:编写可维护、高性能的前端代码
    * UI/UX实现:将设计稿精确转化为高质量前端界面
    * 问题排查:快速定位和解决前端常见问题
    * 技术选型:根据项目需求推荐合适的技术栈
    
    ## 工作范围
    * 提供前端开发相关的代码实现和优化建议
    * 解答前端技术问题和最佳实践
    * 提供前端架构和技术选型建议
    * 分析前端性能问题并提供优化方案
    
    ## 限制
    * 不提供完整的项目实现,专注于关键代码和解决方案
    * 非前端相关技术问题可能需要其他专家支持
    * 仅提供公开可用的API和技术信息,不讨论破解或侵权内容
</role>

<thinking id="problem-solving-approach">
    # 问题分析框架
    
    ## 代码问题分析流程
    1. **问题理解**
       - 明确问题描述和预期结果
       - 识别相关技术栈和环境
       - 确认问题优先级和影响范围
    
    2. **情境分析**
       - 分析代码上下文和执行环境
       - 考虑浏览器兼容性因素
       - 评估性能和用户体验影响
    
    3. **解决方案评估**
       - 生成多种可能的解决方案
       - 使用以下标准评估每种方案:
         * 实现复杂度
         * 维护成本
         * 性能影响
         * 兼容性考虑
         * 最佳实践符合度
       - 选择最佳方案或提供方案比较
</thinking>

<executing id="coding-standards">
    # 前端开发执行标准
    
    ## 代码编写准则
    1. **可读性优先**
       - 使用清晰的变量和函数命名
       - 添加适当的注释解释复杂逻辑
       - 保持一致的代码风格和缩进
    
    2. **模块化与组件化**
       - 遵循单一职责原则
       - 分离关注点,逻辑与UI分离
       - 合理组织文件和目录结构
    
    3. **性能考虑**
       - 避免不必要的重渲染
       - 优化资源加载和执行
       - 使用适当的缓存策略
    
    4. **安全性**
       - 防止XSS和CSRF漏洞
       - 安全处理用户输入
       - 避免暴露敏感信息
       
    5. **无障碍性**
       - 使用语义化HTML
       - 添加适当的ARIA属性
       - 支持键盘导航
</executing>
</prompt>

这个示例展示了如何使用DPML创建一个全面的前端工程师助手提示词。文档包含以下关键部分:

  1. 基本元数据

    :版本、ID、schema和语言信息

  2. 详细元数据

    :通过``标签提供作者、创建时间、关键词等信息

  3. 角色定义

    :使用``标签定义前端工程师的专业背景、优势和限制

  4. 思考框架

    :使用``标签定义解决问题的思考流程

  5. 执行标准

    :使用``标签定义代码编写的标准和流程

在每个标签下,使用Markdown格式组织内容,提供清晰的层次结构和丰富的表达。这种方式既保证了内容的结构化组织,又维持了编写和阅读的便捷性。

此示例可以作为前端开发领域创建DPML提示词的参考模板,也可以根据特定需求进一步定制和扩展。

可视化效果示例

未来发展

  • 引入 <meta> 标签定义元信息

  • 引入 <llm> <mcp> <tool> <rag> 等 agent 组装和交互要素

  • 开发可视化,解释器,IDE插件等配套工具

  • 定义 dpml schema的 xsd 规则

  • 基于 dpml 开发 prompt 管理系统,包含文件管理,版本管理,prompt 测试体系,prompt 领域模板库

  • 持续实践输出领域模版

  • 为Prompt标准持续贡献我们的力量

PML(Perfectly Matched Layer)是一种用于模拟无限大空间中波的边界条件,在有限元分析、声学和电磁学中广泛应用。下面是一个使用MATLAB编写的二维PML代码示例: ``` %% 定义常数 c0 = 299792458; % 光速 mu0 = 4*pi*1e-7; % 真空磁导率 eps0 = 8.85418782e-12; % 真空介电常数 imp0 = sqrt(mu0/eps0); % 真空阻抗 %% 定义模拟区域 Lx = 0.2; % x方向长度 Ly = 0.2; % y方向长度 dx = 1e-3; % 离散步长 dy = 1e-3; Nx = floor(Lx/dx) + 1; % 离散点数 Ny = floor(Ly/dy) + 1; x = linspace(0, Lx, Nx); % 离散点坐标 y = linspace(0, Ly, Ny); [X,Y] = meshgrid(x, y); % 离散点矩阵 %% 定义时间步长和总时间 dt = dx/c0/2; % 时间步长 tmax = 1e-10; % 总时间 Nt = round(tmax/dt) + 1; % 时间步数 t = linspace(0, tmax, Nt); % 时间序列 %% 定义光源和检测点 xc = Lx/2; % 光源和检测点坐标 yc = Ly/2; t0 = 50*dt; % 激励时间 f0 = 1e12; % 中心频率 w0 = 2*pi*f0; % 中心角频率 tau = sqrt(mu0*eps0); % 时间常数 sigmaMax = 4/(tau*dt); % 最大吸收系数 dPML = 0.2; % PML厚度 sigmaPML = @(x) sigmaMax*(x/Lx)^2; % PML吸收系数函数 bPML = @(x) 1 + 1i*sigmaPML(x)/(w0*eps0); % PML参数函数 %% 初始化场变量 Ex = zeros(Ny, Nx); % x方向电场 Ey = zeros(Ny, Nx); % y方向电场 Hz = zeros(Ny, Nx); % z方向磁场 %% 计算系数 CEx = (1/dy)*bPML(Y).*eps0./bPML(X); % x方向系数 CEy = (1/dx)*bPML(X).*eps0./bPML(Y); % y方向系数 CHz = (1/imp0)*bPML(X).*bPML(Y); % z方向系数 %% 初始化PML吸收边界 Exx = zeros(Ny, 2); % x方向电场 Eyy = zeros(2, Nx); % y方向电场 Hzz = zeros(Ny, 2); % z方向磁场 CExx = zeros(Ny, 2); % x方向系数 CEyy = zeros(2, Nx); % y方向系数 CHzz = zeros(Ny, 2); % z方向系数 for i = 1:Ny % x方向PML吸收边界 x1 = x(1) + dPML*(i-1)*dx; x2 = x(end) - dPML*(i-1)*dx; CExx(i, 1) = (1/dy)*bPML(i*dy).*eps0./bPML(x1); CExx(i, 2) = (1/dy)*bPML(i*dy).*eps0./bPML(x2); Exx(i, 1) = CExx(i, 1)*Ey(i, 2) - CHz(i, 1)*Hz(i, 1); Exx(i, 2) = CExx(i, 2)*Ey(i, end-1) - CHz(i, 2)*Hz(i, end); end for j = 1:Nx % y方向PML吸收边界 y1 = y(1) + dPML*(j-1)*dy; y2 = y(end) - dPML*(j-1)*dy; CEyy(1, j) = (1/dx)*bPML(y1).*eps0./bPML(j*dx); CEyy(2, j) = (1/dx)*bPML(y2).*eps0./bPML(j*dx); Eyy(1, j) = CEyy(1, j)*Ex(2, j) + CHz(1, j)*Hz(1, j); Eyy(2, j) = CEyy(2, j)*Ex(end-1, j) + CHz(end, j)*Hz(end, j); end %% 开始模拟 for n = 1:Nt % 激励 if t(n) < t0 Ez = exp(-0.5*((c0*t(n)/Lx)^2 + (c0*t(n)/Ly)^2))*sin(w0*t(n)); else Ez = 0; end % 更新电场 Ex(:, 2:end-1) = CEx(:, 2:end-1).*Ex(:, 2:end-1) ... - (dt/dy)*(Hz(:, 2:end) - Hz(:, 1:end-1)); Ey(2:end-1, :) = CEy(2:end-1, :).*Ey(2:end-1, :) ... + (dt/dx)*(Hz(2:end, :) - Hz(1:end-1, :)); Ex(:, 1) = Exx(:, 1); Ex(:, end) = Exx(:, 2); Ey(1, :) = Eyy(1, :); Ey(end, :) = Eyy(2, :); % 更新磁场 Hz(2:end-1, 2:end-1) = CHz(2:end-1, 2:end-1).*Hz(2:end-1, 2:end-1) ... + (dt/eps0)*(Ex(2:end-1, 2:end) - Ex(2:end-1, 1:end-1) ... + Ey(2:end, 2:end-1) - Ey(1:end-1, 2:end)); Hz(:, 1) = Hzz(:, 1); Hz(:, end) = Hzz(:, 2); % 边界条件 Ex(1, :) = 0; Ex(end, :) = 0; Ex(:, 1) = Exx(:, 1); Ex(:, end) = Exx(:, 2); Ey(:, 1) = 0; Ey(:, end) = 0; Ey(1, :) = Eyy(1, :); Ey(end, :) = Eyy(2, :); % 绘制实时图像 imagesc(x, y, Ez + Hz'); axis equal tight; colorbar; xlabel('x (m)'); ylabel('y (m)'); title(sprintf('t = %.2e s', t(n))); drawnow; end ``` 这段代码演示了如何使用PML方法模拟二维空间中的电磁波传播,包括如何定义模拟区域、时间步长和总时间、光源和检测点、PML吸收边界等。需要注意的是,这只是一个简单的示例,实际应用中可能需要进行更多的优化和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值