Skip to content

Bedrock + Claude 2.1 + Lambda@Edge を Chatbot に繋げてみた

Posted on:2023年12月4日 at 14:24

やってみたこと

家族が気軽にLLMに触れることができるようにLINEのChatbotでOpenAIのChatGPTに繋げるということをやってきました。

Bedrock で Claude 2.1 が使えるようになり、 ChatGPT3.5 より高速で精度が良いという噂だったので、 ChatBotが繋げるAIを Claude 2.1 に変更してみました。

前提

Lambda から Bedrock に繋げるコードを書く

yarn add -D @aws-sdk/client-bedrock-runtime
import { logger } from './logger'
import { BedrockRuntime } from '@aws-sdk/client-bedrock-runtime'
const client = new BedrockRuntime({ region: 'us-east-1' })

export async function chat(chat_message: string) {
 try {
   const start = new Date().getTime()
   logger.info(`start call Bedrock Claude.`)
   let answer = ''
   if (chat_message.length > 5) {
     logger.info(`Request to Bedrock Claude. ${chat_message}`)

     const res = await client.invokeModel({
       modelId: 'anthropic.claude-v2',
       accept: 'application/json',
       contentType: 'application/json',
       body: JSON.stringify({
         prompt: `\n\nHuman: ${chat_message} \n\nAssistant:`,
         max_tokens_to_sample: 1000,
         temperature: 1,
         top_k: 250,
         top_p: 0.999,
         anthropic_version: 'bedrock-2023-05-31',
       }),
     })
     const body: {
       completion: string
       stop_reason: string
       stop: string
     } = JSON.parse(Buffer.from(res.body).toString('utf-8'))
     logger.trace(body)
     answer = body.completion
   } else {
     answer = '質問は5文字以上で入力してください'
   }
   logger.info(`Result from Bedrock Claude. ${answer}`)
   logger.info(`finish call Bedrock Claude. ${new Date().getTime() - start}[ms]`)
   return answer
 } catch (e) {
   logger.error(e)
   return 'AIが回答を見つけられませんでした。'
 }
}
import { logger } from './logger'
import { BedrockRuntime } from '@aws-sdk/client-bedrock-runtime'
const client = new BedrockRuntime({ region: 'us-east-1' })
    const res = await client.invokeModel({
       modelId: 'anthropic.claude-v2:1',
       accept: 'application/json',
       contentType: 'application/json',
       body: JSON.stringify({
         prompt: `\n\nHuman: ${chat_message} \n\nAssistant:`,
         max_tokens_to_sample: 1000,
         temperature: 1,
         top_k: 250,
         top_p: 0.999,
         anthropic_version: 'bedrock-2023-05-31',
       }),
     })
     const body: {
       completion: string
       stop_reason: string
       stop: string
     } = JSON.parse(Buffer.from(res.body).toString('utf-8'))
     logger.debug(body)

LambdaからBedrockを利用できるように、権限をセットする

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "bedrock:*",
            "Resource": "*"
        }
    ]
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "bedrock.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": "sagemaker.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

実際にLINEのChatbot経由で利用してみる

Chatbot

作ってみての感想

LambdaからBedrockに繋げて結果を取得することも難しくはなかったので、興味のあるかたは試してみてください。