見出し画像

【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のアカウント設定が少し分かりにくかったので、画像付きで説明しています。

LINE Developers Consoleにアクセスしログイン
.プロバイダーを作成(初回のみ)

プロバイダーを作成


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

新しいチャネル作成

外部サイトに移動しアカウントを作成します。

.Messaging APIの設定画面をクリック

Messaging APIの設定画面を開くをクリック

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

プロバイダーを選択

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

コピーしておく

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

チャネルアクセストークン発行


実装手順

ステップ1:pythonで実装準備

今回私はvscodeのAzureFunctionでテンプレート用意します。

pythonで実装準備

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

functionテンプレートを選択

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にする

URL設定

ステップ3の2でapi/webhookを追加している理由は
function_app.pyでroute="webhook"としているためです。
Azure Functionsでは、デフォルトで /api/ がプレフィックスとして付くroute="webhook" → /api/webhook になる
もし route="test" なら → /api/test になる


LINE応答設定の調整

LINE Official Account Manager

  • チャット → OFF

  • 応答メッセージ → OFF

  • Webhook → ON

応答機能設定


完成です!

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

LINEのやり取り


気づき

LINEbotは意外と簡単でした!
ただ、会話の履歴を持っていないので、遡って会話することや続ける会話ができませんでした。
次は履歴を持たせるようにしてみたいです🤔



まとめ

Azure OpenAIとも繋ぎやすかったですし、こんなことできるんだ!という発見ができて楽しめました。
今回はLINEbotを作成しましたが、LINEではLINEミニアプリや、LIFFなど他にも作成できるものがありそうなので、触ってみたいです!




著者:森戸 香帆
幼少期からものづくりが大好き。
コロナ禍での新卒時に人材会社へ就職するも、希望とは異なる部署に配属。
そこで改めて自己分析を行い、独学でITを学び始める。
その後、ITエンジニアへ転職し、いろいろ省略して今に至る。


痛快技術株式会社について

痛快技術株式会社 : https://www.tsu-x.com/

当社は、技術の力で社会の問題を解決することを目的として設立されました。私たちは、技術の楽しさを広め、社会のニーズに合わせた製品を開発し、幸せな未来を実現することを使命としています。

痛快技術ではAIの技術やを使った開発を行っております。
他の記事も読んでみてください!


いいなと思ったら応援しよう!