- 就像完整的表达系统一样,比如if语句、for循环、while循环,你可以在其中有条件地调用代理,中止到人工工作者、人工标注系统,然后返回,那种系统。- 哇。- 是的。
大家好,我是Vaibhav。我是BAML的共同创造者之一。我在一家名为Boundary的公司工作,担任创始人,我们真的不喝咖啡。实际上,团队里没有人喝咖啡。我主要喝水,偶尔早上会喝些橙汁。BAML是什么,为什么我总是听到关于它的消息?
VAML是什么?我的意思是,VAML,它实际上是编程语言。它实际上是我和我的联合创始人大约两年前,现在大约一年半前开始的一个疯狂的想法。这只是从这样一个想法开始的:我们不可能使用Langchain编写提示。这感觉不对,从伦理上讲。因为你做了很多吗?不,只是因为我看到的每一行代码都很丑陋。
而且,我认为我与之交谈的很多人,他们谈论,我们与每个人交谈。而且,至少我交谈过的每个人都说过,AI管道代码感觉像是演示代码。就像你扔掉它一样,就像现在正在进行的这种氛围编码一样,每个人都喜欢,氛围编码它然后发布它。如果你从零开始,这可以奏效。对于前端工程,一切都是强组件化的,这非常有效。但是,如果你正在构建一个后端,它与五年前编写的软件有15个复杂之处,
这并不是说它不好。只是,我不会让初级工程师或新员工提交代码而不仔细阅读或与他们讨论。当人们进行氛围编码时,他们并没有这种自然倾向。这不像,所以我认为如果你添加拉取请求,添加流程,你就能做到这一点。但无论如何,重点是,我见过的每一行提示工程代码,甚至在氛围编码之前,都感觉像是氛围编码的。它看起来像是氛围编码的。这是一种现象,在它成为一个名称之前。
是的。而且,我认为,我认为丑陋的代码是那些我认为很多人没有认真思考的事情之一。但有一个原因,那就是世界上每家公司都有一个CI/CD系统,其中包括一个代码风格检查器。
因为代码风格检查器是对还是错并不重要。重要的是,作为一家公司,你们有一个流程和一个关于如何编写代码的明确的系统。因为这有助于你们构建管道,任何从不同公司加入你们的人都可以参与并进行迭代。无论是AI代理编写代码还是人类编写代码,你们都需要这个。而AI管道似乎并没有达到这种严格程度。它们感觉像是拼凑在一起的。这感觉不对。这就是激发BAML的灵感。好的,所以……
你看到一堆Langchain示例。你认为,伙计,我们不能通过Langchain提示来创造更美好的未来。除了代码风格检查器之外,还有什么?代码风格检查器和丑陋的代码,氛围编码的特性。是什么让你这样想的?例如,以Web开发为例。当我第一次开始编写网站时,那是2010年。
大约2012年的时候,React还不存在。TypeScript也不存在。你编写网站的方式是你的后端返回一个字符串。你把它放在那里,这就是你发布的内容。这还不错,但我们都从这种方式转向编写React是有原因的。
React为我们自动完成了很多隐式操作,我认为这非常有帮助。例如,如果你忘记了结束标签,例如,你在末尾放了/button,而你忘记了放/button,它会警告你。你甚至无法推送代码。但是,如果你从后端将其作为字符串返回,你很容易忘记放置/button。现在你的整个网站都崩溃了。构建。我记得我当时第一次申请实习的时候。
无限滚动的新闻提要是一个难题,对吧?这就像交互性不是内置的东西一样。你必须编写所有这些代码,并以某种方式将jQuery与代码中的许多美元符号与你的实际HTML合并。它看起来很糟糕。然后最终React出现了,并说,如果我们只是拉取
HTML的语法将CSS的语法拉入你的JavaScript并使其成为原生语法。所以现在,它不仅变得更漂亮了,因为它看起来更漂亮了,因为它的语法将button突出显示为蓝色或根据你的主题使用任何颜色,与button的实际内容不同,而且它还提供了命令点击,它提供了编译时检查,它提供了DOM重新渲染。React公开的语法允许它做很多新奇的事情。
所以我们采用了相同的方法。如果你要编写提示,你可能不想在你的代码库中编写一堆不可验证的英语。如果我们可以验证英语呢?如果我们可以将英语转换成更像代码的东西,但保留英语的灵活性呢?
所以我们在后台为你做了很多错误修正。我们尽可能少地进行重试和其他操作。它们有效地进入了你的控制。最重要的是,我们可以为你构建工具,让你做一些最好是看到而不是听到的事情。但是,如果我要向一个只是在听的人描述它,想象一下,在你将提示发送到模型之前,你可以看到它,就像一个Markdown预览。
没有人会在不查看它看起来像什么的情况下编写Markdown文件。没有人会在不打开浏览器查看它看起来像什么的情况下发布网站。为什么今天在现有的每个框架中,查看提示的唯一方法是运行你的代码并以某种方式监控实际发送的网络活动,因为你的提示下有50层干扰?所以我们只是把它撕掉,然后说,如果你可以在编写代码时在VS Code或Cursor中实时查看你的提示怎么办?
这种小的工具更改极大地帮助了迭代循环。现在,你刚才说了一些我想更好地理解的东西,那就是可验证的英语。这是什么意思?可验证的英语。是的,这是什么意思?这是一个很好的问题。今天,每个人都将LLM视为一个神奇的盒子,它以某种方式得到了正确的答案。如果它没有得到正确的答案,那就是你的错。
我们喜欢退一步,只将LLM视为一个非常非常好的计算器。那么什么是计算器呢?计算器接受两个数字和一个运算符,然后根据运算符,它将这两个数字转换为一个新数字,对吧?你添加加号,它会将它们相加。你添加乘号,它会将它们相乘。很简单。
现在,你可能会将不同的计算器用于不同的工作。例如,如果你在17世纪或13世纪,你可能会使用算盘。或者蒙特梭利。或者蒙特梭利。或者其他一些东西,没错。但是你今天可能会使用科学计算器。或者你可能会将MatLab用于非常复杂的数值计算。但它们在底层都是计算器。只是不同的计算器有不同的权衡。
那么,如果我们将LLM视为计算器呢?你提供你的数据最终成为的任何参数,然后你只需说,我希望LLM保证它会输出一些特定的东西。例如,如果我正在构建医生-病人记录,你希望在医生给药或他们拥有的任何东西之前进行一些审计控制。而我只有音频记录。但这实际上看起来像是我想要一个计算器,它可以接收音频文件
或记录文本,并输出医生询问的关于药物的问题列表,药物是什么,以及病人是否确认。这是一个计算器。现在我可以使用一个非常强大的设备来实现这个计算器,那就是LLM。根据我使用的LLM,我将获得不同程度的精度。如果我使用小型模型,我将获得良好的精度。如果我使用大型模型,我将获得更好的精度。
但这只是一个计算器,现在我使用的提示变成了进入计算器的运算符,就像加号一样,如果我们这样看待它,那么提示中的英语就完全可以验证了,因为我只需要验证我输入的英语是否会以某种方式产生我想要的数据模型,好的,所以……我将展示一些东西,因为我认为这会更容易,然后我们可以一起讨论……对于那些
可能无法看到它的人。所以这是一个我们为与一群YC创始人进行的为期四小时的研讨会制作的15页Notion文档。所以我认为,当我们谈论代码时,展示代码有时比口头谈论更容易。所以我将展示一些我所说的导致可验证英语的片段。很好。在这种情况下,我有一个名为class_by_message的函数。
classify_message接收一个消息,这是一个字符串,所以它可以来自亚马逊上的评论、推文或我真正拥有的任何东西。来自我女朋友的短信,没关系。而我唯一想知道的是它的情感,其中之一是这三件事。所以我想构建一个计算器,无论消息是什么,它都会返回正面、中性或负面之一。现在我在这里选择的计算器将是OpenAI GT 4.0,但我可以使用Llama模型,我可以使用Anthropic模型,Gemini,这并不重要。
然后,我所说的运算符变成了这个提示。现在我可以通过做几件事很容易地验证这个提示中的英语。因为这不是简单的英语,我只需要说,对于几个不同的测试用例,这段英语是否会将这条消息引导到正确的东西?所以如果我的女朋友给我发短信说,我对你非常生气,它应该返回负面。这个计算器应该计算为负面。
当我们将事情这样看待时,将它们组合成复杂的系统并准确知道我构建到系统中的契约变得容易得多,这导致了现在可由静态分析器使用的代码,可由AI检测到错误发生时的代码,最重要的是,一个强大的迭代循环。因为无论什么原因,如果该消息返回中性,
我知道可能有两件事可能出错。要么我需要一个不同的计算器,要么升级模型到Gemini的2.5 turbo,要么我需要更新我的提示并更改这个计算器使用的运算符。这说得通吗?是的。是的,我明白了。现在为什么你不能使用我们今天在Python等相当常见的语言中拥有的工具来做到这一点呢?
是的,我认为这有两个方面。首先,并非所有软件都是Python。所以当你在Python中这样做时,这意味着用C编写的MySQL数据库现在无法支持AI管道,除非通过启动一个Python微服务。这感觉不对。世界上所有用Java编写的代码,最终也希望使用LLM,因为它们同样是功能强大的计算器。每台计算机,每个系统,
软件应用程序都希望利用该计算器。所以这就是第一个原因,我们应该能够支持所有这些语言。但是你也会遇到一些非常简单的事情,就像这段代码在Python中会是什么样子?所以你会注意到的一件事,我在这里向你展示的是,这段代码有一个字符串,它完全缩进了。也许用它在静态分析中的实际外观更容易看到,所以你可以很容易地突出显示它,就像在React中一样。
所以我现在正在查看VS Code,我正在显示我在那里拥有的相同代码,只是用我们提供的语法突出显示写出来。你会注意到的第一件事是,如果我在Python中这样做,那么我的代码最终会看起来更像这样。所以,嗯哼。
这就像一个非常非常小的细节,最终会发生。是的。但这回到了你之前关于代码丑陋性和可读性因素所说的内容。没错。所以如果我有一个提示,现在每个提示,这是一个长字符串,将以某种方式缩回到第零行。如果它在if语句中嵌套了四层,那么你的if语句将突然被
推到代码的最左边。当你滚动时,你将不知道if语句是否存在,仅仅是因为你有一个长字符串。大多数代码库的设计并非为了在其间拥有全局可用的长字符串。我认为人们没有真正考虑的一点是,当我有很多常量字符串时,我们通常如何在代码库中使用很多字符串变量?我们要么从数据库加载它们,要么
或者我们将它们作为非常短的字符串放在一些constants.py文件中,然后我们加载它们。但是现在我的代码,我的业务逻辑实际上嵌入到这些字符串中。这需要与它们存在的位置一起放置。更糟糕的是,我以非常动态的方式构建这些字符串。有时我会添加if语句来有条件地将语句添加到我的字符串中。有时我会添加for循环来动态构建它们。
有时我想,比如,我必须更改我拥有的字符串,因为模型50%的时间是Gemini,而50%的时间是OpenAI。字符串的设计并非如此。这就像,而且字符串在任何编程语言中都不是为此设计的。那么如何拥有一个既极其动态又极其灵活的字符串呢?唯一接近此的语言是React。好的。好吧,它确实感觉像
在这方面,字符串是,它们是针对不同的范例的。你永远不会真正使用字符串来控制计算机或控制结果。但是现在随着LLM的出现,你正在使用字符串作为控制机制。所以它是代码的一部分。所以我认为如果我理解你的理念,你更多的是说
字符串应该像我们对待其他代码片段一样被视为一等公民。而且应该非常谨慎地对待它们。你需要谨慎对待你的字符串。如果我是达美航空公司,并且我正在构建很多AI聊天机器人,而不仅仅是一个。
我如何保证实习生不会意外地忘记在任何系统消息或聊天机器人中添加你为达美航空公司工作的第一部分?是的。这不是我们想留给人们去做的事情。这是我们想要流程去做的事情。而且今天没有任何语言的机制能够以这种方式静态分析字符串。所以你正在说,嘿,这种……
流程是在编程语言中本地添加的。这是只有编程语言才能做的事情,因为我认为这是另一个问题。它回到了这个想法,为什么我们不能使用我们今天已经拥有的工具和已经存在的语言来做到这一点,对吧?所以我们可以在Python中做到这一点。你可以做的是,你可以创建一个名为
prompt_string的特殊类,现在你在任何地方使用字符串都必须实际使用prompt_string而不是string,但即使你这样做,你也不能缩进字符串了
你依赖公司中所有地方的开发人员使用prompt_string而不是string。让我们记住,开发人员真的很懒。好吧,我很懒。所以其他人也一样,也许他们不知道,但我只是懒。即使我知道,我也不会这样做,因为我不想不得不输入额外的工作。我不必。然后你就会面临风险。是的,我明白了。没错。我认为整个警告是,我们必须决定我们想要承担的负担在哪里。
我们是想让开发人员承担负担,还是想让流程承担负担?有时让开发人员承担负担是可以的,但我认为实际上我认为最好的做法是,如果一项操作变得频繁,那么你就让流程承担负担。
因为这些是如此强大的计算器,所以将其放入流程中而不是开发人员中确实非常强大。然后我们真正所说的另一个重要警告是,就像我之前提到的那样,我们希望每种语言都能支持这些计算器,这些LLM。所以我还没有在Java中看到一个好的框架。我还没有在Go中看到一个好的框架。而OpenAI本身几乎不支持这些语言。
这说明了一些事情。要么他们坚信Python和TypeScript是这里唯一存在的特性。你知道吗,其他的都无关紧要。要么他们相信最终有人会处理它,我们不必考虑它。但我不能相信每个人都应该能够利用这些系统。有些,比如Kubernetes不是用Python构建的。我们拥有的最基础的一些系统不是用Python构建的。
如果这些系统将成为最后能够利用AI管道优势的系统,我觉得这很可惜,因为它们是最有用的。那么BAML是如何与所有这些同步的呢?它如何与所有不同的语言相互作用呢?所以BAML作为一种语言的理念是,我们作为一种语言做一些事情,然后我们做的是代码生成到你的任何其他选择的语言。
所以你用BAML编写你的代码,然后我们进行代码生成以提供给你一个Python函数。所以如果你用BAML编写了一个名为classify_message的函数,我们会创建一个名为def classify_message的相同函数,它实际上会在后台调用BAML代码。BAML代码实际上是用Rust编写的。所以它非常快,可以在每个系统上运行。对于那些使用Python的人来说,它就像NumPy。NumPy不是用Python编写的。它是用C编写的。
这是因为要进行真正好的数值处理,你不能让Python来做。你用C编写,使其速度更快,并通过Python接口将其暴露给Python。这就是我们所做的。我们将BAML代码通过类型安全的自动完成接口暴露给你,支持你选择的每种语言。所以感觉就像你用Python编写的一样。只是碰巧你是在BAML中完成的。
所以我的理解正确吗?因为它基本上是你正在使用你选择的语言编写。是的。但是你正在编写BAML代码,它会在另一端将其转换为BAML。没错。这就是它的工作原理。所以你编写,你打开一个.baml文件。是的。然后你在VS Code或Cursor中按下Command S。我们运行一个名为BAML CLI generate的CLI命令。
它会将.baml文件转换为.py文件或.ts文件或.go文件或.java文件或任何你想要的文件。然后你直接使用它。没有互联网依赖性。它在你的机器上本地运行。然后我们能够自动为你打包很多算法。因为每种语言都在后台利用相同的核心,所以我们实际上没有其他许多框架所具有的那种类型的错误。所以大多数其他框架,它们在Python中实现。
然后他们说,哦,我的上帝,我想人们使用TypeScript。然后他们再次在TypeScript中重新实现一切。然后他们有点忘记了,他们继续向Python添加功能,人们说,我们什么时候向TypeScript添加这个功能?但由于BAML在任何地方都是一样的,我们实际上总是默认支持每种语言的每个功能。哇。好的。是的,这个想法让我想起了很多
当你拥有针对Android或iPhone的特定应用程序时。是的。就像,这个应用程序什么时候会?通常他们首先关注iPhone,然后是,我什么时候可以在Android上获得这个应用程序?对。这是同样的想法,就像在Python中实现的一样。然后,哦,是的,我们也必须在TypeScript中这样做。是的。好吧,让我们看看。
没错。这就是为什么,我认为React Native获得了巨大的推动。这就是为什么Dart和Flutter以及所有这些其他东西获得了巨大的推动,因为你可以一次实现它,并将其用于Web、Android和iOS,因为他们做了基础工作,所以你的团队只需要关注它一次。
是的,这是一个常见的模式。而且,再次回到你所服务的身份,如果你只是构建一次,它可以在任何需要的地方工作,这会舒服得多。是的。如果你从大型组织的角度考虑,大多数大型公司使用不止一种语言。是的。所以现在很好,因为我的所有LLM代码都可以共享。一个团队发现的所有技术都可以被另一个团队使用,即使他们使用不同的语言,他们也可以免费获得它们。所以这种交叉授粉,就像JSON一样。为什么JSON如此强大?因为JSON,每种语言都有JSON.loads、JSON.parse、JSON.serialize。它有这些方法。
内置于其中,因为它们采用了它。JSON与每种语言兼容。BAML的设计理念相同。我们为你提供所有你想要的LLM工具,然后我们与每种语言构建一个兼容层,这样你就不必一直重新发现所有这些工具。所以你一定至少尝试过不
构建另一种语言。你一定认真思考过如何在不构建语言的情况下做到这一点,因为正如你之前所说,我很懒。而你试图通过构建语言来做的事情可能就像不是在困难模式下玩游戏,而是在极难模式下玩游戏。是的,我认为这是最糟糕的主意。我认为这是创业公司有史以来最糟糕的主意之一。
很少有公司能够做到这一点。有一些,但很少。几乎没有公司曾经为业务逻辑做过这件事。但是,我认为很多创业公司都有这样的事情,你可以氛围编码它,并在一天内将一些东西交付给你的客户。
在我们获得前几个用户之前,我们只是坐在角落里编码了八个月。哇。因为……想象一下,我希望你穿上我们前几个使用Dammel的开发人员的鞋子。是的。那时它被称为Glue,所以它是一件不同的事情。这很有趣。我们的名字被起诉了,所以我们不得不重新命名。我认为我们现在有一个更好的名字。是的。但是……
使用VAML的前几个开发人员使用了一个非常不稳定的编译器,有很多错误,所以我们用C++编写,而不是Rust。他们没有语法高亮显示。他们没有自动完成。我们几乎不支持Python。我们肯定不支持任何其他语言。我们的类型系统还不完整。
然后我们从4个,我不是说公司,4个开发人员增长到5个开发人员,花了我们三个月的时间。从5个开发人员到8个开发人员又花了三个月的时间。然后我们在两个月后获得了10个开发人员。然后我们开始蓬勃发展。现在我们可能有大约700家公司在BAML中进行生产部署。很好。包括一些财富500强公司,这真是令人惊讶。太酷了。但是,
我认为这是,我认为,那些项目和技术,就像,你知道过山车上的那些游乐设施,就像,你必须这么高才能乘坐?是的。事实证明,一种语言,你需要身高6英尺2英寸才能入门,也许需要6英尺8英寸才能让开发人员考虑你。而且,就像,我认为我们一开始并没有理解我们承担的任务的艰巨性。我们知道这很难。编程语言,数量不多。
但我们当时低估的一件事是构建稳定事物有多容易。一旦你达到稳定性和通用性的程度,将会解锁的用例数量确实让我们感到非常惊讶。好的。以及工具的演变方式。我们做的一件事就是我刚才谈到的这个概念,关于能够看到提示,例如。
所以通常当人们想要运行提示时,他们通常必须运行一些CLI命令来运行测试。所以我现在正在展示的是,我正在展示VS Code,我正在展示我们的VS Code扩展。因为我们拥有整个堆栈,我可以合法地实时向你展示提示,你可以看到它在我键入时进行编辑。所以如果我在此处键入内容,它会立即出现在此处。如果我更改我的测试用例,
它会弹出,我可以使我的测试用例与基本提示在提示的呈现方式上有所不同。这非常重要,因为如果我想快速浏览一下,我可以很容易地看到错误在哪里。我可以很容易地阅读发送到模型的内容。我可以看到实际发送到模型的底层标记。根据模型的不同,标记器也会发生变化。
你只是通过标记器做到了这一点,因为有了那个标记器,你看到的是每个单词都被突出显示为不同的颜色作为标记,对吗?是的,因为这就是模型实际看到的,对吧?模型没有看到你的英语。它看到的是标记。所以像草莓问题一样,这是一个人们用来谈论的非常常见的问题。
例如,为什么模型不能,为什么模型无法回答草莓这个词?这是因为草莓就像两个标记。但是,如果你用空格拼写草莓,例如 S 空格 T 空格 R,它很容易回答草莓中有多少个 R,因为标记器可以看到 R,对吧?但这很难向别人解释,尤其是初级开发人员,如果你没有合适的工具,但是在这里你可以直接在调试时展示它,并更好地理解模型的工作原理。
哇。有了我们拥有的原始 curl 模式,我们都知道每个框架最终都会组合一个网络消息。所以如果我从 OpenAI 切换到 Anthropic,原始的网络请求本身就会发生变化。所以我们把它做成一个零点击,你可以在事先看到,而不是事后。我认为最大的突破是我所说的……
我称之为 React 中提示的热重载循环。热重载。我喜欢这个名字。对。所以在 React 中,你的热重载循环是什么?你进入你的 React 文件,比如你的 TS 文件或 TSX 文件。你按下 command S。你看浏览器。如果它与你想要的不符,你回到文件。你编辑它。你再回去。这是一个非常快速的热重载循环。实际上,如果没有 React,你无法做到这一点,因为……
关于 Web 状态组件如何工作以及所有这些内容的一大堆东西。我不会深入讨论这些。在提示方面,它有点类似。你想改变你的提示。你想运行你的测试用例。我现在所做的只是按下了运行测试用例按钮。你可以合法地看到模型做了什么。如果它与你的预期不符,你只需修改提示、修改你的数据模型、修改你的输入,然后再次运行它。你进入一个非常快速的热重载循环。因此,你可以快速收敛到测试用例的良好提示。
因为你从未离开你的编辑器,你不需要去浏览器。你正在使用你已经熟悉的工具。你可以使用游标、云代码或任何你想要的其他东西,而无需真正登录任何 SAS。所以这真的,它通过在你屏幕的一侧呈现你在屏幕另一侧正在处理的内容来帮助你加快工作流程。没错。这就是我进行 Web 开发的方式。
因为 Web 开发非常实验性,我们需要这样做。为什么 Jupyter Notebook 对数据科学如此成功?因为数据科学工作非常实验性。我需要视觉反馈才能做到这一点。我不希望每次都必须从头开始运行整个程序。代理也具有很强的实验性,你需要这样做。我们必须问的问题是,每种语言都要单独构建这种实验性工具吗?
或者我们可以只使用像 BAML 这样的东西,然后通过自动完成和所有好处与像 cogen 这样的层连接?好吧,因为我把它想象成一个你会与之一起使用的工具。就像一个,我知道如果我们特别谈论提示,有很多不同的提示工具。我认为 prompt layer 是其中之一,或者 OPIC,甚至 ML flow 现在也这样做。对。所以,嗯,
你如何看待这两件事一起发挥作用?我还是会使用 MLflow 来版本化我的提示吗?为什么?我认为这就像,你为什么要重新发明版本控制?我们有 Git。我们有,这是一个经过实战检验的版本控制系统,几十年来一直为世界上最复杂的软件工作。为什么要重新发明它?它很漂亮。它真的,真的非常好。
只有两家公司重新发明了 Git,那就是 Google、Microsoft 和 Facebook。这是因为他们的代码库非常庞大,Git 太慢了,所以他们对 Git 进行了改进以使其更好。他们也使用了 Mercurial。你为什么要使用其他任何东西?但这不是因为你会有很多不同的提示吗?
当然,就像你刚才向我展示的那样,只有一个测试用例,但我假设当你使用某些东西时,你会有一套测试。是的,我们对常规软件也有这个。我认为如果你回到过去,那时软件的代码行数量要少得多,人们会说,哦,这适用于 10 个函数,但是当你有 10 万个以上的函数时,Git 真的会起作用吗?事实证明,当你有 10 万个以上的函数时,它也能起作用。
我认为你的测试用例和其他所有东西也是一样的。它只是代码。最好的代码位置是你的代码库。现在你可能想从数据库加载测试。没关系。我们知道如何编写从数据库加载测试的代码。我们以前做过。你创建一个数据库调用,你调用它,然后你运行测试用例。我们知道如何编写执行此操作的 PyTest。所以你可能会将一些实例存储在数据库中,而将一些实例存储在本地。这是有道理的。但这只是代码。
现在,当你与使用 PMO 的不同人员一起工作时,他们告诉你哪些事情让你感到惊讶?我认为我听到的最可怕的事情是……他们在生产中使用它?不,这很好。大约七、八个月前,这就不再可怕了。七、八个月前这很可怕,因为每次有人发布时,我都想……因为我们为许多不同的语言发布,我想,哦,我的上帝,我们破坏了什么东西了吗?我们在……
它被称为什么,像 debian,人们使用 debian 的精简版本,像 alpine,有一个名为 alpine 的 ubuntu 容器,人们将其用于部署,因为它非常小,我们曾经破坏过它,或者像有兼容层一样,所以像这样的小事情曾经让我感到焦虑,但现在几乎所有这些错误都已解决,很好,但我认为最可怕的事情是我听到有人在他们的 repo 中有 25000 行 BAML 代码
我说,这是一个真正的代码库。这对我来说很可怕。这很合法,伙计。是的。我说,他们说,我可以使用命名空间吗?因为我们现在在 Babel 中没有命名空间。我说,你为什么需要命名空间?然后他们向我展示了他们的代码。我说,好吧,我想你需要命名空间。所以我们还没有命名空间。我们构建一些功能需要一段时间。是的。
仅仅因为它们是如此核心和原始。是的。所以功能需要一点时间,但有些功能很快。有些工作更多。你如何处理它?那可能是……请继续。哦,不,不,对不起。继续。继续。不,我想说的是 25 美元的代码吓到我了。我认为我第一次遇到写 1000 美元代码的人时,这很可怕。我们聘请了第一个编写 3000 美元 BAML 代码的人。很好。加入我们的公司。他们最终加入了我们。但是……
是的,代码量可能是最可怕的事情。就像,哦,糟糕,人们真的依赖于它。你如何看待下一步的方向?是通过与人们交谈,看看我们需要做的命名空间,我相信还有很多其他事情是人们向你要求的?我认为构建编程语言最好的事情之一是,最终我们是在为自己构建。开发人员真正可以为自己构建的工具非常非常少。
其中之一是编辑器,如游标 VS 代码。你可以去,你可以去做。事实证明,另一个是编程语言,因为作为开发人员,你多少知道编写代码的感觉,并且你对感觉正确的东西、必要的东西有一个想法。所以我们确实会听取客户的意见来添加不同的功能,但我们多少知道我们必须做什么。我认为如果有人让我们制作 BAML,他们会说不。
他们会说,我为什么要这个?我们最早的一些用户就像,你为什么让我编写这段代码?我们只是说,相信我们。我们希望我们是正确的。但是大多数功能通常都在我们的脑海中。我们就像,我们在团队内部进行很多讨论。我们编写了很多伪代码。然后在我们与社区一起验证了这个概念后,我们再去测试它。我们现在有一个超过 1000 人的社区。很好。他们一直在帮助我们指导我们前进的方向。
但我们通常不会利用他们来产生最初的想法,因为他们忙于思考如何构建最好的应用程序。我们有时会看到,例如,我给你举个例子,流式传输。围绕 LLM 的许多 SDK 和框架并没有提供很好的流式传输可视化。
我的意思是……在什么方面?流式传输是一个非常细致的概念。所以我会向你展示一些东西,也许我们可以尝试向其他人描述它。例如,让我们以这个食谱生成器为例。所以每个人都知道我们可以去 ChatGPT 并要求它吐出一个食谱。它会输出一些东西。但是当我使用流式传输时,我可以做一些非常不可思议的事情。如果我可以在加载时使其具有交互性,那该怎么办?
如果你看一下我的屏幕,你实际上可以看到加载程序图标正在告诉我它在任何给定时刻正在处理什么以及已经完成了什么。构建这种应用程序的技巧是,它在今天的 SDK 中是可能的。这真的,真的非常困难。所以我们在这里看到的是,你顶部有一个小的滑块按钮。随着食谱的呈现,你可以移动滑块并获得……
根据你试图用这个食谱喂养的人的数量或大小,该食谱的交互式更新体验。但你也会看到其中一个小的旋转轮,这样你就知道 LLM 正在处理哪个部分。是的。是的。我认为很多人并没有在这方面投入精力。像,你今天能做到吗?
是的,你今天可以使用今天的 LLM 来做到这一点。记住,我们根本没有修改 LLM。我们按原样使用每个模型,没有任何修改。但我经常看到的问题不是你今天做不到这一点。只是这样做需要很多代码。如果你可以用一行 BAML 代码做到这一点呢?这就是我们提供的细微之处。我认为让一些需要变得普遍的东西变得很容易是一件被低估的事情。
但我认为一个很好的例子,很多人可能知道做过这件事的是 Tailwind。我认为 Tailwind 从根本上改变了名称。它改变了样式应该如何完成的游戏,一旦你使用 Tailwind,事情就变得更加标准化了。因为 CSS 是那些我们都希望它完美无缺的事情之一。我们都认为正确的 CSS 方法是用我们链接的一堆类来设计 CSS 文件。但事实证明 CSS 非常局部。
我只想修改我所在的 div,我不希望必须悬停并查看某个类的名称。但问题是我不想在那里编写原始 CSS,因为原始 CSS 很难阅读。实际上,其中有一些属性就像,那是什么?我无法人工阅读。所以 Tailwind 做了一些非常简单的事情,那就是他们添加了一个易于阅读且可以在编程上生成的字符串。他们在空间局部的地方添加了它。所以他们添加了一种新的语法,
用于定义 CSS,然后他们只是通过 React 来呈现底层的实际 CSS。这允许他们免费进行优化,例如只将你代码中实际使用的样式包含到呈现的格式中。你的样式表不像 Bootstrap 或其他系统过去那样长。
但更重要的是,它变得更符合人体工程学。这允许人们为他们网站的每个部分构建完美的 UI,因为它变得很容易在我的代码中频繁地做到这一点。Baml 试图用流式传输做同样的事情。不必费尽心思考虑,是否要在此处添加 100 行额外的代码才能使此流完美无缺?你有一行代码,现在它就可以按照你想要的方式进行流式传输。现在,你看到了什么……
BAML 的用户创建了什么?有哪些很酷的项目?有一些。各种领域都有。所以有一些在政府行业,我认为它们非常有趣。我们有很多基于 BAML 构建的政府 RFP 生成器。我们在医疗领域有一些,例如分析医生与患者的对话以获取各种 EMR 统计数据、管理工作,
我们在 RFP 自动化领域有代理。我们都见过那些 Chrome 扩展程序,它们可以将数据从网页提取到类似电子表格的视图中。我见过你在 BAML 和 SQL 聊天机器人中构建的那些非常通用的动态系统。
各种各样的东西,RAG 系统,各种各样的事情,这真的很令人惊讶。除了你提到的流式传输和命名空间之外,人们还要求哪些东西?你接下来考虑解决的清单上还有什么?对我们来说,更多的语言支持可能是一个巨大的问题。
所以我们今天实际上使用 OpenAPI 支持每种语言。我们原生支持 Python、Ruby、Python、Ruby、TypeScript,然后其余的可以通过 OpenAPI、GrooveMML 获得。但我们将很快添加 Go 支持。接下来将是原生 Java 支持。所以现在我们已经弄清楚了静态语言,我们应该能够解锁其他每种语言,而无需像侧车这样的系统。
然后下一个大问题实际上是一个我们将很快宣布的编排系统。是的,不仅仅是道具,还有完整的流程和编排,以及人们从未见过的代理调试体验。当你提到编排时,你具体指的是什么?
像完整的表达系统,比如 if 语句、for 循环、while 循环,你可以在其中有条件地调用代理、中止到人工工作者、人工注释系统,然后返回,那种系统。哇。是的。所有这些仍然会暴露给你选择的每种语言。哦,我的天哪。所以现在,当你考虑一个思维共享的角度时,你希望……
吸引更多关注或吸引更多开发人员使用 BAML,你如何看待这一点?你认为这最终不会只是一时的昙花一现吗?是的,我们花了大量时间考虑这个问题,因为我认为自从我们开始以来,也就是 2023 年 11 月或 10 月,从那时起就出现了大量的框架。
很多都很快消失了。它们都昙花一现了。我认为一件好事是,人们持续地继续使用,我们的 BAML 用户随着时间的推移而增加,而流失率很低。我担心的一件事是,人们会逐渐放弃 BAML 吗?但正如我所讨论的,拥有 25000 行 BAML 代码的公司,显然他们似乎随着时间的推移而增加了更多的 BAML,而不是减少 BAML。
我认为这类事情减轻了我们对人们是否会逐渐放弃的担忧,比如,也许他们会,但我们会添加命名空间。我们会添加人们对语言的期望的所有内容。但我对 DevTools 的看法与许多人不同,但我受到了 TypeScript 团队的启发。我认为作为一个公司,你拥有一套有限的资源。你选择你想在哪里部署你的资金。你可以部署或结束你的时间。你将资金部署到营销或工程方面。
我们作为一家公司只是说,去他的。我们将编写大量的代码。我们将继续编写代码并继续发布。我们的代码库几乎有 50 万行代码或类似的东西。我们将继续,因为这是我们团队喜欢做的事情。我们可以做一些令人难以置信的功能。我们想做的是,我们只想让作为开发人员的你不再认为 BAML 是一个瓶颈。我们只是在发布。你只是说,酷,我有这个功能。哦,在你甚至想象你需要它之前,在我们已经想到并添加它的时候,你已经需要它了。
我们希望的是,如果人们继续使用 BAML 并继续喜欢它,我希望他们告诉他们的朋友。我认为开发人员是这些真正非常……开发人员是销售你产品最糟糕的人。他们是有史以来最糟糕的买家。但他们是最好的推荐系统。如果一个开发人员喜欢你的工具并遵守它,他们会告诉他们所有的朋友他们有多喜欢它。是的。我想赢得世界各地开发人员的信任。
嘿,我们会关注他们,我们会尽最大努力确保他们的问题消失。因此,与其花时间在营销或所有其他事情上,不如编写好的代码。发布是最好的营销。这就是我们想要继续做的。你认为开发人员在互相交谈时如何谈论 BAMO?是的。
我可以读出一些类似消息的推文,但我几乎每周都会收到来自世界各地某个地方的人的消息,他们第一次发现了 BAML。莉莉说,谢谢。或者说,这太棒了。我不知道你是怎么做到的,但这真的很好。有人给我发了一条消息。我认为最突出的一条消息是,他们发给我的消息是,我,他们发给我的消息是,我三個月前探索过它,但我不想去学习它,因为我没有时间,我必须去发布。
但我这个周末又尝试了一下,因为我厌倦了看到你的帖子。我后悔没有早点切换。它本来可以节省我很多时间。最终大约花了两个半小时学习。很好。但我认为这种后悔的情绪就像一种,我觉得很糟糕,我本可以早点说些话来节省他们早点的时间。
但我真的很高兴他们找到了价值,这并没有浪费他们的时间。我想强调一下你说的他厌倦了看到你的帖子。这不是你在营销模式下的状态。我无法想象当你处于营销模式时,世界会是什么样子。是的,我做。我在 LinkedIn 上发布关于 Bama 的内容。我认为我为团队所做的事情感到非常自豪。我主要发布的内容是我们发布的内容。
是的。所以我还会谈论功能,这就是我们的营销方式。不。因此,我们的更多用户了解我们发布的新功能。像我应该发送一个电子邮件链。我觉得人们这样做,但我真的不知道该如何设置。所以我们,我们收集电子邮件,但我们实际上从未真正地,我们在公司的生命周期中只向人们发送了四封电子邮件。嗯,我尽量不去做,因为我作为一名开发人员讨厌电子邮件。是的。嗯,
所以我们做不同的事情。Google groups 正在进行中。感觉就像,哦,我的上帝,我会死的。嗯,我希望不会。我的意思是,像我一样,让我们谈谈 discord 与 slack。我们为什么使用 discord?我讨厌 discord。像我一样,我喜欢玩游戏等等,它只是为了社交,但 slack 更商业化,更基于工作。是的。但我们想到的一件事是,
我不想放弃我的姓名和身份只是为了问一个问题。这感觉有点像,这就像增加了障碍。所以我们只是说,如果我们只做一个 Discord,不需要登录,只需去问一个问题。这是一种我们始终采用的理念,即尽可能降低进入门槛,因为我们有这个巨大的障碍,那就是你必须在周六花两个小时来玩它。所以我们试图消除其他所有障碍。你认为……
使用 BAML 的人谈论 BAML 时会强调哪些方面?最大的可能是我们的解析。所以我们有一种方法可以进行结构化输出,它比 OpenAI 更好。它比 Anthropic 更好。它比其他所有模型都好,几乎在每个基准测试中都是如此。这是一种我们创建的新算法,称为 Schema Line Parsing。人们喜欢这个东西。他们喜欢它,因为它允许你在一枪中进行链式思考,并对模型进行结构化输出。
你不需要考虑它。我们只是对模型进行错误校正。许多其他框架所做的是,每当模型没有给你你要求的准确内容时,它们都会重试。我们用几毫秒的工作和一个算法解决了同样的问题。现在它已经在数百万次调用中经过实战检验,轻松超过数千万次调用和所有不同类型的数据。这是人们喜欢的一件事。而另一件他们真正喜欢的事情是,在他们克服了这一点之后,
是迭代速度。BAML 的迭代速度与其他任何东西都不一样。如果测试一个提示需要 5 分钟,你需要测试 50 个提示才能找到正确的答案,那么这将花费你 250 分钟。如果测试一个提示需要 5 秒钟,那么这将花费你 250 秒。而且根本没有,当速度快这么多时,根本没有可比性。
我之前展示的来自我们 VS Code Playground 的运行测试按钮可能是我们发布的最好的单一功能。我现在对此感到震惊。