?本文目錄
一、引言
二、成果演示——口述式數(shù)據(jù)可視化
三、遠(yuǎn)原理述
四、實現(xiàn)過程
? (一)環(huán)境配置
? (二)申請OpenAI賬號
? (一)調(diào)用ChatGPT?API
? (二)設(shè)計AI身份,全自動處理數(shù)據(jù)
五、再談此次探索
六、總結(jié)
Part1引言
OpenAI 公司開發(fā)的 ChatGPT 已經(jīng)火了一年多了,這期間各種 AI 產(chǎn)品以及創(chuàng)意層出不窮,問答的、畫畫的、寫論文的……總之啥都有。很多程序員在日常工作中也會使用 ChatGPT 來編寫代碼解決問題,筆者也是其中之一,在使用過程中,筆者逐漸萌生出一些奇妙的想法。
AI 雖然強大,但種種原因限制了它與計算機文件的交互,所以在數(shù)據(jù)處理中,AI 只能是一個“軍師”角色,有謀卻無勇,不能直接幫我們處理數(shù)據(jù)。既然如此,我們能不能使用 Python 對 ChatGPT 做一個“淺加工”,調(diào)用 OpenAI 提供的 API,再輔以藝術(shù)性提問,讓AI 根據(jù)我們的指令直接處理電腦中的數(shù)據(jù),或者做一些數(shù)據(jù)可視化的工作呢?一番探索后,筆者得到了振奮人心的成果,接下來就把成果、原理和過程分享給大家。
本文中所有 Python 代碼均在集成開發(fā)環(huán)境 Visual Studio Code (VScode) 中使用交互式開發(fā)環(huán)境 Jupyter Notebook 中編寫。
Part2成果演示——口述式數(shù)據(jù)可視化
首先,我在 Jupyter Notebook 中開發(fā)出我的 AI 程序,隨后我將一個 Excel 數(shù)據(jù)表存放到與程序同一級的文件夾中。放進來的 Excel 表名為“中國歷年數(shù)字經(jīng)濟核心產(chǎn)業(yè)大類被授權(quán)實用新型專利申請數(shù).xlsx
”,使用 WPS 打開后如下圖所示。
接下來我先后給出以下幾條指令。
第一條指令:使用 Pandas 讀取當(dāng)前目錄下名為“中國歷年數(shù)字經(jīng)濟核心產(chǎn)業(yè)大類被授權(quán)實用新型專利申請數(shù).xlsx”的文件,變量命名為 data
。ChatGPT 收到指令后就照做了,這一步還沒有得到什么成果。
第二條指令:使用變量 data 中的數(shù)據(jù),以“申請年份”為橫軸,分別以“01數(shù)字產(chǎn)品制造業(yè)被授權(quán)實用新型專利數(shù)”、 “02數(shù)字產(chǎn)品服務(wù)業(yè)被授權(quán)實用新型專利數(shù)”、 “03數(shù)字技術(shù)應(yīng)用業(yè)被授權(quán)實用新型專利數(shù)”和“04數(shù)字要素驅(qū)動業(yè)被授權(quán)實用新型專利數(shù)”為縱軸,繪制四條折線圖
。于是 ChatGPT 按照指令,給出了下面這個折線圖以及繪制者個折線圖用到的 Python 代碼。
第三條指令:將四個圖例分別修改成“數(shù)字產(chǎn)品制造業(yè)”、“數(shù)字產(chǎn)品服務(wù)業(yè)”、“數(shù)字產(chǎn)品應(yīng)用業(yè)”和“數(shù)字要素驅(qū)動業(yè)”
。ChatGPT 照做,并直接給出了改進后的成果。
第四條指令:在折線圖右邊添加一個縱軸,內(nèi)容是data中的“被授權(quán)實用新型專利數(shù)”字段,橫軸不變,在折線圖中添加一幅柱狀圖
。最后 ChatGPT 依然不動聲色地完成任務(wù)并給出結(jié)果。
從以上成果來看,我們的 “進化版” ChatGPT 已經(jīng)能夠根據(jù)我們的命令完成數(shù)據(jù)處理任務(wù)。最重要的是,AI 給出的不是建議或者代碼,而是處理的結(jié)果。如果僅僅使用 ChatGPT,目前來說這一定是不可能做到的,但它和 Python 結(jié)合起來卻讓人感到驚喜。
Part3原理概述
這個看上去很了不起的程序,背后原理卻算不上復(fù)雜,相當(dāng)于是給霍金先生換上了一副像施瓦辛格那樣健碩的軀體(打趣一下,絕對無意冒犯)。
如果 ChatGPT 是那個聰明絕頂?shù)哪X袋,那么 Python 就是那副強大的軀體。AI 雖然強大,但是沒有直接操作我們計算機本地文件的權(quán)限;Python 語言也很強大,但沒辦法根據(jù)文字指令為我們解決個性化的問題。于是我們就使用 Python 去調(diào)用 OpenAI 提供的 ChatGPT API 接口,再由我們?nèi)ヌ岢鰧嶋H的需求,ChatGPT 返回處理的 Python 代碼之后,我們想辦法讓 Python 自動地在本地計算機中去運行 ChatGPT 給出的代碼,由于代碼是在我們自己的電腦中運行的,結(jié)果自然也可以得到保留。也就是說實際的處理工作都是 Python 去完成的,ChatGPT 自始至終都沒有接觸到我們的數(shù)據(jù),因此并不存在數(shù)據(jù)安全問題,這一點超級重要!
一套操作之后就有了文章開頭那樣的成果。不過原理說起來簡單,真正實現(xiàn)的過程中,也遇到了不少問題,下面是其中幾個關(guān)鍵點:
-
ChatGPT 的答案中一般同時含有描述性文字和代碼,如何精準(zhǔn)運行代碼而忽略描述性文字?
-
ChatGPT 返回的結(jié)果是字符串,怎么把字符串直接當(dāng)做代碼運行呢,運行后又如何保留代碼中的變量?
-
如何實現(xiàn)連續(xù)對話?
以上問題的答案,都可以在下文中找到。
Part4實現(xiàn)過程
1環(huán)境配置
先在我們的電腦中安裝好 Python 環(huán)境以及開發(fā)環(huán)境,然后在終端中使用以下命令安裝調(diào)用 ChatGPT 的第三方庫。
pip?install?openai
2申請 OpenAI 賬號
與 OpenAI API 進行交互之前,我們需要有與其進行通信時的身份驗證憑證,以確保我們的請求被正確處理。這就需要你在 OpenAI 的網(wǎng)站上創(chuàng)建一個帳號,并在賬戶設(shè)置中生成一個 API 密鑰(網(wǎng)上教程很多,可以參考)。
3調(diào)用 ChatGPT API
在免費可直接調(diào)用的 ChatGPT 模型中,gpt-3.5-turbo
是最優(yōu)選擇,接下來我們就調(diào)用這個模型來解決問題。在調(diào)用之前,我們先導(dǎo)入相關(guān)第三方庫并配置好參數(shù)。
#?導(dǎo)入?OpenAI?庫
import?openai
#?配置申請好的?API?秘鑰,新注冊賬戶都會一定數(shù)量的免費額度
openai.api_key?=?'***********************'
指定 API 密鑰并確定想要調(diào)用的模型后,就可以通過函數(shù)openai.ChatCompletion.create()
來創(chuàng)建 Chat 并獲取模型的響應(yīng)了。在使用之前,我們先了解一下該函數(shù)的兩個必需參數(shù):model
和messages
。
參數(shù) | 用法 |
---|---|
model | 用于指定使用的模型,可以根據(jù)函數(shù)openai.Model.list() 獲取的所有可用模型列表自行選擇 |
messages | 指定歷史聊天中涵蓋的信息,以列表傳遞。列表中的元素為字典,每個字典中包含role ?和content 兩個鍵。role 代表歷史消息中發(fā)送消息者扮演的身份,可以選擇 "system"、"user" 或者 "assistant",其中 "system" 用于向模型提供一般的指導(dǎo)或提示,"user" 表示用戶的輸入,"assistant" 表示模型的回復(fù);content 代表身份對應(yīng)的具體信息內(nèi)容。 |
messages
中的內(nèi)容可以理解為定義上文語境,一般以 "system" 的身份開啟對話,"user" 身份代表用戶向模型傳遞信息,"assistant" 身份代表模型對用戶提問的回答。
下面我們使用函數(shù)openai.ChatCompletion.create()
舉一個簡單的調(diào)用此 API 的例子,代碼如下:
response?=?openai.ChatCompletion.create(
??model?=?"gpt-3.5-turbo",
??messages?=?[
????{"role":?"system",?"content":?"你是一個得力的助手。"},
????{"role":?"user",?"content":?"你好!"},
????{"role":?"assistant",?"content":?"你好,有什么可以幫到你?"},
????{"role":?"user",?"content":?"幫我制定一份有關(guān)放假時間的通知。"}?#?提出問題
??]
)
response
上面的例子中,我們調(diào)用了 OpenAI 的gpt-3.5-turbo
模型,參數(shù)messages
中第一行提示了模型助手的身份;第二行是用戶傳遞給模型的消息,內(nèi)容為“你好!”;第三行是模型的回復(fù)信息,內(nèi)容為“你好,有什么可以幫到你?”;第四行為用戶繼續(xù)傳遞給模型的消息,內(nèi)容為“幫我制定一份有關(guān)放假時間的通知?!?/p>
隨后模型將返回響應(yīng)信息,并將響應(yīng)結(jié)果儲存在變量response
中,響應(yīng)結(jié)果的內(nèi)容如下:
<OpenAIObject?chat.completion?id=chatcmpl-7jMo2oVD9xw1uGZ7QPDm0JTPQSDdy?at?0x1a243138090>?JSON:?{
??"id":?"chatcmpl-7jMo2oVD9xw1uGZ7QPDm0JTPQSDdy",
??"object":?"chat.completion",
??"created":?1691046782,
??"model":?"gpt-3.5-turbo-0613",
??"choices":?[
????{
??????"index":?0,
??????"message":?{
????????"role":?"assistant",
????????#?篇幅原因此處省略,下文介紹
????????"content":?"\u5f53\u7136\u53ef\u4ee5…………\u544a\u8bc9\u6211\u3002"?
??????},
??????"finish_reason":?"stop"
????}
??],
??"usage":?{
????"prompt_tokens":?62,
????"completion_tokens":?470,
????"total_tokens":?532
??}
}
我們來看一下返回結(jié)果中包含的重要內(nèi)容:
-
id:請求 ID。
-
object:返回對象的類型。
-
created:請求時間。
-
model:產(chǎn)生響應(yīng)使用的模型全稱。
-
choices:completion 對象列表,默認(rèn)只有一個回答,或者使用參數(shù) n 來規(guī)定回答數(shù)量。其中:
-
index:choices 列表中 completion 對象的索引
-
message:模型給出的響應(yīng)信息,同時包括 role 和 content
-
finish_reason:模型停止生成文本的原因,包括 "stop" 和 "length"
-
-
usage:查看消耗的 token。其中:
-
prompt_tokens:用戶傳遞信息所消耗的 token
-
completion_tokens:生成模型的響應(yīng)文本消耗的 token
-
total_tokens:一共消耗的 token
-
在上面的代碼中可以看到,返回的響應(yīng)信息中的模型給出的回答是 Unicode 的形式,當(dāng)我們需要查看輸出的結(jié)果時,可以使用如下方式:
在這個例子中我們只使用了函數(shù)openai.ChatCompletion.create()
的兩個必要參數(shù),除此之外,該函數(shù)還有許多其他的可選參數(shù),我們可以根據(jù)自己的要求來調(diào)節(jié)這些參數(shù),從而規(guī)定 ChatGPT 給出的答案范圍,下面列舉四個可選參數(shù):
參數(shù) | 作用 |
---|---|
temperature | 取值介于 0 到 2,默認(rèn)為 1;用于控制輸出結(jié)果的隨機性,temperature 取值越大,隨機性越高。 |
top_p | 默認(rèn)為 1,用于控制生成的候選詞的數(shù)量,以提高回復(fù)的多樣性。是 temperature 的替代方法,top_p 取值越小,多樣性越大。 |
n | choices 中 completion 對象的數(shù)量,默認(rèn)為 1。 |
max_tokens | 默認(rèn)為 inf,用于控制模型生產(chǎn) completion 的最大 token。 |
需要注意一點,參數(shù) temperature 和 top_p 不要同時修改,更改其中一個即可。
4設(shè)計 AI 身份,全自動處理數(shù)據(jù)
前面說到,我們要運行 ChatGPT 返回的代碼,但是又要從它的回答中找出可運行的代碼,剔除其他提示/解釋性文字。這樣做難度太高了,主要是不確定性太高,畢竟 ChatGPT 的回答不可預(yù)測。所以在調(diào)用 ChatGPT 的時候,我們就應(yīng)該明確給出指示,讓 ChatGPT 只返回可運行的 Python 代碼,以及其他注意事項,這個指示可以根據(jù)上一步中提到的 “system” 角色來提出。這樣一來,前面提出的第一個問題就解決了。
根據(jù)上一步的描述,可以獲取 ChatGPT 的回答,但是這個回答是一個字符串,而我們的目的是使用我們自己電腦上的 Python 去運行給出的代碼,Python 中的內(nèi)置函數(shù) exec() 恰好具備這個能力!也就是說代碼運行的問題得以解決。
#?exec()?使用示范
exec('print(1+1)')???#?2
雖然代碼可以運行了,但是代碼運行后又迎來了新的問題,由于代碼是使用 exec() 函數(shù)運行的,運行后代碼中的變量全部無法直接訪問。實際上,當(dāng)函數(shù) exec() 在指定命名空間中運行字符串類型的代碼時,運行過程中的中間變量就可以保留在空間中,運行后我們再從命名空間中取出需要的變量即可。這樣第二個問題也得到了解決。
最后,連續(xù)對話的問題就比較容易了,我們將上一步 ChatGPT 返回的回答添加到與 ChatGPT 的對話記錄中即可。具體實現(xiàn)方法可以查看上一步(通過參數(shù) message 實現(xiàn))。在添加一些其他小功能后,得到了最終的程序。
import?openai
#?指定?OpenAI?API?的密鑰
openai.api_key?=?'***********************'
#?規(guī)定?ChatGPT?的身份以及給出答案的范圍
Describe?=?"你的身份是一個精通Python,能使用pandas等工具進行數(shù)據(jù)處理的專家,可以幫我解決問題,\
????你將會根據(jù)我描述的情景和問題給出相應(yīng)的數(shù)據(jù)處理代碼,并且給出的答案中僅包含代碼,\
????不需要額外的解釋說明。你的代碼不需要使用markdown格式輸出,只要把代碼以字符串的\
????形式給出即可。注意你給出答案的連續(xù)性,如果你之前給出的代碼中包含import語句,\
????那么不需要重復(fù)給出相同的import語句。"
#?定義和儲存歷史消息
BaseMessage?=?[{"role":"system",?"content":Describe}]
#?定義變量?result,用于儲存?ChatGPT?返回的代碼
result?=?''
#?定義命名空間,用于儲存結(jié)果
Space?=?{}
#?定義調(diào)用?ChatGPT?的函數(shù)
def?Chat_Code(Order,?Model="gpt-3.5-turbo"):
????'''
??? Order:告訴 ChatGPT 如何處理數(shù)據(jù)的命令
??? Model:使用的語言模型,默認(rèn)使用 gpt-3.5-turbo
????'''
????global?Space
????global?BaseMessage
????global?result
????#?以?"user"?的身份向?ChatGPT?提問,內(nèi)容為輸入的?Order
????##??不滿意回答時可以撤回上一步的歷史消息
????if?Order?==?"撤回上一步歷史消息":????
????????BaseMessage?=?BaseMessage[:-2]?????
?
????##?退出時清空命名空間并重置歷史消息
????elif?Order?==?"exit":
????????Space?=?{}
????????BaseMessage?=?[{"role":"system",?"content":Describe}]
????????result?=?""
????##?正常提問
????else:
????????Message?=?{"role":"user",?"content":Order}
????????##?將提問內(nèi)容加入歷史消息,實現(xiàn)連續(xù)對話功能
????????BaseMessage.append(Message)
????????#?使用函數(shù)?openai.ChatCompletion.create()?得到?ChatGPT?返回的響應(yīng)信息
????????response?=?openai.ChatCompletion.create(
????????????model?=?Model,
????????????messages?=?BaseMessage
????????)
????????
????????#?提取響應(yīng)中的的代碼,存入變量?result?
????????result?=?response['choices'][0]['message']['content']
????????#?將?ChatGPT?給出的代碼存入歷史消息中,更新歷史對話
????????add?=?{"role":"assistant",?"content":result}
????????BaseMessage.append(add)
????????print(result)??#?查看?ChatGPT?給出的解決代碼
????????##?指定在創(chuàng)建的命名空間中執(zhí)行代碼,并將結(jié)果存儲在該空間中
????????exec(result,?globals(),?Space)
上文中數(shù)據(jù)可視化的對話過程和實際的返回結(jié)果如下。
第一條指令:
Chat_Code(Order?=?"將當(dāng)前目錄下名為“中國歷年數(shù)字經(jīng)濟核心產(chǎn)業(yè)大類被授權(quán)實用新型專利申請數(shù).xlsx”的文件以dataframe數(shù)據(jù)類型導(dǎo)入,并命名為data。")
結(jié)果如下:
第二條指令:
Chat_Code(Order?=?"使用data中的數(shù)據(jù),以“申請年份”為橫軸,分別以\
??????????“01數(shù)字產(chǎn)品制造業(yè)被授權(quán)實用新型專利數(shù)”、\
??????????“02數(shù)字產(chǎn)品服務(wù)業(yè)被授權(quán)實用新型專利數(shù)”、\
??????????“03數(shù)字技術(shù)應(yīng)用業(yè)被授權(quán)實用新型專利數(shù)”和\
??????????“04數(shù)字要素驅(qū)動業(yè)被授權(quán)實用新型專利數(shù)”為縱軸,繪制四條折線圖。")
第三條指令:
Chat_Code(Order?=?"將四個圖例分別修改成“數(shù)字產(chǎn)品制造業(yè)”、\
????????????“數(shù)字產(chǎn)品服務(wù)業(yè)”、\
????????????“數(shù)字產(chǎn)品應(yīng)用業(yè)”和\
????????????“數(shù)字要素驅(qū)動業(yè)”。")
第四條指令:
Chat_Code(Order?=?"在折線圖右邊添加一個縱軸,\
????????????內(nèi)容是data中的“被授權(quán)實用新型專利數(shù)”字段,\
????????????橫軸不變,在折線圖中添加一幅柱狀圖。")
Part5再談此次探索
從上文內(nèi)容中,Python 與 ChatGPT 的結(jié)合確實能夠讓我們的數(shù)據(jù)處理工作變得簡單方便很多。如果延伸一下,我們是不是也可以用它去做一些更復(fù)雜,更有意義的事情呢?我們認(rèn)為,這一定是可行的,不過隨著問題難度的增加,影響因素也會更多,最后的成功率也會降低。從這次探索,我們也積累了一些運用 ChatGPT 自動化處理數(shù)據(jù)的經(jīng)驗,下面分享給大家。
-
AI 的角色十分重要,正如上文中寫到的那樣,我們用了幾百個字來給 AI 一個初始角色,并限制它的答復(fù)格式,所以設(shè)計 AI 角色時,需要盡可能詳細(xì)地描述。
-
提問或者設(shè)計 AI 身份時,語言不要出現(xiàn)歧義。例如在最初設(shè)計 AI 角色時,我們只要求 AI 僅返回可運行的代碼,但 AI 的回復(fù)結(jié)果中依然包含一些解釋性文字。仔細(xì)想一下,這句話(提出的要求)其實是存在歧義的,AI 可能誤以為只要不給出不可運行的代碼就可以了,與解釋性文字無關(guān)。
-
AI 只聽從絕對命令,我們不能指望 AI 去實現(xiàn)我們沒有說出來的事情。例如上文第四條命令中,我們要求 AI 在折線圖的右側(cè)也加一個縱軸,這里筆者內(nèi)心就默認(rèn)了新添加的縱軸和原來的左側(cè)縱軸上的刻度是一致的,只有這樣才會更加嚴(yán)謹(jǐn)。但是實際上 AI 并沒有這樣做,給出的結(jié)果中兩個縱軸的刻度完全沒有關(guān)系,這也導(dǎo)致圖中的柱狀圖雖然美觀,卻不嚴(yán)謹(jǐn)。這個問題的根本原因就是我們沒有主動提出這個要求,那么 AI 會不會這樣做就要看它的心情了。所以為了使 AI 的回答更加嚴(yán)謹(jǐn),我們在提問時需要盡可能給出準(zhǔn)確、細(xì)致的要求,越具體越好,比如新添加的柱形圖的刻度與左側(cè)的坐標(biāo)軸刻度保持一致等等。
-
如果需要讓 AI 幫你處理數(shù)據(jù),那么一定要描述你的數(shù)據(jù),例如有哪些字段,其中存儲什么數(shù)據(jù),否則 AI 給出的代碼可能無法運行。
-
AI 給出的代碼不可能完全正確。影響因素有很多,例如不同版本的 Python 語法不同、不同版本的第三方庫語法不同、某個功能已經(jīng)刪除但是 AI 不知道……所以我們不能一味地相信它給出的代碼,最好對其回答的正確性有個初步的判斷,如果發(fā)現(xiàn)了問題,可以進一步向 AI 提出更改的要求。
-
……文章來源:http://www.zghlxwxcb.cn/news/detail-687622.html
Part6總結(jié)
AI 是一個聰明的腦袋,Python 是一副矯健的身體,兩者只需要簡單地結(jié)合一下,就能夠發(fā)揮出強大的威力,為我們的數(shù)據(jù)處理帶來了許多便利。文章來源地址http://www.zghlxwxcb.cn/news/detail-687622.html
到了這里,關(guān)于Python 實戰(zhàn)之ChatGPT + Python 實現(xiàn)全自動數(shù)據(jù)處理/可視化詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!