用 Python 構(gòu)建由 gpt-3.5-turbo API 支持的聊天機(jī)器人網(wǎng)站
自2023年3月1日發(fā)布“ChatGPT API”以來(lái),已經(jīng)開(kāi)發(fā)出了數(shù)千個(gè)基于該API的應(yīng)用程序,為企業(yè)和個(gè)人開(kāi)啟了新的可能性時(shí)代。借助GPT-3.5的自然語(yǔ)言處理能力,用戶(hù)可以創(chuàng)建能夠無(wú)縫與人交互的聊天機(jī)器人,以回答問(wèn)題、創(chuàng)作小說(shuō)、會(huì)計(jì)甚至提供治療等多種用途。這個(gè)API的潛在用途僅受人們想象力的限制,而看到開(kāi)發(fā)人員將如何繼續(xù)推動(dòng)人工智能的可能性的邊界,這是令人興奮的。
我知道過(guò)去一周互聯(lián)網(wǎng)上有足夠的教程,但是,編寫(xiě)一份關(guān)于如何使用ChatGPT API、Streamlit和Docker發(fā)布一個(gè)合格的網(wǎng)站的端到端工作指南仍然值得。這樣的指南可以讓你在很短的時(shí)間內(nèi)為自己、朋友或小型企業(yè)發(fā)布一個(gè)體面的網(wǎng)站。
為什么需要
我們需要?jiǎng)?chuàng)建自己的聊天機(jī)器人網(wǎng)站有以下幾個(gè)原因:
我們都知道,由于每天的高訪問(wèn)量,順暢登錄和使用ChatGPT的免費(fèi)版本是非常困難的。盡管專(zhuān)業(yè)版每月可用,費(fèi)用為20美元,但對(duì)于不需要高級(jí)功能的普通用戶(hù)來(lái)說(shuō)可能不是一種劃算的選擇。一個(gè)“按需付費(fèi)”的模式將更受許多用戶(hù)的歡迎,因?yàn)樗麄冎恍枰紶柺褂迷撈脚_(tái)。然而,ChatGPT并沒(méi)有提供這個(gè)選項(xiàng)。
幸運(yùn)的是,最近發(fā)布的Chat Completion API(也稱(chēng)為ChatGPT API)使用GPT-3.5-turbo模型,每1k令牌只需0.002美元的成本。這為普通用戶(hù)提供了更經(jīng)濟(jì)實(shí)惠的選擇,而API訪問(wèn)更穩(wěn)定,沒(méi)有高峰期的麻煩。此外,通過(guò)API使用GPT 3.5(與ChatGPT使用的相同模型)構(gòu)建聊天網(wǎng)站不會(huì)讓你忍受ChatGPT花費(fèi)時(shí)間來(lái)模仿人類(lèi)的緩慢“思考”和“打字”響應(yīng)時(shí)間。所有聊天響應(yīng)都是快速和簡(jiǎn)單的。
盡管你的初始網(wǎng)站可能看起來(lái)很基礎(chǔ),但一旦創(chuàng)建它,添加額外的功能將變得輕而易舉,使你能夠達(dá)到商業(yè)潛力,讓我們開(kāi)始吧。
生成OpenAI API密鑰
如果你已經(jīng)在你的賬戶(hù)中申請(qǐng)了OpenAI API密鑰,那么你可以繼續(xù)使用它,而不是生成一個(gè)新的密鑰。
如果這是你第一次使用OpenAI API,那么請(qǐng)注冊(cè)一個(gè)新的OpenAI賬戶(hù),如何注冊(cè),這篇文章就不過(guò)多介紹了,很多網(wǎng)站都有過(guò)介紹。
請(qǐng)注意,在生成后,整個(gè)API密鑰將僅顯示一次,因此你必須將其復(fù)制到安全的地方以供進(jìn)一步使用。(我將我的API密鑰直接復(fù)制到代碼中僅用于演示目的,這不建議在你的應(yīng)用程序中這樣做)
OpenAI API
新發(fā)布的“ChatGPT” API稱(chēng)為“Chat completion”,其文檔可以在此處找到。
即使你之前沒(méi)有使用過(guò)其他OpenAI API,使用起來(lái)也非常簡(jiǎn)單。根據(jù)其官方介紹,要獲得來(lái)自GPT-3.5的答案,你需要做的僅僅是:
安裝包
pip install openai
導(dǎo)入模塊
import openai
相關(guān)創(chuàng)建和配置
complete = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
收到回復(fù)
message=complete.choices[0].message.content
其他GPT模型相比,消息體現(xiàn)在使用上有了新的用法。消息列表將包含多個(gè)消息對(duì)象,這些對(duì)象執(zhí)行“聊天”的功能。系統(tǒng)、用戶(hù)和助手是消息對(duì)象中新定義的三個(gè)角色。系統(tǒng)消息被定義為通過(guò)在內(nèi)容中添加指令來(lái)設(shè)置聊天機(jī)器人的行為,但是正如在介紹中提到的那樣,目前在gpt-3.5-turbo-0301中,這種能力還沒(méi)有完全釋放。用戶(hù)消息表示用戶(hù)的輸入或詢(xún)問(wèn),而助手消息則指代GPT-3.5 API的相應(yīng)響應(yīng)。這種對(duì)話交換模擬了人類(lèi)之間的對(duì)話,用戶(hù)消息引發(fā)了交互,助手消息提供了相關(guān)和有用的答案,以便后面的聊天模型能夠更好地生成與此對(duì)話相關(guān)的響應(yīng)。最后的用戶(hù)消息指代當(dāng)前所請(qǐng)求的提示信息。
Streamlit 和 Streamlit_chat 介紹
Streamlit是一個(gè)開(kāi)源框架,使數(shù)據(jù)科學(xué)家和開(kāi)發(fā)人員能夠快速構(gòu)建和分享用于機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)項(xiàng)目的交互式Web應(yīng)用程序。它還提供了一堆小部件,只需要一行Python代碼就可以創(chuàng)建,例如st.table(…)。對(duì)于我們創(chuàng)建一個(gè)簡(jiǎn)單的私人聊天機(jī)器人網(wǎng)站的目的,Streamlit是一個(gè)非常合適的庫(kù),而第三方的Streamlit_chat庫(kù)則進(jìn)一步提供了便利,使我們不必處理大量的HTML元素和CSS樣式等內(nèi)容來(lái)生成“聊天風(fēng)格”的Web應(yīng)用程序。
要設(shè)置一個(gè)網(wǎng)站并在互聯(lián)網(wǎng)上發(fā)布,只需要幾個(gè)步驟:
安裝包
pip install streamlit
請(qǐng)使用以下代碼創(chuàng)建Python文件“demo.py”
import streamlit as st
st.write("""
# My First App
Hello *world!*
""")
在本地計(jì)算機(jī)或遠(yuǎn)程服務(wù)器上運(yùn)行該代碼:
python -m streamlit run demo.py
在輸出顯示該信息后,你可以通過(guò)列出的地址和端口號(hào)訪問(wèn)你的網(wǎng)站:
You can now view your Streamlit app in your browser.
Network URL: http://xxx.xxx.xxx.xxx:8501
External URL: http://xxx.xxx.xxx.xxx:8501
構(gòu)建聊天機(jī)器人應(yīng)用程序
請(qǐng)注意,Chatbot應(yīng)用程序是通過(guò)Streamlit的session_state對(duì)象管理運(yùn)行數(shù)據(jù)的。我們定義了prompts列表來(lái)存儲(chǔ)從系統(tǒng)角色消息開(kāi)始的提示消息,并在每次生成的聊天中由用戶(hù)和助手追加。
對(duì)于系統(tǒng)角色消息,我將附加了“帶有一點(diǎn)幽默表情”的額外說(shuō)明放入了內(nèi)容中,它真的有效,因?yàn)楫?dāng)我問(wèn)如何成為億萬(wàn)富翁時(shí),它建議我開(kāi)玩笑地?fù)屻y行……這樣的設(shè)置讓我想起了電影“星際穿越”中的“TARS”。
另外,還有兩個(gè)session_state被用于存儲(chǔ)所有API響應(yīng)(生成)和所有用戶(hù)提示(過(guò)去),以便與Streamlit_chat函數(shù)message()一對(duì)一地以聊天樣式顯示。
Streamlit小部件創(chuàng)建了兩個(gè)按鈕,一個(gè)是“發(fā)送”按鈕,用于激活ChatCompletion請(qǐng)求,另一個(gè)是“新的聊天”按鈕,用于清除提示對(duì)象和聊天顯示中的所有聊天歷史記錄。這些行為在回調(diào)函數(shù)chat_click()和end_click()中定義。
為了完全復(fù)制ChatGPT的用戶(hù)體驗(yàn),我們還需要考慮來(lái)自API響應(yīng)的完整markdown功能的顯示,例如代碼片段、表格等。不幸的是,streamlit_chat的聊天氣泡不能很好地顯示markdown內(nèi)容,因此我使用了tabs小部件來(lái)將氣泡顯示中的純文本分開(kāi)顯示為正常文本和富文本。
下面是完整的Python代碼,你可以直接復(fù)制:
import openai
import streamlit as st
from streamlit_chat import message
# 填寫(xiě) API key
openai.api_key = '{Your API key}'
# 如果沒(méi)有 prompts 這個(gè) session_state,就初始化
if 'prompts' not in st.session_state:
st.session_state['prompts'] = [{"role": "system", "content": "You are a helpful assistant. Answer as concisely as possible with a little humor expression."}]
# 如果沒(méi)有 generated 這個(gè) session_state,就初始化
if 'generated' not in st.session_state:
st.session_state['generated'] = []
# 如果沒(méi)有 past 這個(gè) session_state,就初始化
if 'past' not in st.session_state:
st.session_state['past'] = []
# 生成 ChatGPT API 的回答
def generate_response(prompt):
# 把用戶(hù)輸入的消息加入到 prompts 中
st.session_state['prompts'].append({"role": "user", "content":prompt})
# 調(diào)用 ChatGPT API
completion=openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages = st.session_state['prompts']
)
# 從 API 返回的結(jié)果中獲取 ChatBot 的回答
message=completion.choices[0].message.content
return message
# 重置聊天界面
def end_click():
st.session_state['prompts'] = [{"role": "system", "content": "You are a helpful assistant. Answer as concisely as possible with a little humor expression."}]
st.session_state['past'] = []
st.session_state['generated'] = []
st.session_state['user'] = ""
# 處理聊天按鈕點(diǎn)擊事件
def chat_click():
if st.session_state['user']!= '':
# 獲取用戶(hù)輸入的消息
chat_input = st.session_state['user']
# 調(diào)用 ChatGPT API 生成回答
output=generate_response(chat_input)
# 把生成的回答和用戶(hù)輸入的消息存儲(chǔ)到 session_state 中
st.session_state['past'].append(chat_input)
st.session_state['generated'].append(output)
st.session_state['prompts'].append({"role": "assistant", "content": output})
st.session_state['user'] = ""
# 顯示 ChatBot 界面
st.image("logo.png", width=80)
st.title("My ChatBot")
# 顯示用戶(hù)輸入框
user_input=st.text_input("You:", key="user")
# 顯示聊天和重置按鈕
chat_button=st.button("Send", on_click=chat_click)
end_button=st.button("New Chat", on_click=end_click)
# 顯示 ChatBot 的回答和用戶(hù)的輸入
if st.session_state['generated']:
# 倒序遍歷已經(jīng)生成的回答和用戶(hù)的輸入
for i in range(len(st.session_state['generated'])-1, -1, -1):
# 分別使用兩種方式顯示 ChatBot 的回答
tab1, tab2 = st.tabs(["normal", "rich"])
with tab1:
message(st.session_state['generated'][i], key=str(i) + '_generated')
with tab2:
st.markdown(st.session_state['generated'][i])
# 顯示用戶(hù)的輸入
message(st.session_state['past'][i], is_user=True, key=str(i) + '_past')
執(zhí)行streamlit命令后,你的聊天機(jī)器人網(wǎng)站將默認(rèn)上線于http://{你的IP地址}:8501!
python -m streamlit run demo.py
結(jié)束
接下來(lái),就需要部署網(wǎng)站了,由于Streamlit不支持接管端口80作為你的Web服務(wù)端口,因此如果你想避免用戶(hù)輸入類(lèi)似于 :8501 這樣的端口來(lái)訪問(wèn)你的網(wǎng)站,你可以使用Docker來(lái)部署你的Streamlit應(yīng)用程序,并使用Docker將端口80映射到你的實(shí)際Streamlit端口。當(dāng)前還有其他的不熟方式,網(wǎng)上有很多相關(guān)介紹,這里就不過(guò)多介紹了。
今天的分享就到這里,感謝你的閱讀,希望能夠幫助到你,文章創(chuàng)作不易,如果你喜歡我的分享,別忘了點(diǎn)贊轉(zhuǎn)發(fā),讓更多有需要的人看到,最后別忘記關(guān)注「前端達(dá)人」,你的支持將是我分享最大的動(dòng)力,后續(xù)我會(huì)持續(xù)輸出更多內(nèi)容,敬請(qǐng)期待。
https://levelup.gitconnected.com/its-time-to-create-a-private-chatgpt-for-yourself-today-6503649e7bb6
作者:Yeyu Huang文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-413446.html
非直接翻譯,有自行改編和添加部分,翻譯水平有限,難免有疏漏,歡迎指正文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-413446.html
到了這里,關(guān)于從零開(kāi)始,三分鐘內(nèi)用Python快速自建一個(gè)私有化 ChatGpt 聊天機(jī)器人網(wǎng)站的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!