命運石之門跟opeaigpt和linebot作品

閱讀時間約 21 分鐘
故事開始於2010年7月28日,「未來道具研究所」社團的兩人,岡部倫太郎和椎名真由理去秋葉原廣播會館參加中鉢博士的時間旅行理論發表會,見到了年僅18歲就在《科學》雜誌上發表學術論文的天才少女牧瀨紅莉栖。發表會結束不久後,在會館8樓深處,岡部發現了身上滿是鮮血的紅莉栖。驚慌失措的他帶著真由理立刻離開會館,給社團另一成員橋田至發送一條電子郵件告知這一事件。然而發送後的瞬間,岡部愕然發現街道人群消失,廣播會館及周圍早已因不明人造衛星墜落緣故被封鎖,沒有人記得他所經歷的事件。
數小時後,岡部和阿至在大學講習現場再次遇見紅莉栖,引發一陣騷亂。對岡部所說的話感到興趣而至「未來道具研究所」的紅莉栖偶然見到了岡部他們進行的實驗,一連串研究發現岡部發送的電子郵件在一周前被收到!「未來道具研究所」研製的未來道具8號「電話微波爐(暫名)」竟然具備著將電子郵件發送到過去這一時間機器的功能。此時,岡部他們還不知道,這一發明,和他那封送到過去的電子郵件,已經影響了整個世界的未來……
作品中從架空的事物到實際存在的企業、大學、商品都以真名登場,現實中流傳的都市傳說陰謀論網路語言等話題也有提及。故事的核心由自稱為未來人、實際上存在的網路人物約翰·提托所流傳的話語、通過主人公的言行和手機進行操縱的遊戲系統、網絡上流傳的「la jodaso stiana(食堂之男)」等為主題的小故事等構成,並藉此虛實結合地展開故事。其開始時稍難理解,過半時突然展開。其中多有伏筆,結尾一氣呵成。有評論稱本作品「通關後還想消除記憶再來一次」。[7]
命運石之門第二季
看完第一季,馬上又接續第二季,所以感覺還滿連貫的,我非常的融入劇情當中。第二季主要是接續著第23β話,也就是主角岡倫沒有救到紅莉栖的世界線發展,與第一季的正統23畫有救到紅莉栖不同。
沒救到紅莉栖的岡倫,在第二季不斷欺騙自己這已經是最好的結果了,放棄了改變過去的念頭,而已死的紅莉栖這角色,則由一個以紅莉栖記憶為基礎製造出的AI─AMADEUS所取代。
第二季的時空和世界交錯比第一季更為龐大與複雜,有好幾次我都差點消化不良,角色不斷在過去、現在和未來穿梭,不得不佩服編劇能在如此眾多角色(甚至同一個角色可能不只一位)和時間線當中理清所有環節,實在了不起,當然是否有BUG出現,我沒有特別深入研究就不清楚了。
只有一些戰鬥場面,感覺比較扯吧,而且動作不算太流暢,但也已相當有水準。
第二季某些地方也呼應著第一季埋下的伏筆。最後岡倫總算醒悟,他自以為最好的世界其實並不是最好的,而變回以往那個中二病的鳳凰院凶真,展開改變過去之旅,最後成功的和第一季23話有救到紅莉栖的結果銜接。岡倫為了大家獨自奮戰的身影總是令人動容,他一個人背負的種種痛苦也讓人心疼。
所幸最後仍迎來最好的結果,紅莉栖將會獲救,而未來的岡倫則回到飄流至西元好幾年以前的真由里與鈴羽重逢。
↓最後感人的重逢一幕
這篇我要做的就是AI─AMADEUS
首先去Line 做一個帳號放紅莉栖頭像
接下來就是用python串接這個line帳號讓他活起來
其中用到了openai的人工智能聊天系統
openai的人工智能聊天系統現在最厲害的聊天機器人
代碼就修改一下我2019年做的一個金融機器人
# -*- coding: utf-8 -*-
from flask import Flask, request, abort
import requests
import json
from linebot import (
LineBotApi, WebhookHandler
)
import time
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage ,SourceUser
)
from linebot.models import *
import pandas as pd
import configparser
import datetime
import json
import requests
from bs4 import BeautifulSoup
from chatgpt import ChatGPT
chatgpt = ChatGPT()

#爬玩股網
def wantgoo(sid):
target_url = 'https://www.wantgoo.com/stock/'+sid
rs = requests.session()
res = rs.get(target_url)#verify=False
soup = BeautifulSoup(res.text, 'html.parser')
content = ''
if len(soup.select('.cn div'))!=0:
for titleURL in soup.select('.cn div'):
title = titleURL.text.replace(' ','').replace('\n','').replace('\r','')
data = '{}\n'.format(title)
content += data
else:
content += '沒有搜尋到匹配的股票'
return '{}\n{}'.format(sid,content)

app = Flask(__name__,static_url_path = "/images" , static_folder = "./images/" )

#Line的一些使用者金鑰設定
line_bot_api = LineBotApi('*******************************')
handler = WebhookHandler('********************************')
host_id="******************************"

#定義路由器
@app.route("/", methods=['POST'])
def index():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']

# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)

# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)

return 'OK'


#定義接收到文字訊息要如何處理
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
if event.message.text == 'profile':
if isinstance(event.source, SourceUser):
profile = line_bot_api.get_profile(event.source.user_id)
line_bot_api.reply_message(
event.reply_token, [
TextSendMessage(text='Display name: ' + profile.display_name),
TextSendMessage(text='Status message: ' + profile.status_message)
]
)
else:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text="Bot can't use profile API without user ID"))

#當別人密我時回報他的group_id/user_id位置
if event.source.user_id!=host_id:
if event.source.type=='group':
group_id=event.source.group_id
group_text=event.message.text+'\n'+'from'+'\n'+group_id
line_bot_api.push_message(host_id,TextSendMessage(text=group_text))
else:
guest_id=event.source.user_id
guest_text=event.message.text+'\n'+'from'+'\n'+guest_id
line_bot_api.push_message(host_id,TextSendMessage(text=guest_text))
#傳訊
if (event.source.user_id==host_id) and (event.message.text.split(':')[0]=='@傳訊'):
host_text=event.message.text
To_userid=host_text.split(':')[1]
My_message=host_text.split(':')[2:]
content=""
for i in My_message:
content+=i
line_bot_api.push_message(To_userid,TextSendMessage(text=content))
#取得個資
if (event.source.user_id==host_id) and (event.message.text.split(':')[0]=='@取得個資'):
user_id=event.message.text.split(':')[1]
profile = line_bot_api.get_profile(user_id)
line_bot_api.reply_message(event.reply_token,[
TextSendMessage(text='Display name: ' + str(profile.display_name)),
TextSendMessage(text='Status message: ' + str(profile.status_message)),
TextSendMessage(text='Photo url: ' + str(profile.picture_url))])
#玩股網診股
elif (event.message.text.split(' ')[0]=="技術健診") and (len(event.message.text.split(' '))==2):
sid=event.message.text.split(' ')[1]
content=wantgoo(sid)
line_bot_api.reply_message(event.reply_token,TextSendMessage(content))
#chatgpt
elif(event.message.text != "個股健診")&(event.message.text != "選股")&(event.message.text != "走勢預測"):
chatgpt.add_msg(f"Human:{event.message.text}?\n")
reply_msg = chatgpt.get_response().replace("AI:", "", 1)
chatgpt.add_msg(f"AI:{reply_msg}\n")
line_bot_api.reply_message(event.reply_token,TextSendMessage(text=reply_msg))
#run
if __name__ == "__main__":
app.run(host='127.0.0.1', port=2336, debug=True)
其中from chatgpt import ChatGPT
chatgpt = ChatGPT()
我們來看看這個package
from prompt import Prompt

import os
import openai

openai.api_key = "***********************************************"


class ChatGPT:
def __init__(self):
self.prompt = Prompt()
self.model = os.getenv("OPENAI_MODEL", default = "text-davinci-003")
self.temperature = float(os.getenv("OPENAI_TEMPERATURE", default = 0))
self.frequency_penalty = float(os.getenv("OPENAI_FREQUENCY_PENALTY", default = 0))
self.presence_penalty = float(os.getenv("OPENAI_PRESENCE_PENALTY", default = 0.6))
self.max_tokens = int(os.getenv("OPENAI_MAX_TOKENS", default = 240))

def get_response(self):
response = openai.Completion.create(
model=self.model,
prompt=self.prompt.generate_prompt(),
temperature=self.temperature,
frequency_penalty=self.frequency_penalty,
presence_penalty=self.presence_penalty,
max_tokens=self.max_tokens
)
return response['choices'][0]['text'].strip()

def add_msg(self, text):
self.prompt.add_msg(text)
其中from prompt import Prompt代碼如下
import os

chat_language = os.getenv("INIT_LANGUAGE", default = "zh")

MSG_LIST_LIMIT = int(os.getenv("MSG_LIST_LIMIT", default = 20))
LANGUAGE_TABLE = {
"zh": "嗨!",
"en": "Hi!"
}

class Prompt:
def __init__(self):
self.msg_list = []
self.msg_list.append(f"AI:{LANGUAGE_TABLE[chat_language]}")

def add_msg(self, new_msg):
if len(self.msg_list) >= MSG_LIST_LIMIT:
self.remove_msg()
self.msg_list.append(new_msg)

def remove_msg(self):
self.msg_list.pop(0)

def generate_prompt(self):
return '\n'.join(self.msg_list)
接下來就把該填的key填完
openai.api_key = "***********************************************"
#Line的一些使用者金鑰設定
line_bot_api = LineBotApi('*******************************')
handler = WebhookHandler('*
*******************************')
host_id="
************************
openai api_key 可以去

OpenAI API

An API for accessing new AI models developed by OpenAI

取得
line 的api key可以去
Line Developers的 Basic setting and Messaging API取得
自己勤勞點找一下往下滑不難找到
在來就是執行主程式
這裡port
#run
if __name__ == "__main__":
app.run(host='127.0.0.1', port=2336, debug=True)
也不一定要2336可以自行設定
然後開ngrok
把反白處貼到
Webhook settings
測試
一直跟我兜圈子
改一下參數
大功告成.
最大限度上用現代科技做了一個仿製命運石之門的聊天機器人
不確定能否增加傲嬌屬性
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
人工智能工作經驗跟研究
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
🚩命盤的運勢與個性,命理小知識
Thumbnail
如果真有時間旅行者 我相信他將把世界導向好的方向 即便短期的情況很糟 我也相信這是成就未來所選擇的犧牲 本身選擇就是一種收束和結果 那肯定不會盡如人意的 說到這裡 重要的還是自己的目標 其實周遭怎麼樣的重點是自己怎麼樣 看似平常的一段聚餐可能都是眾多時間線所獨有的 看似絕望的一段聚餐可能
Thumbnail
何謂[改],一定是知道不好才會想去[改好],前提是要先知道好運或衰運對不對,什麼都不知道,請問要改什麼呢? 
Thumbnail
我們該如何通過知識,改變自己的人生? 【學習過程中,哪些知識會真正影響到我們的人生?】 若以商業的角度而言,知識的最大價值,在於它是否能將其轉化為生產力,即「實際的價值」。如果某個知識,不能轉化為生產力,那它在本質上,就只是腦中儲存的一條訊息而已。雖然博學是一件好事,但一定會瓜分掉你有限
Thumbnail
我們該如何通過知識,改變自己的人生?   【你所身處的世界,並非是一個真實的世界。】 疤痕實驗: 測試單位先將 10 位被測試者的臉上都畫上了十分逼真的傷疤,連每位被測試者自己看了都嚇一跳,之後測試單位再告訴實驗受試者,要在他們的臉上擦上定妝的粉末,但事實上是假藉塗粉末的名義,再把這
Thumbnail
台灣因地形難以續留雨水,第三大水庫石門水庫,是台灣第一座多功能水庫。Due to the terrain, it is hardly to conserve water, Shih Men Reservoir is the 3rd biggest one of Taiwan.
Thumbnail
【命運之輪】The Wheel of Fortune: 牌卡故事主角:天神 ― 宙斯【Zeus】 奥林帕斯山的最大天神,掌管雷電,也是雷神,代表有力的資源,也代表一個正在學習中的領導者,學無止境,行動力強喜歡戰勝的感覺、是一個有遠大抱負的人,就像是占星學中木星給我們的能量,一種沒有上限的進取能量,讓
Thumbnail
生命是長期而持續的累積。 那些過去的「點」不那麼重要,卻也很重要。 不那麼重要,就是因為它是人生中的一件事。維度拉大來看,就顯得常態而渺小。 真的很重要,是因為我們做的每個選擇,也都播下了未來的種子。
Thumbnail
   你是否曾經有過類似的經驗?在你的生命歷程中試圖拋掉曾經擁有過的軌跡,想逃往另一個夢想中的道路,但是不管你的決心有多麼堅持,經過多少年的時間之後,命運還是把你推回了原本的道路上?這樣的經驗可能發生在職場,也會發生在情感的依附上,但是今天我只談職場的部分,以後有機緣再來談情感的宿命吧!  
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
🚩命盤的運勢與個性,命理小知識
Thumbnail
如果真有時間旅行者 我相信他將把世界導向好的方向 即便短期的情況很糟 我也相信這是成就未來所選擇的犧牲 本身選擇就是一種收束和結果 那肯定不會盡如人意的 說到這裡 重要的還是自己的目標 其實周遭怎麼樣的重點是自己怎麼樣 看似平常的一段聚餐可能都是眾多時間線所獨有的 看似絕望的一段聚餐可能
Thumbnail
何謂[改],一定是知道不好才會想去[改好],前提是要先知道好運或衰運對不對,什麼都不知道,請問要改什麼呢? 
Thumbnail
我們該如何通過知識,改變自己的人生? 【學習過程中,哪些知識會真正影響到我們的人生?】 若以商業的角度而言,知識的最大價值,在於它是否能將其轉化為生產力,即「實際的價值」。如果某個知識,不能轉化為生產力,那它在本質上,就只是腦中儲存的一條訊息而已。雖然博學是一件好事,但一定會瓜分掉你有限
Thumbnail
我們該如何通過知識,改變自己的人生?   【你所身處的世界,並非是一個真實的世界。】 疤痕實驗: 測試單位先將 10 位被測試者的臉上都畫上了十分逼真的傷疤,連每位被測試者自己看了都嚇一跳,之後測試單位再告訴實驗受試者,要在他們的臉上擦上定妝的粉末,但事實上是假藉塗粉末的名義,再把這
Thumbnail
台灣因地形難以續留雨水,第三大水庫石門水庫,是台灣第一座多功能水庫。Due to the terrain, it is hardly to conserve water, Shih Men Reservoir is the 3rd biggest one of Taiwan.
Thumbnail
【命運之輪】The Wheel of Fortune: 牌卡故事主角:天神 ― 宙斯【Zeus】 奥林帕斯山的最大天神,掌管雷電,也是雷神,代表有力的資源,也代表一個正在學習中的領導者,學無止境,行動力強喜歡戰勝的感覺、是一個有遠大抱負的人,就像是占星學中木星給我們的能量,一種沒有上限的進取能量,讓
Thumbnail
生命是長期而持續的累積。 那些過去的「點」不那麼重要,卻也很重要。 不那麼重要,就是因為它是人生中的一件事。維度拉大來看,就顯得常態而渺小。 真的很重要,是因為我們做的每個選擇,也都播下了未來的種子。
Thumbnail
   你是否曾經有過類似的經驗?在你的生命歷程中試圖拋掉曾經擁有過的軌跡,想逃往另一個夢想中的道路,但是不管你的決心有多麼堅持,經過多少年的時間之後,命運還是把你推回了原本的道路上?這樣的經驗可能發生在職場,也會發生在情感的依附上,但是今天我只談職場的部分,以後有機緣再來談情感的宿命吧!