ChatGPT + Firebase
在使用 ChatGPT API 时,因为 API 本身是“一次性”,无法储存聊天的历史纪录,这也衍生了“无法串联上下文”的问题,不过如果将 ChatGPT 串连 Firebase 的 Realtime database,就能够做到在与 ChatGPT 聊天时,即时透过数据库记录上下文的内容,这篇教学会介绍相关的做法。
快速导览:
建立与设定 Firebase Realtime database
参考“建立 Firebase RealTime Database”教学,建立一个 Firebase Realtime database。
参考“设定 Firebase RealTime Database 安全规则”教学,将读取和写入的规则都设为 true。
参考“串接 Firebase RealTime Database 存取数据”教学,安装 Python 的 firebase 函数库。
pip install git+https://github.com/ozgur/python-firebase
ChatGPT 使用 text-davinci-003 模型
参考“ChatCPT 串连上下文语句”教学中的 text-davinci-003 模型范例,加入 Firebase Realtime database 储存对话纪录,如此一来就能在再次打开时,记得上一次所讲的对话。
import openai
openai.api_key = '你的 API Key'
from firebase import firebase
url = 'https://XXXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None) # 初始化 Firebase Realtime database
chatgpt = fdb.get('/','chatgpt') # 取的 chatgpt 節點的資料
if chatgpt == None:
messages = '' # 如果節點沒有資料,訊息內容設定為空
else:
messages = chatgpt # 如果節點有資料,使用該資料作為歷史聊天記錄
while True:
msg = input('me > ')
if msg == '!reset':
message = ''
fdb.delete('/','chatgpt') # 如果輸入 !reset 就清空歷史紀錄
print('ai > 對話歷史紀錄已經清空!')
else:
messages = f'{messages}{msg}\n' # 在輸入的訊息前方加上歷史紀錄
response = openai.Completion.create(
model='text-davinci-003',
prompt=messages,
max_tokens=128,
temperature=0.5
)
ai_msg = response['choices'][0]['text'].replace('\n','') # 取得 ChatGPT 的回應
print('ai > '+ai_msg)
messages = f'{messages}\n{ai_msg}\n\n' # 在訊息中加入 ChatGPT 的回應
fdb.put('/','chatgpt',messages) # 更新資料庫資料
执行程序后,就算重新启动程序,ChatGPT 也会记得过去的聊天内容 ( 例如说还记得名字 )
进入 Firebase Realtime database 也能看到历史纪录的数据。
ChatGPT 使用 gpt-3.5-turbo 模型
参考“ChatCPT 串连上下文语句”教学中的 gpt-3.5-turbo3 模型范例,加入 Firebase Realtime database 储存对话纪录,如此一来就能在再次打开时,记得上一次所讲的对话。
import openai
openai.api_key = '你的 API Key'
from firebase import firebase
url = 'https://XXXXXXXXXXX.firebaseio.com'
fdb = firebase.FirebaseApplication(url, None) # 初始化 Firebase Realtimr database
chatgpt = fdb.get('/','chatgpt') # 讀取 chatgpt 節點中所有的資料
if chatgpt == None:
messages = [] # 如果沒有資料,預設訊息為空串列
else:
messages = chatgpt # 如果有資料,訊息設定為該資料
while True:
msg = input('me > ')
if msg == '!reset':
fdb.delete('/','chatgpt') # 如果輸入 !reset 就清空 chatgpt 的節點內容
messages = []
print('ai > 對話歷史紀錄已經清空!')
else:
messages.append({"role":"user","content":msg}) # 將輸入的訊息加入歷史紀錄的串列中
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
max_tokens=128,
temperature=0.5,
messages=messages
)
ai_msg = response.choices[0].message.content.replace('\n','') # 取得回應訊息
messages.append({"role":"assistant","content":ai_msg}) # 將回應訊息加入歷史紀錄串列中
fdb.put('/','chatgpt',messages) # 更新 chatgpt 節點內容
print(f'ai > {ai_msg}')
执行程序后,就算重新启动程序,ChatGPT 也会记得过去的聊天内容 ( 例如说还记得名字 )
进入 Firebase Realtime database 也能看到历史纪录的数据。
小结
透过 Firebase Realtime database,就能非常方便快速地储存 ChatGPT 的聊天记录,并让 ChatGPT 能够分辨上下文,是相当不错的功能!但仍然要注意的是,回传历史纪录会造成 ChatGPT 的 token 数量暴增,一但超过免费额度就要开始收费啰。
微信扫码关注
抖音扫码关注