R資料處理-用R丟多個問題給ChatGPT並儲存答案 [Stack Overflow練題002]

更新於 發佈於 閱讀時間約 10 分鐘
若想知道怎麼在R裡面透過API向ChatGPT一次提問多個問題,並且將每個問題與各自的答案對應整理好,請看今天的練習。

前言

ChatGPT正式推出已經滿2年了(2022年12月推出),這2年間許多公司也推出類似的服務,使生成式AI與生活更加緊密連結。

相信大家多多少少在工作、娛樂、創作或搜尋資訊等各方面使用過ChatGPT,或至少剛推出時有嚐鮮一下。如果最近還有持續在用,應該會發現比當初的版本有了許多進步,尤其是生成回覆的時間大概縮短了兩輩子這麼多。

雖然回覆時間已經很快了,但若有多個問題要問,並想把答案都整理好,一問一答的複製貼上流程是不是稍嫌冗長呢?例如想把作業的題目一口氣輸入……例如想直接整理下面這個表格:

| 國家 | 人口 | 首都 |
--------------------
| 美國 | | |
| 巴西 | | |
| 日本 | | |
| 南非 | | |
| 德國 | | |

有沒有辦法直接完成呢?


題目

這次在Stack Overflow看到的提問是使用者想透過API,在R裡面直接向ChatGPT提問並且把答案整理進表格,提問原帖在此。

提問帖作者展示了「單獨提出問題」的話,可以正常運作。

raw-image

但是如果想要把兩個問題同時丟給ChatGPT並儲存答案則會失敗。更簡單的說法,提問者想要自動完成下面這個命名為test的表格:

> test
x y
1 Is Arkansas in the United States?
2 Is Arkansas in India?

其中x是整理在一起的2個問題,而y則想要放置答案。


解答

解答-1. 透過套件與API向ChatGPT提問

這個問題其實是資料結構的問題,只是套了一個「向ChatGPT提問」的主題。本質上來說,可以分解成3個部分:

  1. 建立data.frame
  2. 產生一個vector
  3. 把vector指派為data.frame的一個新欄位


但要給出一個「能完全重現」的解答,我們還是要按部就班進行。因此第一步先看看怎麼使用套件與API(直接擷取提問者的發文)。

### load current ChatGPT package: https://github.com/jcrodriguez1989/chatgpt
install.packages("chatgpt")
library(chatgpt)

### load GPT API
Sys.setenv(OPENAI_API_KEY = "XXX")

首先是安裝與讀取套件,這部分沒有問題,直接複製並執行程式碼即可。第二步則是要取得API key,讓R可以跟ChatGPT「對話」。(關於API的介紹可以看這篇文章

要取得API,要前往OpenAI的API網站,並登入平常使用ChatGPT的帳號。點選「Create new secret key」後再輸入一些名稱等基本設定,就可以成功建立新的API了,建立完成會看到下面的視窗。

raw-image

注意這邊是唯一一次能看到完整API key的機會,關閉之前務必先複製下來,若不慎遺失了的話就要再建立新的來用了。這邊拿到的API key就是用來取代前面提問者的程式碼Sys.setenv(OPENAI_API_KEY = "XXX")這一段裡面的XXX。

接下來就可以正式開始用ask_chatgpt()提問了!

……很遺憾,直接使用的話會得到:You exceeded your current quota, please check your plan and billing details.這個錯誤訊息……是的,使用API要以流量計費,因此必須先在API網站內的Billing頁面,點選「Add payment details」新增付費方式(信用卡資訊)。API的費用相關資訊可以參考這篇文章,計價方式非常划算,加值最少的5美元都可以用很久。


解答-2. 批次提問並將解答儲存進表格

設定完成,可以透過R向ChatGPT提問後,接著正式處理今天的提問(終於!)。首先我們看看原提問者是哪裡出錯:

### write into dataframe
test <- data.frame(x = c("Is Arkansas in the United States?", "Is Arkansas in India?"))

### ask_chatgpt
test <- test %>%
mutate(y = cat(ask_chatgpt(x)))

首先是不應該使用cat()這個函式,它的用途是直接把要的文字貼到terminal上,而貼出來的東西只能給人類的眼睛讀,對程式來說不是一個物件。比較以下兩種結果:

> class(cat(ask_chatgpt("Is Arkansas in the United States?")))

*** ChatGPT input:

Is Arkansas in the United States?

Yes, Arkansas is a state located in the United States.[1] "NULL"


> class(ask_chatgpt("Is Arkansas in the United States?"))

*** ChatGPT input:

Is Arkansas in the United States?

[1] "character"

class()要求R提供資料的類型,這邊的意思是要求R告訴我們ChatGPT對這一題的答案,也就是:"Yes, Arkansas is a state located in the United States."這一句話是什麼資料型態,cat()得到的結果是"NULL",連物件都不是無法判斷。注意[1]後面的文字才是程式的回答,因為cat()會強迫把文字貼到terminal上,導致ChatGPT的回答先貼完後,程式才作答。另一方面,不使用cat()的話就會回答"character",也就是字串。

提問者會使用cat()應該是因為套件作者的範例有用這個函式,如果只是單獨提問的話這可以得到最簡潔的結果,回傳的答案連""都不會有,但若要將答案進一步處理的話就不能這樣使用。

單純拿掉cat()?結果仍然不對。

test <- test %>%
mutate(y = ask_chatgpt(x))

Error in `mutate()`:
ℹ In argument: `y = ask_chatgpt(x)`.
Caused by error in `gpt_get_completions()`:
! list(message = "Invalid type for 'messages[9].content[0]': expected an object, but got a string instead.", type = "invalid_request_error", param = "messages[9].content[0]", code = "invalid_type")
Run `rlang::last_trace()` to see where the error occurred.

這邊的原因則是ask_chatgpt()預設你要放一個且只有一個問題進去,但是mutate()相當於把整個欄位(test的x)都放進去。

我們必須「一個一個地」提問才行,那是不是應該用迴圈呢?用迴圈可以達成目的,但這邊只有兩個問題還好,當項目一多時迴圈會跑到天~長~地~久。若需要執行的步驟可以用apply家族處理,使用apply家族才是比較好的作法。

test <- data.frame(
  x = c("Is Arkansas in the United States?", "Is Arkansas in India?")
)

test$y <- sapply(test$x, ask_chatgpt)

這段先建立只有一個欄位(x)的data.frame,接著用sapply()ask_chatgpt()這個函式套用到test$x裡面的每一個物件,其結果會是一個跟test$x一樣長的vector,再把這個vector指派成data.frame的另一個欄位(y)。



惡作劇完成!

非常簡單的程式碼,但要說明每一個步驟卻變成這麼長的文章。而且文章的內容已經預設大家對R、資料結構、資料類型、apply家族都有基本認識,畢竟這邊若要展開又是另一篇長文了……如果對這些略過的部分有疑問,以後再另外做個分析講解吧!

留言
avatar-img
留言分享你的想法!
avatar-img
窄視野的生活觀察
0會員
3內容數
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
若想知道怎麼在R裡面透過API向ChatGPT一次提問多個問題,並且將每個問題與各自的答案對應整理好,請看今天的練習。
Thumbnail
若想知道怎麼在R裡面透過API向ChatGPT一次提問多個問題,並且將每個問題與各自的答案對應整理好,請看今天的練習。
Thumbnail
本文章介紹瞭如何使用AutoGPT, 一種可以自主蒐集資料生成訴求,幫你與ChatGPT在互動中提出一連串的問題,來解決你的問題。對於安裝時的常見問題也進行了解答,並提供了使用的步驟以及目前的解決方式。
Thumbnail
本文章介紹瞭如何使用AutoGPT, 一種可以自主蒐集資料生成訴求,幫你與ChatGPT在互動中提出一連串的問題,來解決你的問題。對於安裝時的常見問題也進行了解答,並提供了使用的步驟以及目前的解決方式。
Thumbnail
年前將至,出國旅遊的熱度逐漸提升,規劃行程常常是耗費龐大時間的一個必經過程,而透過AI,可以幫助你預先了解目的地,這裡將介紹幾種提問方式,並以日本旅遊為例,來說明如何在規劃形成的過程。
Thumbnail
年前將至,出國旅遊的熱度逐漸提升,規劃行程常常是耗費龐大時間的一個必經過程,而透過AI,可以幫助你預先了解目的地,這裡將介紹幾種提問方式,並以日本旅遊為例,來說明如何在規劃形成的過程。
Thumbnail
臺灣從2023年初到現今,已出現許多ChatGPT應用在各個領域的內容與經驗分享,而本文則從將ChatGPT執行新聞下標與摘要人員的實作中,去回應ChatGPT應用在新聞產業上,目前能做到哪些事情?以及透過這些運用的經驗去反思ChatGPT對於新聞產業的影響。 讓ChatGPT執行下標新聞內容
Thumbnail
臺灣從2023年初到現今,已出現許多ChatGPT應用在各個領域的內容與經驗分享,而本文則從將ChatGPT執行新聞下標與摘要人員的實作中,去回應ChatGPT應用在新聞產業上,目前能做到哪些事情?以及透過這些運用的經驗去反思ChatGPT對於新聞產業的影響。 讓ChatGPT執行下標新聞內容
Thumbnail
大家好!相信大家也常常使用ChatGPT 這個人工智能工具,經過半年,它已經成為生活必備的一個工具了,包含工作,生活,娛樂,都可以常常使用,生成文案,諮詢內容,聊天娛樂等等 但是,ChatGPT 似乎有點偷懶呀!
Thumbnail
大家好!相信大家也常常使用ChatGPT 這個人工智能工具,經過半年,它已經成為生活必備的一個工具了,包含工作,生活,娛樂,都可以常常使用,生成文案,諮詢內容,聊天娛樂等等 但是,ChatGPT 似乎有點偷懶呀!
Thumbnail
Chatlize.ai 是由一名生物資訊學者 Steven Xijin Ge 所做,透過簡易的介面可以讓使用者輕鬆透過指令(prompt)的方式就可以輕鬆處理數據。結果不僅會直接提供程式原始碼、並執行,若有視覺化需求,它也會幫你完整視覺化。
Thumbnail
Chatlize.ai 是由一名生物資訊學者 Steven Xijin Ge 所做,透過簡易的介面可以讓使用者輕鬆透過指令(prompt)的方式就可以輕鬆處理數據。結果不僅會直接提供程式原始碼、並執行,若有視覺化需求,它也會幫你完整視覺化。
Thumbnail
這兩條指令都是為了通過問答的方式,引導ChatGPT深入理解用戶的需求並提供更精確的回答。這種方法確實可以提高回答的准確率和深度。您可以根據自己的情境填充[角色]、[任務]、[結果]和[數量]這些佔位符,來得到更具體的問題和答案。
Thumbnail
這兩條指令都是為了通過問答的方式,引導ChatGPT深入理解用戶的需求並提供更精確的回答。這種方法確實可以提高回答的准確率和深度。您可以根據自己的情境填充[角色]、[任務]、[結果]和[數量]這些佔位符,來得到更具體的問題和答案。
Thumbnail
Hi, 我是茶桁。 在上一节中,我们介绍了如何使用最新的ChatGPT API,注册HuggingFace账户,并将我们的聊天机器人部署出去。在这个过程中,我们学习了实际的应用开发过程,使你对聊天机器人的开发有了充足的体验。在这一讲中,我们将探讨OpenAI的各种接口提供的能力,以更深入地了解这些
Thumbnail
Hi, 我是茶桁。 在上一节中,我们介绍了如何使用最新的ChatGPT API,注册HuggingFace账户,并将我们的聊天机器人部署出去。在这个过程中,我们学习了实际的应用开发过程,使你对聊天机器人的开发有了充足的体验。在这一讲中,我们将探讨OpenAI的各种接口提供的能力,以更深入地了解这些
Thumbnail
每次遇到問題,就習慣性地google一下。這邊googoo、那邊glegle,偶爾就會遇見可以稍微研究一下的新事物。 週一那天,我趁著孩子們午休的時間,在搜尋欄位打上「怎麼使用Chat GPT學英文」,發現一篇由塔科女子介紹的在Line上使用Chat GPT的方法,於是決定馬上來玩看看。
Thumbnail
每次遇到問題,就習慣性地google一下。這邊googoo、那邊glegle,偶爾就會遇見可以稍微研究一下的新事物。 週一那天,我趁著孩子們午休的時間,在搜尋欄位打上「怎麼使用Chat GPT學英文」,發現一篇由塔科女子介紹的在Line上使用Chat GPT的方法,於是決定馬上來玩看看。
Thumbnail
(本文附圖皆截圖自ChatGPT) 廢話不多說,直接上圖。 第二個問法只比第一個問法多了一個「問號」,但是ChatGPT就會耗費比較多的運算力來處理,也就是說會比較「認真」去找答案。 第三個問法就更不用說了,他必須花費好幾倍的運算力,更加「認真」才能回答。 當然,它還是採取最安全、最制式化的方式回答
Thumbnail
(本文附圖皆截圖自ChatGPT) 廢話不多說,直接上圖。 第二個問法只比第一個問法多了一個「問號」,但是ChatGPT就會耗費比較多的運算力來處理,也就是說會比較「認真」去找答案。 第三個問法就更不用說了,他必須花費好幾倍的運算力,更加「認真」才能回答。 當然,它還是採取最安全、最制式化的方式回答
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News