手把手教你使用Python調(diào)用 ChatGPT!支持http代理
作者:虛壞叔叔
博客:https://xuhss.com
早餐店不會(huì)開(kāi)到晚上,想吃的人早就來(lái)了!??
前段時(shí)間OpenAI 開(kāi)放了兩個(gè)新模型的api接口,專門為聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。
ChatGPT is powered by gpt-3.5-turbo, OpenAI’s most advanced language model.
從上面這句話,我們可以知道現(xiàn)在 chat.openai.com 官網(wǎng)就是由 gpt-3.5-turbo 模型提供的服務(wù),現(xiàn)在官方公開(kāi)了這一模型的調(diào)用接口,這使得我們這些普通開(kāi)發(fā)者也能直接在自己的應(yīng)用/服務(wù)中使用這個(gè)狂攬億萬(wàn)用戶的模型。
接下來(lái)將和大家介紹如何利用 Python 快速玩轉(zhuǎn) gpt-3.5-turbo。
一、先跑起來(lái),再理解
首先你需要有一個(gè) openai 賬號(hào),如何注冊(cè)我就不多說(shuō)了,網(wǎng)上教程很多,而且很詳細(xì),如果有問(wèn)題可以加我微信:pythonbrief,添加通過(guò)后請(qǐng)直接描述你的問(wèn)題+問(wèn)題截圖。
訪問(wèn)下面頁(yè)面,登錄 openai 賬號(hào)后,創(chuàng)建一個(gè) api keys。
# api keys 創(chuàng)建頁(yè)面
https://platform.openai.com/account/api-keys
接下來(lái)很簡(jiǎn)單了,安裝 openai 官方的 Python SDK,這里需要注意的是得安裝最新版本 openai,官方推薦的是 0.27.0 版本。
pip install openai==0.27.0
直接上請(qǐng)求代碼:
import openai
import json
# 目前需要設(shè)置代理才可以訪問(wèn) api
os.environ["HTTP_PROXY"] = "自己的代理地址"
os.environ["HTTPS_PROXY"] = "自己的代理地址"
def get_api_key():
# 可以自己根據(jù)自己實(shí)際情況實(shí)現(xiàn)
# 以我為例子,我是存在一個(gè) 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實(shí)現(xiàn):提示手動(dòng)輸入3個(gè)不同的3位數(shù)區(qū)間,輸入結(jié)束后計(jì)算這3個(gè)區(qū)間的交集,并輸出結(jié)果區(qū)間"
rsp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "一個(gè)有10年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的資深算法工程師"},
{"role": "user", "content": q}
]
)
代碼解析:
- get_api_key() 函數(shù)是我自己寫(xiě)的一個(gè)從文件讀取 api keys 的方法,我是存在一個(gè) openai_key 文件里,json 格式,你可以改成你自己的獲取方法,甚至可以直接寫(xiě)到代碼里(雖然不推薦,但確實(shí)最簡(jiǎn)單)。
- q 是請(qǐng)求的問(wèn)題
- rsp 是發(fā)送請(qǐng)求后返回結(jié)果
- openai.ChatCompletion.create 中參數(shù)
- model 是使用的模型名稱,是一個(gè)字符串,用最新模型直接設(shè)置成gpt-3.5-turbo 即可
- messages 是請(qǐng)求的文本內(nèi)容,是一個(gè)列表,列表里每個(gè)元素類型是字典,具體含義如下表:
程序運(yùn)行返回內(nèi)容,從響應(yīng)回復(fù)內(nèi)容我們可以看到,回復(fù)內(nèi)容是一個(gè) json 字符串,
我們可以通過(guò)以下方法直接獲取相關(guān)信息:
返回消息內(nèi)容
rsp.get("choices")[0]["message"]["content"]
角色
rsp.get("choices")[0]["message"]["role"]
問(wèn)題+回答總長(zhǎng)度
rsp.get("usage")["total_tokens"]
其他信息也可以通過(guò)類似方法獲取。
- 測(cè)試 ChatGPT 回答代碼運(yùn)行情況,可以看出代碼邏輯和運(yùn)行都沒(méi)啥問(wèn)題,注釋也到位。
二、實(shí)現(xiàn)多輪對(duì)話
如何實(shí)現(xiàn)多輪對(duì)話?
gpt-3.5-turbo 模型調(diào)用方法 openai.ChatCompletion.create 里傳入的 message 是一個(gè)列表,列表里每個(gè)元素是字典,包含了角色和內(nèi)容,我們只需將每輪對(duì)話都存儲(chǔ)起來(lái),然后每次提問(wèn)都帶上之前的問(wèn)題和回答即可。
- 可以看到,我首先問(wèn)了“1+1=幾”,然后問(wèn)“為什么是這樣”,ChatGPT 會(huì)根據(jù)前面的提問(wèn)將新問(wèn)題識(shí)別為“為什么1+1=2”。
- 后面繼續(xù)問(wèn)水仙花數(shù)有哪些,再問(wèn)“如何寫(xiě)個(gè)python程序來(lái)識(shí)別這些數(shù)”,ChatGPT 同樣會(huì)根據(jù)前面的提問(wèn)將新問(wèn)題識(shí)別為“如何寫(xiě)個(gè)python程序來(lái)識(shí)別這些水仙花數(shù)”,并給出對(duì)應(yīng)解答。
實(shí)現(xiàn)代碼
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():
# 可以自己根據(jù)自己實(shí)際情況實(shí)現(xiàn)
# 以我為例子,我是存在一個(gè) 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": "一個(gè)有10年P(guān)ython開(kāi)發(fā)經(jīng)驗(yàn)的資深算法工程師"}]
self.filename="./user_messages.json"
def ask_gpt(self):
# q = "用python實(shí)現(xiàn):提示手動(dòng)輸入3個(gè)不同的3位數(shù)區(qū)間,輸入結(jié)束后計(jì)算這3個(gè)區(qū)間的交集,并輸出結(jié)果區(qū)間"
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:
# 創(chuàng)建文件
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})
# 寫(xiě)入
with open(self.filename, 'w', encoding='utf-8') as f:
json.dump(msgs, f)
except Exception as e:
print(f"錯(cuò)誤代碼:{e}")
def main():
user = input("請(qǐng)輸入用戶名稱: ")
chat = ChatGPT(user)
# 循環(huán)
while 1:
# 限制對(duì)話次數(shù)
if len(chat.messages) >= 11:
print("******************************")
print("*********強(qiáng)制重置對(duì)話**********")
print("******************************")
# 寫(xiě)入之前信息
chat.writeTojson()
user = input("請(qǐng)輸入用戶名稱: ")
chat = ChatGPT(user)
# 提問(wèn)
q = input(f"【{chat.user}】")
# 邏輯判斷
if q == "0":
print("*********退出程序**********")
# 寫(xiě)入之前信息
chat.writeTojson()
break
elif q == "1":
print("**************************")
print("*********重置對(duì)話**********")
print("**************************")
# 寫(xiě)入之前信息
chat.writeTojson()
user = input("請(qǐng)輸入用戶名稱: ")
chat = ChatGPT(user)
continue
# 提問(wèn)-回答-記錄
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 類,包含三個(gè)函數(shù):
- __init__初始化函數(shù),初始化了三個(gè)個(gè)實(shí)例變量,user、messages、filename(當(dāng)前用戶、消息列表、存儲(chǔ)記錄的文件路徑)。
- ask_gpt函數(shù),將當(dāng)前用戶所有歷史消息+最新提問(wèn)發(fā)送給 gpt-3.5-turbo ,并返回響應(yīng)結(jié)果。
- writeTojson函數(shù),結(jié)束/重置用戶時(shí)記錄當(dāng)前用戶之前的訪問(wèn)數(shù)據(jù)。
- main函數(shù),程序入口函數(shù),用戶輸入用戶名后進(jìn)入與 ChatGPT 的循環(huán)對(duì)話中,輸入 0 退出程序,輸入 1 重置用戶,退出和重置都會(huì)將當(dāng)前用戶之前訪問(wèn)數(shù)據(jù)記錄搭配 json 文件中。
- 由于 gpt-3.5-turbo 單次請(qǐng)求最大 token 數(shù)為:4096,所以代碼里限制了下對(duì)話次數(shù)。
更多拓展
- 你可以寫(xiě)個(gè)函數(shù),從 json 文件讀取歷史用戶訪問(wèn)記錄,然后每次訪問(wèn)可以選用戶。
- 你可以寫(xiě)個(gè) web 服務(wù),使用 session 或者數(shù)據(jù)庫(kù)支持多用戶同時(shí)登錄,同時(shí)訪問(wèn)。
- 你可以基于之前分享的釘釘機(jī)器人項(xiàng)目,將 gpt-3.5-turbo 接入釘釘機(jī)器人。
- 你還可以關(guān)注下方小卡片 搜索更多 ChatGPT 相關(guān)項(xiàng)目,或者其他有意思的項(xiàng)目學(xué)習(xí)練手,歡迎學(xué)習(xí)交流。
總結(jié)
最后的最后
由本人水平所限,難免有錯(cuò)誤以及不足之處, 屏幕前的靚仔靚女們 如有發(fā)現(xiàn),懇請(qǐng)指出!
最后,謝謝你看到這里,謝謝你認(rèn)真對(duì)待我的努力,希望這篇博客對(duì)你有所幫助!
你輕輕地點(diǎn)了個(gè)贊,那將在我的心里世界增添一顆明亮而耀眼的星!
?? 往期優(yōu)質(zhì)文章分享
- C++ QT結(jié)合FFmpeg實(shí)戰(zhàn)開(kāi)發(fā)視頻播放器-01環(huán)境的安裝和項(xiàng)目部署
- 解決QT問(wèn)題:運(yùn)行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
- 解決安裝QT后MSVC2015 64bit配置無(wú)編譯器和調(diào)試器問(wèn)題
- Qt中的套件提示no complier set in kit和no debugger,出現(xiàn)黃色感嘆號(hào)問(wèn)題解決(MSVC2017)
- Python+selenium 自動(dòng)化 - 實(shí)現(xiàn)自動(dòng)導(dǎo)入、上傳外部文件(不彈出windows窗口)
?? 優(yōu)質(zhì)教程分享 ??
- ??如果感覺(jué)文章看完了不過(guò)癮,可以來(lái)我的其他 專欄 看一下哦~
- ??比如以下幾個(gè)專欄:Python實(shí)戰(zhàn)微信訂餐小程序、Python量化交易實(shí)戰(zhàn)、C++ QT實(shí)戰(zhàn)類項(xiàng)目 和 算法學(xué)習(xí)專欄
- ??可以學(xué)習(xí)更多的關(guān)于C++/Python的相關(guān)內(nèi)容哦!直接點(diǎn)擊下面顏色字體就可以跳轉(zhuǎn)啦!
學(xué)習(xí)路線指引(點(diǎn)擊解鎖) | 知識(shí)定位 | 人群定位 |
---|---|---|
?? Python實(shí)戰(zhàn)微信訂餐小程序 ?? | 進(jìn)階級(jí) | 本課程是python flask+微信小程序的完美結(jié)合,從項(xiàng)目搭建到騰訊云部署上線,打造一個(gè)全棧訂餐系統(tǒng)。 |
??Python量化交易實(shí)戰(zhàn) ?? | 入門級(jí) | 手把手帶你打造一個(gè)易擴(kuò)展、更安全、效率更高的量化交易系統(tǒng) |
?? C++ QT結(jié)合FFmpeg實(shí)戰(zhàn)開(kāi)發(fā)視頻播放器?? | 難度偏高 | 分享學(xué)習(xí)QT成品的視頻播放器源碼,需要有扎實(shí)的C++知識(shí)! |
?? 游戲愛(ài)好者九萬(wàn)人社區(qū)?? | 互助/吹水 | 九萬(wàn)人游戲愛(ài)好者社區(qū),聊天互助,白嫖獎(jiǎng)品 |
?? Python零基礎(chǔ)到入門 ?? | Python初學(xué)者 | 針對(duì)沒(méi)有經(jīng)過(guò)系統(tǒng)學(xué)習(xí)的小伙伴,核心目的就是讓我們能夠快速學(xué)習(xí)Python的知識(shí)以達(dá)到入門 |
?? 資料白嫖,溫馨提示 ??
關(guān)注下面卡片即刻獲取更多編程知識(shí),包括各種語(yǔ)言學(xué)習(xí)資料,上千套PPT模板和各種游戲源碼素材等等資料。更多內(nèi)容可自行查看哦!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-472684.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-472684.html
到了這里,關(guān)于手把手教你使用Python調(diào)用 ChatGPT!支持http代理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!