BAML提示工程语言:让大模型提示词开发像写代码一样简单

文章介绍了BAML提示工程语言,通过"提示即函数"理念将提示词代码化管理。它解决了传统提示词开发中的硬编码、类型安全和效率问题,提供模式工程、类型安全输出和灵活性。开发者可用BAML定义提示函数,生成类型安全的客户端代码,实现更可靠、可维护的大模型应用开发。

提示词(Prompt)是用户输入给 LLM 模型的指令或问题,用于引导模型生成期望的输出内容。在日常 AI 应用开发中,开发调试提示词,是一项繁琐工作,常常会面临以下问题:

  1. 提示词直接硬编码在应用程序中,修改和迭代过程繁琐且容易出错。
  2. 缺乏输出类型安全,处理 LLM 模型返回的结构化数据需要手动解析,容易出错且难以维护
  3. 效率低下,缺少工程化方法,提示词开发过程往往重复且低效

由于上述的问题,提示词开发往往变成了一种依靠主观经验的艺术。当某个 AI 应用效果惊艳的时候,人们往往想到:用的是什么提示词,给我看看你的提示词?而不会想到如何使用系统性的方法步骤,开发调试出符合应用场景要求的提示词。

本文介绍提示工程语言 BAML,通过’提示即函数’的理念,将提示词像代码一样管理起来,使提示开发成为一门系统工程。

什么是 BAML

  • 项目地址:https://github.com/BoundaryML/baml
  • 官方文档:https://docs.boundaryml.com/home

BAML是一种用于构建可靠AI工作流程和智能体(Agents)的简易提示语言。

核心功能亮点

  • 将提示工程转化为模式工程(schema engineering),大幅简化开发过程,提升提示工程开发效率(仅需专注设计提示的结构化数据模型,即可获得更可靠的输出)
  • 完全类型安全的输出:BAML 可强制约束 LLM 输出的数据结构(返回开发者预先定义的类型)。即使在流式响应时,也可以保持输出的类型安全。
  • 极致灵活性:兼容任意LLM、任意编程语言和任意数据模式。
  • 实现与任意 LLM 模型兼容的可靠工具调用:SAP(Schema-Aligned Parsing,模式对齐解析)算法,专门用于处理大语言模型可能生成的灵活输出格式。如,让 LLM 返回响应格式:JSON 块内嵌套 Markdown,或生成答案前的推理链(chain-of-thought)

BAML 的设计哲学

BAML的设计哲学体现了实用主义与工程简洁性的融合

  1. 尽可能避免创新(不重复造轮子),降低开发者认知负担,聚焦业务而非工具链
  • 提示需要版本管理?已有完美方案:Git
  • 提示需要存储?已有完美方案:文件系统
  1. 零环境依赖:任意文本编辑器 + 任意终端即可使用
  2. 速度优先:用Rust实现编译器,使工程开销趋近于零
  3. 低认知门槛(大学一年级学生也应能理解)
LLM 提示即函数

以函数的形式定义提示词(提示即函数),是 BAML 的核心设计原则:BAML 的基本构建单元是函数。每个提示词都是一个函数,它接收参数并返回预定义的类型。BAML 设计了一种新的语法(新的编程语言),定义提示(prompt)

下面是以函数形式定义提示 prompt 的例子:一个聊天 Agent 的提示词定义。通过声明式语法,将复杂的聊天逻辑转化为类型安全的函数定义。

  • 输入参数:message 对话消息历史;tone,限定为 happy 或 sad 的语气参数
  • 限定返回的类型:返回 StopTool(停止对话) 或 ReplyTool(回复消息)
  • client:指定使用的 LLM
  • prompt:动态生成提示模板(自动注入输出格、tone 变量)
function ChatAgent(message: Message[], tone: "happy" | "sad") -> StopTool | ReplyTool {    client "openai/gpt-4o-mini"    prompt #"        Be a {{ tone }} bot.        {{ ctx.output_format }}        {% for m in message %}        {{ _.role(m.role) }}        {{ m.content }}        {% endfor %}    "#}class Message {    role string    content string}class ReplyTool {  response string}class StopTool {  action "stop"@description(#"    when it might be a good time to end the conversation  "#)}
为什么需要新的编程语言?

维护数百个 f-string 提示词的想法实在令人作呕 。字符串不利于构建可维护的代码库,BAML 更倾向于结构化的字符串。

BAML 的目标是:赋予你自然语言的表达力,同时保留代码的结构化特性。

BAML 函数可被任意编程语言调用

定义了 BAML 函数后,我们使用主流的开发语言(如,python、go、ruby等)调用 BAML 函数。

什么是 baml_client

baml_client 是由 BAML 文件生成的代码,它将 BAML 提示词转换为目标语言(如 python、go)的等效函数,并提供经验证的类型安全输出。

BAML 的 Rust 编译器会基于 .baml 文件生成 baml_client。以 python 为例:

baml_src 目录下的 generators.baml 文件,指定了编译生成 baml_client 的配置项:

generator target {    // Valid values: "python/pydantic", "typescript", "ruby/sorbet", "rest/openapi"    output_type "python/pydantic"    // Where the generated code will be saved (relative to baml_src/)    output_dir "../"    // The version of the BAML package you have installed (e.g. same version as your baml-py or @boundaryml/baml).    // The BAML VSCode extension version should also match this version.    version "0.204.0"    // Valid values: "sync", "async"    // This controls what `b.FunctionName()` will be (sync or async).    default_client_mode sync}

通过 baml_client,可以调用 BAML 函数:

from baml_client import bresume_info = b.ExtractResume("....some text...")

通过上面的代码,可以实现以下功能:

  1. 以正确参数调用 LLM 端点
  2. 解析输出内容
  3. 修复损坏的 JSON(如存在)
  4. 将结果封装为类型化对象返回
  5. 错误处理机制

BAML 作为通用类型系统,可在任意编程语言中使用。若使用 python,BAML 类型会转换为 Pydantic 模型。若使用 TypeScript, BAML 类型会转换为 TypeScript 类型。

以下是通过 Python 调用 BAML 定义的 ChatAgent 函数示例,通过 baml_client 可以访问调用 BAML 函数。

from baml_client import bfrom baml_client.types import Message, StopToolmessages = [Message(role="assistant", content="How can I help?")]whileTrue:    print(messages[-1].content)    user_reply = input()    messages.append(Message(role="user", content=user_reply))    tool = b.ChatAgent(messages, "happy")    if isinstance(tool, StopTool):        print("Goodbye!")        break    else:        messages.append(Message(role="assistant", content=tool.response))

安装与运行

以 python 为例,使用 BAML 进行开发,可以参考文档:https://docs.boundaryml.com/guide/installation-language/python

1、在 IDE 安装 BAML 插件

可以在 https://marketplace.visualstudio.com/items?itemName=boundary.baml-extension 下载 vs code 插件,该插件具有语法高亮、测试沙盒、提示预览等功能。

笔者使用 pycharm,在插件市场,也可以搜索到 BAML 相关插件。点击 install 进行安装。

2、安装 BAML

运行以下命令,安装 BAML 的 python 包:

pip install baml-py

安装其他依赖的 python 包

pip install typing_extensionspip install pydantic

3、将 BAML 添加到项目

运行以下命令,会创建 baml_src 目录,自动生成初始化的 BAML 代码。

baml-cli init
```![](http://cdn.zhipoai.cn/cf351a07.jpg)

运行 baml-cli init 后,自动在项目目录下,生成一个子目录 baml\_src,存放 BAML 代码

![](http://cdn.zhipoai.cn/3618322a.jpg)

**4、配置模型 client**

由于某些原因,不方便访问 openai、anthropic 等模型。这里自定义一个 client,使用 qwen 模型。在 clients.baml 文件里添加以下内容:

* 由于 qwen 模型兼容 openai , 供应商 provider 可设置为 openai
* 配置模型名称、api key、url

```plaintext
client<llm> QwenPlus {  provider openai // 指定提供商  options {    model "qwen-plus"            // 自定义模型    api_key env.DASHSCOPE_API_KEY // 读取环境变量,获取 api key    base_url "https://dashscope.aliyuncs.com/compatible-mode/v1" // 自定义端点  }}

5、定义 prompt

使用 BAML 的语法,以函数的形式定义提示(prompt)。下面定义两个 BAML 函数:

(1)根据主题、体裁,写一首诗歌

  • topic:主题
  • poetry_type:诗歌体裁
function MakePoetry(topic: string, poetry_type: string) -> string {  client QwenPlus  prompt #"    写一首诗歌,关于{{ topic }}的{{ poetry_type }}.  "#}

(2)中国省份信息提取

根据一段关于某个省份的信息描述(自然语言形式),提取相关信息,返回结构化的类型:

  • 定义 Province 类型,包含省份名称、省份简称、省会、人口、邻近省份等信息。
  • ExtractProvince:从省份描述信息中,提取结构化信息,返回 Province 类型的对象。
class Province {  name string@description("省份名称")  brief_name string@description("省份简称")  capital string@description("省会")  language string@description("语言、方言")  population int @description("人口")  area string@description("面积")  nearby_provinces string[] @description("邻近省份")}function ExtractProvince(province: string) -> Province {  client QwenPlus  prompt #"    Extract from this content:    {{ province }}    {{ ctx.output_format }}  "#}

6、基于 .baml files 生成 baml_client 的 python 模块

编写好 .baml 文件后,在项目目录下,运行 baml-cli generate 命令,即可编译生成 baml_client 的 python 模块

(baml_learning) PS D:\python_project\baml_learning> baml-cli generate                  2025-08-13T19:26:33.346 [BAML INFO] Wrote 13 files to baml_client2025-08-13T19:26:33.346 [BAML INFO] Generated 1 baml_client: ../baml_client

7、测试运行

完成上述的准备工作后,我们可以测试调用 BAML 函数,下面展示三个例子:

  • 以”日出“为主题,写一首五言律诗
  • 以”江河“为主题,写一首七言绝句
  • 从一段关于广东省的文字描述,提取信息,返回预先定义的结构类型 Province
from baml_client import bfrom baml_client.types import Provinceimport os# os.environ['BAML_LOG'] = 'WARN'poetry = b.MakePoetry('日出', '五言律诗')print(poetry)poetry = b.MakePoetry('江河', '七言绝句')print(poetry)province_info = """广东省,英文名(Guangdong Province), 简称粤, 中华人民共和国省级行政区,省会是广州市。 地处中国大陆最南部,东邻福建,南临南海,西接广西,北接江西、湖南。 截至2023年12月,下辖21个地级市、共122个县(市、区), 总面积17.98万平方千米, 2024年末,广东省常住人口12780万人。 广东省语言复杂多样,主要有粤、客、闽三大汉语方言。"""province = b.ExtractProvince(province_info)print('省份名称: ', province.name)print('省份人口:', province.population)

8、运行效果

关于日出的五言律诗:

**日出**  东方初破晓,霞彩映山红。  雾散金光现,云开紫气融。  鸟啼迎暖日,风静海天中。  万物生辉处,朝霞照碧空。

关于江河的七言绝句:

《江河》  浩荡东流不计年,千峰倒影入中天。  风来两岸闻潮急,月落沙洲起暮烟。

关于广东省的结构化信息:

{      "name": "广东省",      "brief_name": "粤",      "capital": "广州市",      "language": "粤、客、闽三大汉语方言",      "population": 127800000,      "area": "17.98万平方千米",      "nearby_provinces": [        "福建",        "广西",        "江西",        "湖南"      ]    }

BAML 的日志级别默认是 INFO。运行程序,会打印每次向 LLM 请求时的提示(根据函数传入的参数,动态生成提示)

省份信息提取的 prompt:

---PROMPT---    system: Extract from this content:    广东省,英文名(Guangdong Province), 简称粤, 中华人民共和国省级行政区,省会是广州市。 地处中国大陆最南部,东邻福建,南临南海,西接广西,北接江西、湖南。 截至2023年12月,下辖21个地级市、共122个县(市、区), 总面积17.98万平方千米, 2024年末,广东省常住人口12780万人。 广东省语言复杂多样,主要有粤、客、闽三大汉语方言。    Answer in JSON using this schema:    {      // 省份名称      name: string,      // 省份简称      brief_name: string,      // 省会      capital: string,      // 语言、方言      language: string,      // 人口      population: int,      // 面积      area: string,      // 邻近省份      nearby_provinces: string[],    }

以上是关于 BAML 的介绍。关于 BAML 的更多功能,可以阅读官方文档:https://docs.boundaryml.com/home。

通过 BAML ,可以让我们的提示(prompt)开发变得代码化、函数化、工程化,构建可维护的AI工作流


如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 大模型行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方优快云官方认证二维码,免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值