【Go】AWS BedrockでClaude3 Haikuを使ってみる
はじめに
現在界隈で盛り上がりをみせているClaude3ですが、Bedrockでも使えるようになったとのことで検証していきます!
事前準備から実際にGoでコードを動かせるように解説するので、最後まで読んでもらえると嬉しいです。
事前準備
1. AWSのシークレット(環境変数)を用意する
.env
に以下の値を設定します。
Claude3 Sonnet(おそらくHaikuも)は、米国東部(バージニア北部)および米国西部(オレゴン)のみで使えるため、今回はバージニア北部のus-east-1
を設定します。
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
2. モデルアクセスを要求(ユースケースの送信)
Amazon Bedrock > プロバイダー
へ移動して、使いたいモデルへのアクセスをリクエストします。
モデルのアクセスを要求する前にユースケースの送信が必要な方は、用途などをフォームに入力しましましょう。
入力後すぐにアクセスをリクエストできるようになります。
Haikuを選択し、「モデルアクセスをリクエスト」します。
アクセスが付与されれば準備完了です。
GoのSDKを使う
早速Goでコードを書いていきます。
ハマったポイント
何度かエラーを繰り返したので、その場合の確認ポイントを列挙します。
- リージョンを指定しているか
-
us-east-1
であることを確認してください ※他にも可能なリージョンはありますが、本記事では統一しています
-
- モデルが許可されているか
- 前述した事前準備を確認してください
- リクエストが正しいか
- リクエストの形式(プロパティ名など)を確認してください
Go
以下のような会話(1往復)をするコードで、なるべく余計な処理を省いてシンプルに作っています。
自分 「こんにちは」
AI 「はい、こんにちは。どのようなことでお困りですか?法律に関する質問などありましたら、専門家としてお答えさせていただきます。よろしくお願いいたします。」
※システムメッセージで「あなたは法律の専門家です」と入れています。
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/bedrockruntime"
"github.com/joho/godotenv"
)
const (
Model = "anthropic.claude-3-haiku-20240307-v1:0"
)
type Message struct {
Role string `json:"role"`
Content []Content `json:"content"`
}
type Content struct {
Type string `json:"type"`
Text string `json:"text"`
}
func init() {
if err := godotenv.Load(".env"); err != nil {
panic(err)
}
}
func main() {
sdkConfig, err := config.LoadDefaultConfig(context.Background())
if err != nil {
panic(err)
}
bedrockClient := bedrockruntime.NewFromConfig(sdkConfig)
content := Content{
Type: "text",
Text: "こんにちは",
}
msg := Message{
Role: "user",
Content: []Content{content},
}
payload := struct {
AnthropicVersion string `json:"anthropic_version"`
MaxTokens int `json:"max_tokens"`
System string `json:"system"`
Messages []Message `json:"messages"`
Temperature float64 `json:"temperature"`
}{
AnthropicVersion: "bedrock-2023-05-31",
MaxTokens: 512,
System: "あなたは法律の専門家です",
Messages: []Message{msg},
Temperature: 1,
}
body, err := json.Marshal(payload)
if err != nil {
panic(err)
}
output, err := bedrockClient.InvokeModel(context.Background(), &bedrockruntime.InvokeModelInput{
ModelId: aws.String(Model),
ContentType: aws.String("application/json"),
Body: body,
})
if err != nil {
panic(err)
}
var resp struct {
ContentItem []struct {
Type string `json:"type"`
Text string `json:"text"`
} `json:"content"`
}
if err = json.Unmarshal(output.Body, &resp); err != nil {
panic(err)
}
fmt.Println(resp.ContentItem[len(resp.ContentItem)-1].Text)
}
さいごに
モデルのアクセス権限の設定を忘れていたり、モデル名が間違っていたりと何度かエラーに遭遇しましたが、エラーメッセージが詳細だったため比較的簡単に解決できました。
ただ、SDKがそれほど整備されていないのか情報が少なく、完全に理解できていない部分もあります。
もう少しGoのSDKの中を読み解いていきたいです。
(間違っていたら教えてください)
ぜひこのコードを参考に、AWS BedrockでClaude3を試してみてください。
Discussion