在使用 ChatGPT API 時,因為 API 本身是「一次性」,無法儲存聊天的歷史紀錄,這也衍生了「無法串聯上下文」的問題,不過如果將 ChatGPT 串連 Firebase 的 Realtime database,就能夠做到在與 ChatGPT 聊天時,即時透過資料庫記錄上下文的內容,這篇教學會介紹相關的做法。
快速導覽:
參考「建立 Firebase RealTime Database」教學,建立一個 Firebase Realtime database。

參考「設定 Firebase RealTime Database 安全規則」教學,將讀取和寫入的規則都設為 true。

參考「串接 Firebase RealTime Database 存取資料」教學,安裝 Python 的 firebase 函式庫。
pip install git+https://github.com/ozgur/python-firebase
參考「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 也能看到歷史紀錄的資料。

參考「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 數量暴增,一但超過免費額度就要開始收費囉。
英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古
如果我有以下一段Ruby代码:classBlahdefself.bleh@blih="Hello"@@bloh="World"endend@blih和@@bloh到底是什么?@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@@bloh是Blah的类Class中的一个变量? 最佳答案 人们似乎忽略了该方法是类方法。@blih将是常量Bleh的类Class实例的实例变量。因此:irb(main):001:0>classBlehirb(main):002:1>defself.blehirb
我在Ruby程序中有两个URI。一个肯定是绝对URI,另一个可能是绝对URI或相对URI。我想在第一个的上下文中将第二个转换为绝对URI,所以如果第一个是http://pupeno.com/blog第二个是/about,结果应该是http://pupeno.com/about.有什么想法吗? 最佳答案 Ruby的内置URI和Addressablegem,做这个简短的工作。我更喜欢Addressable,因为它功能更全面,但URI是内置的。require'uri'URI.join('http://pupeno.com/blog','/
是否可以不为lambda分配上下文?例如:classRuledefget_rulereturnlambda{putsname}endendclassPersonattr_accessor:namedefinit_rule@name="ruby"Rule.new.get_rule.call()#shouldsay"ruby"butsaywhatobjectofclassRull,doesnothavevariablename#orself.instance_eval&Rule.new.get_ruleendend我的目标是->没有上下文的存储过程对象,并在特定位置调用之前分配上下文。可能
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动
目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans
这个问题的表述并不复杂,但我会尽力而为。通过我们的代码,我们有一些片段,例如response=do_something()returnresponseunlessresponse.ok?我想写一个包装器方法,这样就不需要这一步了,它看起来像这样defrr(&block)response=yieldunlessresponse.ok?#somehowdoreturnbutincontextabove(magicneededhere)endresponseend之后我就可以将上面的代码最小化为response=rr{do_something()}似乎不可能,但这是Ruby所以也许有办法吗?
要清楚-此代码运行完美-codewithproc但如果我将Proc.new更改为lambda,则会出现错误ArgumentError:wrongnumberofarguments(1for0)这可能是因为instance_eval想要将self作为参数传递,而lambda将其视为一种方法并且不接受未知参数?有两个例子-第一个是工作:classRuledefget_ruleProc.new{putsname}endendclassPersonattr_accessor:namedefinit_rule@name="ruby"instance_eval(&Rule.new.get_rule
我想知道是否有人可以帮助我理解文档中的这一部分:Withthedefinedcontextinmodel,youhavemultiplenewmethodsatdisposaltomanageandviewthetagsinthecontext.Forexample,with:skillcontextthesemethodsareaddedtothemodel:skill_list(andskill_list.add,skill_list.removeskill_list=),skills(plural),skill_counts.我有这个:型号:classProjectControl
我搜索了一下,但我一定是使用了错误的术语-ruby是否有办法grep查找字符串/正则表达式并返回周围的5行(上方和下方)?我知道我可以调用"grep-C5..."或什至编写我自己的方法,但这似乎是ruby应该有的东西,我只是没有使用正确的搜索词。 最佳答案 您可以使用正则表达式来完成。这是我们要搜索的字符串:s=%{ThefirstlineThesecondlineThethirdlineThefourthlineThefifthlineThesixthlineTheseventhlineTheeightlineThenin