译者 | 李睿
审校 | 重楼
ChatGPT无需进行微调或接受特定主题的训练,就可以回答有关各种技术主题的问题——包括如何编写R代码。这意味着任何R语言编程人员都可以使用ChatGPT的功能,即使是那些对大型语言模型知之甚少的编程人员也是如此。大型语言模型(LLM)是OpenAI公司的ChatGPT等人工智能聊天机器人的基础技术。
围绕ChatGPT和R语言的生态系统正在形成,这使得将人工智能技术整合到R语言工作流程中变得很容易。但是在人们开始在R中使用ChatGPT和与之相关的工具之前,有一些重要的事情需要记住:
(1)用户对这些工具的所有要求都会被发送到OpenAI公司的服务器,因此不要使用ChatGPT工具处理敏感信息。
(2)ChatGPT可以自信地返回错误的答案。即使是错误的响应也可以作为节省时间的起点,但不要假设代码将完全按照用户的期望执行。德克萨斯基督教大学副教授、流行的tidycensus R软件包的开发者Kyle Walker最近在推特上表示,“ChatGPT可以在用户很好地理解一个主题的情况下为其工作提供助力,也可能让用户暴露出他们不知道自己在做什么”。其区别在于知道什么时候人工智能输出不正确。而用户需要检查ChatGPT的响应。
(3)ChatGPT可以对同一个查询生成不同的响应,有些答案可能是准确的,而另一些则不是。例如,当多次请求一个带有蓝色条形图的ggplot2条形图时,其代码有时会生成一个带有蓝色条形图,但有时不会,即使提交了完全相同的请求。如果需要一个可再现的工作流,这种结果显然不太理想。
(4)如果用户正在使用的软件包最近进行了更新,ChatGPT也不会知道,因为它的训练数据截止到2021年。
(5)本文中的大多数资源都要求用户拥有自己的OpenAI API密钥,并且这一API并不是免费使用的。虽然目前价格很低,但不能保证它会一直保持这种状态。ChatGPT 3.5涡轮模型目前的定价是每10,000个令牌为0.2美分。那么令牌能带来什么?例如,从234行mpg数据集创建散点图的请求花费38个令牌。
(6)向ChatGPT寻求编码帮助不太可能让用户陷入人工智能种族和性别偏见的伦理困境。然而,关于向OpenAI公司提供更多数据是否明智的讨论也很激烈。例如,训练数据如何被抓取和重新利用的伦理问题;如果使用开源的大型语言模型(例如H2O.ai的h2oGPT)而不是OpenAI公司的问题。这些问题需要组织和个人自己去分析。然而在撰写本文时,根本没有特定于R语言的大型语言模型(LLM)工具可以与围绕ChatGPT构建的工具相媲美。
现在了解目前可用的一些最著名的以R为中心的ChatGPT资源。
1.RTutor
这个应用程序是一种优雅而简单的方法来对ChatGPT和R进行采样。用户上传一个数据集,问一个问题,然后看着它生成R代码和结果,其中包括图形。虽然它被命名为RTutor,但这个应用程序也可以生成Python代码。
RTutor的网址是https://rtutor.ai/。它是目前列出的唯一一个不需要ChatGPT API密钥使用的应用程序或软件包,但用户需要为大量使用提供自己的密钥,以免向创建者的帐户收费。
图1要求RTutor创建条形图时的结果
该应用程序的“关于”页面解释说,“RTutor的主要目标是帮助有R语言使用经验的人学习R或提高工作效率……RTutor可以用来加快使用R的编码过程。它为用户提供了一个测试和完善的代码草案。小心出现漏洞和错误。”
RTutor的代码是开源的,可以在GitHub上找到,所以用户可以安装自己的本地版本。然而,许可只允许用户使用应用程序用于非营利或非商业用途,或用于商业测试。RTutor是南达科他州立大学生物信息学教授Steven Ge博士个人创建的项目。
2.CodeLingo
这个多语言应用程序可以将代码从一种编程语言“翻译”到另一种语言。可用的语言包括Java、Python、JavaScript、C、C++、PHP等,包括R。这只是一个Web应用程序,可在https://analytica.shinyapps.io/codelingo/上获得。用户需要输入OpenAI API密钥才能使用它(用户可能希望在测试后重新生成密钥)。
图2 CodeLingo应用程序中的ChatGPT尝试将ggplot2图形代码转换为Python
将ggplot2 R图的代码转换为JavaScript生成输出的请求使用相当难学的D3 JavaScript库,而不是JavaScript新手更可能想要的内容,例如Observable Plot或Vega-Lite。
转换为Python的请求(如图2所示)更为直接,并且使用了用户所期望的库。然而,ChatGPT不明白“Set1”是一个ColorBrewer调色板,不能直接在Python中使用。与许多ChatGPT使用的情况一样,在编程语言之间翻译代码可能会给用户提供一个有用的起点,但是需要知道如何修复错误。
这款应用由Analytica Data Science Solutions开发。
3.askgpt
这个软件包可以在https://github.com/JBGruber/askgpt获得,对于在控制台中首次使用ChatGPT的用户来说,这可能是一个很好的起点,部分原因是它在初次启动时会给出一些指示。加载带有库的包(askgpt),它的响应是:
Hi, this is askgpt .
- To start error logging, run `log_init()` now.
- To see what you can do use `?askgpt()`.
- Or just run `askgpt()` with any question you want!
在不存储密钥的情况下使用login()函数,将看到一条关于如何获取API密钥的消息:
It looks like you have not provided an API key yet.
- Go to <https://platform.openai.com/account/api-keys>
- (Log into your account if you haven’t done so yet)
- On the site, click the button + Create new secret key to create an API key
- Copy this key into R/RStudio
看起来用户还没有提供API密钥。
系统会要求用户将密钥保存在密匙环中,然后就可以为以后的会话做好准备了。如果用户的密钥已经存储,login()将不返回任何消息。
Askgpt的默认设置是将查询结果存储为一个对象,这样就可以将它们保存到一个变量中,如下所示:
barchart_instructions <- askgpt("How do I make a bar chart with custom colors with ggplot2?")
提交一个查询,用户会首先看到:
GPT is thinking ⠴
这样,用户就知道其请求已经被发送了,并且应该会得到答复,而不是想知道在用户点击提交后会发生什么。
除了软件包的通用askgpt()函数外,还有一些特定于编码的函数,例如annstate_code()、explain_code()和test_function()。这将涉及到将响应剪切并粘贴回源代码中。
对于那些熟悉OpenAI API的人员来说,软件包的chat_api()函数允许用户设置API参数,例如想要使用的模型、每个请求愿意花费的最大令牌以及所需的响应温度(将在本文后面详细解释)。
chat_api()函数返回一个列表,其中响应的文本部分在YourVariableName$choices[b[1]]$message$content中。其他有用的信息也存储在列表中,例如使用的令牌数量。
askgpt包是由阿姆斯特丹自由大学的博士后研究员Johannes Gruber创建的。它可以从CRAN安装。
4.gptstudio
这个软件包和gpttools(如下所述)具有RStudio插件可以与ChatGPT一起使用,尽管也有一些命令行函数可以在任何IDE或终端中使用。
用户可以从代码源窗格上方的插件下拉菜单或通过RStudio命令调色板(Ctrl-shift-p)搜索插件来访问RStudio中的外接工具。
根据软件包网站的介绍,“gptstudio是一个通用的助手,让R程序员可以轻松地将大型语言模型(LLM)的使用整合到他们的项目工作流中。”
其中一个插件ChatGPT启动了一个基于浏览器的应用程序,用于询问用户的R编码问题,并提供编程风格(整洁、基础或无偏好)和熟练程度(初学者、中级、高级和天才)的选项。
在下面的截图中,用户询问了作为一个具有整洁(tidyverse)风格的中级程序员,如何在R中创建散点图,
图3查询gptstudio的ChatGPT插件
使用基本编程风格询问相同的问题,生成的代码使用基础R的plot函数作为答案。
虽然gptstudio是为R编码提供帮助而设计的,但它可以利用更多的ChatGPT功能,所以可以问它任何问题,就像最初的基于Web的ChatGPT一样。例如,该应用程序的工作原理与ChatGPT工具一样好,可以编写Python代码并回答诸如“什么行星离太阳最远?”之类的一般问题。
gptstudio包的另一个插件,Source插件中的ChatGPT似乎最接近魔法。用户可以像往常一样在源代码窗格中编写代码,在代码中添加请求更改的注释,选择包含注释的代码块,然后应用插件。然后所要求的更改已完成。
当将插件应用到以下代码时:
# Sort bars by descending Y value, rotate x-axis text 90 degrees, color bars steel blue
ggplot(states, aes(x = State, y = Pop_2020)) +
geom_col()
代码被替换为图4中突出显示的选择:
图4 Source插件中的ChatGPT示例
太酷了,但是如果运行这段代码,这些条就不会显示为钢蓝色。在geom_col()中移动fill = “steelblue”使其工作。这个错误与这个特定的插件无关,而是与ChatGPT本身的变幻莫测有关。正如以上提到的,在其他时间运行了相同的请求,其结果是准确的。
将以下代码发送到ChatGPT的源代码插件生成了一个Shiny应用程序的完整指令和代码:
# Create an R Shiny app with this data
states<- readr::read_csv("https://raw.githubusercontent.com/smach/SampleData/main/states.csv")
然而,两次提交请求返回了两个完全不同的结果——第一个是两个文件的应用程序,在使用它之前忘记加载ggplot2库:第二个调用的列实际上不在数据中。编写处理现有数据集细节的查询需要更多的工作,但是代码仍然可以作为构建的框架。
gptstudio由Michel Nivard和James Wade撰写。
5.gpttools
据软件包网站介绍,gpttools软件包的目的“是为R软件包开发人员扩展gptstudio,使其更容易将大型语言模型(LLM)的使用纳入项目工作流程”。截至本文撰写之时,gpttools包还没有在CRAN上发布。与其相反,用户可以从JamesHWade/gptools GitHub repo或R Universe安装gpttools,其方法如下:
# Enable repository from jameshwade
options(repos = c(
jameshwade = "https://jameshwade.r-universe.dev",
CRAN = "https://cloud.r-project.org"
))
# Download and install gpttools in R
install.packages("gpttools")
该软件包的插件包括:
- ChatGPT检索
- 将脚本转换为函数
- 将roxygen添加到Function(记录一个函数)
- 建议进行单元测试
- 文档数据
- 提出改进建议
要运行插件,突出显示其代码,然后从RStudio Addins下拉菜单中选择该插件,或者在命令调色板中搜索它(在RStudio Addins菜单中使用Tools >显示命令调色板,在Windows上使用Ctrl-Shift-P,在Mac上使用Cmd-Shift-P)。
当用户运行插件时,并不总是看到消息告诉他发生了什么,所以要有耐心。
建议改进插件在一个R文件中的函数下面生成了未注释的文本,后面跟着修改的代码。有些建议并不是很有帮助。例如,对于下面的代码:
if (exportcsv) {
filename_root <- strsplit(filename, "\\.")[[1]][1]
filename_with_winner <- paste0(filename_root, "_winners.csv")
rio::export(data, filename_with_winner)
}
推荐的插件
Use `paste()` instead of `paste0()` to ensure a space is included between the names of the winners.
用户不想要文件名中有空格!尽管如此,还是无法否认书中的所有建议。以下建议似乎是合理的:
Use a switch statement instead of multiple if statements, to allow for additional functionality in the future
在这种情况下,用户更有可能使用dplyr的case_hen()或data.table的fcase(),而不是baseR的switch()。
如果用户正在使用任何软件包的ChatGPT插件,请确保有代码的原始副本,因为代码有被覆盖的风险,而用户不一定想要这样做。
6.ChatGPT
ChatGPT包提供了在R中使用ChatGPT的函数和RStudio插件,在测试时记录了10个插件。
特定于代码的函数包括comment_code()、complete_code()、create_unit_tests()、document_code()、find_issues_in_code()和refactor_code()。还有一个通用的ask_chatgpt()函数和插件,如果用户想将ChatGPT用于与代码无关的内容。
将密钥存储在.Renviron文件中:
OPENAI_API_KEY=”your key”
如果用户试图在存储密钥之前运行其中一个插件,将得到一条错误消息,告诉他如何进行密钥设置。
该包位于CRAN上,或者可以使用
remotes::install_github("jcrodriguez1989/chatgpt", build_vignettes = TRUE)
当用户在没有加载软件包的情况下尝试加载插件时,什么也没有发生。然后用库(chatgpt)加载了这个包,得到了这个消息:
Warning message:
In run_addin("document_code") :
Please set one of `OPENAI_ADDIN_REPLACE=TRUE` or `OPENAI_VERBOSE=TRUE`
按照R环境文件中的说明操作,将verbose选项设置为TRUE,因为不希望替换初始代码。
这导致在控制台中显示对ChatGPT的查询,并在控制台中显示响应。
在R环境文件中使用OPENAI_ADDIN_REPLACE=TRUE选项,并且在RStudio中选择了代码,当添加文档时,用户的一些初始代码偶尔会消失。用户最终坚持使用这个包的命令行函数而不是插件,但是可能会发现插件很有用,只要记住在试验之前复制其代码。
这个聊天软件包由Juan Cruz Rodriguez创建。
7.gptchatteR
gptchatteR号称“一个实验性的非官方包装器,用于在R中与OpenAI GPT模型进行交互,其中一个优点是它的chatter.plot()函数。
安装软件包:
remotes::install_github("isinaltinkaya/gptchatteR", build_vignettes = TRUE, dependencies = TRUE)
这确保了它还安装了所需的openai包。然后,可以加载这个包并使用:
library(gptchatteR)
chatter.auth("YOUR KEY")
在完成之后,使用chatter.create()启动一个聊天会话。
chatter_create()参数包括OpenAI模型的模型(默认为text-davinci-003), max_tokens用于用户希望使用的最大令牌数量(默认为100),以及使用如下参数设置的“温度”:
chatter.create(temperature = 0)
根据OpenAI文档,温度设置可以在0到1之间,表示“模型输出不太可能的令牌的频率”。
温度越高,输出就越随机(通常也是创造性的)。然而,这与“真实”是不一样的。对于大多数实际用例,例如数据提取和真实问答,温度为0是最好的。
包的默认值是中性的0.5。除非想要娱乐而不是获得可用的代码,否则将温度设置为0是值得的。
当进行测试的时候,这个包是工作的,但是生成了以下警告:
The `engine_id` argument of `create_completion()` is deprecated as of openai 0.3.0.
ℹ Please use the `model` argument instead.
ℹ The deprecated feature was likely used in the gptchatteR package.
Please report the issue to the authors.
用户可以创建一个“随意”的聊天。聊天(“你的输入”)。如果用户认为需要在初始请求之后进行后续操作,可以使用chatter.feed(),它将存储用户的第一个查询以便在第二个问题中使用,以此类推。
运行以下代码后:
library(gptchatteR)
chatter.auth(Sys.getenv("OPENAI_API_KEY"))
chatter.create(temperature = 0)
chatter.feed('I have the following data in R mydf <- data.frame(State = c("CT", "NJ", "NY"), Pop = c(3605944, 9288994, 20201249))')
myplot <- chatter.plot("Make a graph with State on the x axis and Pop on the Y axis")
一个图表出现在RStudio视图窗格中。图形代码存储在myplot$code中。
gptchatteR软件包是由哥本哈根大学的博士Isin Altinkaya创建的。
8.chatgptimages
这个R包不是为了帮助用户编写代码而设计的。与其相反,它使用熟悉的R和Shiny界面来访问ChatGPT的另一个功能:创建图像。目前,基于用于训练模型的人工智能图像创建中存在许多道德知识产权问题,如果用户想将此软件包用于娱乐以外的任何内容,务必记住这一点。
也就是说,如果想尝试,需要注意它不会像通常的软件包那样安装。首先,确保其系统上也安装了shiny、golem、shinydashboard、openai、config和test。然后,在https://github.com/analyticsinmotion/chatgpt-images-r-shiny上下载整个GitHub repo,或者在https://github.com/analyticsinmotion/chatgpt-images-r-shiny上下载并解压缩.zip文件。打开chatgtimages。在RStudio中打开run_dev. Rproj文件。R文件放到项目的dev文件夹中,然后逐行运行这个短文件。这个应用程序应该在默认浏览器中打开:
图5 chatgtimages应用程序在浏览器中运行
按照存储ChatGPT API密钥的说明,用户就可以开始创建和保存图像。
其结果如图6所示:
图6从chatgtimages保存的图像
超越ChatGPT
如果用户想测试其他开源的大型语言模型,Chat with open large language models这个非R特定的工具非常有趣。在撰写本文时,它提供了9种不同的模型,还有一个“竞技场”,用户可以同时测试两种模型,并选出最佳模型。
用户需要注意其使用条款:“仅用于非商业用途。它只提供有限的安全措施,并可能产生令人反感的内容。它不得用于任何非法、有害、暴力、种族主义或性目的。该服务收集用户对话数据,用于未来的研究。”
最后提醒一下,H2o. ai有一个网站,可以在https://gpt.h2o.ai/上测试它的模型。
原文标题:8 ChatGPT tools for R programming,作者:Sharon Machlis