手把手教你使用 Python 呼叫 ChatGPT-3.5-API
大家好,我是老表
前天 OpenAI 開放了兩個新模型的api介面,專門為聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。
ChatGPT is powered by gpt-3.5-turbo, OpenAI’s most advanced language model.
從上面這句話,我們可以知道現在 chat.openai.com 官網就是由 gpt-3.5-turbo 模型提供的服務,現在官方公開了這一模型的呼叫介面,這使得我們這些普通開發者也能直接在自己的應用/服務中使用這個狂攬億萬使用者的模型。
接下來將和大家介紹如何利用 Python 快速玩轉 gpt-3.5-turbo。
本文所有程式碼已開源,持續更新中:XksA-me/ChatGPT-3.5-AP
先跑起來,再理解
首先你需要有一個 openai 賬號,如何註冊我就不多說了,網上教程很多,而且很詳細,如果有問題可以加我微信:pythonbrief,新增通過後請直接描述你的問題+問題截圖。
訪問下面頁面,登入 openai 賬號後,建立一個 api keys。 ```bash
api keys 建立頁面
https://platform.openai.com/account/api-keys ```
接下來很簡單了,安裝 openai 官方的 Python SDK,這裡需要注意的是得安裝最新版本 openai,官方推薦的是 0.27.0 版本。
bash
pip install openai==0.27.0
直接上請求程式碼: ```python import openai import json
目前需要設定代理才可以訪問 api
os.environ["HTTP_PROXY"] = "自己的代理地址" os.environ["HTTPS_PROXY"] = "自己的代理地址"
def get_api_key(): # 可以自己根據自己實際情況實現 # 以我為例子,我是存在一個 openai_key 檔案裡,json 格式 ''' {"api": "你的 api keys"} ''' openai_key_file = '../envs/openai_key' with open(openai_key_file, 'r', encoding='utf-8') as f: openai_key = json.loads(f.read()) return openai_key['api']
openai.api_key = get_api_key()
q = "用python實現:提示手動輸入3個不同的3位數區間,輸入結束後計算這3個區間的交集,並輸出結果區間" rsp = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "一個有10年Python開發經驗的資深演算法工程師"}, {"role": "user", "content": q} ] ) ``` 程式碼解析: - get_api_key() 函式是我自己寫的一個從檔案讀取 api keys 的方法,我是存在一個 openai_key 檔案裡,json 格式,你可以改成你自己的獲取方法,甚至可以直接寫到程式碼裡(雖然不推薦,但確實最簡單)。
- q 是請求的問題
- rsp 是傳送請求後返回結果
- openai.ChatCompletion.create 中引數
-
- model 是使用的模型名稱,是一個字串,用最新模型直接設定成
gpt-3.5-turbo
即可
- model 是使用的模型名稱,是一個字串,用最新模型直接設定成
-
- messages 是請求的文字內容,是一個列表,列表裡每個元素型別是字典,具體含義如下表:
- messages 是請求的文字內容,是一個列表,列表裡每個元素型別是字典,具體含義如下表:
-
程式執行返回內容,從響應回覆內容我們可以看到,回覆內容是一個 json 字串,
我們可以通過以下方法直接獲取相關資訊:
-
- 返回訊息內容
bash rsp.get("choices")[0]["message"]["content"]
- 返回訊息內容
-
- 角色
bash rsp.get("choices")[0]["message"]["role"]
- 角色
-
- 問題+回答總長度
bash rsp.get("usage")["total_tokens"]
其他資訊也可以通過類似方法獲取。
- 問題+回答總長度
-
測試 ChatGPT 回答程式碼執行情況,可以看出程式碼邏輯和執行都沒啥問題,註釋也到位。
實現多輪對話
如何實現多輪對話?
gpt-3.5-turbo 模型呼叫方法 openai.ChatCompletion.create 裡傳入的 message 是一個列表,列表裡每個元素是字典,包含了角色和內容,我們只需將每輪對話都儲存起來,然後每次提問都帶上之前的問題和回答即可。
- 效果圖
-
- 可以看到,我首先問了“1+1=幾”,然後問“為什麼是這樣”,ChatGPT 會根據前面的提問將新問題識別為“為什麼1+1=2”。
-
- 後面繼續問水仙花數有哪些,再問“如何寫個python程式來識別這些數”,ChatGPT 同樣會根據前面的提問將新問題識別為“如何寫個python程式來識別這些水仙花數”,並給出對應解答。
-
實現程式碼
```bash import openai import json import os
os.environ["HTTP_PROXY"] = "http://127.0.0.1:7890" os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890"
獲取 api
def get_api_key(): # 可以自己根據自己實際情況實現 # 以我為例子,我是存在一個 openai_key 檔案裡,json 格式 ''' {"api": "你的 api keys"} ''' openai_key_file = '../envs/openai_key' with open(openai_key_file, 'r', encoding='utf-8') as f: openai_key = json.loads(f.read()) return openai_key['api'] openai.api_key = get_api_key()
class ChatGPT: def init(self, user): self.user = user self.messages = [{"role": "system", "content": "一個有10年Python開發經驗的資深演算法工程師"}] self.filename="./user_messages.json"
def ask_gpt(self):
# q = "用python實現:提示手動輸入3個不同的3位數區間,輸入結束後計算這3個區間的交集,並輸出結果區間"
rsp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=self.messages
)
return rsp.get("choices")[0]["message"]["content"]
def writeTojson(self):
try:
# 判斷檔案是否存在
if not os.path.exists(self.filename):
with open(self.filename, "w") as f:
# 建立檔案
pass
# 讀取
with open(self.filename, 'r', encoding='utf-8') as f:
content = f.read()
msgs = json.loads(content) if len(content) > 0 else {}
# 追加
msgs.update({self.user : self.messages})
# 寫入
with open(self.filename, 'w', encoding='utf-8') as f:
json.dump(msgs, f)
except Exception as e:
print(f"錯誤程式碼:{e}")
def main(): user = input("請輸入使用者名稱稱: ") chat = ChatGPT(user)
# 迴圈
while 1:
# 限制對話次數
if len(chat.messages) >= 11:
print("******************************")
print("*********強制重置對話**********")
print("******************************")
# 寫入之前資訊
chat.writeTojson()
user = input("請輸入使用者名稱稱: ")
chat = ChatGPT(user)
# 提問
q = input(f"【{chat.user}】")
# 邏輯判斷
if q == "0":
print("*********退出程式**********")
# 寫入之前資訊
chat.writeTojson()
break
elif q == "1":
print("**************************")
print("*********重置對話**********")
print("**************************")
# 寫入之前資訊
chat.writeTojson()
user = input("請輸入使用者名稱稱: ")
chat = ChatGPT(user)
continue
# 提問-回答-記錄
chat.messages.append({"role": "user", "content": q})
answer = chat.ask_gpt()
print(f"【ChatGPT】{answer}")
chat.messages.append({"role": "assistant", "content": answer})
if name == 'main':
main()
``
**程式碼解析:**
-
ChatGPT類,包含三個函式:
- -
init初始化函式,初始化了三個個例項變數,user、messages、filename(當前使用者、訊息列表、儲存記錄的檔案路徑)。
- -
ask_gpt函式,將當前使用者所有歷史訊息+最新提問傳送給 gpt-3.5-turbo ,並返回響應結果。
- -
writeTojson`函式,結束/重置使用者時記錄當前使用者之前的訪問資料。
-
main
函式,程式入口函式,使用者輸入使用者名稱後進入與 ChatGPT 的迴圈對話中,輸入 0 退出程式,輸入 1 重置使用者,退出和重置都會將當前使用者之前訪問資料記錄搭配 json 檔案中。 -
由於 gpt-3.5-turbo 單次請求最大 token 數為:4096,所以程式碼裡限制了下對話次數。
更多拓展
- 你可以寫個函式,從 json 檔案讀取歷史使用者訪問記錄,然後每次訪問可以選使用者。
- 你可以寫個 web 服務,使用 session 或者資料庫支援多使用者同時登入,同時訪問。
- 你可以基於之前分享的釘釘機器人專案,將 gpt-3.5-turbo 接入釘釘機器人。
你還可以上 Github 搜尋更多 ChatGPT 相關專案,或者其他有意思的專案學習練手,歡迎學習交流。
我建立了個 ChatGPT 應用交流群,如果你感興趣可以掃下方二維碼新增我微信申請加入。
專案已開源,持續更新中:XksA-me/ChatGPT-3.5-AP
- 手把手教你使用 Python 呼叫 ChatGPT-3.5-API
- 情人節Github開源專案大“賞”,花樣表白她!
- 炒股賠光家底,賣水果年入100億,“江西老表”要去IPO了
- 伺服器被黑客攻擊,用來挖礦!怎麼辦?
- “一戶一墩”,手把手教你用Python搶冰墩墩
- 擁有一臺伺服器後,我竟然這麼酷?
- 終於有了一個人人可以訪問的網站了
- 資料分析從零開始實戰,Pandas讀取HTML頁面 資料處理解析
- 資料分析從零開始實戰,Pandas讀寫CSV資料
- Linux裡的“寶塔”,真正的寶塔!詳細教程
- 手把手教大家如何給域名申請免費SSL證書
- 馬拉車演算法解最長迴文子串!Manacher
- 快速搞定Go語言環境,幫你避坑
- 怎麼自學Python,大概要多久?
- Django中的超級使用者和自己建立app原來這麼簡單!
- 兩個排序陣列的中位數,“最”有技術含量的解法!
- 一行程式碼獲取股票、基金資料,並繪製K線圖
- Windows下安裝、使用Pycharm教程,這下全了
- 慶國慶微信頭像處理這麼簡單?幾行程式碼一秒出圖
- Python資料儲存讀取,6千字搞定各種方法