OPEN AI x ChatGPT x LineBot 串接完整全紀錄

更新於 2024/12/16閱讀時間約 18 分鐘
步驟:
S1.至OPEN AI 取得 API KEY
S2.至LineBot 取得 Channel access token 、Channel secret 並 進行相關設定
S3.至Vercel 申請免費伺服器並連結 GitHub原碼
S4.GitHub上傳原碼(index.py、chatgpt.py、prompt.py、requirements.txt、vercel.json)
S5.至Vercel進行伺服器設定(此處主要為原碼與環境變數,也就是將S1 & S2 的api key 與 權杖 進行設定,取得進行 Webhook用的網址),成功後可看到 Hello World 字眼
S6.至LineBot 進行 WebHook設定,完成後即可在Line上進行測試

詳細步驟流程:

取得OPEN API KEY


首先至OPEN AI 取得 API KEY,詳細可參閱 OPENAI 聊天機器人 文章

LineBot Channel access token 、Channel secret

取得 LineBot Channel access token 、Channel secret 後 至 Line BOT 控制台 申請 LineBot Key
申請方式,可參照 LineBOt 建置影片
其中要注意,此處為
點擊後方 Edit 可進到中文頁面修改
設定完成後 至 vercel 申請免費伺服器

Vercel 匯入 GitHub 原碼

申請完成後,匯入 GitHub 原碼
若沒 GitHub 則需至 GitHub官網註冊
GitHub上傳原碼 可在官網下載工具使用

原碼部分

from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
from api.chatgpt import ChatGPT
import os
line_bot_api = LineBotApi(os.getenv("LINE_CHANNEL_ACCESS_TOKEN"))
line_handler = WebhookHandler(os.getenv("LINE_CHANNEL_SECRET"))
working_status = os.getenv("DEFALUT_TALKING", default = "true").lower() == "true"
app = Flask(__name__)
chatgpt = ChatGPT()
# domain root
@app.route('/')
def home():
    return 'Hello, World!'
@app.route("/webhook", methods=['POST'])
def callback():
    # 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:
        line_handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'
@line_handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    global working_status
    
    if event.message.type != "text":
        return
    working_status = True
    if working_status:
        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))
if __name__ == "__main__":
    app.run()
chatgpt.py 可參考 OPEN AI 聊天機器人Chat範例
from api.prompt import Prompt
import os
import openai
openai.api_key = os.getenv("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)
prompt.py 可參考 vercel 官網提供的 python flask 範例
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)
此外,根據vercel官網提供的 python flask建置,還須注意
You can install dependencies for your Python projects by defining them in requirements.txt or a Pipfile with corresponding Pipfile.lock.
requirements.txt
Flask==2.2.2
這件事,將版本與相關的SDK建立 requirements.txt
Flask==2.2.2
line-bot-sdk
openai
還有,vercel.json 用來,指定路徑進入點的
{
  "builds": [
    {
      "src": "api/index.py",
      "use": "@vercel/python"
    }
  ],
  "routes": [
    {
      "src": "/(.*)",
      "dest": "api/index.py"
    }
  ]
}
完成後,透過 GitHub 工具上傳
上傳完成後,返回 vercel 進行 import

Vercel Environment Variables 環境設定

點擊 Environment Variables 進行環境設定,將OPEN AI & LineBot API KEY 進行輸入設定,完成後 點擊 Deploy

LineBot Webhook 設定

完成後,複製 DOMAINS 路徑,返回 LineBot後台
將路徑貼上,並在路徑後方加上 webhook,原因是我們在 index.py處
@app.route("/webhook", methods=['POST'])
將路徑引到此處與LineBot透過post方式傳輸資料
至此就可以進行測試囉~

QA

chatgpt 與 openai gpt3 有何差異

chatgpt 有api嗎

使用ChatGPT API

若要使用 ChatGPT 作為 Line機器人的串接API
則須將 chatgpt.py 的
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()
透過ChatGPT說的進行合併修改
import openai
openai.api_key = "YOUR_API_KEY"
response = openai.Completion.create(
engine="chatbot",
prompt="Hello, how are you today?",
max_tokens=20
)
print(response.text)
不過經過測試,這裡有點有趣
依上述所言,只要改 model 就應該可以
def __init__(self):
        self.prompt = Prompt()
        self.model = "chatbot"
        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()
But
因此~
目前就是只能用 OpenAI GPT-3 玩~

後記:

經過我的騷擾跟測試,這機器人改口了~
笑死~
本紀錄參考:
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
40會員
130內容數
獨立遊戲開發紀錄
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
吳佳鑫的沙龍 的其他內容
安裝Python 安裝Open Ai 參考資料 註冊申請 Open AI API 至官方網站申請為會員,接著選 View API Key 進入後 選擇 Create CHAT 範例 官方範例 中文CHAT
XAMPP 伺服器架設 S1. 下載與安裝 S2. 啟動XAMPP、Apache、Mysql S3. Mysql安全性設定 shell : --user=root password "1234" phpmyadmin(config.inc.php) S4. Apache設定
本範例為 PHP 載入 CSV檔,進行數據統計,並計算出各號碼開出次數。 資料來源: 政府資料開放平台 公益彩券各年度各期電腦型彩券獎號、銷售金額與獎金總額 載入CSV檔的作法 將資料進行統計整理 將資料放於陣列的方式 自定義函式 完整原碼
構想上,前端簡單的使用Google Map 做定位,並寫入SQL做第一段比對經緯度。接著前端有一個php上傳圖片的功能(沒有 https 所以就不做網頁開相機的方式)。經過上傳至伺服器後,python 圖形辨識,比對上傳的圖片,若比對成功或相似度差異不大,則判定正確,寫入SQL,端頁面顯示奪寶成功。
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
安裝Python 安裝Open Ai 參考資料 註冊申請 Open AI API 至官方網站申請為會員,接著選 View API Key 進入後 選擇 Create CHAT 範例 官方範例 中文CHAT
XAMPP 伺服器架設 S1. 下載與安裝 S2. 啟動XAMPP、Apache、Mysql S3. Mysql安全性設定 shell : --user=root password "1234" phpmyadmin(config.inc.php) S4. Apache設定
本範例為 PHP 載入 CSV檔,進行數據統計,並計算出各號碼開出次數。 資料來源: 政府資料開放平台 公益彩券各年度各期電腦型彩券獎號、銷售金額與獎金總額 載入CSV檔的作法 將資料進行統計整理 將資料放於陣列的方式 自定義函式 完整原碼
構想上,前端簡單的使用Google Map 做定位,並寫入SQL做第一段比對經緯度。接著前端有一個php上傳圖片的功能(沒有 https 所以就不做網頁開相機的方式)。經過上傳至伺服器後,python 圖形辨識,比對上傳的圖片,若比對成功或相似度差異不大,則判定正確,寫入SQL,端頁面顯示奪寶成功。
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
本專題為兩塊ESP8266-ESP01 ,分別為 Arduino+ESP-01+YL-69 土壤濕度檢測器與LED燈 ,以及 ESP-01 + DHT11 + LED 傳輸給伺服器端,並於伺服器上 WebSite 透過ESP-01上傳儲 存於 MYSQL 資料呈現曲線圖給前端使用者。此外,前端使用者
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
OpenAI 推出 高品質影片生成式 AI「Sora」後,在全球掀起熱烈的關注,即便在還沒有對外開放,「Sora」也在網路媒體上引起一窩蜂的討論。
Thumbnail
以下都是轉貼各方觀點,重點可以進一步看發表者跟回應者,我自己也有自身應用場景的murmur : 低利率環境可能回不去 科技掌握在大資金公司時代則是持續下去 工業時代引導一波人才需求 東方社會喜歡考試定生死 學校教育外還有補習班可以協助 既然AI工具隨處可得 培養厚植的各方素養與多元興趣
Thumbnail
  靜靜地坐在桌前,腦海中如潮水般不斷回想著 Open AI 發佈會的點點滴滴。那一場發佈會,宛如一道淩厲的閃電,猛然間照亮了未來那原本被重重迷霧所籠罩的道路,卻也在我的心中肆意地湧起了無盡的不確定與惶恐。   看著那些關於 AI 發展的詳細介紹,我仿佛看到了一個正以驚人速度變化著的世界在
Thumbnail
在快時代的生活裡人工智慧是少不了的,Open AI是一間專門研究AI的公司,而Open AI創辦人希望進行 AI 研究可以促進和發展友好的人工智慧,使人類整體受益。剛接觸AI的朋友可以跟隨本文一起了解喔! 什麼是Open AI? Open AI是一間美國人工智慧研究所,2015年於舊金山成立,主
Thumbnail
這篇內容精華重點:一個是 Open AI 執行長分享了一篇「希望有人早點告訴他的幾件事」,從過來人的角度分享他年輕時會希望有人告訴他的事情,很有啟發,還有一部影片是我認為人生必看 TED 的演講,叫脆弱的力量,告訴我們與脆弱相處的方法跟重要性。
Thumbnail
是的,又是個打問號的標題,而且還慢了一個多星期,就是一篇廢文… 今天來挑戰超短廢文! 就在8月14、15日,大批媒體開始發表,起因為印度的《Analytics India Magazine》這個媒體在8/10發表了一篇文章,雖然文章中有舉出許多支持標題的觀點,但是就如同:這部車再不轉彎,就會撞上道
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
OpenAI 推出 高品質影片生成式 AI「Sora」後,在全球掀起熱烈的關注,即便在還沒有對外開放,「Sora」也在網路媒體上引起一窩蜂的討論。
Thumbnail
以下都是轉貼各方觀點,重點可以進一步看發表者跟回應者,我自己也有自身應用場景的murmur : 低利率環境可能回不去 科技掌握在大資金公司時代則是持續下去 工業時代引導一波人才需求 東方社會喜歡考試定生死 學校教育外還有補習班可以協助 既然AI工具隨處可得 培養厚植的各方素養與多元興趣
Thumbnail
  靜靜地坐在桌前,腦海中如潮水般不斷回想著 Open AI 發佈會的點點滴滴。那一場發佈會,宛如一道淩厲的閃電,猛然間照亮了未來那原本被重重迷霧所籠罩的道路,卻也在我的心中肆意地湧起了無盡的不確定與惶恐。   看著那些關於 AI 發展的詳細介紹,我仿佛看到了一個正以驚人速度變化著的世界在
Thumbnail
在快時代的生活裡人工智慧是少不了的,Open AI是一間專門研究AI的公司,而Open AI創辦人希望進行 AI 研究可以促進和發展友好的人工智慧,使人類整體受益。剛接觸AI的朋友可以跟隨本文一起了解喔! 什麼是Open AI? Open AI是一間美國人工智慧研究所,2015年於舊金山成立,主
Thumbnail
這篇內容精華重點:一個是 Open AI 執行長分享了一篇「希望有人早點告訴他的幾件事」,從過來人的角度分享他年輕時會希望有人告訴他的事情,很有啟發,還有一部影片是我認為人生必看 TED 的演講,叫脆弱的力量,告訴我們與脆弱相處的方法跟重要性。
Thumbnail
是的,又是個打問號的標題,而且還慢了一個多星期,就是一篇廢文… 今天來挑戰超短廢文! 就在8月14、15日,大批媒體開始發表,起因為印度的《Analytics India Magazine》這個媒體在8/10發表了一篇文章,雖然文章中有舉出許多支持標題的觀點,但是就如同:這部車再不轉彎,就會撞上道