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/sdk-for-javascript/v3/developer-guide/javascript_s3_code_examples.html

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/conversation-inference-call.html

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です