iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Python

Python 錦囊密技系列 第 19

【Python錦囊㊙️技19】ChatGPT如何提升開發團隊的生產力(1)

  • 分享至 

  • xImage
  •  

前言

大型語言模型(Large Language Model, LLM),例如ChatGPT,除了提供影像/文字/語音的生成(Generation)、彙總(Summarization)、資料檢索(Extraction)、翻譯(Translation)、語音辨識(Speech recognition)、圖像修復(Inpainting)、圖像延伸(Outpainting)...等外,還包括許多程式方面的功能,可參閱下圖:
https://ithelp.ithome.com.tw/upload/images/20241002/20001976f521fChX87.png

這些功能可以提升開發團隊的生產力,我們就來好好研究一番吧。由於,ChatGPT有關程式的訓練資料大部份來自GitHub,而且絕大多數是Python語言的程式碼,如何善用ChatGPT,提升開發生產力,是Python開發工程師必備的技能。

內容將包括下列主題:

  1. 特定領域的程式生成(Code generation)。
  2. 程式註解生成(Commentation)。
  3. 依據規格生成程式(Generate code by function spec.)。
  4. 程式教學(Code Explaination)。
  5. 重構(Refactoring)。
  6. 除錯(Debug)。
  7. 測試案例生成(Test case generation)。
  8. SQL生成(SQL generation)。
  9. SQL解析(SQL parsing)。
  10. 資料分析(EDA)。

程式生成

假設我們對某一領域的程式設計不熟悉,可以請ChatGPT生成程式並作解釋,讓新手很容易入門。

範例1. 生成機器學習的程式。

  1. 輸入提示(Prompt)如下:
請提供機器學習的乳癌診斷的分類程式碼
  1. ChatGPT的回應包括:
  • 套件安裝指令:
pip install scikit-learn pandas numpy
  • 程式碼:程式過長,不在本文顯示,請參閱19\breast_cancer_classification.py,內容有非常詳細的註解。
  • 程式碼說明:
1.	載入資料集:使用Scikit-learn中的load_breast_cancer()函數載入乳癌資料集。
2.	分割數據:將資料分為訓練集(70%)和測試集(30%)。
3.	建立模型:使用隨機森林分類器進行訓練。
4.	評估模型:預測測試集結果並輸出模型的準確率、分類報告及混淆矩陣。
  • 結果如下:
•	準確率:模型在測試集上的表現。
•	分類報告:包含每個分類(良性/惡性)的精確率、召回率和F1分數。
•	混淆矩陣:顯示模型的預測結果和實際情況之間的關係。
這個分類器可以有效地幫助識別乳癌數據集中的良性和惡性腫瘤。
  1. 測試:接著可以把程式碼存檔後執行。
python breast_cancer_classification.py
  1. 執行結果:沒有錯誤,無需修改即可執行。
    https://ithelp.ithome.com.tw/upload/images/20241002/20001976dfNbfCAlRR.png

範例2. 訓練迴歸模型預測銷售量。

  1. 輸入提示(Prompt)如下:
請提供訓練迴歸模型預測銷售量的程式碼
  1. ChatGPT的回應與範例1的段落是很相似,因為沒有現成資料集,改採生成隨機資料。
  2. 測試:程式碼存檔為19\regression_test.py後執行。
python regression_test.py
  1. 執行結果:沒有錯誤,無需修改即可執行。
           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為程式碼添加註解。

  1. 輸入提示(Prompt):程式碼來自18\mock_test4.py,刪除註解如下。
請提供以下程式碼註解:
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()
  1. ChatGPT的回應:太可怕了,不只註解非常詳細,而且ChatGPT還知道Response類別的作用,也瞭解Mock的使用。
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. 輸入規格生成程式。

  1. 輸入提示(Prompt)如下:大意是裁剪影像檔,如果列或行的平均值低於設定的門檻值,即將其裁剪。
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.
  1. ChatGPT的回應:複製程式碼,並修改最後2列如下,存檔為19\generate_code_from_spec.py後執行。
cropped_image_array = crop_dark_perimeter('chicago.jpg', threshold=50)
img = Image.fromarray(cropped_image_array)
img.show()
  1. 執行結果:會把chicago.jpg的黑邊框移除。
    https://ithelp.ithome.com.tw/upload/images/20241002/20001976FpGY3EErkp.png

程式教學。

提供一段程式,請ChatGPT逐行解釋。
範例4. 輸入規格生成程式。

  1. 輸入提示(Prompt)如下:自16\mysite\polls\views.py截取一段程式。
請解釋以下程式:
@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)
  1. ChatGPT的回應:太神了,竟然知道是Django視圖(View),部份回答如下圖。
    https://ithelp.ithome.com.tw/upload/images/20241002/20001976Mb8tFfhxgd.png

重構(Refactoring)

我們也可以請ChatGPT幫我們重構(Refactoring)程式,這對於Code review也很有幫助,讓新手知道正確的程式寫法。
範例4. 重構【9x9乘法表列印】的程式碼。

  1. 輸入提示(Prompt)如下:自16\mysite\polls\views.py截取一段程式。
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()
  1. ChatGPT的回應如下:幫我們改寫成函數,並使用List Comprehension,同時一次輸出一排資料,提高程式效率。
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()
  1. 因為生成的程式沒有註解,再輸入提示(Prompt)如下:。
add comment
  1. ChatGPT的回應如下:非常完美,註解非常詳細。
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資料夾,歡迎讀者下載測試,如有錯誤或疏漏,請不吝指正。


上一篇
【Python錦囊㊙️技18】單元測試(Unit Testing)進階篇
下一篇
【Python錦囊㊙️技20】ChatGPT如何提升開發團隊的生產力(2)
系列文
Python 錦囊密技30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言