我用AI发明一门新DSL,只用了1小时!过程详解

广告位招租
扫码页面底部二维码联系

在之前的文章中,我提到未来的编程会是自然本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。语言的编程。在这一好奇心的驱使下,我着手【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】实践,试图打造一个完整的闭环,来让用户可【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。以通过输入一段带有编程性质的自然语言,就本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。可以指挥系统完成输入中指定的任务。在经过【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】昨天的思考后,今天我用1个小时实现了一个转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。粗糙的样例,而实现的过程,主要是借助了L【版权所有,侵权必究】【作者:唐霜】LM来帮我发明一个DSL,并让它帮我实现【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。一个可以编译该DSL的compiler。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net接下来,我就详细讲解一下,我是怎么利用A【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netI,把AI作为产品基础依【本文首发于唐霜的博客】实现这一过程的。【版权所有,侵权必究】

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net

效果预览【转载请注明来源】

原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】

【本文受版权保护】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

上面的演示图片中,我首先在左侧输入框中输本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】入了一段有明显编程暗示的自然语言文本,在【版权所有,侵权必究】【未经授权禁止转载】文本中使用@来调用某个Agent。当我提原创内容,盗版必究。【作者:唐霜】交这段文本后,可以获得右侧弹出层内的结果著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】,具体内容如下:

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。

把用户发送过来的数据用著作权归作者所有,禁止商业用途转载。@data_extract (AI数据提著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。取)提取出其中的年份,以及每年的产量。将提取原创内容,盗版必究。本文作者:唐霜,转载请注明出处。出来的数据用@data-transformer (数【本文首发于唐霜的博客】【转载请注明来源】据格式化)转化为JSON格式。【本文首发于唐霜的博客】

【版权所有】唐霜 www.tangshuang.net【转载请注明来源】本文作者:唐霜,转载请注明出处。【作者:唐霜】
转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】

经过翻译后的DSL如下:【关注微信公众号:wwwtangshuangnet】
【本文首发于唐霜的博客】【本文受版权保护】

【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。
# 定义Agent
agent_data_extract = Agent("@data_extract", 6)
agent_data_transformer = Agent("@data-transformer", 9)

# 定义任务
task_extract_data = Task(agent_data_extract, "提取用户数据中的年份和每年产量")
task_transform_to_json = Task(agent_data_transformer, "将提取的数据转化为JSON格式")

# 定义流程
flow_data_processing = Flow([
    task_extract_data,
    task_transform_to_json
])

# 运行流程
execute flow_data_processing

你可以看到,AI理解了我输入的自然语言,著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】以及对该文本进行了意图理解和语句分析,最【未经授权禁止转载】【作者:唐霜】终得到了一份看上去完全符合预期的DSL,【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】并且从Task的任务内容来看,AI并不是未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net简单的把文本进行拼凑,而是按照自己的理解【关注微信公众号:wwwtangshuangnet】【作者:唐霜】进行了重新输出。

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【本文受版权保护】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。

思考过程转载请注明出处:www.tangshuang.net

【未经授权禁止转载】【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。

我以前有实现过DSL的经历,在 http转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.nets://www.tangshuang.n【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】et/8445.html 一文中,我实现【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】了一门用于Restful API的查询语本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net言,可见我自己是有能力去完成一门DSL的【作者:唐霜】【版权所有,侵权必究】。在播客《Robust:程序员的TALK【版权所有,侵权必究】未经授权,禁止复制转载。 PLACE》中,我还讲过基于这一思路去【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】实现中文编程也不是梦。另外,请关注我的微本文版权归作者所有,未经授权不得转载。【转载请注明来源】信 wwwtangshuangnet 持本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】续接收最新技术干货。不过,从设计到实现一【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】门DSL,还是比较【访问 www.tangshuang.net 获取更多精彩内容】人的。更何况我们设计的DSL都是有严格语【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】法的,【转载请注明来源】面对上述自然语言的编程目标来说,还是毫无【未经授权禁止转载】未经授权,禁止复制转载。头绪。

【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。

我的第一个想法是,既然我自己无法完成从自【作者:唐霜】【转载请注明来源】然语言到具体代码的过程,那么能否让AI帮本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。我完成呢?从我之前的文章中,你大概可以了【转载请注明来源】【版权所有,侵权必究】解到,市面上目前还是未经授权,禁止复制转载。项目级别的代码生成比较多,例如最近刚火的本文作者:唐霜,转载请注明出处。【未经授权禁止转载】Devin,而能够完成细粒度的任务编排的【未经授权禁止转载】原创内容,盗版必究。,比较少。
本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。

既然没有现成的轮子可以用,又没时间自己造本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。,于是我的第二个想法冒出来:让AI帮我把【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。自然语言转化为设计好的DSL,再把DSL未经授权,禁止复制转载。未经授权,禁止复制转载。丢到解释器中执行,这样不就完美解决了吗?

未经授权,禁止复制转载。【作者:唐霜】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。

【本文受版权保护】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net原创内容,盗版必究。未经授权,禁止复制转载。

激动的手,颤抖的心,说干就干。著作权归作者所有,禁止商业用途转载。

【本文受版权保护】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。

实践过程【版权所有】唐霜 www.tangshuang.net

著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net

万事开头难,自然语言到DSL,让AI来翻未经授权,禁止复制转载。【作者:唐霜】译,嗯……怎么开始呢?

【本文受版权保护】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】

首先,设计一门DSL。【关注微信公众号:wwwtangshuangnet】

【作者:唐霜】著作权归作者所有,禁止商业用途转载。【本文受版权保护】本文作者:唐霜,转载请注明出处。

我一开始想到自己之前的经验,既然是DSL原创内容,盗版必究。转载请注明出处:www.tangshuang.net,那么就向世界上最伟大的SQL对齐,发明未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】一些命令、指令,比如SELECT xx 原创内容,盗版必究。【版权所有,侵权必究】TODO xx之类的。然而,很快我就打消本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】了这种命令式DSL的语法设计,因为在我的转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。设想中,用户是希望去完成一项任务,而完成【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。任务一定意味着时间转载请注明出处:www.tangshuang.net,也就是说,这门DSL的执行过程,一定是未经授权,禁止复制转载。【转载请注明来源】具有时间流动性的,而命令式的语言根本不存本文作者:唐霜,转载请注明出处。【作者:唐霜】在这一概念。

【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】

既然如此纠结,不如让AI帮我设计DSL。【版权所有,侵权必究】原创内容,盗版必究。我假想并整理了几个例子,把这几个文本丢给【本文首发于唐霜的博客】【本文受版权保护】AI,并让它总结其中规律,为我发明一种D【未经授权禁止转载】【作者:唐霜】SL。

【本文受版权保护】【原创不易,请尊重版权】【转载请注明来源】【本文受版权保护】

过了不到5秒钟,它返回了它设计的结果给我原创内容,盗版必究。转载请注明出处:www.tangshuang.net

【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】

【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】未经授权,禁止复制转载。【本文首发于唐霜的博客】未经授权,禁止复制转载。

一看到开头的“基本元素”部分,我就有点兴【未经授权禁止转载】原创内容,盗版必究。奋,挺像那么回事的。仔细观察之后,我不大【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】满意,告诉它突出“流程”“任务”的概念,转载请注明出处:www.tangshuang.net【版权所有,侵权必究】也是10秒钟不到的时间,它给了我第二版:

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】

【作者:唐霜】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【转载请注明来源】

这一版非常棒,概念明确了,但是我仍然希望著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】引入“事【转载请注明来源】”来实现上一篇文章说的解耦问题。于是继续【转载请注明来源】【版权所有,侵权必究】让它调整,最终我得到了感觉不错的一个版本【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】。它给了“词汇表”“语法”“示例”“注意【本文受版权保护】未经授权,禁止复制转载。事项”4个部分,而且看上去非常专业。我让著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。它导出为一个txt文件给我,之后我下载到转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net了本地保存。

未经授权,禁止复制转载。原创内容,盗版必究。原创内容,盗版必究。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【关注微信公众号:wwwtangshuangnet】

就这样,我花了大概20分钟左右,就设计好原创内容,盗版必究。本文作者:唐霜,转载请注明出处。了一门基本符合我需求的DSL了。

【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net

接下来,自然语言转换为DSL。本文版权归作者所有,未经授权不得转载。

著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。原创内容,盗版必究。

当我们拿到用户输入的自然语言文本之后,我本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】们把它提交给AI,让AI帮我们转化为DS原创内容,盗版必究。【作者:唐霜】L即可。

【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net

不过我们需要让AI较为准确【未经授权禁止转载】未经授权,禁止复制转载。识别用户自然语言与DSL之间的对应关系。【版权所有】唐霜 www.tangshuang.net【转载请注明来源】我们都知道LLM具有幻觉,有的时候转换并【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】不准确。为了提高这种准确性,我们可以通过本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。大量样本对模型进行微调,成本稍大。另一种【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】方法则是提供更多的examples,利用【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.netLLM的推理能力,它可以在example著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。s中找到规律,从而给出匹配度更高的结果。

【作者:唐霜】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】

在提交给AI时,我们在system前置预【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。设中,把AI预设为DSL转化角色,把下载【版权所有,侵权必究】【转载请注明来源】下来的DSL语法定义文件作为前提,把用户【原创内容,转载请注明出处】未经授权,禁止复制转载。输入作为user消息进行提交。在AI返回【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。的结果中,我们直接提取出代码部分,最终就本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。得到了我们想要的DSL。

【本文首发于唐霜的博客】【作者:唐霜】未经授权,禁止复制转载。【未经授权禁止转载】转载请注明出处:www.tangshuang.net

最后,执行DSL。【转载请注明来源】

【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】

正如我前文说的,解释执行DSL其实也挺熬【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net人的,不过,我们现在有了AI,我们可以让未经授权,禁止复制转载。【未经授权禁止转载】AI帮我们完成compiler的编写。

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】原创内容,盗版必究。【未经授权禁止转载】

著作权归作者所有,禁止商业用途转载。【本文受版权保护】【转载请注明来源】

不过可惜的是,由于目前所有大模型工具在t【未经授权禁止转载】未经授权,禁止复制转载。okens上都有限制,我并没有得到完整的未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。代码内容。此时,我们就可以利用Devin著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。这类AI编程机器人帮我们来完成整个代码的【原创内容,转载请注明出处】【原创不易,请尊重版权】编写,然后再自己对代码做微调。

【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】未经授权,禁止复制转载。

由于这部分我还没有实现,这里就不继续深入【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。了。

【本文首发于唐霜的博客】【原创内容,转载请注明出处】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net

遗留问题,如何解决?转载请注明出处:www.tangshuang.net

【未经授权禁止转载】【原创不易,请尊重版权】【转载请注明来源】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

在上文我给的DEMO中,其实还有遗留问题【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。,就是Task的内容还是自然语言。

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
task_transform_to_json = Task(agent_data_transformer, "将提取的数据转化为JSON格式")

这显然也无法被真正用来作为执行的内容。不转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】过,有了上述的实战经验之后,解决这部分的著作权归作者所有,禁止商业用途转载。【本文受版权保护】办法就很清晰了。我们仍然要让AI帮我们确未经授权,禁止复制转载。【原创内容,转载请注明出处】定该任务调用的方法是什么。

【作者:唐霜】本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】

首先,我们需要为每一个agent定义方法【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】,例如:

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net原创内容,盗版必究。原创内容,盗版必究。
agent_data_transformer
.toJSON: 转化为JSON格式
.toXML: 转化为xml格式agent_other
.method1: 用作什么未曾预料的用途
.method2: 或许在遥远地方会有另外一个作用

接下来,我们将此agent方法定义文档交【本文受版权保护】【关注微信公众号:wwwtangshuangnet】给AI,并让AI根据Task中的参数和自【作者:唐霜】【本文受版权保护】然语言文本,确定实际应该调用什么方法,并未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】让AI输出对应的方法名。

【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】

这样我们就可以得到如下形式的结果:【转载请注明来源】

【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】
task_transform_to_json = Task(agent_data_transformer, "toJSON")

这样,我们就得到了真正的可用于解释执行的【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】DSL代码了。

【作者:唐霜】【未经授权禁止转载】【版权所有,侵权必究】【未经授权禁止转载】【未经授权禁止转载】

结语【版权所有】唐霜 www.tangshuang.net

【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【未经授权禁止转载】

在过去的1小时里,我的大脑在燃烧,然而,【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】我并没有像以往一样,因为DSL设计、代码【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。编写、算法、目录结构、状态管理等等问题纠【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net结,我把这些烧脑的工作本文版权归作者所有,未经授权不得转载。AI帮我完成,而我主要是思考怎么让AI理著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。解我的意图和目标,怎样让它给到我令人满意【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net的结果。之前我有一篇文章讲,李厂长的话要【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net听,如今看看,真的是有道理的。

【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【转载请注明来源】【转载请注明来源】本文版权归作者所有,未经授权不得转载。

2024-03-26 3786

为价值买单,打赏一杯咖啡

本文价值37.86RMB