OpenAI的ChatGPT代码解释器的开源实现

最新资讯2年前 (2023)发布 AI观察员
397 0 0

API + 本地客户端

幸运的是,我们确实可以访问用于代码解释器的底层模型(GPT-4 或 GPT-3.5 的速度)。我认为通过一些胶水密集型工程,我可以使用 API 来构建自己的版本。随着像这个和这个这样的各种本地 ChatGPT 客户端的激增,我认为还有一个空间。一个专注于 REPL + LLM 利基市场,用于个性化助手,可以通过为您执行代码来执行您的日常任务。

Jupyter 内核

那些看过我过去几年所做的事情的人都知道,我是Jupyter项目支持的交互式计算体验的忠实粉丝。Jupyter 内核是一个与语言无关的概念,它为您提供了一个计算内核,该内核可以通过一种将用户连接到 REPL 并连接/返回的线路协议执行代码片段。stdinstdoutstderr

我一直痴迷于如何利用Jupyter项目。前段时间,在周末,我创建了一个名为slack-ipython的项目。它允许你通过将Jupyter内核公开为Slack机器人来运行Python代码。

该项目的问题在于您仍然必须编写自己的代码。现在是 2023 年,第 20 周,谁还在这样做!?(是的,在人工智能领域,我们不再只计算年数,事情发展得太快了。

排队 GPT 代码模型!

项目:GPT 代码用户界面

我希望从本地安装的角度来看,该项目尽可能简单。我的一个怀疑是,OpenAI还没有向更广泛的公众发布ChatGPT代码解释器,因为它有效地向所有ChatGPT(Plus?)用户公开了一个云计算虚拟机(尽管像Google Colab一样被严重切片)。这是a)一些严肃的工程工作和b)更严重的云账单。

因为我也没有免费的无限云计算,所以我认为最好的做法是让每个人都使用自己的好电脑。(在我们把所有东西都移到云中之前,你曾经运行过的东西。

为了便于启动和运行,我希望安装过程仅此而已。由于繁重的工作是由OpenAI运行的托管模型推理完成的,因此需要在本地运行的大多数代码实际上相当简单。pip install gpt-code-ui

为了包含前端(在 React 中构建),我从优秀的 Streamlit 项目中借用了一个技巧。您只需构建一个 Web SPA 客户端并将其捆绑到您的 Python 包中,然后再将其上传到 PyPI。技术细节:他们使用了CRACO(创建反应应用程序配置覆盖),但我选择了更现代的Vite来捆绑SPA。

为了分离关注点,我决定将基于 Flask 的 Jupyter 内核管理器与提供静态 SPA 文件并与 OpenAI API 通信的主 Flask 应用程序分开。有关主要组件的概述,请参阅以下基本体系结构图:

OpenAI的ChatGPT代码解释器的开源实现

功能列表

你还在这里?棒!我保证,这是好的部分。这东西居然管用!

以下是该项目可以执行的操作(今天):

  • 文件上传
  • 文件下载
  • 上下文感知(它可以指您以前的消息)
  • 生成代码
  • 运行代码(Python 内核)
  • 模型切换(GPT-3.5 和 GPT-4)

因此,您可以执行诸如上传CSV文件并要求其删除列,保存文件并打印下载链接之类的操作。即使在开发过程中看到它超过 50 次之后,事实上你可以在 2023 年第 20 周做到这一点,这让我大吃一惊 🤯

我能用这个做什么?

这里有一个我认为非常整洁的例子。我上传了一个文件并要求它找到作为背包问题的最佳项目配置。weights.txt

OpenAI的ChatGPT代码解释器的开源实现

在标签页中打开图像

一种不同的工程

这有点切线,我觉得它仍然有点主题。在开发过程中,我想出了一些感觉非常神奇的技巧。

文件上传上下文注入

首先,我需要让模型以某种方式知道用户上传的文件的文件名是什么。我想出的第一个天真的简单解决方案最终效果出奇地好。

为了提供用户给出的先前说明的模型上下文,我保持限制为 4K 字符(安全地低于 4K 令牌的上下文窗口大小)。上传文件时,我只需向 Flask Web 服务器的自定义端点发出请求,该端点允许直接在该上下文窗口中插入文本。有关详细信息,请参阅代码中的 Flask 终结点。dequePOST/inject-context

我插入了一个自然语言句子,描述事件“文件某个文件名.csv已成功上传。当我稍后向模型询问“现在以字节为单位打印文件大小”之类的内容时,它知道我指的是哪个文件。大概你也可以做一些像“第一个文件”和“第二个文件”这样的事情,因为它在传递的上下文中有一种排序的感觉。这是否有效留给读者练习;-)。

setup.py依赖

作为 Python 包作者,您必须注意的一件事是尽可能松散地指定依赖项。这意味着您不会完全确定依赖项,但通常您根据特定依赖项的版本控制动态维护一系列主要版本或单个主要版本。

这意味着,在开发过程中,当您确定它“在我的机器上工作”时,您不能简单地运行和读取并调用它一天。pip freeze > requirements.txtrequirements.txtsetup.py

但是,该过程的简单性吸引了我,因此我认为我可以使用类似的流程来利用 GPT-4 来放宽版本要求。

我所做的是管道进入一个提示,并要求它为我生成一个指定正确版本范围的提示。pip listsetup.py

pip list:
Package                       Version       
----------------------------- --------------
alabaster                     0.7.12
alembic                       1.8.1
aniso8601                     9.0.1
...
xdg                           5
zeroconf                      0.60.0
zipp                          3.8.0

requirements.txt:
ipykernel
snakemq
requests
Flask
flask-cors
python-dotenv

Write a setup.py that specifies the correct range

生成:

setup(
    ...
    install_requires=[
        'ipykernel>=6,<7',
        'snakemq>=1,<2',
        'requests>=2,<3',
        'Flask>=2,<3',
        'flask-cors>=3,<4',
        'python-dotenv>=1,<2'
    ],
)

在检查时,它似乎使用输出中的主要版本信息来决定它将固定到哪个主要版本。我本可以自己查找这个,但这肯定更快,而且我不记得版本范围的确切语法,因此为我节省了更多的文档搜索。pip listsetup.py

文件下载

我正在使用一个包装用户输入的提示,以便模型生成正确的代码,而无需任何其他周围的输出。例如,我解释了它应该用 Python 编写代码的模型,并通知模型代码将在 Jupyter 内核上下文中执行(这意味着它知道它也可以运行 bash 命令,例如)。因为它有时会忽略我不在前面/附加注释的请求,所以我通过搜索 ‘ 或 ”’ 标记来输出代码片段。!tar -xvf archive.tgzregex

通过提示,我想教模型如何允许用户下载他们的文件。事实证明,您可以通过一些镜头方法教授模型。然后,完整的提示变为(可能会进行大量优化):

First, here is a history of what I asked you to do earlier. The actual prompt follows after ENDOFHISTORY. History:

<messages buffer>

ENDOFHISTORY.

Write Python code that does the following: 

<user prompt>

Note, the code is going to be executed in a Jupyter Python kernel.

Last instruction, and this is the most important, just return code. No other outputs, as your full response will directly be executed in the kernel.

Teacher mode: if you want to give a download link, just print it as <a href='/download?file=INSERT_FILENAME_HERE'>Download file</a>. Replace INSERT_FILENAME_HERE with the actual filename. So just print that HTML to stdout. No actual downloading of files!

有趣的是,与 GPT-4 相比,GPT-3.5 似乎更一致地拾取这些指令(这是有道理的)。

当您要求模型对您的文件执行某些操作时,下载文件特别有用。例如,调整图像大小。

开源

我没有任何计划从这个项目中赚钱。事实上,我只是想构建这个东西,因为我想有一个沙箱来修补代码提示和直接代码执行。我认为最强大的做法是将其作为一个开源项目发布,以便更广泛的社区可以扩展它并跟上LLM的创新步伐。

例如,我想支持将其挂钩到各种开源模型中。就像StarCoder一样,可以通过Hugging Face获得。

理想情况下,我们将更接近于支持富媒体输出的 ChatGPT 代码解释器(这几乎已经存在,可能只需要对 Jupyter 内核生成的富媒体输出消息进行一些巧妙的解析 – 也许是你的第一个 PR?

所以如果你想贡献,请去 https://github.com/ricklamers/gpt-code-ui 拿一些你喜欢的东西。如果你觉得它很酷,但不能贡献,请给它一个⭐️并告诉你的朋友。

开放工作

此外,我最近放弃了我的创业公司Orchest,并希望从下个月开始从事有趣的机器学习工程项目。如果您有兴趣雇用我作为承包商,请联系,我很想听听您正在构建什么。我的电子邮件是 gmail dot com 上的 ricklamers。

© 版权声明

相关文章

天猫U特购  京东优惠购        京东优惠    天猫优惠