S3から取得したファイルをBedrockへ
amplifyでWebアプリケーションを作成しています。
S3から取得したファイルをBedrockへファイルを転送して、回答を取得するためにの方法が分からず、探していたのですが。。。
日本のブログレベルでなかなか見つからず。とりあえず、実装をしてみました。
S3からファイルを取得
import {
S3Client,
GetObjectCommand,
} from "@aws-sdk/client-s3";
const awsClient = new S3Client({});
//S3からファイル取得
s3ResponseObject= await awsClient .send(
new GetObjectCommand({
Bucket:<ダウンロードするバケット名>,
Key:<S3のファイルキー(/buketkey/test.txtのような)> as string
})
)
//バイナリに変換
const s3ByteObject= await s3ResponseObject.Body.transformToByteArray();
GetObjectCommandでファイルを取得します。ファイルはストリームになっています。
ファイルを取得したら、そのままBedrockには送信できないので、バイト(uint8array)に変換します。
変換はtransformToByteArray();を使用します。
※補足: GetObjectCommandで取得したファイルはtransformToString(“<エンコード方式>”)でString形に変換もできます。この形の紹介のほうが多いかも。。。
Bedrockへファイルを送信
import {
BedrockRuntimeClient,
ConverseCommand,
} from "@aws-sdk/client-bedrock-runtime";
//Bedrockeへ送信するメッセージ
const bedrockMessage = [
{
role: "user",
content: [
{text: <bedrockへの送信する文字列>},
{
document:{
format: "txt",//ファイル形式
name: "bedrockFile",
source: {
bytes: s3ByteObject,//S3から取得してバイト型に変換したファイル
},
},
},
],
},
];
//Bedrockeで実行するAPI
const bedrockCommand = new ConverseCommand({
"anthropic.claude-3-haiku-20240307-v1:0",//モデルID
messages: bedrockMessage
});
//BedrockでメッセージおよびAPI実行
const bedrockResponse = await bedrockClient.send(bedrockCommand);
//Bedrockからメッセージを取得
const textFromBedrock = bedrockResponse.output.message.content[0].text;
console.log(textFromBedrock )
bedrockMessageはformatを間違えると、エラーが起きるので、テキストに合わせて設定をします。
で、ConverseCommandにモデルと、メッセージを設定して、bedrockClientで実行すると回答を得られます。
意外と簡単。
参考ドキュメント
AWSの公式ドキュメントです。
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/conversation-inference-call.html