【R】RでChatGPT!「chatgpt」ライブラリ!API経由でストレスなくアクセスできる!

Rからchatgptを使用できるライブラリが登場しました!

ChatGPTの最近の流行はすごいですよね!ただ、ブラウザからChatGPT (https://chat.openai.com/)にアクセスすると結構な頻度で「ChatGPT is at capacity」となって利用できなかったりします。。。

みんながアクセスする時間帯は特にひどくてメールアドレスを登録して利用できるようになるまで待つ必要があったりします。。。

そんな悩みを解消してくれるのがAPIを経由してChatGPTを利用できるRのライブラリ「chatgpt」です!かなり快適にレスポンスを返してくれます!

会話のログはR markdownなどとして保存もできます!サイトのChatGPT (https://chat.openai.com/)だとアクセスできない時は会話ログも見られないので、この点も大きなメリットですね!

この記事ではインストール方法、API keyの環境変数への設定方法、chatgptライブラリの関数全てを紹介しています!

Sponsored Links

インストール

現在はinstall.packages(“chatgpt”)でインストールしようとすると「このRのversionでは利用できない」というエラーが出るみたいです。

以下のコマンドでGitHubからインストールします!

# install.packages("remotes") 
remotes::install_github("jcrodriguez1989/chatgpt")
library("chatgpt")

ChatGPTのAPI keyの取得方法

ChatGPTのAPIにアクセスするにはAPI keyというものが必要になります!

API keyの取得は全く難しくなくて、こちらのサイト(https://platform.openai.com/account/api-keys)にアクセスして、[create new secret key]を押すだけです!

「sk-」で始まる文字列がAPI keyです!

API keyの取得方法は以下のサイトが非常に参考になりますのでご参照ください!

https://www.karada-good.net/analyticsr/r-767/

Sponsored Links

Rの環境変数にOPEN AIのAPI keyを設定する!

2パターンの方法が紹介されています!

API keyの設定方法1 Sys.setenv()

Sys.setenv()で直接環境変数に書き加える方法です!

この方法だとすぐに実行できます!ただ、Rのsessionを再起動するたびにこのコマンドを実行する必要があります!

Sys.setenv(OPENAI_API_KEY = "XX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Sponsored Links

API keyの設定方法2 .Renvironを編集

毎回、上のSys.setenv()を実行するのが面倒だという方は.Renvironファイルに書き込んでしまいましょう!

やり方は以下です!usethis::edit_r_environ().Renvironファイルを開いて、エディタで以下を入力するだけです!

OPENAI_API_KEY=XX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

library(usethis) 
usethis::edit_r_environ()
# • Modify '/Path/to/.Renviron' 
# • Restart R for changes to take effect 
# .Renvironファイルが開く

# 以下を.Renviron ファイルに記入
OPENAI_API_KEY=XX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

# .Renvironは起動時に読み込まれるため、再起動
.rs.restartR()
# Restarting R session... 
Sponsored Links

chatgptパッケージの使い方

さて!準備ができたら早速使っていきましょう!

いつものChatGPT!ask_chatgpt()

確実に一番よく使うであろう関数が、ask_chatgpt()です!

ブラウザでアクセス(https://chat.openai.com/)した時と全く同じように使用することができます!

library("chatgpt")

cat(ask_chatgpt("Please teach me about chatgpt."))
# *** ChatGPT input:
# 
# Please teach me about chatgpt
# ChatGPT is a natural language processing (NLP) model developed by Microsoft Research. 
# It is a deep learning model based on the Transformer architecture and trained on large-scale conversation data.
# The model was designed to generate natural and relevant responses to user queries. 
# It can be used to power chatbot applications, where it can generate conversation responses based on a given context. 
# ChatGPT can also be used to generate text in other domains such as news, stories, and sports.


# もちろん日本語でも大丈夫です!
cat(ask_chatgpt("RとPythonどっちがいい?"))
# *** ChatGPT input:
# 
# RとPythonどっちがいい?
# この質問には回答を与えることはできません。RとPythonどちらが最適なツールであるかは、使用する目的に応じて異なります。
# Rは統計分析のための強力なツールですが、Pythonはプログラミング言語であり、
# データサイエンス、機械学習などの多くのタスクを実行するのに役立ちます。

Sponsored Links

コードにコメントを追加!comment_code()

コード中にインラインコメントをつけて、各行の処理を説明してくれます!

あとで見返してどんな意味のコードなのかも理解しやすくなりますね!

cat(comment_code("
for (i in 1:10) {
  print(1 / i ** 2)
}
"))

# *** ChatGPT input:
# 
# Add inline comments to the following R code: "
# for (i in 1:10) {
#   print(1 / i ** 2)
# }
# "
# # This code is looping through the values 1-10 and printing the result of 1 divided by each value squared.
# for (i in 1:10) { # loop through values 1-10
#   print(1 / i ** 2) # print 1 divided by each value squared
# }

testを自動で作成!create_unit_tests()

testthat というライブラリを使用してtestを自動で生成してくれます!

cat(create_unit_tests("
squared_numbers <- function(numbers) {
  result <- 1 / numbers ** 2
  return result
}
"))
# *** ChatGPT input:
# 
# Create a full testthat file, with test cases for the following R code: "
# squared_numbers <- function(numbers) {
#   result <- 1 / numbers ** 2
#   return result
# }
# "
# library(testthat)
# 
# context("squared_numbers()")
# 
# test_that("squared_numbers() works as expected", {
#   expect_equal(squared_numbers(4), 0.0625)
#   expect_equal(squared_numbers(5), 0.04)
#   expect_equal(squared_numbers(-2), -0.25)
#   expect_equal(squared_numbers(100), 0.0001)
# })
Sponsored Links

変数名を自動で作成!create_variable_name()

端的で一目見てわかりやすい変数名を自動で作成してくれます!

cat(create_variable_name("sapply(1:10, function(i) 1 / i ** 2)"))]

# *** ChatGPT input:
# 
# Give a good variable name to the result of the following R code: "sapply(1:10, function(i) 1/i ** 2)"
# inverse_square_values
Sponsored Links

コードのドキュメントを作成!document_code()

関数のドキュメントを自動で作成してくれます!

フォーマットを作成してくれるのが本当に便利で、仮に出力自体が不十分だったとしてもこれに少し足すだけで良いのがいいですね!

cat(document_code("
inverse_square_numbers <- function(numbers) 1 / numbers ** 2
"))

# *** ChatGPT input:
# 
# Document, in roxygen2 format, this R function: "
# inverse_square_numbers <- function(numbers) 1 / numbers ** 2 # " 
# #' Calculate the inverse square of a vector of numbers 
# #' 
# #' @param numbers A numeric vector of numbers 
# #' 
# #' @return A numeric vector of the inverse squares of the input numbers 
# #' 
# #' @export 
# #' 
# #' @examples 
# #' 
# #' inverse_square_numbers(2) # #' #> [1] 0.25
# #' 
# #' inverse_square_numbers(c(2,4))
# #' #> [1] 0.25 0.0625
# #' 
# inverse_square_numbers <- function(numbers) 1 / numbers ** 2

コードを説明してくれる!explain_code()

コード全体の説明文を作成してくれます!

各行の説明をインラインコメントで付け加えてくれるcomment_code()とは好みで使い分けていいかと思います!

cat(explain_code("
for (i in 1:10) {
  print(1 / i ** 2)
}
"))

# *** ChatGPT input:
# 
# Explain the following R code: "
# for (i in 1:10) {
#   print(1 / i ** 2)
# }
# "
# This code is looping through the numbers 1 to 10 and 
# printing out the result of 1 divided by each number squared. 
# For example, the first iteration would print out 1/1^2 = 1 and 
# the last iteration would print out 1/10^2 = 0.01.
Sponsored Links

エラーや想定外の挙動の原因を発見!find_issues_in_code()

個人的に一番好きな関数がこれです!

Rのプログラミングが初めての方にはめちゃくちゃ重宝するのではないでしょうか?

無料の超優秀なメンターに添削してもらうみたいなものです!

cat(find_issues_in_code("
i <- 0
while (i < 0) {
  i <- i - 1
}
"))

# *** ChatGPT input:
# 
# Find issues or bugs in the following R code: "
# i <- 0
# while (i < 0) {
#   i <- i - 1
# }
# "
# The code is incorrect as it creates an infinite loop 
# since i is initialized as 0 and is always less than 0. 
# The code should be modified to i <- 0, while (i > 0) {i <- i - 1 }

コードの最適化!optimize_code()

コードの挙動自体は変えずに、全体を最適化してくれます!

例だと、iという変数は必要ないので省略され、バグの原因になりがちなwhileループをforループにして無限ループに陥る可能性をなくしてくれていますね!

cat(optimize_code("
i <- 10 
while (i > 0) {
  i <- i - 1
  print(i)
}
"))

# *** ChatGPT input:
# 
# Optimize the following R code: "
# i <- 10 
# while (i > 0) {
#   i <- i - 1
#   print(i)
# }
# "
# for (i in 10:1) {
#   print(i)
# }
Sponsored Links

コードのリファクタリング!refactor_code()

リファクタリングとは、「コード全体の機能を変えることなく、理解や修正が簡単になるようにコードの改変を行うこと」です!

つまりは機能を変えずにわかりやすくしてくれます!

リファクタリングについてはこちらのサイト(http://objectclub.jp/technicaldoc/refactoring/refact-what)が詳しいです!

cat(refactor_code("
i <- 10 while (i > 0) {
  i <- i - 1
  print(i)
}
"))

# *** ChatGPT input:
# 
# Refactor the following R code, returning valid R code: "
# i <- 10 # while (i > 0) {
#   i <- i - 1
#   print(i)
# }"
# for (i in 10:1) {
#   print(i)
# }

参考

https://github.com/jcrodriguez1989/chatgpt

https://www.karada-good.net/analyticsr/r-767/

http://objectclub.jp/technicaldoc/refactoring/refact-what

 

Sponsored Links
SKJブログはTwitterでも役に立つ情報を発信しています!