在生成式AI與大型語言模型(Large Language Model, LLM)蓬勃發展下,有許多工具可以幫助我們學習與撰寫程式,例如ChatGPT或Copilot,ChatGPT有免費的GPT-3.5可以使用,或付費使用GPT-4;Copilot則是有30天試用期,試用完可選擇付月費或年費。以下列舉兩個我使用ChatGPT學習程式語言的情境,這邊使用的都是免費的GPT-3.5,因此不能用GPT-4 Code Interpreter 的功能,以下將提出一些範例與使用上的建議。
在開始之前,先說明一下LLM常用的術語,首先是「指令」、「提示」或「詠唱詞」,其實就是用戶的請求和問題,英文為Prompt;模型根據給定的Prompt生成的回應,英文則是Completion。
因為程式語言充滿各種模組及套件,要實現同一個功能,可能有好幾種方式,因此,在學習或想要實現某種功能時,先詢問ChatGPT有哪些方法/模組可以完成,能夠省去探索的時間,並讓ChatGPT給出範例程式碼,更是可以事半功倍。
以下提供一個指令(Prompt)的範例,如果我想要學自然語言處理的內容,並且想做情緒分析,我可以這樣詢問:如何用python作文本情緒分析,請給我作業流程與範例程式碼
結果發現,他的確給出了流程與範例程式碼,但我們想用不同方法實現,因此,換一個問法:如何用python作文本情緒分析,請給我至少三種不同的作業流程與範例程式碼
。給出的結果如下:
1.基於情感詞典的情緒分析:這種方法使用情感詞典來對文本進行情感分析,如VADER情感詞典。這是一種快速且容易實現的方法。
2.使用機器學習模型進行情緒分析:這種方法使用機器學習模型,如支持向量機(SVM)或隨機森林(Random Forest)等,將文本分類為正面、負面或中性。
3.使用深度學習模型進行情緒分析:這種方法使用深度學習模型,如循環神經網絡(RNN)或轉former,通常需要更大的數據集來獲得更好的效果。
可以看到,ChatGPT給出了深度學習以外的另外兩種方法,如此一來,對於用Python進行文本情緒分析便有基礎的概念,可以進一步追問或者去google相關領域的知識,並用其提供的範例程式碼進行操作,以此來加快學習的步伐。
總之,用ChatGPT諮詢學習方向/路徑,可以歸結成以下問法:
如何用 [某個程式語言] 作 [某個任務] , [詳細說明或者針對資料的敘述] ,請給我 [__種] 不同的作業流程與範例程式碼。
第二個我最常用的情境,就是直接叫AI幫忙寫程式了,只要跟ChatGPT講程式語言、具體任務、預期結果,通常都能夠得到很不錯的結果,以下為兩個例子的呈現。
我下的Prompt是我想要用python跑decision tree和random forest兩個模型,做的是分類的任務,並畫圖呈現訓練集跟測試集的學習曲線,X軸使用epoch
。
結果呈現如下,的確給了我用scikit-learn實現的程式碼,也能夠運行。
上面給出的程式碼,是生成一個範例的資料集,接著,我試圖敘述自己的資料集,請ChatGPT生成code:我有三個資料,avg_df、knn_df、linear_df,分別是用平均數、knn、linear三種方式填補空缺值處理完的資料。 想要用'pm2.5', 'o3'當作X,'status'當作Y,Y是一個類別變數,有0、1、2、3四種類別。 我要訓練一個分類模型,分別套用以下五個模型:Decision Tree、Random Forest、SVC、Logistic Regression、K-Nearest Neighbors 最終的結果是想畫圖,每張圖代表一個模型,X軸為不同參數,並且有三條線分別表示套用三個資料下的預測準確率。 超參數的部分,Decision Tree用ccp_alpha,Random Forest用min_df,SVC用kernel,Logistic Regression用C,K-Nearest Neighbors用n_neighbors。 請給我python的code,註解請用繁體中文。
這樣的問法,的確成功生成了我想要的結果,而且完全沒有錯誤,非常厲害!
第二個範例,是想做一個查詢財報資訊的程式,用到的技術是網路爬蟲。網路爬蟲本來就是GPT比較難實踐的一個任務,因此,我試圖用各種方式不斷修正,最終成功獲得可以運行的程式碼。
首先,我的任務是,有一些券商的網站可以找到上市櫃公司的年報/季報,因此我想要把有興趣的財務指標抓下來,作為投資決策參考。
此時,我下的prompt為:元大證券網站中,台積電(2330)的各年財務報表,網址為http://jdata.yuanta.com.tw/z/zc/zcr/zcr0.djhtm?b=Y&a=2330 我想要抓取每年的「每股盈餘」、「營業毛利率」,抓取的時候用「科目名稱」進行抓取,撰寫環境是Google colab,請給我程式碼
。
ChatGPT給了我一段程式與說明,說明如下:
這個程式碼使用requests
模組從元大證券網站獲取台積電的財務報表網頁資料。然後,使用BeautifulSoup
模組對網頁資料進行解析,找到表格並抓取每年的每股盈餘和營業毛利率資料。根據表格標題的科目名稱進行索引,找到對應的欄位資料。最後,使用pandas
模組將資料轉換成DataFrame,並印出結果。
請注意,網站的結構可能會有所更改,導致程式碼無法正確運行。如果發生這種情況,您可能需要根據網站的新結構調整程式碼。
結果貼到Python環境運行,發現無法運行。於是我把網頁原始碼(程式中變數soup
)的內容貼給他看,裡面包括我要抓的財報資訊,目的是讓模型知道要抓的資訊在網頁結構中的哪個位置,並打上prompt如下:請依據以上原始碼,抓取每年的「每股盈餘」、「營業毛利率」,抓取的時候用「科目名稱」進行抓取,撰寫環境是Google colab,請給我程式碼
給了原始碼內容,果然就有成功生成表格了,但抓到的內容只有兩年,網頁中卻有八年,因此仍不完整。
因此,我給了ChatGPT更明確的修正指令:抓到資料了,但資料有點錯誤,
1. 「每股盈餘」、「營業毛利率」,應該是出現在最左邊的column,因此要用最左邊的column進行篩選
2. 原始資料的每個row代表期別,這邊只抓了期別為2022、2021,我要完整的資料共9個row,欄位名稱應該包括['期別','2022','2021','2020','2019','2018','2017','2016','2015'],以上,請幫我修正
修正結果果然成功了,接著,再用修正好的程式碼,請ChatGPT幫我寫一個查詢功能。我下的prompt,是把修正好的程式碼貼給他,並且也給他看輸出的資料框(Data Frame)格式,這邊要將表格轉成ChatGPT看得懂的格式,在GPT-3.5不能傳檔案的情況下也是可以達成的,只要把Table轉成Markdown就可以,因此,我下的Prompt如下:以下是我目前的程式碼:.........。
抓下來的dataframe(df)前幾行如下:.........。
其中,抓取的網站只要更改公司代碼,就可以查詢其他公司,例如,想抓取台積電(2330),網址為http://jdata.yuanta.com.tw/z/zc/zcr/zcr0.djhtm?b=Y&a=2330;想抓取鴻海(2317),網址為http://jdata.yuanta.com.tw/z/zc/zcr/zcr0.djhtm?b=Y&a=2317
抓下來的dataframe中,第一個欄位是科目名稱,請幫我改寫上面程式碼,改寫成我可以輸入多個我想要查詢的公司代碼、科目名稱,並呈現結果。
最終,也成功得到結果了,結果如下所示。
最後,分享給大家這個完全由ChatGPT(GPT-3.5)寫出來的爬蟲程式,可以丟到Google Colab上面玩玩喔。
# 輸入多個公司代碼和科目名稱
companies = {'台積電': '2330', '鴻海': '2317'}
subjects = ['每股盈餘', '營業毛利率']
# 載入必要模組
import requests
import pandas as pd
from bs4 import BeautifulSoup
# 定義取得財報的函式
def get_financial_data(company_code, subject_names):
url = f'http://jdata.yuanta.com.tw/z/zc/zcr/zcr0.djhtm?b=Y&a={company_code}'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
table = soup.find('table', id='oMainTable')
headers = ['期別','2022','2021','2020','2019','2018','2017','2016','2015']
data = []
rows = table.select('div.table-row')
for row in rows:
cells = row.select('span.table-cell')
subject = cells[0].text.strip()
if subject in subject_names:
values = [cell.text.strip() for cell in cells[1:]]
data.append([subject] + values)
df = pd.DataFrame(data, columns=headers)
return df
# 取得不同公司的資料並合併
dfs = []
for company_name, company_code in companies.items():
df_company = get_financial_data(company_code, subjects)
dfs.append(df_company)
result_df = pd.concat(dfs, keys=companies.keys(), names=['公司名稱'])
# 印出結果
result_df
目前的LLM真的日新月異,除了付費版GPT-4提供了可以上傳檔案,甚至用Python導出結果的功能外,還有優勢在於完全免費的最大競爭者Claude 2,未來必定還會推出更多免費與開源的AI工具,我們再拭目以待。
另外,使用這些工具時,我發現其實怎麼下指令(prompt)是最重要的,盡量說清楚情境、關鍵字,並且給範例、線索,最後明確表明想要的結果、成品的樣態。基本上都可以達到不錯的效果,在網路上也找得到許多指令的下達方式,例如這篇,提供了許多用ChatGPT寫程式的指令,可以參考。
最後,在現在工具如此發達的時代,正是所有人踏入資料科學、程式設計、流程自動化領域的最佳時機,因此,快握緊手把,一起飛快學習吧!
善用AI,可以跳過很多學習程式的障礙,用對方法,從入門到寫一個可用的功能,其實只需要不到一個禮拜的時間!