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家族都有基本認識,畢竟這邊若要展開又是另一篇長文了……如果對這些略過的部分有疑問,以後再另外做個分析講解吧!

留言0
查看全部
avatar-img
發表第一個留言支持創作者!
窄視野的生活觀察 的其他內容
若需要分析的資料是固定欄寬格式(Fixed Width Format, fwf)的純文字檔,需要透過ddf或sps工作檔正確指定欄位分隔、變項名稱,請看今天的練習。
若需要分析的資料是固定欄寬格式(Fixed Width Format, fwf)的純文字檔,需要透過ddf或sps工作檔正確指定欄位分隔、變項名稱,請看今天的練習。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
今天又發現ChatGPT的一些缺點, 使用時需要很準確的提供你想要表達的文字(我覺得還蠻重要的) 又或者拿一些範例給它看, 它就能更準確的回答問題, 因為今天我發現有一篇文章和之前寫過的完全一樣了, 所以又要再請ChatGPT生成30則勵志英文短文, 結果之前發問的問題已經消失了, 又
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在 AI說書 - Prompt Engineering - 61 | Scenario Base
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 RTAO 範本簡單而深刻,由四個關鍵元素定義:Role 、 Task 、 Audience 、 Outp
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 TOCD 範本體現了簡單性和有效性,此範本以四個基本元素 ( Task、Output、Context
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 ChatGPT縱然成功,但是仍有一些任務處理得不好,例如: 需要邏輯推論的任務 多步驟的任務
大家在跟Chat GPT互動的時候,會不會覺得常常雞同鴨講 我們梳理了一些提升Chat GPT回答能力的作法 ChatGPT回答不是你要的怎麼辦? 我們也實作了當中的一種方法,叫做RAG於 自己做免錢Chat GPT吧 這篇文章,我們談談其他技巧,稱為Prompt Engineering
回顧我們的目標是自己做一個免錢Chat GPT 自己做免錢Chat GPT吧 當中,我希望外掛一個外部知識庫,叫做RAG,來提升整體問答的品質,同時又能避免機敏資訊被Chat GPT竊取。 緣由參見 ChatGPT回答不是你要的怎麼辦? 詳細實作於 使用Meta釋出的模型,實作Chat G
到目前為止,我們已經完成RAG技術的實作,在上一篇文章使用Meta釋出的模型,實作Chat GPT - Part 5中,可以看到加入RAG之後,可以讓我的大型語言模型回答更為精確。 現在我們要把它用一個畫面做呈現,而不是以程式碼來給大家看,就類似Chat GPT這樣,背後有複雜的程式運行,但是眾人
延續使用Meta釋出的模型,實作Chat GPT - Part 4,我們現在遇到一個問題:語言模型回答的資訊不是我想要的。 於是我參照ChatGPT回答不是你要的怎麼辦?,想使用低成本的技術:RAG,來改善這問題。 以下開始實作,首先引入一個重量級工具包,它叫做LangChain,這是做語言模型
Thumbnail
本文章介紹瞭如何使用AutoGPT, 一種可以自主蒐集資料生成訴求,幫你與ChatGPT在互動中提出一連串的問題,來解決你的問題。對於安裝時的常見問題也進行了解答,並提供了使用的步驟以及目前的解決方式。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
今天又發現ChatGPT的一些缺點, 使用時需要很準確的提供你想要表達的文字(我覺得還蠻重要的) 又或者拿一些範例給它看, 它就能更準確的回答問題, 因為今天我發現有一篇文章和之前寫過的完全一樣了, 所以又要再請ChatGPT生成30則勵志英文短文, 結果之前發問的問題已經消失了, 又
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在 AI說書 - Prompt Engineering - 61 | Scenario Base
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 RTAO 範本簡單而深刻,由四個關鍵元素定義:Role 、 Task 、 Audience 、 Outp
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 TOCD 範本體現了簡單性和有效性,此範本以四個基本元素 ( Task、Output、Context
我們人類和ChatGPT的對話技巧也是需要學習的,有鑑於此,我想要一天分享一點「和ChatGPT對話的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 ChatGPT縱然成功,但是仍有一些任務處理得不好,例如: 需要邏輯推論的任務 多步驟的任務
大家在跟Chat GPT互動的時候,會不會覺得常常雞同鴨講 我們梳理了一些提升Chat GPT回答能力的作法 ChatGPT回答不是你要的怎麼辦? 我們也實作了當中的一種方法,叫做RAG於 自己做免錢Chat GPT吧 這篇文章,我們談談其他技巧,稱為Prompt Engineering
回顧我們的目標是自己做一個免錢Chat GPT 自己做免錢Chat GPT吧 當中,我希望外掛一個外部知識庫,叫做RAG,來提升整體問答的品質,同時又能避免機敏資訊被Chat GPT竊取。 緣由參見 ChatGPT回答不是你要的怎麼辦? 詳細實作於 使用Meta釋出的模型,實作Chat G
到目前為止,我們已經完成RAG技術的實作,在上一篇文章使用Meta釋出的模型,實作Chat GPT - Part 5中,可以看到加入RAG之後,可以讓我的大型語言模型回答更為精確。 現在我們要把它用一個畫面做呈現,而不是以程式碼來給大家看,就類似Chat GPT這樣,背後有複雜的程式運行,但是眾人
延續使用Meta釋出的模型,實作Chat GPT - Part 4,我們現在遇到一個問題:語言模型回答的資訊不是我想要的。 於是我參照ChatGPT回答不是你要的怎麼辦?,想使用低成本的技術:RAG,來改善這問題。 以下開始實作,首先引入一個重量級工具包,它叫做LangChain,這是做語言模型
Thumbnail
本文章介紹瞭如何使用AutoGPT, 一種可以自主蒐集資料生成訴求,幫你與ChatGPT在互動中提出一連串的問題,來解決你的問題。對於安裝時的常見問題也進行了解答,並提供了使用的步驟以及目前的解決方式。