🕶️

LINE公式アカウントの応答をLLMで知能化!

2024/10/04に公開

0. 背景

公式アカウントを運営する際に、こんな課題はございませんか?

  • 問い合わせが多く、スタッフが足りない
  • 営業時間外に来るメッセージに、即時に対応できない
  • 24時間365日のサポート体制を構築したいが、コストがかさむ

数行のコードで構築できるシステムをご紹介したい

1. Azure OpenAI

Azure OpenAI は、Microsoft が提供する Azure 上のサービスで、OpenAI の言語モデル(GPT シリーズ)と Azure のセキュリティ、スケーラビリティを組み合わせ、AI アプリケーションを簡単に構築できます。

メリット

  1. 大規模言語モデル:GPT-4 などの高度な言語モデルで複雑な自然言語処理をサポート
  2. セキュリティ:企業レベルのセキュリティ基準で、顧客のデータの安全性を確保する
  3. Azure サービスとの統合:Azure Cognitive Services や Machine Learning とのシームレスな統合が可能

2. システム構成

Line Message API

  • LINE Messaging APIは、エンドユーザーが送信したメッセージをLINEプラットフォーム経由でボットサーバーに転送し、ボットサーバーがそのメッセージに応じてREST APIを使ってユーザーに自動返信を行う仕組みです。
  • これにより、企業や開発者は双方向のコミュニケーションを効率的に自動化し、24時間365日のサポートを実現することができます。

メッセージのやり取り

  1. エンドユーザーがメッセージを送信
  2. Webhookでメッセージがボットサーバーに送信される
  3. ボットサーバーがREST APIを使って応答
  4. エンドユーザーが返信を受け取る
  • ここにボットサーバーシステムだけ組み込む必要があります。

自動返信システム

  • LINEでユーザーから送信されたメッセージをリッスン(MessageEvent

  • 事前に指定された応答のスタイルを読み込む(この例では「友好的なスタイル」(get_friendly_prompt)を使用)

  • LLMを使用して返信を生成し、ユーザーの入力とプロンプトを組み合わせて対話に影響を与える(conversation.run

  • reply_tokenを使用して、LINE Messaging API を通じて生成された返信メッセージをユーザーに送信する

    @handler.add(MessageEvent, message=TextMessageContent)
    def handle_message(event):
        # ユーザーから送信されたメッセージを取得
        user_message = event.message.text
    
        # ユーザーのメッセージをログに出力
        app.logger.info(f"ユーザーからのメッセージを受信しました: {user_message}")
    
        try:
            # Prompt スタイルを読み込む
            prompt_style = get_friendly_prompt()  
            
            # LLM とメモリを使用して返信を生成
            # 会話前に Prompt スタイルを追加して対話に影響を与える
            response = conversation.run(input=f"{prompt_style}\nUser: {user_message}")
            
            # ユーザーに生成されたメッセージを返信
            with ApiClient(configuration) as api_client:
                line_bot_api = MessagingApi(api_client)
                line_bot_api.reply_message_with_http_info(
                    ReplyMessageRequest(
                        reply_token=event.reply_token,
                        messages=[TextMessage(text=response)]
                    )
                )
            app.logger.info(f"メッセージが正常に送信されました: {response}")
        except Exception as e:
            app.logger.error(f"メッセージの送信に失敗しました: {str(e)}")
    
  • Azure API KEYを用意した上、LangChainにより記憶があるボットを構築する

    import os
    from dotenv import load_dotenv
    from langchain.chat_models import AzureChatOpenAI
    
    load_dotenv()
    
    def create_llm_client(temperature=0.7, streaming=False) -> AzureChatOpenAI:
        return AzureChatOpenAI(
            openai_api_key=os.getenv("AZURE_OPENAI_API_KEY"),
            openai_api_version=os.getenv("API_VER"),
            azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
            deployment_name=os.getenv("DEPLOYMENT_NAME"),
            temperature=temperature,
            streaming=streaming
        )
    
    llm = create_llm_client()
    memory = ConversationBufferMemory()
    conversation = ConversationChain(llm=llm, memory=memory)
    

Webhookリクエストの正当性を認証する

  • LINEのWebhookイベントを受信し、以下の理由で署名の検証する

    • リクエストの正当性確認
    • データの改ざん防止
    @app.route("/webhook", methods=['POST'])
    def webhook():
        signature = request.headers['X-Line-Signature']
        body = request.get_data(as_text=True)
        app.logger.info(f"Request body: {body}")
    
        try:
            handler.handle(body, signature)
        except InvalidSignatureError:
            app.logger.error("無効な署名です。チャンネルシークレットを確認してください。")
            abort(400)
        except Exception as e:
            app.logger.error(f"エラーが発生しました: {str(e)}")
            abort(500)
    
        return 'OK'
    

3. システム検証

まだ本格的なクラウドサービスを導入していない場合や、迅速にLINE Messaging APIの動作を確認したい場合どのように検証したほうがいいのか?

ngrokで検証する

ngrokは、ローカル環境で動作しているサーバーを一時的にインターネット上に公開できるツールです。これにより、LINE公式アカウントとボットサーバーの通信テストを簡単に行えます。詳細は以下に参照してください!

https://zenn.dev/yh007/articles/427d29d08dabce

  1. ngrokからもらったURLを最後のwebhook まで以下のMessaging APIのWebHookに登録し、有効化にする
  2. ngrokを起動した上、app.py を実行する
  3. 以下のように使えると思う
  4. 常に既読をしたい場合は以下の手順に参照

まとめ

LLMによるLINE公式アカウントの知能化により、対話体験が大幅に向上できるし、24時間対応が可能になります。引き続き、LLMに関する新しい応用例を更新し、ユーザー体験をさらに向上させることに努めていきます。

Discussion