人工智能大数据,工作效率生产力
Ctrl + D 收藏本站,更多好用AI工具
当前位置:首页 » AI资讯

AI函数-用自然语言的形式编程

2024-05-15 59

过往系列:

Marvin·这个开源项目好像提出一种很新的东西 – AI函数 – 知乎 (zhihu.com)

前言

在前一篇文章中,我向各位介绍一种新的AI应用开发框架,Marvin。

如果是第一次看到这篇文章或者已经忘记Marvin是什么项目的看官稍微复习。

AI函数-用自然语言的形式编程插图

Marvin,一个构建于Pydantic, FastAPI, Langchain, and Prefect之上的AI应用程序框架

该项目目前的主要特点就是代码足够简洁,并且指定输出格式,就能保证LLM回复结构化的格式输出。

相比较于Langchain来说,Marvin看起来非常的神奇,仅仅只需要添加一个装饰器就能保证LLM输出同class相同的数据格式。

不过好像除了这个神奇的装饰器之外,也没有什么特别之处,那为什么我还要介绍这个项目呢,甚至连英伟达的科学家都赞叹不已。

不要着急,随我慢慢看下去。

Marvin框架

在Marvin的官方文档中主要介绍了以下几个概念

  • AI function
    • 重头戏 AI函数
  • AI model
    • 也就是上图中ai_model,可以指定封装类为结构化输出目标
  • Bots
    • 聊天机器人,同OpenAI的聊天接口
  • Loader
    • 外部数据载入模块,比如pdf,文本,csv等等
  • Infrastructure
    • 基础设施,比如向量数据库
  • Plugins
    • 插件,也就Langchain中的工具,联网工具,wolfram…

在我看来其实际上Marvin最重要的两个概念就在AI function和AI model.

其他概念或多或少都在其他开源软件中有所提及。甚至于由于Marvin是构建在Langchain 之上的框架,你可以在Langchain中找到所有与之对应的名词。

AI Function

AI函数-用自然语言的形式编程插图1

如果使用Langchain开发过AI 应用程序的朋友当看到这张代码片段时,一定会非常惊讶,并且感叹其精简。

说实话当初,我就是被这么一个代码片段所吸引的,并且敏锐的察觉到了一丝不同寻常,不过直到看了官方文档和更多用例后,才明白段代码的厉害之处。

在这里我先卖个关子,为了能更有对比性,我在下面写个Langchain的伪代码给大家比较一下。prompt并不严谨请见谅。

LangChain

#这是一种解析类,他可以解析字符数组, #parse将会用于解析LLM的输出。将格式化文本转换为数据实例 parser = StringListParser(pydantic_object=Location) #这就是prompt了,决定LLM输出质量的神奇咒语 #注意format_instruction参数,这是LLM格式输出要求,在这里是json格式的字符数组 prompt = PromptTemplate( template="生成{n}个水果.\n以如下形式输出{format_instructions}\n", input_variables=["n"], partial_variables={"format_instructions": parser.get_format_instructions()} ) # 在这里我们传入了另一个prompt参数,n。 #完整Prompt = "生成3个水果.\以如下形式输出[xx,xx,xx,...,xx(一共n个)]" _input = prompt.format_prompt(n=3) #开始与LLM对话 #假如output输出的是一段json output = model(_input.to_string()) #输出结果并解析成Location,并赋值给变量 location = parser.parse(output)

可以看出,Langchain的代码非常符合传统的编程习惯

  1. 准备prompt,准备占位符参数。
  2. 输入到LLM
  3. 通过一个解析类通过 回复的json文本,构建一个实例

Marvin AI Function

现在让我们在回头看Marvin的AI Function

@ai_fn def list_fruits(n:int)-> list[str]: """Generate a list of n fruits""" list_fruits(3)

AI function 代码简洁是一方面,毕竟是Marvin本身就是构建于Langchain之上的,怎么着也不可能比Langchain要繁琐。

最主要的是AI Function的函数体内容。这个内容直接就是Prompt!

函数体本身就是Prompt !!

可能还有童鞋没有反应过来,这是多大一件事。

Marvin利用Python的docstring 特性,将函数的注释性描述,改造为了一个提供Prompt的函数体,而这个函数的执行就是将prompt和prompt参数传入LLM。

内聚性

Prompts 就是 AI Function 的逻辑代码。

Prompts与AI Function 紧密结合

Prompt 不再是放置在独立文本文件下的一段字符串,不再需要经过任何中间的处理过程,他就是一个函数的功能,他位于函数的函数体内,如同千千万万个普通的机器语言函数一般。

还有什么语法比AI Function更加内聚的吗?

内聚性只是一个好处,另外一个好处则更是颠覆性的(原谅我的用词夸张~)

当我们在写函数体本身时,就是在写一个相关的AI功能。并且这个功能使用自然语言书写的,返回的是可供机器代码处理的结构化输出。

这不正是在用自然语言的方式书写代码吗?

在Marvin中,我们在写一个AI函数就像是在写一个普通的函数一般。

只不过这个函数的函数体是自然语言,执行对象是LLM而非CPU。这个函数的概念变成了AI Function。

而这就是Marvin的抽象理念 —— 用自然语言的方式书写AI代码

让我们从前一篇文章中拉回一点引用。

传统函数与AI函数的不同

传统的函数通常依赖于预先定义的源代码——即预先编写的、确定的指令。它们在收到输入时,按照预定的逻辑进行操作,然后生成并返回输出。
AI函数则不同。它们不依赖于预先编写的代码,而是使用大型语言模型(LLM),由于LLM可以理解和生成人类语言。因此,当AI函数接收到输入时,它会将这个输入传递给LLM,LLM会根据其训练来生成相应的输出。

AI函数由于LLM的加入,能够处理更加丰富的内容,但这同样是需要代价的 —— 输出不稳定。

想要输出结构化的内容则需要正确的Prompt以及一系列的文本参数(也就是Langchain中关于prompt的代码。)

这其中就会有很多重复的代码,自然也就产生了封装。

封装的方式千千万万,而Marvin的封装方式则独特在此处。

不仅简化了代码,更是突出了面向LLM编程的本质。

同时由于Prompt融入了函数本身,AI函数与其他普通函数并无不同。

当AI Function加入逻辑流程中,编码者根本无需关心AI Function ,他只需要像对待普通函数一样,接收他的返回,并用于下段代码中。

这也符合推荐这个框架的英伟达科学家对未来应用框架的预测

在未来,任何非结构化的输入或输出点都将配备有一种可以无缝处理和理解这些数据的大型语言模型接收器。

最后,肯定有童鞋注意到了我是用中文书写prompt的。

按照上文的逻辑,prompt就是ai function的函数体。那这算不算是一种中文编程呢(逃

—已经结束咧—

在这篇文章中,我觉的Marvin对AI Function的封装理念要比如何实现重要的多,因此决定先写出来。

至于封装的原理,内部逻辑则是其次了。

下一遍,我会讲讲Marvin是如何做到如此简洁的封装的,以及他的核心prompt是什么。

PS:其实我不是很喜欢Marvin的使用体验,不太自由,冗余的Prompt也很多,心疼我的钞票,但我对他的封装理念大为赞同。

最后,让AI快点把我淘汰吧!

原文链接:https://zhuanlan.zhihu.com/p/629927203

相关推荐

阅读榜

hellenandjeckett@outlook.com

加入QQ群:849112589

回顶部