大型語言模型(Large Language Model, LLM),例如ChatGPT,除了提供影像/文字/語音的生成(Generation)、彙總(Summarization)、資料檢索(Extraction)、翻譯(Translation)、語音辨識(Speech recognition)、圖像修復(Inpainting)、圖像延伸(Outpainting)...等外,還包括許多程式方面的功能,可參閱下圖:
這些功能可以提升開發團隊的生產力,我們就來好好研究一番吧。由於,ChatGPT有關程式的訓練資料大部份來自GitHub,而且絕大多數是Python語言的程式碼,如何善用ChatGPT,提升開發生產力,是Python開發工程師必備的技能。
內容將包括下列主題:
假設我們對某一領域的程式設計不熟悉,可以請ChatGPT生成程式並作解釋,讓新手很容易入門。
範例1. 生成機器學習的程式。
請提供機器學習的乳癌診斷的分類程式碼
pip install scikit-learn pandas numpy
1. 載入資料集:使用Scikit-learn中的load_breast_cancer()函數載入乳癌資料集。
2. 分割數據:將資料分為訓練集(70%)和測試集(30%)。
3. 建立模型:使用隨機森林分類器進行訓練。
4. 評估模型:預測測試集結果並輸出模型的準確率、分類報告及混淆矩陣。
• 準確率:模型在測試集上的表現。
• 分類報告:包含每個分類(良性/惡性)的精確率、召回率和F1分數。
• 混淆矩陣:顯示模型的預測結果和實際情況之間的關係。
這個分類器可以有效地幫助識別乳癌數據集中的良性和惡性腫瘤。
python breast_cancer_classification.py
範例2. 訓練迴歸模型預測銷售量。
請提供訓練迴歸模型預測銷售量的程式碼
python regression_test.py
TV Radio Newspaper Sales
0 118.616634 33.891424 3.990592 11.839271
1 285.707149 8.786298 27.174034 17.621722
2 222.278243 12.273292 15.652319 15.940227
3 183.610960 45.434938 24.967267 15.652903
4 55.245406 32.289308 10.281438 8.589531
模型係數: [0.04858591 0.09112536 0.05050901]
模型截距: 3.256508185153928
均方誤差 (MSE): 3.86
R平方值 (R2 score): 0.84
範例3. 請ChatGPT為程式碼添加註解。
請提供以下程式碼註解:
import unittest
from unittest.mock import Mock
import requests
from requests.exceptions import Timeout
from dataclasses import dataclass
@dataclass
class Response:
status_code:int
json:str
requests = Mock()
requests.get.return_value = Response(status_code=200, json={'data':'wondful'})
def get_holidays():
r = requests.get("http://localhost/api/holidays")
if r.status_code == 200:
return r.json
return None
class TestHolidays(unittest.TestCase):
def test_get_holidays_timeout(self):
print(get_holidays())
if __name__ == "__main__":
unittest.main()
import unittest # 引入單元測試模組,允許編寫和運行測試
from unittest.mock import Mock # 引入Mock模組,用於模擬對象的行為
import requests # 引入requests庫,用於發送HTTP請求
from requests.exceptions import Timeout # 引入Timeout異常,以便處理超時情況
from dataclasses import dataclass # 引入dataclass,用來簡化類的定義
@dataclass
class Response:
status_code: int
json: str
# 定義Response類來模擬requests的回應物件。使用dataclass簡化類定義:
# - status_code: 用來存儲HTTP狀態碼 (例如200表示成功)
# - json: 用來存儲模擬的JSON數據
# 創建一個Mock對象來替代requests模組
requests = Mock()
# 設定Mock對象的get方法,使其返回模擬的Response對象
requests.get.return_value = Response(status_code=200, json={'data': 'wondful'})
# 定義一個函數來發送HTTP GET請求並處理回應
def get_holidays():
# 發送一個模擬的GET請求,請求URL為"http://localhost/api/holidays"
r = requests.get("http://localhost/api/holidays")
# 檢查回應的狀態碼,如果為200則返回JSON數據
if r.status_code == 200:
return r.json
# 如果狀態碼不是200,則返回None
return None
# 創建一個單元測試類,繼承自unittest.TestCase
class TestHolidays(unittest.TestCase):
# 定義一個測試方法,用來測試get_holidays函數的行為
def test_get_holidays_timeout(self):
# 打印get_holidays()的結果。這裡實際上是測試get_holidays函數的行為
print(get_holidays())
# 如果這個腳本是直接執行的,運行所有的單元測試
if __name__ == "__main__":
unittest.main()
上一個範例【程式-->註解】,這次恰好相反,以【規格或註解-->程式】。
範例4. 輸入規格生成程式。
Here's a Python function that achieves the task of cropping the perimeter rows and columns of an image if their mean value is below a given threshold. The function uses the Pillow library to load the image and numpy to handle the image as an array for processing.
cropped_image_array = crop_dark_perimeter('chicago.jpg', threshold=50)
img = Image.fromarray(cropped_image_array)
img.show()
提供一段程式,請ChatGPT逐行解釋。
範例4. 輸入規格生成程式。
請解釋以下程式:
@login_required()
def choice_update(request):
choice_id = request.POST.get("id", "")
choice = get_object_or_404(Choice, pk=choice_id)
question_id = choice.question.id
choice.name = request.POST.get("name", "")
choice.seq_no = request.POST.get("seq_no")
choice.choice_text = request.POST.get("choice_text", "")
choice.save()
return question_detail(request, question_id)
我們也可以請ChatGPT幫我們重構(Refactoring)程式,這對於Code review也很有幫助,讓新手知道正確的程式寫法。
範例4. 重構【9x9乘法表列印】的程式碼。
refactor the following code:
for i in range(1,10):
for j in range(1,10):
print(f'{i}x{j} = {i*j:2d}', end=' ')
print()
def print_multiplication_table():
for i in range(1, 10):
row = [f'{i}x{j} = {i*j:2d}' for j in range(1, 10)]
print(' '.join(row))
print_multiplication_table()
add comment
def print_multiplication_table():
"""
Prints the multiplication table from 1 to 9.
Each row represents the multiplication of a number with all numbers from 1 to 9.
"""
for i in range(1, 10): # Iterate through numbers 1 to 9 for the multiplication table
# Create a list for the current row of the multiplication table
row = [f'{i}x{j} = {i*j:2d}' for j in range(1, 10)] # Calculate and format each multiplication
# Print the current row by joining the elements with two spaces
print(' '.join(row))
# Call the function to print the multiplication table
print_multiplication_table()
ChatGPT重構可以作為程式設計師的虛擬數位老師,同時生成程式註解,可節省許多時間,並解決程式設計師不喜歡寫文件/註解的困擾。
相信以上的功能已經可以說服我們,ChatGPT確實能提升開發團隊的生產力,以前IT主管不厭其煩的要求程式設計師,必須撰寫註解、準備測試案例、程式模組化,藉由ChatGPT的協助,輕鬆就可以完成,程式設計師不可以再有藉口嘍。
由於篇幅已過長,其他功能留待下次繼續討論,Happy coding!!
本系列的程式碼會統一放在GitHub,本篇的程式放在src/19資料夾,歡迎讀者下載測試,如有錯誤或疏漏,請不吝指正。