TypeScript之父Anders Hejlsberg介绍TypeChat的播客全文

完整音频地址:

https://mp.weixin.qq.com/s?__biz=MzU3NjM0NjY0OQ==&mid=2247485574&idx=1&sn=5d2dccdebcc62f05261f37012481ddc0&chksm=fd1407f0ca638ee60e5fee36f1bd3711ef24ec40d2e2272503ce9953fd03dfe28b0f43b2ae5a&token=83622345&lang=zh_CN#rd


Scott  00:02:06

嗨,我是Scott Hanselman。这是Hanselman的另一集。今天我正在和Anders Hejlsberg聊天。他是Turbo Pascal的原作者。他在微软工作,是TypeScript的首席架构师和核心开发人员。今天,我们不谈论这些事情。我们谈论TypeChat。你好,先生。


安德斯00:02:22

我很好,谢谢。很高兴见到你,斯科特。


Scott  00:02:24

你和你的团队又创造了一件东西,多么有趣啊!你是如此的有创造力,你只是在寻找痛点和问题,然后想出一种编程语言来解决它们吗?或者,你的灵感来自哪里?


安德斯00:02:35

首先,我,这不是我一个人做的,这是,这是,当然,这是一群人做的。特别是,我一直在与史蒂夫·卢科和微软的另一位技术人员合作。我们大概在六个月前开始思考,这不是一个真正的新语言,不像我做的许多其他项目。相反,这是一个实用的项目,将自然语言与编程和数据结构的世界连接起来。你知道,就像建立一座桥梁,让我们能够利用人工智能拥有的所有这些美妙的语言能力,以一种应用程序可以使用的方式。


安德斯00:03:22

这可以用于处理命令或控制设备,或构建智能代理或进行任务编排或,或任何你所拥有的,但由自然语言输入控制的任务。我们想以一种实用、安全和可验证的方式来做这件事。你知道,我们都对人工智能在编写代码方面的惊人能力印象深刻,例如,对吗?我们看看我们的Copilot项目。我的意思是,它很棒,虽然它可以做到自动驾驶,但你不会想把钥匙交给这辆快速汽车,然后把它开下悬崖,对吗?我的意思是,你如何以一种仍然可以证明是安全和可验证的方式来利用它,而且还容易被其他程序使用?


Scott  00:04:1

是的,我们看到在人们谈论非常大的语言模型时,称自己为提示工程师并降对达模型的操作称为提示工程。你知道,我并不想成为一个,一个仇恨者或考虑一下炒作。有很多炒作在进行。提示工程听起来非常像编程,你知道,每个词都很重要,而且都非常粘稠,我们只是使用英语而不是使用适当的语言。所以感觉就像是用一种不同的工程取代提示工程。


安德斯00:04:41

是的,它不是。让我来谈谈,所以,所以大型语言模型在默认情况下生成文本时非常棒。而且,大量的大型语言模型应用是关于将文本提示转换为其他文本。所以这是文本到文本的转换,对吗?这对人们来说很好,但对代码来说不是很好,因为当你使用人工智能输出的文本时,你要做什么?你想在程序中做一些事情。嗯,我的意思是,现在你,你想做什么?比如必须解析它,然后弄清楚它给我的是什么?所以使用非结构化的l l M响应是有挑战性的。


安德斯00:05:22

在TypeChat项目中我们做的第一件关键的事情是我们要求LLM用js生成响应,现在,这不是,我们不是第一个做这个的,而且,而且,每个人都知道这些模型非常理解js,他们知道你可以把什么放进相邻的文档,什么不能放进相邻的文档,一旦你得到相邻的文档,现在你有程序可以使用的东西,你可以在响应中拥有结构,对吗?但是你如何控制Json的形状,对吗?我的意思是,你用自然语言问模型,哦,请给我一个看起来像这个例子或那个例子的Json,请不要说不要有这样的属性。


安德斯00:06:04

现在你又回到这个不精确的世界了,对吧?所以,TypeChat的第二部分是我们要求模型把Json放进一个模式中。我们告诉模型关于这个模式的方法是我们给它一些TypeScript源代码。我们基本上给它一些TypeScript类型定义,然后说,这是一些TypeScript类型。这是用户请求。请在JSON中给我一个这些类型的实例,它最好地反映了请求要求的内容,在模式允许你说的指导下。


安德斯00:06:47

突然之间你对它们进行了约束不能像莎士比亚十四行诗那样随意抛出,它喜欢说它必须符合模式,所以类型引导响应,但它真正美妙的部分是你可以使用类型来验证响应,对吧?所以你要求模型使用这些类型响应,一旦模型响应,我们就可以拿那个Json来验证它,因为,嘿,我们可以把TypeScript作为验证器运行,或者你可以运行任何其他类型的验证器,你想要的话,你可以运行一个js验证器。


安德斯00:07:28

在我们的例子中,我们把TypeScript编译器作为服务来运行。你知道,它因为它只是一段JavaScript代码,你可以在任何地方运行。我们验证响应,如果响应不正确,那么我们甚至可以继续,并要求模型尝试根据我们从检查中得到的错误或诊断来修复响应。我们甚至这样做了。这结果工作得非常好。它工作的原因是大型语言模型是在大量的Json和大量的TypeScript上训练的,因为它是最流行的编程语言之一,特别是在开源世界中。


安德斯00:08:12

它还很好用,因为你在 TypeScript 中编写的这些模式是对你想要的紧凑、明确和正式的描述,例如,TypeScript 可以比 JS 模式紧凑五倍。


Scott  00:08:30

我的下一个问题是,为什么不直接做JS模式呢


安德斯00:08:33

如果我们要求json,让我们使用JSON schema。结果是模型实际上并不理解它,因为在他们的训练中没有那么多。而且它只是更大。它消耗更多的令牌。所以它更难传达。所以现在我终于可以得到提示工程了,对吗?也就是说,与其有这个叫做提示工程的临时东西,当你使用TypeChat时,你不需要提示工程师,你只需要写模式。这是你必须做的唯一提示工程。那并不是真正的提示工程,那只是工程。你写一些类型。


安德斯00:09:13

顺便说一下,这些类型的优点是,在这些类型中,你可以有注释。在这些注释中,你可以用自然语言向模型传达这个属性是做什么的,那个属性是做什么的,这个其他属性是做什么的。而且,甚至可以给出使用例子等等。模型会挑选那个,但它们也会挑选模式的正式可验证部分,对吗?所以这变成了某种天作之合。最后我想说,这种方法的一个优点是,当你把用户请求翻译成Json时,现在它实际上,需要一个非常先进的软件来把自然语言的用户请求转换成js。


安德斯00:10:01

从JSON回到自然语言实际上非常容易。我的意思是把JS转换回字符串。你知道,你可以写一个,假设Json是来自某个订购先生机器人的订单,对吗?我的意思是,你可以回读每行项目是什么,以及任何东西,并把它转换成文本形式,然后你可以与用户确认,以防你对软件中的永久记录进行更改,对吗?在这一点上,没有机会出现幻觉,这是由LLM运行的软件的另一个危险问题,对吗?你能相信他们说的话吗?在这里,你不必相信他们说的话,因为你有一些Json,你可以回读,没有机会出现幻觉,并得到用户确认,是的,这确实是我想要你去做的事情。


安德斯00:10:52

然后就可以开始了,这样就可以构建一个安全的、可验证的管道,而且效果很好。


Scott  00:11:01

这个能用吗?因为我不知道怎么表达,这只是一个幸运的巧合,在语料库中有很多TypeScript,因为这是一个管道,在你说,我想要一杯咖啡之前,有一个前言,在进入非常大的语言模型之前,你已经传递了咖啡店模式,然后你可以在返回的路上捕获它,所以你在输入和输出上都验证了,但是在前言之前没有引擎在运行,对吗?你实际上是传递TypeScript信息和TypeScript模式,它是多么幸运,它知道这么多关于TypeScript的东西,它可以这样做。


安德斯00:11:39

我认为这个技巧,或者说这个方法论不仅仅适用于 TypeScript。它真的可以是任何其他语言,模型已经在上面训练过,或者它已经看到大量的训练数据。例如,我们尝试了 Python 中的 YAML 和 relax NG 模式。那也可以。我们尝试了 C,我们尝试了,你知道,我的意思是,在很多方面,我们在这里建立的方法论和框架都是一样的,对吗?这个方法论也可以用于其他领域,其他语言领域。绝对的。只是碰巧我们在这里的初始版本专注于 TypeScript 和 JavaScript 生态系统。


Scott  00:12:22

这很有意义,因为 TypeScript 是类型化的,它很舒服,它以一种积极的方式非常简洁,在这个上下文中标记的数量很重要。


安德斯00:12:32

是的,这是对Jason非常准确的描述,因为Json只是JavaScript的一个子集,而TypeScript是关于输入JavaScript的,对吧?所以这绝对是一个,一个可爱的组合,是的。


Scott  00:12:47

我担心的一件事是人们开始使用非常大的语言模型,比如ChatGPT,就像我不知道的,就像这样,我可以把任何我想的东西扔给它。就像,你知道,我调度,我不知道使用一种什么样的类比,就像我只是把字符串扔给它,但还没有意义,它花了我们多少美元,我叫它,你知道,多少便士,多少,多少碳被烧掉了?有没有机会使用像TypeChat这样的东西,这是一个约束系统,允许我在较小的语言模型上获得很好的结果。也许我不需要ChatGPT。


安德斯00:13:24

首先,你当然不需要GPT4来运行这个。我们已经在GPT4上进行了广泛的测试,但也在GPT3.5 Turbo上,并且它在3.5Turbo上运行得相当不错,作为消费者运行大约比GPT4便宜10到20倍。我们也在试验一个完整的开源模型。我们肯定希望这个东西能与他们很好地工作。我还没有那么多关于这个的数据。我们正在收集这个数据,我希望社区能尝试这个,因为我愿意从中学习。这是一个开源项目,你知道,我们正在把它放在那里。


安德斯00:14:04

所以,我们可以从这个努力中学习。我们只是认为这是一个特别有意义的方式来解决一个非常实用的问题。你可以把它看作,在某种意义上,在人工智能和程序和API之间的最后一英里,对吗?我的意思是,你必须以某种方式从自然语言到另一个世界,在那里你可以激活程序,编写逻辑,并以一种你可以推理的方式对响应做一些事情。


Scott  00:14:37

很多很多年以前,我研究电话树系统,我们会创建这些模式,来描述如何通过电话通话来进行在线银行业务,它们非常受限。我想知道这是否可以用于其他上下文,来描述文本解析,以及能够适当地解析文本?


安德斯00:15:00

绝对的。我的意思是,它,它是,这是一件有趣的事情,就像当我们谈论它的时候,我们正在谈论的,对吗?我的意思是,因为这是一种将类型和模式嫁接到大型语言模型上的方式。但是大型语言模型,当然具有惊人的能力和惊人的自然语言知识。例如,你可以,你知道,就像我们已经尝试过的一种方法来分解大型模式,假设你的模式太大了,它实际上不适合响应或请求的令牌窗口。那么,你能做的是你可以要求模型将请求分成离散的片段并对它们进行分类,例如,好的,这里的这个东西与,你知道,排序这个东西与交付有关。


安德斯00:15:55

这个东西与任何东西都有关系。模型可以转录自然语言,并把它们分成这个、这个、这个和这个。或者对它们进行分类,从某种意义上说,这是清洗和重复。这都是一样的。你只需要给它一个模式,不,我不会给你完整的模式。我会给你一个优步模式,它说,请先把它放入以下10个类别中,然后给我一个与每一部分和分类相关的自然语言描述,对吗?然后你可以在每个类别上转一圈,然后为那个类别提供更多的模式,然后说,现在拿这个文本。所以在某种意义上,你可以看到如何建立编配模型,你可以建立插件模型,你知道,你甚至可以推测为每个在文本上运行的各种插件建立嵌入,以便找出要激活哪个。


安德斯00:16:48

然后你使用它的模式,所以有无限的可能性,我应该补充一点,有几件事情很有趣,或者说TypeChat另一个有趣的地方,就是有两种不同的方式,你可以使用这个系统,我们已经谈了很多,比如你给它一个模式,然后你得到那个模式的一个实例,在J中,我们经常想做的事,就是安排事情或者运行一些任务,或者按顺序做一些事情,其中一个顺序取决于前一个的结果,或者说一个步骤取决于前一个的结果,我们不知道这些动作的组合会是什么。


安德斯00:17:30

这是一个非常典型的模式,对吗?我们支持这个模式,允许你请求简单的程序,在Json中表示,对于这个,我们有一个解释器,你可以运行它来实现程序所说的内容。所以当你在这种模式下使用TypeChat时,你不仅仅是呈现,而不是呈现两个东西,一个模式和一个用户请求,我们现在呈现三个东西。我们为简单的JSON程序呈现一个模式,然后我们为一个带有函数的API呈现用户编写的模式。现在这些不是真正的函数,如果你愿意的话,它们只是假装的函数,模型可以假装调用一个假装的小程序,这个程序是使用我们给它的Json模式表示的,然后我们给它用户请求,然后输出结果。


安德斯00:18:24

这些漂亮的小程序,我们仍然在讨论完全可验证因为你得到的只是Json,你不能运行这个Json,没有这个概念,对吧?但我们有一个解释器,所以在某种意义上你可以运行它,但解释器所做的只是遍历Json,每当它看到一个make believe函数调用,它就会在用户代码中调用一个处理器,并说,程序想要调用这个函数,这是它想要给你的参数,现在由你决定是否允许,所以它是完全沙盒化和安全的,但它非常有用。


安德斯00:19:05

我们已经看到一些很棒的结果,比如控制一个音乐播放器,你知道,你可以说播放和停止,给我一个披头士的播放列表,或者给我两个播放列表,它就这样工作了,


Scott  00:19:19

大家知道,大型语言模型在数学方面是出了名的糟糕,我们经常看到截图,比如说,人们说二加二等于三,或者任何在github.com/microsoft/TypeChat上出现的大型语言,在例子下面,有一个数学例子,你在做一个简单的计算器。是的,是的。在那个例子中,你正在做你所描述的,对吗?


安德斯00:19:39

是的。


Scott  00:19:39

你让它擅长数学,因为那原本是它不擅长的东西。


安德斯00:19:43

这是一个很有趣的例子,因为它当然可以,它可以计算简单的东西,比如一加二,你甚至可以问它一加二等于多少?但我们不是问它一加二的结果,我们要求一个程序,可以计算一加二,然后它会吐出一个小程序,它被API化为(1,2)对吧?然后你当然可以用API乘以四,等等。


Scott  00:20:06

它会生成各种汇编语言,然后你再进行解析。


安德斯00:20:08

它不是,它是,你,你可以用有限的指令集构建你自己的小语言,对吗?然后你可以要求模型用那个有限的小语言来写程序。但是,但是那个特殊的例子也顺便表明了,那个模型不,它理解运算符优先。它也理解反向波兰符号。如果你看一些,表达式停止文本,里面有一堆你可以运行的样本,或者你可以简单地说你可以告诉它做什么,请用2乘以3,然后用4乘以5,然后把结果相加。是的,它会给你写一个小程序来做这个。所以你可以用法语做,你可以,我的意思是,我的意思是,有无数的可能性来利用大型语言模型的其他能力,对吗?


安德斯00:20:54

但最终你已经约束了它,但你所能说的只是用这种简单的语言写程序,对吗?


Scott  00:21:00

这很有趣。这都是关于约束,只允许它做某些事情,但同时,我看着咖啡店图式,我在想如果有人说出它不希望听到的话会怎么样?很接近,也许他们拼错了espresso,或者他们要了菜单上没有的糖浆。你如何给他们灵活性,说,我要半杯牛奶,双倍脱咖啡因,等等,你知道,就像是,它可能会说奇怪的东西,但你不想把他们赶出去。


安德斯00:21:30

是的,我想你问的是,我们如何容错?是的,这是一个非常有趣的问题。首先,我们总是会验证返回的响应。所以如果它试图说在你的拿铁上添加一种不存在的糖浆,你会得到一个类型检查错误。因为那个模式就是这样写的。它字面上写成一堆字面类型,这里,这里是我们的10种糖浆,如果它试图做覆盆子或草莓糖浆,而这里只有覆盆子糖浆,那么你就会得到一个错误,然后我们将告诉模型,这是错误,请尝试修复它。它可能或可能不。我的意思是,在那个点上它可能做不了什么,但我们确实捕捉到了错误,对吗?


安德斯00:22:14

但有时让模型在线外稍微着色会更好然后你自己可以在代码中验证它,所以你可以改成说糖浆可以是任何字符串因为大型语言模型对糖浆的种类了解很多,对吧?然后也许他们会试着问你要草莓糖浆,然后你可以说,不,我们没有,但至少你把它放入了一个桶,所以如果你愿意,你可以选择你想让模式有多严格,现在,有一件事,我们想出来的一个非常有趣的学习是你真的想确保你的模式为模型不理解的东西做出规定。


安德斯00:22:57

在我们的例子中,大多数的模式,有一个未知的桶,如果它没有得到你想要的东西,模型可以把东西放进去,比如你点了两杯拿铁,一个蓝莓松饼和一个中等大小的大猩猩,它会完全得到拿铁和蓝莓松饼,然后它会想,嗯,我该拿这个大猩猩怎么办?所以它会把它放进未知的桶里,现在你可以告诉用户,我给你拿铁和松饼,但我不知道大猩猩该怎么办,而不是让模型产生幻觉,当你开始时,它会很高兴地这样做,如果你在星巴克点餐机器人上,你告诉它玫瑰是红色的,紫罗兰是蓝色的,它会提出符合模式的东西,因为它是为了取悦别人。


安德斯00:23:45

这个模式不允许它说它没有得到它,除非你为它做了规定,你明白我的意思吗?现在我们在这里谈论的是概念模式工程,对吧?我认为这些模式的方式是我们,我们有点像使用这个类比,你知道,就像模型视图控制器在,在用户界面中,对吧?如果你愿意的话,你可以把这些当做视图模式。它们实际上不是你的数据库使用的模式或者你的程序内部使用的模式。它们是适合用户交互的模式。所以你可以考虑一个,这里的一个类比叫做响应模式,对吧?这些模式约束了模型,这样你就可以使用数据,然后做最终的验证并实现改变,对吧?


安德斯00:24:35

在你的程序里。


Scott  00:24:37

我看一下咖啡店模式,它有未知文本,但就像模式描述了一个购物车,购物车是n个行项目或未知文本,未知文本是溢出,但它是可选的,所以你可以包括大猩猩,或者你可以说这是一个无效的模式,没有大猩猩,看看


安德斯00:24:57

你看这个程序,当它得到响应时,它首先检查的是,所有的东西都是行项目还是有一些未知的东西? 如果有未知的,那么让我先,让我读一下我没有读到的。所以我们可以先解决这个问题。


Scott  00:25:11

当说话模型开始工作时,这将是如此有趣。就像我六、九个月前与GPT聊天一样。它改变了一切,我觉得,你知道,Alexa、Siri和Tana都没有准备好。我听力有问题,这是Alexa,我不知道你是否能听到她,或者她关机了。哦,是的,她决定她听到了我,现在她想谈论一些事情。


安德斯00:25:32

是的。


Scott  00:25:32

Alexa,停下来。我觉得,有一个,有一个有趣的老滑稽剧,一群苏格兰绅士,比如我们的朋友约翰·坎宁安,他们被困在电梯里,他们想去11楼,他们只是尖叫11,他们,它就是不走,因为语音模型还没有建立。


安德斯00:25:53

是的。


Scott  00:25:54

能够拥有这些工具,真正进行有意义的对话,免受不适当的幻觉,让你真正进行交易,这真的很令人兴奋。


安德斯00:26:06

是的,但我也不想过度承诺。这并不能解决世界上的每一个问题,但如果你有一个受限的问题,很多问题都是受限的,那么这肯定可以解决问题,把自然语言和你的问题连接起来。对于一个非常庞大的应用程序来说,这是非常有用的。


Scott  00:26:29

是的。是的。


安德斯00:26:30

这就是这个项目让我兴奋的地方。


Scott  00:26:33

我印象最深刻的例子是日历例子,因为我专门使用Siri,而且已经用了好几年了。但其中一个例子是我说,今天下午两点我要和珍妮见面,然后去干洗店,然后去看足球比赛,然后你说,每个活动都留出一个小时,我当时想,哦,天哪,即使是人类也很难理解。


安德斯00:26:57

不,然后是GPT3.5 Turbo,你知道,我的意思是,不只是GPT4,这些模型,他们有惊人的能力,我认为这是组合这些能力的超级有用的方式。


Scott  00:27:10

是的,它的模式只有90行,如果没有括号和空格的话,可能只有60行。所以现在这个是可用的,人们现在可以使用它,它在普遍许可下。你希望它去哪里?你希望社区参与进来,看看他们能走多远?


安德斯00:27:26

我希望社区能够参与进来。我希望人们能够在其他的LLM上运行这个实验,这样我们就能得到,你知道,为了让这个工作,语言模型需要多聪明?因为我们知道它在最简单的模型上不起作用,但是我们还在探索。


Scott  00:27:44

LAMA 2刚刚发布,微软和Meta刚刚联手发布的。


安德斯00:27:46

是的,是的,是的,我已经关注了,事实上今天下午我就要开始实验,我认为我们的一些队友已经这样做了,但是,当然。


Scott  00:27:55

当这个节目播出的时候。


安德斯00:27:58

哦,是的,这个,我们,我们应该,我们应该知道答案。是的,很酷。但我希望得到社区的反馈。我希望得到其他的例子,我希望有一个持续的对话,关于我们下一步要怎么做。非常感谢。


Scott  00:28:11

酷。非常感谢你和我聊天,祝贺你,你的同事,你的团队,为这个有趣的设计模式,TypeChat。大家可以在github.com/microsoft/TypeChat上查看,并参与到GitHub存储库中。非常感谢安德斯·海尔斯伯格今天和我聊天。这是汉塞尔一分钟的另一集,我们下周再见。

 欢迎关注公众号:文本魔术,了解更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值