panco’s blog

興味が沸いたことを書く

LINE × Llama 2 のチャットボット開発③(Llama 2 翻訳編) Llama 2 搭載メンヘラ彼女の誕生はまだ遠い

前回の記事はこちら。 pancokeiba.hatenablog.com

llama-2-70b-chat を使用しているが、ChatGPT のように日本語で返してくれるわけではなさそうだ。日本語で聞いた質問は理解してくれるものの回答が英語限定の様子(執筆時点)。

ということで、今回のテーマはこちら。

llama-2-70b-chat の返答を翻訳して LINE に送る

googletrans を利用し、Llama 2 から受け取ったメッセージを日本語に翻訳する実装を追加した。 出来上がった main.py はこちら。

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
)
import replicate
import os 
from googletrans import Translator

app = Flask(__name__)

# LINE のチャネルアクセストークン設定
configuration = Configuration(access_token=os.environ['CHANNEL_ACCESS_TOKEN'])
# LINE の秘密鍵設定
handler = WebhookHandler(os.environ['CHANNEL_SECRET'])

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        app.logger.info("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
    with ApiClient(configuration) as api_client:
        # Llama2 実行
        output = replicate.run(
            "meta/llama-2-70b-chat:35042c9a33ac8fd5e29e27fb3197f33aa483f72c2ce3b0b9d201155c7fd2a287",
            input={"prompt": event.message.text}
        )
        output_ilst = list(output)
        output_str = ''.join(output_ilst)
        
        # 翻訳
        translator = Translator()
        translated = translator.translate(output_str, src='en', dest='ja').text

        line_bot_api = MessagingApi(api_client)
        line_bot_api.reply_message_with_http_info(
            ReplyMessageRequest(
                reply_token=event.reply_token,
                messages=[TextMessage(text=translated)]
            )
        )

if __name__ == "__main__":
    app.run()

動作確認

英語で聞いても日本語で返してくれる。

ちなみに、Replicate を見ると Output は英語のため、期待通り googletrans が効いていることがわかる。