🧠

【Claude2】Go+AWS BedrockでClaude2を使ってみる

2023/11/05に公開

はじめに

最近海外でGPT-4よりも優秀じゃね? と話題(Twitterで耳にしただけ...)のAnthropic社製生成AIモデル「Claude2」が気になったので使ってみることにした。

ちなみに、何がどう優秀なのかは公式を見ていただき、、ざっとまとめると

  • 最大10万トークンに対応、最大75,000文字入力
    • GPT-4の3倍以上
  • 2つ以上のファイルを同時に解析
  • 司法試験の選択問題で76.5%正解
  • 2023年初頭までのデータを学習

等々...
もちろんコードの生成や質疑応答も可能。ただ、インターネット接続は未実装な模様。

ゴール

今回は、Goを使用してAWS Bedrock経由でClaude2のを導入して、CLIから操作してみる。
なぜGoなのかは、同じようなことをやっている記事がほぼ見当たらなかったから。

環境

go 1.20

Claude2導入手順

※AWSアカウントが必要
ざっと手順を書いてく。
詳しい導入手順はこちらが参考になる。

  1. コンソールからAWS Bedrockを検索
  2. リージョンをus-east-1に選択し「Get started」
  3. 左から「Base models」
  4. 「Request model access」を選択しAnthropic選択しをリクエストする
  5. 申請理由を入力し、statusが「Access granted」になるまで待つ。(10分ほど)

APIキーとかは特に必要なく、AWS Bedrockのアクセス許可のあるIAMユーザーを用意してください。

コード

GoとAWSということでお馴染みのaws-sdk-go-v2を使ってAWS Bedrockを操作していく。

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"os"

	"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"
)

// メッセージのフォーマット。ClaudeAPIではHuman,Assistantともに必須人物
const claudePromptFormat = "\nHuman: %s\nAssistant:"

func main() {
	err := godotenv.Load(".env")
	if err != nil {
		log.Fatal("Error loading .env file")
	}
	
	// AWSのIAMユーザーとリージョンの設定
	cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRegion("us-east-1"), config.WithSharedConfigProfile(os.Getenv("AWS_PROFILE")))
	if err != nil {
		log.Fatal(err)
	}
	// AWS Bedrockランタイムのクライアントを初期化
	brc = bedrockruntime.NewFromConfig(cfg)

	// CLI読み込み初期化
	reader := bufio.NewReader(os.Stdin)

	// チャット対話のためループ
	for {
		fmt.Print("\nEnter your message: ")
		// CLI入力受付
		input, _ := reader.ReadString('\n')
		input = strings.TrimSpace(input)

		msg := fmt.Sprintf(claudePromptFormat, input)

		payload := Request{Prompt: msg, MaxTokensToSample: 2048}
		payloadBytes, err := json.Marshal(payload)
		if err != nil {
			log.Fatal(err)
		}

		// メッセージをClaude2APIに送信
		output, err := brc.InvokeModel(context.Background(), &bedrockruntime.InvokeModelInput{
			Body:        payloadBytes,
			// ModelIdはこちら:https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids-arns.html
			ModelId:     aws.String("anthropic.claude-v2"), 
			ContentType: aws.String("application/json"),
		})
		if err != nil {
			log.Fatal(err)
		}

		var resp Response

		err = json.Unmarshal(output.Body, &resp)
		if err != nil {
			log.Fatal(err)
		}

		fmt.Println("\n--- Response ---")
		fmt.Println(resp.Completion)
	}
}

type Request struct {
	Prompt            string   `json:"prompt"`
	MaxTokensToSample int      `json:"max_tokens_to_sample"`
	Temperature       float64  `json:"temperature,omitempty"`
	TopP              float64  `json:"top_p,omitempty"`
	TopK              int      `json:"top_k,omitempty"`
	StopSequences     []string `json:"stop_sequences,omitempty"`
}

type Response struct {
	Completion string `json:"completion"`
}

また、sdkを覗いてたら、*bedrockruntime.InvokeModelWithResponseStreamOutputという構造体も見つけたので、レスポンスをストリーミング形式で受け取れそう。

結果

$ go run main.go

Enter your message: hello
 Hello! I'm Claude, an AI assistant created by Anthropic.
Enter your message: 日本語使える?
 はい、少し日本語が話せます。
Enter your message: あなたはどんなモデルなの?
 はい、私はAnthropicが作成したClaudeという名前のAIアシスタントです。Anthropicは安全なAIシステムを開発するスタートアップ企業です。 私は大規模言語モデルで訓練されていて、会話能力が向上するように設計されています。
Enter your message:(続く...)

Discussion