🧠
【Claude2】Go+AWS BedrockでClaude2を使ってみる
はじめに
最近海外で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アカウントが必要
ざっと手順を書いてく。
詳しい導入手順はこちらが参考になる。
- コンソールからAWS Bedrockを検索
- リージョンをus-east-1に選択し「Get started」
- 左から「Base models」
- 「Request model access」を選択しAnthropic選択しをリクエストする
- 申請理由を入力し、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