LINE聊天机器人,真的不太好设定一个步骤有错都会卡关,我亦弄好久才得到初体验,分享给大家
参考来自
https://vocus.cc/article/639da520fd89780001e965d7
详细步骤流程:
1.取得OPEN API KEY(需自行设定取得)
2.LineBot Channel access token 、Channel secret(需自行设定取得)
3.Vercel 汇入 GitHub 原码 (建议用GitHub建Vercel 帐号)
4.GitHub 原码部分(上传以下三个档案到自已 GitHub)
index.py
from flask import Flask, request, abortfrom linebot import LineBotApi, WebhookHandlerfrom linebot.exceptions import InvalidSignatureErrorfrom linebot.models import MessageEvent, TextMessage, TextSendMessagefrom api.chatgpt import ChatGPTimport osline_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 working_status = True if event.message.type != "text": return 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
from api.prompt import Promptimport osimport openaiopenai.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.model = os.getenv("OPENAI_MODEL", default = "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() def add_msg(self, text): self.prompt.add_msg(text)
prompt.py
import oschat_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)
5.Vercel Environment Variables 环境设定(带入PYTHON 参数)
6.LineBot Webhook(一定要有成功画面)
当以上这么多设定都成功后便会得到以下Line BOT 回应,成为真正的LINE聊天机器人,我试很久才弄出来如下: