模型 / 数据集
BoundaryML/baml avatar
BoundaryML/baml

BAML:为智能体而生的编程语言,还是又一个 DSL 赌注?

The programming language for agents

9,180 个 Star492 个 ForkRustApache-2.0

秒懂

它是什么?
BAML 自称是“智能体的编程语言”,用类似 TypeScript 的语法和 Rust 风格的类型系统,试图减少大模型输出中的错误。本文基于仓库与文档,分析其机制、上手方式、局限与替代方案。
适合谁用?
BAML 适合那些正在构建复杂智能体工作流、且对输出结构化与类型安全有硬性要求的团队,尤其是已经使用 TypeScript 或 Python 并愿意引入新 DSL 的开发者。它不适合追求极简工具链、或只需要简单 JSON 输出的项目。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Rust(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题:智能体输出不可靠的根源

大模型返回的文本天然是非结构化的,而智能体应用需要精确的数据来调用工具、填充状态或触发逻辑。常见做法是让模型输出 JSON,再靠运行时解析,但一旦字段缺失或类型不符,整个流程就会崩溃。BAML 的定位正是这个痛点。它宣称每个特性都为了让智能体“少犯错”,比如类型系统在运行时保留类型信息,不存在 any 或危险的类型转换。这意味着从模型返回的数据在进入你的代码前,就已经被校验和约束。它面向的是那些正在生产环境中构建智能体的工程师,而不是做原型验证的爱好者。这些人需要的是确定性,而不是灵活。BAML 试图把错误从运行时提前到编译期,用语言本身来约束模型输出。

语言设计:TypeScript 外表,Rust 内核

BAML 的语法看起来像 TypeScript,但类型系统借鉴了 Rust。它声称编译速度比 Go 还快,虽然 README 没有给出具体基准,但这暗示了性能是设计目标之一。关键特性是“类型在运行时持久存在”,这意味着你定义的结构体在程序运行期间仍然可查,不像 TypeScript 那样编译后类型信息就消失了。错误是类型化的,并且经过静态分析。文件系统直接决定模块和命名空间,这减少了显式的导入声明。它还内置了绿色线程和无色并发,类似 Go 的 goroutine,让并发调用模型变得简单。这些设计合起来,是为了让开发者能写出更少运行时错误的代码。但要注意,这些描述来自 README,实际编译速度与并发模型的效果,需要自己跑一遍才能验证。

运行时机制:类型如何约束模型输出

虽然 README 没有给出完整的架构图,但从描述可以推断出核心机制:你定义带类型的函数,这些函数描述模型应该返回的结构。当智能体调用这些函数时,BAML 的运行时负责与模型交互,并强制输出符合类型定义。因为类型在运行时存在,所以可以用反射或类似机制检查输出是否匹配。如果模型返回了不符合预期的内容,BAML 会将其视为类型错误,而不是静默地传给下一个环节。内置的测试与 eval 框架可以让你针对不同的模型和提示词组合编写断言。这种设计意味着,BAML 充当了模型输出与业务逻辑之间的一个强校验层。它不关心模型内部如何推理,只关心输出是否满足你的契约。

上手实测:从 brew 到第一个 BAML 函数

安装过程很直接,macOS 用户可以用 Homebrew。README 给出了四条命令:brew install baml、baml agent install、baml init、baml ide install --code。第一条安装 CLI,第二条可能安装智能体相关的依赖,第三条初始化项目,最后一条为 VS Code 安装语言插件。baml init 应该会生成一个示例目录,包含 .baml 文件。之后你可以用 TypeScript、Python、Go、C# 或 Java 调用编译后的 BAML 函数,这意味着你可以增量采用,不需要重写现有代码。例如,你可以在 Python 中导入生成的模块,然后像调用本地函数一样调用 BAML 定义的结构化输出函数。但注意,具体 API 细节 README 没有展开,你需要查看 quickstart 或命令行帮助。

局限与失败模式:新语言的代价

BAML 的最大局限是它是一门新语言,这意味着你需要学习新语法、新工具链,还要处理编译器或运行时可能不成熟的边界情况。它没有庞大的社区或丰富的第三方库,遇到问题只能靠 Discord 或源码。另一个问题是,它强调“无垃圾输出”,但这依赖于模型在提示下严格遵守类型约束。如果模型输出包含恶意或异常内容,类型系统可能无法完全防护。而且,BAML 的 nightly 版本发布频繁,如 0.18.1-nightly.20260908.a,暗示正式版可能还不稳定,生产环境需要谨慎锁定版本。此外,它内置的并发模型虽然听起来强大,但如果你只需要串行调用模型,这些特性就是多余的复杂度。对于简单项目,直接使用 JSON 解析库可能更轻量。

替代方案对比:BAML 与 TypeScript + Zod 的差异

最常见的替代方案是用 TypeScript 配合 Zod 库来定义 schema,并在运行时校验模型输出。这种方法不需要引入新语言,你继续使用熟悉的生态。Zod 在运行时校验类型,但类型定义与模型调用之间没有编译期的连接。BAML 的差异在于,它将类型定义作为语言的一部分,并且编译器可能生成更优化的校验代码。另一个替代是纯 Python 加 Pydantic,类似于 Zod,但面向 Python。BAML 声称可以增量采用,这意味着你可以在现有 TypeScript 项目中逐步替换部分逻辑。但关键区别是,BAML 需要你学习它的语法和工具,而 Zod 或 Pydantic 只是库。如果你的团队已经熟悉 TypeScript,Zod 的学习成本更低。BAML 的价值主张是,它为智能体场景提供了更完整的抽象,包括测试框架和 stdlib,但这一切都以锁定到新语言为代价。

维护与许可:Apache-2.0 下的长期考量

BAML 采用 Apache-2.0 许可,这是一个宽松的许可证,允许商业使用、修改和分发,但需要保留版权声明。这对大多数公司是友好的。但维护成本取决于项目的活跃度。仓库主要用 Rust 编写,默认分支是 canary,暗示开发节奏快,但可能不稳定。频繁的 nightly 发布意味着你需要持续跟进更新,否则可能错过 bug 修复或特性。另一方面,新语言的生命周期不确定性很高,如果 Boundary 公司停止维护,或者社区不增长,你可能会被困在一个没有第三方支持的语言上。在采用前,建议查看 GitHub 上的 issue 追踪和贡献指南,评估项目的响应速度。虽然 README 提到招聘 Rust 工程师,但长期投入无法保证。

编辑结论

BAML 适合那些正在构建复杂智能体工作流、且对输出结构化与类型安全有硬性要求的团队,尤其是已经使用 TypeScript 或 Python 并愿意引入新 DSL 的开发者。它不适合追求极简工具链、或只需要简单 JSON 输出的项目。若考虑采用,应先验证:BAML 的编译器在你常用的模型与提示词组合下是否稳定,运行时类型检查是否覆盖所有边界情况,以及 nightly 版本与正式版的差异是否影响生产部署。最后,确认 Apache-2.0 许可与你的分发方式兼容。BAML 的赌注在于:一个新语言能否在智能体生态中站稳脚跟,这需要时间与社区验证。

官方来源

  1. BoundaryML/baml on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
社区笔记

社区笔记