串接 OpenAI ChatGPT (1)
已经可以使用 Python 开发 LINE BOT 之后,就能再继续搭配 OpenAI ChatGPT 的 API,当接收到指定的消息时,透过 AI 机器人进行自动回复的动作。
快速导览:
本篇文章所需知识
要实作本篇文章的范例,需要先参考以下文章,先建立自己的 LINE BOT 以及注册 OpenAI 账号。
如果已经有账号或专案,直接点击下方链接开始。
- Google Dialogflow:https://dialogflow.cloud.google.com/
- LINE Developers:https://developers.line.biz/zh-hant/
- LINE 官方账号管理页面:https://tw.linebiz.com/login/
使用的 LINE BOT 程序
参考“自动回复消息”文章,使用 Anaconda Jupyter 或本机环境执行下方的程序码,并搭配 ngrok 服务,建立 LINE Webhook URL,执行后发送消息到 LINE BOT,应该就能看到 LINE BOT 回复一模一样的消息。
from flask_ngrok import run_with_ngrok # colab 使用,本機環境請刪除
from flask import Flask, request
from linebot import LineBotApi, WebhookHandler
from linebot.models import TextSendMessage # 載入 TextSendMessage 模組
import json
app = Flask(__name__)
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True)
json_data = json.loads(body)
print(json_data)
try:
line_bot_api = LineBotApi('你的 Channel access token')
handler = WebhookHandler('你的 LINE Channel secret')
signature = request.headers['X-Line-Signature']
handler.handle(body, signature)
tk = json_data['events'][0]['replyToken'] # 取得 reply token
msg = json_data['events'][0]['message']['text'] # 取得使用者發送的訊息
text_message = TextSendMessage(text=msg) # 設定回傳同樣的訊息
line_bot_api.reply_message(tk,text_message) # 回傳訊息
except:
print('error')
return 'OK'
if __name__ == "__main__":
run_with_ngrok(app) # colab 使用,本機環境請刪除
app.run()
加入 OpenAI ChatGPT,让 AI 回复消息
参考“使用 ngrok 服务”,注册 OpenAI 并产生 ChatGPT API Key 之后,修改程序,加入判断“Hi AI:”开头的文字,当文字的开头出现“Hi AI:”的字串时 ( 透过程序全部转成小写 ),就让 OpenAI 进行回复,否则就仍然回传相同的字串。
import openai
from flask_ngrok import run_with_ngrok # colab 使用,本機環境請刪除
from flask import Flask, request
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.models import TextSendMessage # 載入 TextSendMessage 模組
import json
app = Flask(__name__)
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True)
json_data = json.loads(body)
print(json_data)
try:
line_bot_api = LineBotApi('你的 Channel access token')
handler = WebhookHandler('你的 Channel secret ')
signature = request.headers['X-Line-Signature']
handler.handle(body, signature)
tk = json_data['events'][0]['replyToken']
msg = json_data['events'][0]['message']['text']
# 取出文字的前五個字元,轉換成小寫
ai_msg = msg[:6].lower()
reply_msg = ''
# 取出文字的前五個字元是 hi ai:
if ai_msg == 'hi ai:':
openai.api_key = '你的 OpenAI API Key'
# 將第六個字元之後的訊息發送給 OpenAI
response = openai.Completion.create(
model='text-davinci-003',
prompt=msg[6:],
max_tokens=256,
temperature=0.5,
)
# 接收到回覆訊息後,移除換行符號
reply_msg = response["choices"][0]["text"].replace('\n','')
else:
reply_msg = msg
text_message = TextSendMessage(text=reply_msg)
line_bot_api.reply_message(tk,text_message)
except:
print('error')
return 'OK'
if __name__ == "__main__":
run_with_ngrok(app) # colab 使用,本機環境請刪除
app.run()
从下图与 LINE BOT 的对话中可以看出,如果开头没有 hi ai 的聊天消息,就会采用一模一样的消息回复,如果开头有 hi ai 的聊天消息,就会让 OpenAI 进行回复。
小结
结合了 OpenAI 的 LINE BOT,已经能够满足基本“聊天机器人”的需求,但因为聊天的对象是 OpenAI 的 AI 机器人,所以回答的信息可能不见得是所想的结果,建议可以再进一步搭配程序逻辑的判断,或是透过 Dialogflow 的语意判断,才能做出真正有帮助的 LINE 聊天机器人。
微信扫码关注
抖音扫码关注