【LINEbot × Azure OpenAI】意外と簡単!友達感覚で話せるAI botを作ってみた
前のプロジェクトで、LINE画面から購入できるサイト開発していた経験があり、そのときの復習と純粋な好奇心から、改めてLINEを絡めての開発を学んでみました!
今までAzure OpenAIを勉強していたのでLINEと絡めて作成してみました!
Azure FunctionsとLangChainを使うことで、サーバー管理不要でシンプルに実装でき、ngrokを使えばデプロイ前にローカルで動作確認もできます。
この記事を呼んで少しでも参考になれば幸いです。
作成するもの
LINEに送ったメッセージに対して、Azure OpenAIが自動で返答する
ChatGPTをもう少しカジュアルにしたような、
LINEで友達とやり取りするようにできることが目標です!

プロンプト
以下のように指示しました。
prompt_text = """
あなたは親しみやすく、丁寧なアシスタントです。
LINEでのチャット形式で、フレンドリーに会話してください。
ルール:
- 短めの文章で、読みやすく
- 敬語は使わない
- わかりやすく説明する
- 知らないことは「わからないです」と正直に言う
- 100文字以内で答える
- 画像の内容に基づいて回答する
質問:{user_input}
回答:
"""完成したもの
今回完成したキャプチャです!
自然なやり取りができました!

事前準備
LINEアカウント(LINE Developers でログインするの際に必要)
Azure OpenAI Serviceの以下リソース
エンドポイントURL
APIキー
デプロイメント名
Python 3.12(Azure Functionsは3.7〜3.12に対応)
ngrokダウンロード
【使用した技術・サービス】
・LINE Messaging API
ユーザーからのメッセージを受け取る窓口となるサービスです。
・Azure Functions
Webhookを受けて処理を行うサーバーレス環境です。
・Azure OpenAI Service(GPT-4o)
メッセージ内容に対するAIの回答を生成するサービスです。
・ngrok
ローカル環境を一時的に外部公開するためのツールです。
・LangChain
AIプロンプトの管理と会話フローの構築
LINE Messaging APIの設定
LINEのアカウント設定が少し分かりにくかったので、画像付きで説明しています。
1.LINE Developers Consoleにアクセスしログイン
2.プロバイダーを作成(初回のみ)

3.新しいチャネルを作成(Messaging APIを選択)

外部サイトに移動しアカウントを作成します。
4.Messaging APIの設定画面をクリック

5.先ほど作成したプロバイダーを選択

6.以下の情報を取得:
・Channel secret

7.以下の情報を取得:
・Channel Access Token
LINE Developers に戻り、作成したアカウントの「Messaging API設定」タブで発行

実装手順
ステップ1:pythonで実装準備
今回私はvscodeのAzureFunctionでテンプレート用意します。

テンプレートはHttp triggerを選択しても、Skipしても問題ありません。
LINEのWebhookはHTTPリクエストを受け取るので、HTTP triggerが適していますが、
今回のように、すでにコードがある場合はスキップでも大丈夫です。

function_app.pyフォルダを以下のように書き換えてください。
上記をSkipした場合、ファイルを新しく追加作成してください。
import azure.functions as func
import logging
import os
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
from langchain_openai import AzureChatOpenAI
from langchain_core.prompts import PromptTemplate
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
# LINE設定
line_bot_api = LineBotApi(os.environ['LINE_CHANNEL_ACCESS_TOKEN'])
handler = WebhookHandler(os.environ['LINE_CHANNEL_SECRET'])
# Azure OpenAI設定
llm = AzureChatOpenAI(
model_name="gpt-4o",
deployment_name=os.environ['AZURE_OPENAI_DEPLOYMENT_NAME'],
azure_endpoint=os.environ['AZURE_OPENAI_ENDPOINT'],
api_key=os.environ['AZURE_OPENAI_API_KEY'],
openai_api_version=os.environ.get('AZURE_OPENAI_API_VERSION', '2024-12-01-preview'),
temperature=0.7
)
# プロンプトテンプレートの定義
prompt_text = """
あなたは親しみやすく、丁寧なアシスタントです。
LINEでのチャット形式で、フレンドリーに会話してください。
ルール:
- 短めの文章で、読みやすく
- 敬語は使わない
- わかりやすく説明する
- 知らないことは「わからないです」と正直に言う
- 100文字以内で答える
- 画像の内容に基づいて回答する
質問:{user_input}
回答:
"""
prompt = PromptTemplate(
template=prompt_text,
input_variables=["user_input"],
)
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
user_message = event.message.text
try:
# プロンプトとLLMを組み合わせてチェーンを作成
chain = prompt | llm
# AIで返信生成
response = chain.invoke({'user_input': user_message})
reply_text = response.content
except Exception as e:
logging.error(f"AI Error: {str(e)}")
reply_text = "申し訳ございません。エラーが発生しました。"
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_text)
)
@app.route(route="webhook", methods=['POST'])
def webhook(req: func.HttpRequest) -> func.HttpResponse:
logging.info('LINE webhook triggered')
# 署名の検証
signature = req.headers.get('X-Line-Signature', '')
body = req.get_body().decode('utf-8')
try:
handler.handle(body, signature)
except InvalidSignatureError:
logging.error("Invalid signature")
return func.HttpResponse("Invalid signature", status_code=400)
except LineBotApiError as e:
logging.error(f"LINE Bot API Error: {e}")
return func.HttpResponse("Error", status_code=500)
return func.HttpResponse("OK", status_code=200)ステップ2:requirements.txtを編集
# Uncomment to enable Azure Monitor OpenTelemetry
# Ref: aka.ms/functions-azure-monitor-python
# azure-monitor-opentelemetry
azure-functions
line-bot-sdk
langchain-openaiステップ3:local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "python",
"LINE_CHANNEL_ACCESS_TOKEN": "あなたのChannel Access Token",
"LINE_CHANNEL_SECRET": "あなたのChannel Secret",
"AZURE_OPENAI_ENDPOINT": "あなたのAzure OpenAIエンドポイント",
"AZURE_OPENAI_API_KEY": "あなたのAzure OpenAI APIキー",
"AZURE_OPENAI_DEPLOYMENT_NAME": "あなたのデプロイメント名",
"AZURE_OPENAI_API_VERSION": "2024-02-15-preview"
}
}LINEのアカウント作成の際にコピーしたものと、
Azureの
・エンドポイントURL
・APIキー
・デプロイメント名
などを貼り付けてください!
ローカル環境でのテスト
ステップ1:Azure Functionsを起動します
ngrokを使ってローカル環境をLINEのWebhookに接続してテストを行います。
ターミナルで以下コマンドを実行します
func start成功すると以下が表示されます
Functions: webhook: [POST] http://localhost:〇〇〇〇/api/webhook
ステップ2:ngrokでローカル環境を公開
新しいターミナルを開いて以下コマンドを実行
〇〇〇〇の部分は出力されたlocalhost:〇〇〇〇の部分を入力
ngrok http 〇〇〇〇出力されたURLを確認
Forwarding: https://xxxx-xxxx.ngrok-free.dev -> http://localhost:7071ステップ3:LINE DevelopersにWebhook URLを設定
1. LINE Developers Consoleの「Messaging API設定」タブを開く
2. 「Webhook URL」にngrokのURLに/api/webhookを追加したものを入力 例:https://xxxx-xxxx.ngrok-free.app/api/webhook
3. 「更新」をクリック
4. 「検証」をクリックして接続確認
5. 「Webhookの利用」をONにする

ステップ3の2でapi/webhookを追加している理由は
function_app.pyでroute="webhook"としているためです。
Azure Functionsでは、デフォルトで /api/ がプレフィックスとして付くroute="webhook" → /api/webhook になる
もし route="test" なら → /api/test になる
LINE応答設定の調整
チャット → OFF
応答メッセージ → OFF
Webhook → ON

完成です!
お疲れ様でした!
これで、LINEで送ったメッセージにAzure OpenAIが自動で返信するbotが完成しました!

気づき
LINEbotは意外と簡単でした!
ただ、会話の履歴を持っていないので、遡って会話することや続ける会話ができませんでした。
次は履歴を持たせるようにしてみたいです🤔
まとめ
Azure OpenAIとも繋ぎやすかったですし、こんなことできるんだ!という発見ができて楽しめました。
今回はLINEbotを作成しましたが、LINEではLINEミニアプリや、LIFFなど他にも作成できるものがありそうなので、触ってみたいです!
著者:森戸 香帆
幼少期からものづくりが大好き。
コロナ禍での新卒時に人材会社へ就職するも、希望とは異なる部署に配属。
そこで改めて自己分析を行い、独学でITを学び始める。
その後、ITエンジニアへ転職し、いろいろ省略して今に至る。
痛快技術株式会社について
痛快技術株式会社 : https://www.tsu-x.com/
当社は、技術の力で社会の問題を解決することを目的として設立されました。私たちは、技術の楽しさを広め、社会のニーズに合わせた製品を開発し、幸せな未来を実現することを使命としています。
痛快技術ではAIの技術やを使った開発を行っております。
他の記事も読んでみてください!
