本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh)
本文作者: 苏洋
创建时间: 2023年07月25日
统计字数: 6415字
阅读时间: 13分钟阅读
本文链接: https://soulteary.com/2023/07/25/open-source-implementation-of-openai-code-interpreter-gpt-code-ui.html
-----
# OpenAI Code Interpreter 的开源实现:GPT Code UI
本篇文章聊聊 OpenAI Code Interpreter 的一众开源实现方案中,获得较多支持者,但暂时还比较早期的项目:GPT Code UI。
## 写在前面
这篇文章本该更早的时候发布,但是 LLaMA2 发布后实在心痒难忍,于是就拖了一阵。结合 LLaMA2 的本地私有化部署和运行的能力,接下来这类应用或许都有会一些不同于以往的有趣的玩法,还是非常期待的。
[Code Interpreter](https://openai.com/blog/chatgpt-plugins#code-interpreter)是一个潜力巨大的功能,或者说方向,不过目前的体验一言难尽,不论是 OpenAI 还是开源软件。
本文中介绍的项目,目前依旧还在早期,不论是实现细节还是架构上都有比较多的这样或那样的问题,但开源世界里,软件的进化,可能会比想象中的要快的多,可以适当保持期待。
演示所使用的容器方案,代码和镜像已经上传至 GitHub 和 [DockerHub](https://hub.docker.com/r/soulteary/gpt-code-ui/tags),有需要的同学可以自取,别忘记“一键三连”:
[soulteary/docker-code-interpreter](https://github.com/soulteary/docker-code-interpreter)
![Docker Code Interpreter 开源项目](https://attachment.soulteary.com/2023/07/25/docker-ci-github.jpg)
后续,我会将看到的类似的 Code Interpreter 类型的开源项目都收集到这个项目中,并附加干净 & 稳定的容器镜像。
本篇文章中,我们先来使用社区原版的软件,配合 OpenAI API 或 [Azure OpenAI Service](https://azure.microsoft.com/en-us/products/cognitive-services/openai-service),来完成基础的本地 Code Interpreter 的搭建和运行。
## GPT Code UI 的镜像使用
想要使用 `GPT Code UI`,只需要两步:下载镜像,写配置文件后用 Docker 把服务“拉起来”。
### 下载 GPT Code UI 容器镜像
使用 Docker 下载我们所需要的镜像文件,由于软件处于早期,变动概率较高,这里我推荐使用带有版本号的下载方式,进行 Docker 镜像的下载:
```bash
docker pull soulteary/gpt-code-ui:0.42.35
```
镜像不大,200MB 左右,包含了基础软件和 GPT API 输出代码中常见的 Python PyPI 依赖库。
### 编写使用 OpenAI API 容器配置
如果你使用的是 OpenAI API 的话,我们可以这样写一个配置文件:
```yaml
version: "3.8"
services:
gpt-code-ui:
image: soulteary/gpt-code-ui:0.42.35
environment:
OPENAI_API_KEY: "YOUR_TOKEN"
API_PORT: 5010
WEB_PORT: 8080
SNAKEMQ_PORT: 8765
APP_HOST: "0.0.0.0"
# optional: if you want to use proxy
# HTTPS_PROXY: "http://host.docker.internal:1234"
ports:
- "8080:8080"
```
将上面的内容保存为 `docker-compose.yml`,然后使用 `docker compose up` 启动服务。
接着,在浏览器中访问 `http://localhost:8080` 或者 `http://你的IP:8080` 就能够看到默认的服务页面了。
![开源 Code Interpreter 服务就绪](https://attachment.soulteary.com/2023/07/25/is-ready.jpg)
界面中的 `Kernel is ready.` 代表着服务运行就绪,我们可以开始玩了。
额外注意的是,如果你的服务部署在国内,应该需要配置 `HTTPS_PROXY` 来确保访问 OpenAI API 正常。
### 编写使用 Azure OpenAI API 容器配置
如果你使用的是 Azure 的 OpenAI API 服务,那么配置需要稍稍调整下:
```yaml
version: "3.8"
services:
gpt-code-ui:
image: soulteary/gpt-code-ui:0.42.35
environment:
OPENAI_API_KEY: "YOUR_TOKEN"
OPENAI_API_TYPE: "azure"
OPENAI_BASE_URL: "https://YOUR_DOMAIN.openai.azure.com/"
OPENAI_API_VERSION: 2023-03-15-preview
AZURE_OPENAI_DEPLOYMENT: "gpt-35-turbo"
API_PORT: 5010
WEB_PORT: 8080
SNAKEMQ_PORT: 8765
APP_HOST: "0.0.0.0"
# optional: if you want to use proxy
# HTTPS_PROXY: "http://host.docker.internal:1234"
ports:
- "8080:8080"
```
还是将配置保存为 `docker-compose.yml`,然后使用 `docker compose up` 启动起来,就可以通过浏览器访问你的服务了。
## GPT Code UI 的使用
我估计没有使用过 ChatGPT Code Interpreter 功能的同学,在启动起来服务之后,会有一些懵圈。接下来,我们来一起试试这个服务的基础使用。
想要比较舒服的使用这类软件,我们首先需要一个合适的“数据集”,我从网上随手搜了一个“[电视主机游戏销售数据](https://gist.github.com/Ironraptor3/34f3938c703111353ee5f28cc9b29d68)”,你可以在浏览器里打开这个[数据集文件](https://gist.githubusercontent.com/Ironraptor3/34f3938c703111353ee5f28cc9b29d68/raw/5c57e51dbc550a141a44f93028104ffce6281624/vgsales.csv),并将数据集保存为 `vgsales.csv`。
我们在 GPT Code UI 中上传这个数据集后。能够看的程序会自动解析 CSV 数据集中的表头,告诉我们可以用哪些字段来玩。
![程序会自动分析数据集可用表头](https://attachment.soulteary.com/2023/07/25/analytics-field.jpg)
```TeXT
File vgsales.csv uploaded successfully.
The file contains the following columns: Rank, Name, Platform, Year, Genre, Publisher, NA_Sales, EU_Sales, JP_Sales, Other_Sales, Global_Sales
```
接着,我们可以随便输入点啥,比如问问它销量前十的游戏是啥:“show top 10 games”。
然后,我们就能够看到它去结合这个数据集,生成的获取销量前十的游戏的代码了:
```python
import pandas as pd
import os
# get the most recently uploaded file
files = os.listdir()
files.sort(key=os.path.getmtime)
latest_file = files[-1]
# read in the csv file as a pandas dataframe
df = pd.read_csv(latest_file)
# show top 10 games by global sales
top_10 = df[['Name', 'Global_Sales']].sort_values(by='Global_Sales', ascending=False).head(10)
print(top_10)
# if code modifies or produces a file, print link to download it
print("Download file")
```
为了节约我们的时间,程序会尝试自动执行生成的代码。
![程序获取到的 TOP 10 列表](https://attachment.soulteary.com/2023/07/25/top-10-list.jpg)
只要上一步生成的代码可以被正确执行,我们就都能够看的代码执行后的结果,得到我们想要的数据列表:
```TeXT
Name Global_Sales
6112 Wii Sports 82.74
122 Super Mario Bros. 40.24
8322 Mario Kart Wii 35.82
9750 Wii Sports Resort 33.00
705 Pokemon Red/Pokemon Blue 31.37
188 Tetris 30.26
6113 New Super Mario Bros. 30.01
6114 Wii Play 29.02
9751 New Super Mario Bros. Wii 28.62
108 Duck Hunt 28.31
Download file
```
假设我们不需要复制粘贴文本,想要更直观的看到数据之间的差异,可以试试将结果转换为图表。
方法很简单,给他提一个“draw top 10 games”的需求就好,它会自动分析需求,然后生成一个可以绘图的代码片段:
```python
import pandas as pd
import matplotlib.pyplot as plt
# Read the CSV file into a pandas dataframe
df = pd.read_csv("vgsales.csv")
# Sort the dataframe by global sales in descending order
df = df.sort_values("Global_Sales", ascending=False)
# Get the top 10 games by global sales
top_10 = df.head(10)
# Create a bar chart of the top 10 games
plt.bar(top_10["Name"], top_10["Global_Sales"])
plt.xticks(rotation=90)
plt.xlabel("Game Name")
plt.ylabel("Global Sales (millions)")
plt.title("Top 10 Video Games by Global Sales")
plt.show()
# Print link to file if generated
print('Download file')
```
尝试执行之后,我们就能够得到更直观的结果啦。
![程序生成到的 TOP 10 图表](https://attachment.soulteary.com/2023/07/25/top-10-games.jpg)
上面的例子,都太过简单了,只是针对单一条件的分析。接下来,我们来试着用组合条件来进行数据分析和图表绘制。
比如我们想要获取销量最高的 PSP 动作类游戏,以往如果写代码的话,我们需要告诉他游戏平台是 PSP,游戏类型是动作游戏,排序方法是按照销量数据量,数据条数选择 10 条。
但是,有了 Code Interpreter 和语言模型之后,我们可以提个简单(含糊)的要求 “draw top 10 PSP action games”,模型就会自己分析数据然后生成可以玩的代码了:
```python
import pandas as pd
import matplotlib.pyplot as plt
# read the csv file
df = pd.read_csv('vgsales.csv')
# filter for PSP games and action genre
psp_action = df[(df['Platform'] == 'PSP') & (df['Genre'] == 'Action')]
# sort by global sales and get top 10
top_10 = psp_action.sort_values(by='Global_Sales', ascending=False).head(10)
# create bar chart of top 10 games
plt.bar(top_10['Name'], top_10['Global_Sales'])
plt.xticks(rotation=90)
plt.xlabel('Game Title')
plt.ylabel('Global Sales (in millions)')
plt.title('Top 10 PSP Action Games by Global Sales')
plt.show()
print("Download file")
```
只要“动动嘴”,说出你想要的,结果“秒秒钟”就出现在你的眼前了,是不是很方便?
![程序生成到的 TOP 10 PSP 动作游戏图表](https://attachment.soulteary.com/2023/07/25/top-10-psp.jpg)
## 其他
目前这个项目还处于比较早期的阶段,从架构设计上、安全性、性能指标和可扩展性等等方面都有比较多的可完善之处。
你在运行的过程中,可能会出现类似这样或者那样的各种问题,比如:
```TeXT
ModuleNotFoundError Traceback (most recent call last)
Cell In[2], line 4
2 import pandas as pd
3 import numpy as np
----> 4 import dateparser
5 import matplotlib.pyplot as plt
6 import geopandas as gpd
ModuleNotFoundError: No module named 'dateparser'
```
或者一些变量、目录相关的报错,遇到这类问题可以考虑重试下问题,让它再次生成代码,避开之前的坑。
## 最后
好了,这篇关于开源社区的 Code Interpreter 的介绍就写到这里了。目前,我在同时在积极的为社区的这类项目提供 PR 和建议,希望这类项目能够走的更远。
说起来,自 Code Interpreter 上线后,身边的一众工程师狂喜。然而普通用户似乎并不那么感冒,一如当今已经炙手可热的 ChatGPT,在去年十一月时也只是少数人的狂欢。
个人观点,目前为止它是一个目前依旧被低估的产品,而非一个简单的 Chat 内的工具。多数使用场景,目前还停留在数据分析师和“代码生成和微操优化”上,然而它能带来的远不止如此。
如果你只关注代码,那么你可以当它是一个既能生成代码,又能执行验证,甚至从结果中继续展开的,具备智能的高级程序运行环境。
如果你不在乎代码是如何被生成和执行的,那么你可以当它是官方出品的,一个比 AutoGPT 完成度更高,未来生态和能力更强的高级自动化工具。
如果你不局限于当前的能力,帮助它联上网,让它能够从具体的数据库、知识库中获取信息,以及给予它更强力的代码容器环境,以及更多的 API 访问权限,它会是一个真正的懒人工具:更少的幻觉、更多的准确性和严格的逻辑性,具备执行能力和打通多种软件系统的能力。
--EOF