只要會寫 Python 的人,都能簡單上手的 ChatGPT Python API

Pecu Tsai
7 min readMar 11, 2023

--

作者:臺師大科技系 PecuLab 蔡芸琤 (Pecu)

因為我在臉書發了這篇文章 https://www.facebook.com/pecu.tsai/posts/10221251225176925

所以,決定把操作步驟寫下來分享給更多人,讓人人都能享受到駕馭 AI 的快感。

接下來的操作目標,也寫在這篇臉書貼文 https://www.facebook.com/pecu.tsai/posts/10221251409861542

正題開始:

要先到 https://platform.openai.com/docs/guides/chat 註冊 ChatGPT API,取得 Key。

  1. 參考 https://platform.openai.com/docs/api-reference/introduction 安裝 ChatGPT Python API。(這裡的先備知識是,要先知道怎麼使用 Python,以及知道如何在 CLI 中用 pip install,如果到這邊看不懂,可以先跳開去搜尋 Python 基礎教學相關線上資源。)
  2. 一邊參照使用手冊 https://platform.openai.com/docs/api-reference/chat/create,以下為 Create chat completion 的示範。

前置作業:

  1. 已經安裝好 Python (可使用 Anaconda 懶人包,或是官方原生的 Python)。
  2. 已經安裝好編輯器 (可使用 Jupyter Notebook 或是 VS Code)。
  3. 準備一堆長篇文字檔,最好是你曾經貼過一堆文章到 ChatGPT,被回應因為文章太長而無法處理的經驗,在繼續看接下來的示範,會更有感覺。

Pecu 程式碼範例:https://github.com/pecu/peculab/blob/main/ChatGPT/ChatGPT_API.py

以下是程式碼說明:

  1. 先將準備好的長文存在 txt 檔中,並透過 Python 將檔案讀入,存成一個 str 的變數 itemlist。
import openai

with open('./data/程式語言_Week3_Python基礎02.txt', 'r', encoding='utf-8') as fh:
tmp = fh.read()
itemlist = tmp.split(',')


itemlist = str(itemlist)

2. 將自己從 ChatGPT API 登入畫面中取得的 Key 放在另一個檔案,再將 Key 讀入,可避免自己公開程式碼時,把自己的 Key 也曝光了。

keyfile = open("key.txt", "r")
key = keyfile.readline()

openai.api_key = key

3. 因為,ChatGPT API 也有限制 4096 Token 的長度條件 (1000 Tokens 大約是 750 個英文字,或 400 個中文字),所以,要自己改寫一個迴圈,批次將文章一段段讀入後,才塞入 openai.ChatCompletion.create 的 messages 裡面。start_idx 和 end_idx 在控制每輪迴圈執行時,要取得的字串起訖 index,依照這段 index 範圍取出的內容,存入該次的 sub_list 變數中,接著將這段變數資料,與 messages 裡的 json 格式進行合併,就可執行 openai.ChatCompletion.create 後取出 response,那到該次段落的中文摘要與英文翻譯,並寫入 output.txt 中,直到文章結束。

start_idx = 0
result = ''
while start_idx < len(itemlist):
end_idx = min(start_idx + 1600, len(itemlist))
sub_list = itemlist[start_idx:end_idx]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a chatbot"},
{"role": "user", "content": f"提供以上文字之繁體中文摘要與英文翻譯:{sub_list}"}
]
)
for choice in response.choices:
result += choice.message.content
print(start_idx)
start_idx = end_idx

with open('output.txt', 'w', encoding='utf-8') as output_file:
output_file.write(result)

我把自己定位在非資訊專家,而是會聰明使用工具的生活實踐家。真正的資訊專家就是那些發明 API 給我們用的大神們,平凡如我,只要等著神仙打架,就會有新的 AI 好工具掉下來給我使用。

相關的操作過程與 Live Coding 會放在我的四門課程中,以下為四門課的直播清單,有興趣的人可以再自行服用。

111–2 學期臺師大科技系程式語言 https://youtube.com/playlist?list=PLH3VeiMX0ckhOIbUi2Qnjq89ZHXF260xO

111–2 學期臺師大科技系資料結構 https://youtube.com/playlist?list=PLH3VeiMX0cki-JIJVIP7zjFv30W87fbKv

111–2 學期臺師大科技系系統分析與設計 https://youtube.com/playlist?list=PLH3VeiMX0ckjtirHLjS-JgxEFqAXO1X86

111–2 學期臺師大教育大數據微學程學習分析工具與實務 https://youtube.com/playlist?list=PLH3VeiMX0ckiBTEYePXLZl7kMlbC--bZt

建議高手們直接瀏覽官方文件或是當次下載的 API 套件包程式碼,因為 API 變動實在太快,有可能我現在寫的這段範例,過一陣子,又不適用了 (會出錯的原因包羅萬象,有可能是 API 的in-out 接口又被改過,或是模型更新,不再是 gpt-3.5-turbo)。

至於要如何擴充自己的資料集,讓 ChatGPT 變成你專屬的貼身秘書,而不是像現在這樣子有答非所問的狀況,想要讓 ChatGPT 能消化你過往的知識,變成你的好幫手,再於 2023–03–13 晚上七點之後,直接瀏覽我上面貼的那幾個撥放清單 (Fine-tuning 的教學步驟有點懶得寫了)。

--

--