【Go】Amazon BedrockでClaude ToolUseを使う
概要
今回はGoでAmazon Bedrock経由のClaude ToolUseの実装例を紹介します。
サンプルコードをネット上で探したり、AWSのドキュメントを読んではみたももの、Pythonの実装例があるくらいで、Goの実装例はほとんど見つからず苦労したので、同じ様に困っている方の少しでも助けになったら嬉しいです。
AWS SDK for Go v2
AWSサービス用のGo SDK Version2を使います。
ToolUseとは
ClaudeのToolUseとは、大元のタスクとは別タスクや外部のツールを定義し、呼び出すことで、Claudeの能力を拡張する機能です。これにより、Claudeは通常できないような複雑なタスクを自動化できます。
GPTだとFunction Callingと呼ばれているものです。
今回はサンプルコードですので、簡単な数学の計算をして、JSON形式で返してくれる様に設定しました。
コード
コード全体
コード全体はこちらにあります。
コードの説明
環境変数の設定
まずaws sdkを使う際に必要な環境変数を.envファイルに設定してください。
AWS_ACCESS_KEY_ID=your_aws_access_key_id
AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key
AWS_REGION=your_aws_region
MODEL_ID=your_model_id
MODEL_IDは例えば"anthropic.claude-3-haiku-20240307-v1:0"といったAPIリクエスト時に使用するmodelIdを入力します。
環境変数のロード
ここからはmain.go
のコードです。
こちらは先ほど設定した.envファイルから環境変数を読み込む部分です。
func init() {
if err := godotenv.Load("../../.env"); err != nil {
log.Fatal("Error loading .env file")
}
}
Tool名と入力スキーマの定義
次に、Tool名と入力スキーマを設定します。これは、どのようなデータをToolが受け取るかを定義するためのものです。
var toolName = "math_tool"
var itemProperties = map[string]interface{}{
"formula": map[string]interface{}{
"description": "Formula to be calculated",
"type": "string",
},
"answer": map[string]interface{}{
"description": "the answer to the formula",
"type": "string",
},
}
var toolProperties = map[string]interface{}{
"item": map[string]interface{}{
"type": "array",
"properties": itemProperties,
},
}
var inputSchema = map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"tool": toolProperties,
},
}
システムインストラクションとユーザーメッセージの設定
次に、システムインストラクションとユーザーメッセージを定義します。これは、AIモデルにどのようなタスクを依頼するかを示します。
systemInstruction := fmt.Sprintf("Use %s to get the sum of two numbers.", toolName)
system := []types.SystemContentBlock{
&types.SystemContentBlockMemberText{
Value: systemInstruction,
},
}
input := "1 + 2"
userMsg := types.Message{
Role: types.ConversationRoleUser,
Content: []types.ContentBlock{
&types.ContentBlockMemberText{
Value: input,
},
},
}
Tool設定の定義
Tool設定を定義します。これは、どのToolを使うかを指定するためのものです。
toolConfig := types.ToolConfiguration{
Tools: []types.Tool{
&types.ToolMemberToolSpec{
Value: types.ToolSpecification{
InputSchema: &types.ToolInputSchemaMemberJson{
Value: document.NewLazyDocument(inputSchema),
},
Name: &toolName,
},
},
},
}
Claudeへのリクエスト
最後に、Bedrock Runtimeを使用してClaudeにリクエストを送信します。
output, err := bedrockRuntime.Converse(context.Background(), &bedrockruntime.ConverseInput{
ModelId: &modelId,
Messages: []types.Message{userMsg},
System: system,
ToolConfig: &toolConfig,
})
レスポンスの処理
レスポンスから必要な情報を抽出します。
response, _ := output.Output.(*types.ConverseOutputMemberMessage)
responseContentBlock := response.Value.Content[0]
text, _ := responseContentBlock.(*types.ContentBlockMemberText)
fmt.Printf("Response: %s\n", text.Value)
contentBlock := response.Value.Content[1]
toolUseOutput, _ := contentBlock.(*types.ContentBlockMemberToolUse)
toolUseOutputJson, err := toolUseOutput.Value.Input.MarshalSmithyDocument()
if err != nil {
log.Fatalf("unable to marshal tool use output, %v", err)
}
fmt.Printf("Tool Use Output: %s\n", toolUseOutputJson)
まとめ
この記事では、AWS SDK for Go v2を使って、Amazon Bedrock経由のClaude ToolUseを使用する方法を紹介しました。
筆者はGoには精通していないので書き方が変だったら指摘いただけると嬉しいです。
Discussion