Amazon Web Services ブログ

Integrate Amazon Aurora MySQL and Amazon Bedrock using SQL

本記事は、Integrate Amazon Aurora MySQL and Amazon Bedrock using SQLを翻訳したものです。翻訳はSr. Database Solutions Architectの杉山が担当しました。

組織は大量のデータをリレーショナルデータベースに保存しているため、エンドユーザーエクスペリエンスを向上させるために生成AIの基盤モデルを使ってこれらのデータセットを補強する明確な動機があります。この記事では、Amazon Aurora Machine Learningを使用して、Amazon Aurora MySQL互換エディションを生成AIモデルと統合する方法を探ります。Amazon BedrockとのAmazon Aurora MySQLの統合について説明し、2つのユースケースを紹介します:

  • サービス改善のためのデータベース情報の補完 – Amazon Bedrockで生成した補足情報をAuroraデータベースに保存し、リアルタイムにアクセス可能にします
  • 生産性の向上 – Auroraデータベースに保存された長い文書をAmazon Bedrockで要約します

Amazon Aurora MySQLでMLを使用する他の方法については、「Build a generative AI- powered agent assistance application using Amazon Aurora and Amazon SageMaker JumpStart」を参照してください。

Solution overview

生成人工知能 (生成AI)は、会話、物語、画像、動画、音楽など、新しいコンテンツやアイデアを生成できるAIの一種です。

基盤モデル(FM)は、幅広い一般化されたラベル付けされていないデータで訓練された機械学習(ML)モデルです。これらは様々な一般的なタスクを実行できます。大規模言語モデル(LLM)はFMの一種です。LLMは要約、テキスト生成、分類、オープンエンドの会話、情報抽出などの言語ベースのタスクに特化しています。

このソリューションは、以下の主要コンポーネントに基づいています:

  • Amazon AuroraAmazon Auroraは、MySQL及びPostgreSQLと互換性のあるクラウド向けのリレーショナルデータベース管理システム(RDBMS)です。Auroraは商用データベースに匹敵するパフォーマンスと可用性を、10分の1のコストで提供します。Aurora MLを使えば、従来のSQLプログラミング言語でさまざまなML アルゴリズム(MLベースの予測、生成AI、感情分析など)を呼び出すことができます。Aurora MLを使うためにMLの経験は必要ありません。Aurora MLは、Aurora とAWS ML サービスとの間で、カスタムインテグレーションを構築したりデータを移動させたりすることなく、簡単で最適化され安全な統合を提供します。AuroraはFMを含むさまざまなMLアルゴリズムのためにAmazon SageMakerまたはAmazon Bedrockを、感情分析のためにAmazon Comprehendを呼び出すので、アプリケーションからはこれらのサービスを直接呼び出す必要はありません。
  • Amazon Bedrock – Amazon Bedrockは、AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI、Amazonなどの主要AI企業から高性能の基盤モデル(FM)を1つのAPIで選択できる、完全マネージドサービスです。また、セキュリティ、プライバシー、責任あるAIが組み込まれた生成AIアプリケーションを構築するための幅広い機能セットも提供します。Amazon Bedrockは、FMを使って生成AIアプリケーションを構築およびスケーリングする簡単な方法を提供します。Amazon Bedrockはサーバーレスなので、インフラストラクチャを管理する必要がなく、既に慣れ親しんだAWS サービスを使って、安全に生成AI機能をアプリケーションに統合およびデプロイできます。

次の図は、Amazon Aurora MySQLでMLを使用する例を示しています

以下のセクションでは、Amazon Aurora MySQLからSQLクエリを使ってAmazon Bedrockをリアルタイムで呼び出す方法を実演していきます。手順概要は以下の通りです:

1. 新しいクラスターを作成

2. データベースとデータベースユーザーを作成

3. Auroraクラスターのための AWS Identity and Access Management (IAM) ロールとポリシーを作成

4. IAMロールをAuroraクラスターに割り当てる

5. Amazon Bedrockベースモデルを有効にしてAurora MLを使用

6. Amazon Bedrockにアクセスする関数を作成

Prerequisites

この投稿では、AWS管理コンソールの操作に慣れている事を前提としています。
また、AWS アカウントで以下のリソースとサービスが有効になっている必要があります:

  • Amazon Bedrockとの統合を使用するには、Amazon Aurora MySQL 3.06.0以降のバージョンが必要です。
  • Aurora MySQLクラスターはカスタムDBクラスターパラメータグループを使用する必要があります。
  • ロールと権限を作成するには、IAMへのアクセス権が必要です。
  • Amazon BedrockでFMを使用するためのアクセス権が必要です。
    この投稿では、Amazon Titan Text G1 – Express (amazon.titan-text-express-v1)とAnthropic Claude 3 Haiku (anthropic.claude-3-haiku-20240307-v1:0)を使用しています。各リージョンでサポートされているModelに関しては、Model support by AWS Regionを参照してください。
  • MLサービスは、Aurora MySQLクラスターと同じAWSリージョンで実行されている必要があります。
  • Aurora MySQLクラスターのネットワーク構成が、Amazon Bedrockのエンドポイントへの接続を許可している必要があります。(Amazon Bedrockエンドポイントに対してhttpsアクセスを許可)

Create an Aurora MySQL cluster

最初のステップは、Aurora MySQLクラスターを作成することです。完全な手順については、「Creating and connecting to an Aurora MySQL DB cluster」と「Using Amazon Aurora machine learning with Aurora MySQL」を参照してください。この例で使用する特定の構成オプションをいくつか紹介します:

  1. Auroraコンソールで、Amazon Bedrock をサポートしているリージョンに新しいクラスターを作成します(例: us-east-1)。
    補足: 2024年5月現在、東京リージョン(ap-northeast-1)ではAnthropic Claude v3 Haikuをサポートしていません
  2. エンジンオプションでは、Aurora(MySQL互換)を選択します。エンジンバージョンは、Amazon Bedrock統合を使用するためにAurora MySQL 3.06.0を使用します。
  3. 設定オプションでは、AuroraスタンダードまたはAurora I/O最適化のいずれかを選択します。
  4. インスタンスの設定では、インスタンスクラスを選択します。
  5. Amazon Bedrockと統合するには、後でパラメータグループを変更する必要があるため
    このタイミングで custom DB cluster parameter group を作成し適用します。

  1. Auroraクラスターを作成します。
    クラスターがプロビジョニングされた後、Amazon Bedrockとの統合に向けてクラスターを準備するための一連のSQLコマンドを実行する必要があります。
  2. MySQLコマンドラインクライアントを使用して、 rds_superuser_role権限を持つユーザー(マスターユーザーなど)としてAuroraクラスターにログインし以下のコードを実行します。Amazon Bedrock ML関数を使用するには、 AWS_BEDROCK_ACCESS データベースロールをユーザーに付与する必要があります。
mysql> create database bedrockdb;  /*** Sample Database ***/
Query OK, 1 row affected (0.03 sec)

mysql> create user `bedrock_user`@`%` identified by 'password'; /*** Sample User ***/
Query OK, 0 rows affected (0.30 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON bedrockdb.* TO `bedrock_user`@`%`;
Query OK, 0 rows affected (0.05 sec)

mysql> GRANT AWS_BEDROCK_ACCESS TO `bedrock_user`@`%`;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW GRANTS FOR `bedrock_user`@`%`\G
*************************** 1. row ***************************
Grants for bedrock_user@%: GRANT USAGE ON *.* TO `bedrock_user`@`%`
*************************** 2. row ***************************
Grants for bedrock_user@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `bedrockdb`.* TO `bedrock_user`@`%`
*************************** 3. row ***************************
Grants for bedrock_user@%: GRANT `AWS_BEDROCK_ACCESS`@`%` TO `bedrock_user`@`%`

これで、データベースユーザーがAmazon Bedrockと統合する準備ができました。次に、Aurora MySQL DBクラスターにAmazon Bedrockへのアクセス権を付与する為にIAMロールを作成します。

Create an IAM role and policy for the Aurora cluster

Aurora MLがAmazon Bedrockとうまく連携できるようにするには、まず Aurora クラスターがAmazon Bedrockモデルと通信できるようにするIAMポリシーを作成する必要があります。以下の手順を実行してください:

  1. IAMコンソールで、ナビゲーションペインから「ポリシー」を選択します。
  2. ポリシーの作成」を選択します。
  3. アクセス許可を指定」ページで、「サービスを選択」から「Bedrock」を選択します。

  1. ポリシーエディタで、「Bedrock」を展開し、「読み取り」の下にある「InvokeModel」を選択して、そのアクションを許可します。
  2. 「リソース」では、「すべて」または「特定」を選択します。チームが必要とするAmazon Bedrock内のモデルにのみアクセスを許可することがベストプラクティスです。(ここではデモ用にすべてを選択しています)

  1. 次へ」を選択します。
  2. ポリシー名」には、ポリシーの名前(例: AuroraBedrockInvokeModel)を入力します。
  3. ポリシーの作成」を選択します。

  1. IAMコンソールで、ナビゲーションペインから「ロール」を選択します。
  2. ロールの作成」を選択します。
  3. 信頼されたエンティティタイプ」では、「AWSのサービス」を選択します。
  4. 「サービス」または「ユースケース」では、「RDS」を選択します。
  5. RDS – Add Role to Database」を選択します。
  6. 次へ」を選択します。

前の手順で作成したIAMポリシーを、この作成中のIAMロールに割り当てます。

  1. 許可ポリシー」で、作成した「AuroraBedrockInvokeModel」ポリシーを検索して選択します。
  2. 次へ」を選択します。

  1. ロールの詳細」セクションで、ロール名(この例ではAuroraBedrockRole)と説明を入力します。
  2. 作成するIAMロールを確認し、AuroraBedrockInvokeModelポリシーが付与されていることを確認します。
  3. ロールを作成」を選択してロールを作成します。

Assign the IAM role to the Aurora cluster

次に、作成したAuroraBedrockRoleというIAMロールをAmazon Aurora MySQLクラスターに割り当てる必要があります。以下の手順に従ってください:

  1. Amazon RDSコンソールで、Aurora MySQLクラスターの詳細ページに移動します。
  2. 接続とセキュリティ」タブで、「IAMロールの管理」セクションを探します。
  3. このクラスターに追加する IAM ロールを選択」で、作成したAuroraBedrockRoleロールを選択。
  4. ロールの追加」を選択します。

  1. 作成したこのIAMロールのARNを、Aurora MySQLクラスターに関連付けられているカスタムDBクラスターパラメータグループの aws_default_bedrock_role パラメータに追加します。

  1. 「変更を保存」を選択して設定を保存します。

パラメータの確認は、AWS マネジメントコンソール、AWS コマンドラインインターフェイス (AWS CLI) のいずれかを使用できます。また、次の例のように MySQL クライアントツールを使用して確認することもできます:

mysql> show global variables like 'aws_default%';
+-----------------------------+--------------------------------------------------+
| Variable_name               | Value                                            |
+-----------------------------+--------------------------------------------------+
| aws_default_bedrock_role    | arn:aws:iam::012345678910:role/AuroraBedrockRole |
| aws_default_comprehend_role |                                                  |
| aws_default_lambda_role     |                                                  |
| aws_default_s3_role         |                                                  |
| aws_default_sagemaker_role  |                                                  |
+-----------------------------+--------------------------------------------------+
5 rows in set (0.03 sec)

これでクラスターは、Amazon Bedrock 内のモデルを呼び出すことができるようになりました。

Use Aurora ML

Aurora MLは、Amazon Bedrock、SageMaker、Amazon Comprehendなど、SQL コマンドを使ってAWS MLサービスと直接連携できるAuroraの機能です。

Amazon Bedrock FMsの一覧は、AWS CLIで確認する事ができます:

$ aws bedrock list-foundation-models --query '*[].[modelName,modelId]' --out table
-------------------------------------------------------------------------------
|                            ListFoundationModels                             |
+---------------------------------+-------------------------------------------+
|  Titan Text Large               |  amazon.titan-tg1-large                   |
|  Titan Image Generator G1       |  amazon.titan-image-generator-v1:0        |
|  Titan Image Generator G1       |  amazon.titan-image-generator-v1          |
|  Titan Text Embeddings v2       |  amazon.titan-embed-g1-text-02            |
|  Titan Text G1 - Lite           |  amazon.titan-text-lite-v1:0:4k           |
|  Titan Text G1 - Lite           |  amazon.titan-text-lite-v1                |
...
|  Claude                         |  anthropic.claude-v2:1:200k               |
|  Claude                         |  anthropic.claude-v2:1                    |
|  Claude                         |  anthropic.claude-v2                      |
|  Claude 3 Sonnet                |  anthropic.claude-3-sonnet-20240229-v1:0  |
|  Claude 3 Haiku                 |  anthropic.claude-3-haiku-20240307-v1:0   |
+---------------------------------+-------------------------------------------+

ベースモデルを使用する前に、対象のモデルがAmazon Bedrockコンソールで有効になっていることを確認してください。 有効になっていない場合は、対象のモデルへのアクセスを追加して下さい。

これで、Aurora から直接Amazon Bedrockにアクセスできる関数を作成できるようになりました。以下の例は、Amazon Titan Text G1 – ExpressAnthropic Claude 3 Haikuモデルを使用してAmazon Bedrockを呼び出す関数を生成する方法を示しています。これらのモデルはTEXTモダリティをサポートしています。別のモデルIDを使用したい場合は、ベースモデルIDのモデルIDと、Amazon Bedrockでサポートされているモデルのリストを参照してください。

1. ここでは、先程作成したbedrock_userアカウントでログインします。
2. データベースをbedrockdbに切り替え、ロールをAWS_BEDROCK_ACCESSに設定した後に関数を作成します。関数の定義はGitHubリポジトリに用意されています。

mysql> use bedrockdb
Database changed
mysql> SELECT CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.00 sec)

mysql> SET ROLE AWS_BEDROCK_ACCESS;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `AWS_BEDROCK_ACCESS`@`%` |
+--------------------------+
1 row in set (0.00 sec)

3, Amazon Titan Text G1 -Expressを呼び出す関数を作成します:

CREATE FUNCTION invoke_titan (request_body TEXT)
RETURNS TEXT
ALIAS AWS_BEDROCK_INVOKE_MODEL
MODEL ID 'amazon.titan-text-express-v1' /*** model ID ***/
CONTENT_TYPE 'application/json'
ACCEPT 'application/json';

4. Anthropic Claude 3 Haikuを呼び出す関数を作成します:

CREATE FUNCTION claude3_haiku (request_body TEXT)
RETURNS TEXT
ALIAS AWS_BEDROCK_INVOKE_MODEL
MODEL ID 'anthropic.claude-3-haiku-20240307-v1:0' 
CONTENT_TYPE 'application/json'
ACCEPT 'application/json';

5. 「地球の陸地と海の割合は何ですか?」と質問し、Amazon Titanの関数を呼び出します:

select json_unquote(json_extract(invoke_titan(
 '{
  "inputText": "What is the proportion of land and sea on Earth?",
  "textGenerationConfig": {
  "maxTokenCount": 1024,
  "stopSequences": [],
  "temperature":0,
  "topP":1
  }
}'
),"$.results[0].outputText")) as bedrock_response\G

6. Anthropic Claude 3の関数を呼び出します:

select json_unquote(json_extract(claude3_haiku(
 '{
 "anthropic_version": "bedrock-2023-05-31",
 "max_tokens": 1024,
 "messages": [{"role": "user","content": [{"type": "text", "text": "What is the proportion of land and sea on Earth?"}]}],
 "temperature": 0,
 "top_p": 0,
 "top_k":1,
 "stop_sequences": []
 }'
),"$.content[0].text")) as response_from_bedrock\G

Amazon Bedrockコンソールの Amazon Bedrockプレイグラウンドで質問の出力を確認することで、レスポンスの正確性を検証できます。詳細については、「Anthropic’s Claude 3 Haiku model is now available on Amazon Bedrock」を参照してください。

これで、Amazon Bedrockを使用するためのAuroraクラスターの準備が完了しました。
次のセクションでは、統合されたAmazon Bedrockと既存のデータを使用する2つのユースケースを示します。

Aurora クラスターが Amazon Bedrock と通信できない場合は、 Aurora クラスターが Amazon Bedrock と通信できるようにネットワーク構成を調整する必要があるかもしれません。この設定方法の詳細については、Enabling network communication from Amazon Aurora MySQL to other AWS services, Create a VPC endpoint及びUse AWS PrivateLink to set up private access to Amazon Bedrockを参照してください。 この投稿では、VPC と Amazon Bedrock 間のプライベート接続を使用するために、 bedrock-runtime endpoint を選択しています。

Use case 1: Complement existing data with Amazon Bedrock

既存のデータをAmazon Bedrockとリンクさせることで、どのように情報を補完できるかを見てみましょう。この例では、まだデータベースにデータがないので、検証目的で新しくテーブルを作成してデータを追加します。テーブル定義はGitHubリポジトリで提供されています。

  1. サンプルテーブルを作成します:
CREATE TABLE `t_bedrock` (
  `id` int NOT NULL AUTO_INCREMENT,
  `country` varchar(52) NOT NULL DEFAULT '',
  `information` varchar(2048),
  `modify_user` varchar(255) NOT NULL DEFAULT (current_user()),
  `updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_update_time` (`updated_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1;
  1. サンプルデータを挿入します(これは既にデータベースに格納されている既存のデータと想定してください):
insert into t_bedrock(country) values('India'),('China'),('United States'),('Indonesia'),('Brazil'),('Mexico'),('Japan');
  1. データがテーブルに格納されていることを確認します。

  1. テーブルからデータを取得するためのプロシージャを作成し、そのデータに対して関数を実行します。プロシージャの定義はGitHubリポジトリで提供されています:
DROP PROCEDURE IF EXISTS get_bedrock_claude3_haiku;
DELIMITER //

Create Procedure get_bedrock_claude3_haiku()
BEGIN

DECLARE done INT DEFAULT FALSE;
DECLARE v_id INT;
DECLARE v_country varchar(52);
DECLARE cursor_bedrock CURSOR FOR
    SELECT id,country FROM t_bedrock order by id;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cursor_bedrock;

loop_cursor: LOOP
    FETCH cursor_bedrock INTO v_id,v_country;

    IF done THEN
        LEAVE loop_cursor;
    END IF;

    set @question = concat('\"messages\": [{\"role\": \"user\",\"content\": [{\"type\": \"text\", \"text\": \"What is the most popular food in ', v_country,' ?\"}]}]}\'),\"$.content[0].text\")) as response_from_bedrock');
    set @parameter = '(\'{\"anthropic_version\": \"bedrock-2023-05-31\",\"max_tokens\": 1024,\"temperature\": 0,\"top_p\": 0, \"top_k\":1, \"stop_sequences\": [],';
    set @request = concat("update t_bedrock,(select json_unquote(json_extract(claude3_haiku",@parameter,@question,") response set information = response.response_from_bedrock where id =",v_id);

    PREPARE update_stmt FROM @request;
    EXECUTE update_stmt;
    DEALLOCATE PREPARE update_stmt;

END LOOP;

CLOSE cursor_bedrock;
END//

DELIMITER ;
  1. 既存のテーブルからデータを取得し、対象のデータに基づいてAmazon Bedrockにリクエストを送信し、コンテンツに応じてデータを取得し、テーブルの内容を更新するプロシージャを実行します:
mysql> call get_bedrock_claude3_haiku();

その結果、データに対して補完的な情報を取得できているはずです。

次の例では、異なる国々で人気の食べ物をリストアップした結果を確認しています:

mysql> select * from t_bedrock limit 1\G

例えば、あなたが旅行サイトを運営していて、自身のサイト上で京都の観光スポットを参考情報として掲載したい場合、次の例のように質問内容を変更すればデータを取得できます。使用例によって必要となるデータは異なりますので、ニーズに合わせて質問をカスタマイズしてみてください:

select json_unquote(json_extract(claude3_haiku(
'{
 "anthropic_version": "bedrock-2023-05-31",
 "max_tokens": 1024,"temperature": 0,"top_p": 0,"top_k":1,"stop_sequences": [],
 "messages": [{"role": "user","content": [{"type": "text", "text": "Please tell me 3 recommended sightseeing spots in Kyoto."}]}]
}'),"$.content[0].text")) as response_from_bedrock\G

Anthropic Claude 3 は、英語、スペイン語、日本語をはじめとする複数の言語をサポートしています。例えば、次のリクエストでは、京都のおすすめ観光スポット5か所を日本語で尋ねています。

select json_unquote(json_extract(claude3_haiku(
'{
 "anthropic_version": "bedrock-2023-05-31",
 "max_tokens": 1024,"temperature": 0,"top_p": 0,"top_k":1,"stop_sequences": [],
 "messages": [{"role": "user","content": [{"type": "text", "text": "京都でお勧めの観光地を教えて下さい"}]}]
}'),"$.content[0].text")) as response_from_bedrock\G

次の例として、データベースに格納された長い文章をどのように要約するかも確認しましょう。

Use case 2: Summarize existing data with Amazon Bedrock

データベースに格納された長い文章を要約するために Amazon Bedrock を使うと、読みにくさが軽減されます。要約機能を使えば、短時間で概要を把握する事ができます。さらに詳細が必要な場合は、オリジナルのデータを読むこともできます。この使用例は、製品やサービスのレビューの要約や、サポート担当者向けのケースノートの要約などに活用されています。

この使用例では、「What’s New with AWS?」からAWSサービスの最新リリースに関するニュースを取得し、データベースに保存します。最初に保存されたデータから製品名のみを取得する処理を行います。次に、リリースノートの要約を行います。テーブル定義は、GitHubリポジトリで提供されています。

次の手順を完了してください:

1. データを保存するためのサンプルテーブルを作成します:

CREATE TABLE `t_feed` (
  `id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(1024) DEFAULT NULL,
  `link` varchar(2048) DEFAULT NULL,
  `product` varchar(512) DEFAULT NULL,
  `description` text,
  `summary` text,
--  `modify_user` varchar(255) DEFAULT (current_user()) COMMENT 'optional column',
  `updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_update_time` (`updated_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  1. 別のターミナルにて、次のスクリプトを実行してサンプルデータを挿入します
    (Python 3.7以降が必要です。”python3 feed.py”で実行できます):
import pymysql
import feedparser
import re

# if module is not installed, please install it. ex: pip install -r requirements.txt

myfeed = feedparser.parse("https://aws.amazon.com/about-aws/whats-new/recent/feed/")
db = pymysql.connect(
        host='<Aurora MySQL Writer Endpoint>',
        user='<user name>',
        password='<password>',
        database='<sample schema (ex: bedrockdb)>',
        cursorclass=pymysql.cursors.DictCursor)

with db:
  with db.cursor() as cur:
    for item in myfeed['items']:
        title = item.title
        link = item.link 
        description =  re.sub(r'<[^>]+>', '', item.description).replace("'", "\\'").replace('"', '\\"').replace('\n', ' ')
        print (title)
        print (link)
        print (description)

        cur.execute("INSERT INTO t_feed (title, link, description) VALUES (%s, %s, %s)", (title, link, description))
  db.commit()
  print ('Import rss Succesfull!')

スクリプトを実行すると、ドキュメントが次のように保存されます:

mysql> select count(*) from t_feed; select * from t_feed limit 1\G

これで、descriptionカラムから製品名を取得し、productカラムに格納する準備ができました。

  1. descriptionカラムから製品名のみを追加するためのプロシージャを作成します:
DROP PROCEDURE IF EXISTS get_rss_product_by_bedrock_claude3_haiku;
DELIMITER //

CREATE PROCEDURE `get_rss_product_by_bedrock_claude3_haiku`()
BEGIN

DECLARE done INT DEFAULT FALSE;
DECLARE v_id INT;
DECLARE v_description text;
DECLARE cursor_description CURSOR FOR
    SELECT id,description FROM t_feed order by id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cursor_description;

loop_cursor: LOOP
    FETCH cursor_description INTO v_id,v_description;

    IF done THEN
        LEAVE loop_cursor;
    END IF;

    set @question = concat('\"messages\": [{\"role\": \"user\",\"content\": [{\"type\": \"text\", \"text\": \"Please pick up product name only from the following description. ', v_description,' ?\"}]}]}\'),\"$.content[0].text\")) as response_from_bedrock');
    set @parameter = '(\'{\"anthropic_version\": \"bedrock-2023-05-31\",\"max_tokens\": 1024,\"temperature\": 0,\"top_p\": 0, \"top_k\":1, \"stop_sequences\": [],';
    set @request = concat("update t_feed,(select json_unquote(json_extract(claude3_haiku",@parameter,@question,") response set product = response.response_from_bedrock where id =",v_id);

    PREPARE summarize_stmt FROM @request;
    EXECUTE summarize_stmt;
    DEALLOCATE PREPARE summarize_stmt;
END LOOP;
CLOSE cursor_description;
END//
DELIMITER ;
  1. Amazon Bedrockを使って、descriptionカラムから製品名を取得するためにプロシージャを実行します:
    mysql> call get_rss_product_by_bedrock_claude3_haiku();
  2. プロシージャを実行した後、productカラムにデータが追加されたことを確認できます。
    これにより、コンテンツをより容易に理解する事ができます。

    mysql> select * from t_feed limit 1\G

descriptionカラムを要約したい場合は、質問を「次の説明を200文字以内で要約してください」のようなものに変更し、更新対象のカラムをsummaryに変更する必要があります。これにより、各説明が約200文字で要約されるため、作業効率が向上します。

  1. descriptionカラムの要約をsummaryカラムに追加するためのプロシージャを作成します:
DROP PROCEDURE IF EXISTS get_rss_summary_by_bedrock_claude3_haiku;
DELIMITER //

CREATE PROCEDURE `get_rss_summary_by_bedrock_claude3_haiku`()
BEGIN

DECLARE done INT DEFAULT FALSE;
DECLARE v_id INT;
DECLARE v_description text;
DECLARE cursor_description CURSOR FOR
    SELECT id,description FROM t_feed order by id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cursor_description;

loop_cursor: LOOP
    FETCH cursor_description INTO v_id,v_description;

    IF done THEN
        LEAVE loop_cursor;
    END IF;

    set @question = concat('\"messages\": [{\"role\": \"user\",\"content\": [{\"type\": \"text\", \"text\": \"Please summarize the following description in 200 characters or less. ', v_description,' ?\"}]}]}\'),\"$.content[0].text\")) as response_from_bedrock');
    set @parameter = '(\'{\"anthropic_version\": \"bedrock-2023-05-31\",\"max_tokens\": 1024,\"temperature\": 0,\"top_p\": 0, \"top_k\":1, \"stop_sequences\": [],';
    set @request = concat("update t_feed,(select json_unquote(json_extract(claude3_haiku",@parameter,@question,") response set summary = response.response_from_bedrock where id =",v_id);

    PREPARE summarize_stmt FROM @request;
    EXECUTE summarize_stmt;
    DEALLOCATE PREPARE summarize_stmt;


END LOOP;
CLOSE cursor_description;
END//

DELIMITER ;
  1. Amazon Bedrockから要約データを取得するためにプロシージャを実行します:
    mysql> call get_rss_summary_by_bedrock_claude3_haiku();
  2. プロシージャを実行した後、summaryカラムにデータが追加されたことを確認できます:
    mysql> select * from t_feed limit 1\G

  1. 次の例では、descriptionカラムとsummaryカラムの文字数をチェックしています:
mysql> select id,description,summary,length(description),length(summary) from t_feed limit 10;

group_concatを使う事で、複数のデータを組み合わせて要約を作成することも可能です。次の出力は、20行からデータを取得し、要約を作成した例です。サンプルコードはGitHubリポジトリで提供されています。

set session group_concat_max_len = 1048576; 
set session aurora_ml_inference_timeout = 30000;

-- If the data size is small, there is no particular need to limit it. However, if there is a large amount of data, it is limited because PREPARED STATEMENTS can cause errors.
-- set @all = (select group_concat(description) from t_feed);

set @all = (select group_concat(top20.description) from (select description from t_feed limit 20) top20);
set @question = concat('\"messages\": [{\"role\": \"user\",\"content\": [{\"type\": \"text\", \"text\": \"Please categorize and tell me what kind of services improvement being talked about based on the following content.  ', @all,' ?\"}]}]}\'),\"$.content[0].text\")) as response_from_bedrock');
set @parameter = '(\'{\"anthropic_version\": \"bedrock-2023-05-31\",\"max_tokens\": 1024,\"temperature\": 0,\"top_p\": 0, \"top_k\":1, \"stop_sequences\": [],';
set @request = concat("select json_unquote(json_extract(claude3_haiku",@parameter,@question);

PREPARE select_stmt FROM @request;
EXECUTE select_stmt\G
DEALLOCATE PREPARE select_stmt;

日本語版の「What’s New with AWS?」からAWSサービスの最新リリースに関するニュースを取得する事で、Use case 2で説明したように日本語で要約を作成する事も可能です。

Considerations

デモではSQLコマンドを実行すると1分以内に応答が返ってきますが、これはコンテキストの細かさや量によっても変わります。本番環境に導入する前に、この概念実証をご自身の実装に適応させることが重要です。大量の処理を行う予定の場合は、Amazon Bedrockのクォータと、Amazon Bedrockの価格設定に関しても参照することをお勧めします。

Clean up

作成したリソースを使用する必要がなくなった場合は、終了時に削除してください:

  1. データベースから不要なオブジェクトとユーザーを削除します。
  2. Aurora MLを使用する必要がなくなったが、クラスターの使用を続ける場合は、ML関連のパラメーター(aws_default_bedrock_role)とIAMロールをクラスターから削除できます。
  3. Amazon Bedrockにアクセスするために作成したIAMロールが不要になった場合は、削除できます。また、必要に応じてネットワーク設定を更新する必要がある場合があります。
  4. Auroraクラスターが不要になった場合は、「Aurora DBクラスターとDBインスタンスの削除」の手順に従って削除してください。

Conclusion

現在の企業は、エンドユーザーエクスペリエンスや生産性の向上のために、リレーショナルデータベースに格納されているデータに 生成AI の機能を組み込みたいと考えています。この投稿では、Amazon Bedrock を使って格納されたデータに対して補完的な情報を取得する方法を実演しました。また、Amazon Bedrock との Aurora ML 統合機能を利用して、Aurora データベースに格納されたドキュメントを要約する方法も実演しました。

Aurora ML を使って SQL 関数として Amazon Bedrock 上の FMs を呼び出せる機能は、生成AI アプリケーションを構築する際に LLM の学習曲線を平滑化します。これにより、カスタム統合を構築したり、データを移動したりすることなく、Aurora と AWS ML サービスを簡単で最適化され、安全な方法で統合できます。

Aurora MLの詳細については、「Amazon Aurora Machine Learning」を参照してください。
Amazon Aurora MySQLにおける最新のAurora MLについては、「Using Amazon Aurora machine learning with Aurora MySQL」を参照してください。

コメントでフィードバックをお寄せください。


About the Authors

Steve Dilleは、Amazon Auroraのシニアプロダクトマネージャーです。AWSのAuroraデータベースにおけるgenerative AIの戦略とプロダクトイニシアチブを主導しています。この役割に就く前は、Auroraのパフォーマンスおよびベンチマークチームを創設し、その後Amazon Aurora Serverless v2のRDS Data APIを構築して立ち上げました。AWSには4年間在籍しています。それ以前は、NCRでソフトウェア開発者、HPでプロダクトマネージャー、Sybase(SAP)でデータウェアハウジングディレクターを務めていました。データ管理、分析、ビッグデータ分野で5件の企業買収と1件のIPOに成功した企業の執行役員としてVPまたはCMOを20年以上務めた経験があります。Steveは、UC BerkeleyでInformation and Data Scienceの修士号、シカゴ大学ブース校でMBA、ピッツバーグ大学でComputer Science/Mathの学士号を取得しています。

杉山真也はアマゾン ウェブ サービス (AWS) でシニアデータベースソリューションアーキテクトを務めています。ハードウェアおよびデータベースソフトウェアベンダーでデータベーステクニカルコンサルタントとして10年間従事した後、インターネット企業において10年以上にわたりサイト運用、サービス開発、管理業務など様々な業務に携わってきました。現在は、主にAmazon RDSおよびAmazon Auroraを使用するMySQLとMariaDBのユーザー企業に対し、課題解決とソリューション提供のサポートを行っています。