AI ChatBot I How to Build AI LINE Bot with Ollama, Flask and Ngrok?
Flask 是一个轻量级的Web框架,主要用于建立基于Python的Web应用和API。它可搭建webhook本地服务器,同时提供灵活的URL路由和HTTP请求处理方式,允许开发者快速启动并测试应用功能。由于其结构简单,开发者常用其作为建立和测试 MVP(最小可行性产品),同时其也非常适合新手作为入门学习Web开发的工具之一。
本文利用树莓派4B搭建Flask和Ngrok来实现简易的LINE Bot功能,其中Ngrok的安装和建置可参考此篇文章,本篇主要着重在Flask环境建置和程式码的部分。
Flask环境建置:
a.为了避免版本干扰,建置python venv虚拟环境
raspberry@raspberry-desktop:~/python-venv$ python -m venv ngrok_linebot_env raspberry@raspberry-desktop:~/python-venv$ source ngrok_linebot_env/bin/active
b.在该虚拟环境中,安装flask和line-bot-sdk
(ngrok_linebot_env) raspberry@raspberry-desktop:~/python-venv$ pip install flask line-bot-sdk
程式码:
该程式码范例主要是让LINE Bot回应与请求相同的内容,相当于是一只学人说话的鹦鹉。
from flask import Flask, request, abort
from linebot.v3 import (
WebhookHandler
)
from linebot.v3.exceptions import (
InvalidSignatureError
)
from linebot.v3.messaging import (
Configuration,
ApiClient,
MessagingApi,
ReplyMessageRequest,
TextMessage
)
from linebot.v3.webhooks import (
MessageEvent,
TextMessageContent
)
app = Flask(__name__)
#Channel Access Token 和 Channel Secret
configuration = Configuration(access_token='your Channel Access Token')
handler = WebhookHandler('your Channel Secret')
#根路径 "/" (用于检测flask server是否有顺利运作)
@app.route("/")
def index():
return "Hello, Flask is running!"
#LINE Bot的Webhook回调路由
@app.route("/callback", methods=['POST'])
def callback():
#X-Line-Signature headers info
signature = request.headers['X-Line-Signature']
#请求资料
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
#验证签名并处理Webhook请求
try:
handler.handle(body, signature)
except InvalidSignatureError:
app.logger.info("Invalid signature. Please check your channel access
token/channel secret.")
abort(400)
return 'OK'
#讯息处理function
@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
#利用ApiClient建立与LINE Messaging API的串接
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)#创建MessagingApi实例
#ReplyMessageRequest,用于发送回覆讯息
reply_message_request = ReplyMessageRequest(
reply_token=event.reply_token,
messages=[TextMessage(text=event.message.text)] #将接收到的讯息作为回覆讯息
)
#利用MessagingApi的reply_message_with_http_info方法发送回覆讯息
line_bot_api.reply_message_with_http_info(reply_message_request)
if __name__ == "__main__":
app.run(port=5000) #port=5000, 须与ngork的port=5000一致
若想让使用者透过LINE与AI模型进行问答,可考虑与OpenAI的API进行串接,若是考量问答数据有隐私或商业机密,则可考虑搭建本地AI服务器并与之串接,如Ollama。本文封面视频即是利用Flask和Ollama串接的LINE Bot测试效果。