Open Interpreter介绍

Open Interpreter是code interpreter(advanced data analytics)的开源版本。介绍code interpreter使用的文章有很多,大家可以先了解其使用,再回过头来阅读本文。
code interpreter优势有三:

  1. 代码自动生成 执行 并自动纠错 重新生成和执行
  2. 支持上传文件并进行分析
  3. 一次会话代码共享同一进程(对话中可以直接使用之前生成的函数或执行过保存的变量)

Open Interpreter 直接实现了第1 3点,本文会介绍其如何实现1、3点。第2点未直接实现,但可以进行拓展,本文不做过多介绍。
Open Interpreter 是1个专业领域拥有专业技能的Agent。也是规划-思考(生成代码)-执行(执行代码)的流程,也是由于其专业性,在自动生成执行代码,以及通过用户对话逐步完善代码的体验会优于其他通用型Agent。

整体框架

下面是Open Interpreter整体框架图:
17195246-2023-10-17T11:52:58.png
下面我们从2个维度分别拆解这个框架
1.将其做为1个Agent,也就是之前常见的think-action模式。
2.解释Open Interpreter的2个优势实现原理:
1)代码自动生成 执行 并自动纠错 重新生成和执行。
2)一次会话代码共享同一进程(对话中可以直接使用之前生成的函数或执行保存的变量)。

Agent

将Open Interpreter作为1个Agent来看,我们需要关注的是其think过程和execute过程,在通用Agent中execute过程我们常常只做简单介绍(因为其对应的Action会有很多),但在Open Interpreter中,需要对execute多做些介绍,因为此处是其优势所在:

think

对于Think过程,我们关注的是2部分 1.prompt处理 2.响应处理

prompt处理

下面是对Open Interpreter中对prompt的处理,主要包含4个部分
1.系统消息,这是1个预置的prompt
2.获取用户设备信息
3.增加历史消息(这部分与自动纠错有关,后面会解释)
4.声明其Function(Action)(以便让LLM可以返回固定的格式)

响应处理

响应处理这里主要是处理按照上面Function参数格式的返回
如果返回中包含了code代表着需要执行代码,则开始进入执行阶段:

if "code" in interpreter.messages[-1]:  

execute

Open Interpreter中的执行主要分3部分
1.开启1个进程执行代码, 这里专门维护1个进程和Open Interpreter的第2个优势(一次会话中可以直接使用之前生成的函数或执行过保存的变量)有关,后面会详细解释。
2.对生成的代码进行预处理,比如增加try-catch或者增加一些打印
3.将代码写入到标准输入中,触发代码执行

Open Interpreter具备的2个优势

1.代码自我纠错
Open Interpreter能够实现代码自动纠错的很重要将原因是其将错误信息作为prompt的一部分一同提交,然后LLM根据代码和错误信息诊断出错误原因,并生成修复后的代码。
在前文中介绍prompt处理时的第3部分会将历史消息拼接:

messages_for_llm = interpreter.messages.copy()  

而我们在代码执行过程中,如果遇到错误信息也会一直添加到interpreter.messages中:
Open Interpreter在处理1次用户输入后是1个while True的循环,这就使得如果think过程认为code执行有错误,会重新生成代码并执行,也就实现了代码自动纠错的功能。

2.一次会话中可以直接使用之前生成的函数或执行过保存的变量
Open Interpreter能够实现一次会话中可以直接使用之前生成的函数或执行过保存的变量,原因在于同一次会话,所有代码都执行在同一进程中。下面我们看看具体实现:
1).在上面execute时会使用subprocess.Popen()开启1个单独的执行进程,并指定了其标准输入输出。
2).将生成的代码写入标准输入中(会触发执行写入的代码),由于写入的都是process这同一个进程,自然可以直接使用之前的执行结果,比如生成的函数或者执行得到的变量等:

总结

Open Interpreter可以认为是1个专业方向的Agent,将任何任务转化为代码实现,并且可以通过与用户交互逐步完善代码,对于生成错误的代码也拥有自动纠错的能力。因为代码一直在重新定义世界,所以Open Interpreter虽然不是通用Agent,但依旧可以完成非常多的任务。其中对于prompt的设计,以及执行过程中对于进程的使用很值得学习。

原文:https://mp.weixin.qq.com/s?__biz=MzkyNTI4NzI2OQ==&mid=2247484221&idx=1&sn=980637942bb6ceefd1bea4c3292b697f&scene=21