用35行程式碼開發一個自己的AI對話機器人
之前也寫了好幾篇關於ChatGPT的文章了,領略到了與深入優化的GPT-3(Generative Pre-trained Transformer)對話過程中的各種驚喜。但是因為ChatGPT的爆發性流量和訪問限制問題,平時使用的時候多多少少會不太方便。其實OpenAI本身就提供了大量的API介面,可以讓使用者免費使用開發出自己的Web APP,包括我們今天要說的對話機器人,關於API的一些應用,我在之前一篇文章做過介紹,有興趣可以點開閱讀: 十分鐘學會開發自己的Python AI應用【OpenAI API篇】
雖然目前OpenAI提供的的API沒法開發出像ChatGPT那樣就同一個話題持續對話的應用(可以期待下即將釋出的ChatGPT API,不過會收費),但是基於一個知識,一個文字編輯需求,如續寫,或者一個寫作大綱等等單一的文字需求,用目前的Open AI Text Completion類的API,配合Steamlit庫,很簡單地就可以開發一個對話的Web應用。而且由於使用的是API方式進行訪問,平時使用時對訪問IP沒有任何限制,也不存在堵塞排隊現象。
老規矩,OpenAI網址:openai.com. 註冊登入需要有谷歌訪問能力,和海外手機號驗證(教程很多,可以在平臺裡直接搜尋到)。
Streamlit
Streamlit 是一個開源框架,非常適合機器學習和資料科學。 開發人員用它建立用於資料視覺化和資料分析的互動式應用程式,而無需編寫大量的 HTML、CSS 或 JavaScript 程式碼。 Streamlit 通過 Python 構建應用程式,使資料科學家和軟體工程師可以輕鬆地使用已有的技能來建立用於資料探索和資料分析的互動Web。本文就用Streamlit來開發這個AI對話的Web頁面。
有兩種使用 Streamlit 的方法,一種是在他們自己的雲平臺中,一種是在本地安裝在你自己電腦或伺服器上。對於第一個選項,你需要在Streamlit平臺上註冊賬號,連結自己的GitHub,這裡不多介紹了。這裡主要介紹第二種方法,因為使用起來更自由。
OpenAI API
要使用API,你需要獲得OpenAI的API 金鑰。需要訪問註冊一個OpenAI賬戶,具體方法,掘金上有不少這裡就不復述了。
我們今天要用的介面就在Text completion裡面。
有了賬號我們就可以在自己賬號裡找到API Key,如下圖。注意建立API Key時務必第一時間複製下來,因為建立完關閉對話方塊以後,就再也無法看到完整的Key。
有了API key,我們就可以建立一個 Streamlit Python 指令碼了。
建立Python指令碼
首先,先把必要的庫給裝上:
$ pip install streamlit
$ pip install streamlit_chat
$ pip install openai
$ pip install python-detenv
具體的程式碼實現是很容易的,首先匯入所需的庫,向openai.api_key 中剛剛複製出來的API Key。
import openai
import streamlit as st
from streamlit_chat import message
import os
from dotenv import load_dotenv
openai.api_key = '你的API_KEY'
然後定義generate_response()函式:
def generate_response(prompt):
completion=openai.Completion.create(
engine='text-davinci-003',
prompt=prompt,
max_tokens=1024,
n=1,
stop=None,
temperature=0.6,
)
message=completion.choices[0].text
return message
通過將使用者對話指令(Prompt)作為引數從 GPT-3 生成OpenAI的text completion模型響應。我們這裡還指定了模型 'text-davinci-003' ,當然你還可以使用其他模型,不過Davinci的訓練資料是目前比較新的。
也可以為Prompt設定字數限制 (max_tokens)。
其中還有一個temperature變數非常相關,因為它實質上定義了AI創造力的級別,它可以設定在 0 和 1 之間。0 產生穩健的輸出,而 1 則具有高度創造力。
接下來的程式碼,就是演示如何用streamlit,包括一個第三方的庫streamlit_chat,建立一個對話型的web介面,其中建立past(使用者在輸入框的輸入text)和generated(呼叫generate_response()後API回覆的text)列表,用來儲存和顯示歷史對話記錄,程式碼很簡單,一目瞭然: ``` st.title("也魚實驗室的AI Chatbot")
storing the chat
if 'generated' not in st.session_state:
st.session_state['generated'] = []
if 'past' not in st.session_state:
st.session_state['past'] = []
user_input=st.text_input("You:",key='input')
if user_input:
output=generate_response(user_input)
#store the output
st.session_state['past'].append(user_input)
st.session_state['generated'].append(output)
if st.session_state['generated']:
for i in range(len(st.session_state['generated'])-1, -1, -1):
message(st.session_state["generated"][i], key=str(i))
message(st.session_state['past'][i], is_user=True, key=str(i) + '_user')
以上就是全部程式碼,把它合併儲存為demo.py,總共不到40行,接下來你只要在該檔案目錄下用命令列輸入:
python -m streamlit run demo.py
```
就會看到以下列印,一個介面很光潔的網頁隨即會在本地開啟: ``` You can now view your Streamlit app in your browser.
Local URL: http://localhost:8502 Network URL: http://xxx.xxx.xxx.xxx(我的IP):8502 ```
好了,試試與其對話吧,你可以跟他打招呼,獲取知識,讓其提供寫作提綱,讓其續寫你的文章,或是為你總結一段文字。
在 ChatGPT API 釋出之前,這可能是使用 GPT-3 模型的最簡單方法。 最後需要提的是,關於使用Streamlit,我們必須知道,如果我們需要做一個互動性強及安全的大型應用,那麼還是要考慮使用Django這類Web框架進行開發。