🐥

【Go】AWS BedrockでClaude3 Haikuを使ってみる

2024/03/16に公開

はじめに

現在界隈で盛り上がりをみせているClaude3ですが、Bedrockでも使えるようになったとのことで検証していきます!
事前準備から実際にGoでコードを動かせるように解説するので、最後まで読んでもらえると嬉しいです。

事前準備

1. AWSのシークレット(環境変数)を用意する

.envに以下の値を設定します。
Claude3 Sonnet(おそらくHaikuも)は、米国東部(バージニア北部)および米国西部(オレゴン)のみで使えるため、今回はバージニア北部のus-east-1を設定します。

.env
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1

2. モデルアクセスを要求(ユースケースの送信)

Amazon Bedrock > プロバイダーへ移動して、使いたいモデルへのアクセスをリクエストします。

モデルのアクセスを要求する前にユースケースの送信が必要な方は、用途などをフォームに入力しましましょう。
入力後すぐにアクセスをリクエストできるようになります。

Haikuを選択し、「モデルアクセスをリクエスト」します。

アクセスが付与されれば準備完了です。

GoのSDKを使う

早速Goでコードを書いていきます。

  • モデルはこちらで確認できます
  • APIリクエストの形式はこちらで確認できます

ハマったポイント

何度かエラーを繰り返したので、その場合の確認ポイントを列挙します。

  • リージョンを指定しているか
    • us-east-1であることを確認してください ※他にも可能なリージョンはありますが、本記事では統一しています
  • モデルが許可されているか
    • 前述した事前準備を確認してください
  • リクエストが正しいか
    • リクエストの形式(プロパティ名など)を確認してください

Go

以下のような会話(1往復)をするコードで、なるべく余計な処理を省いてシンプルに作っています。

自分 「こんにちは」
AI 「はい、こんにちは。どのようなことでお困りですか?法律に関する質問などありましたら、専門家としてお答えさせていただきます。よろしくお願いいたします。」

※システムメッセージで「あなたは法律の専門家です」と入れています。

main.go
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