前回の記事ではADBの異種DB向けDBLink機能を使ってSnowflakeと連携し、ADBからSELECT AI (NL2SQL) でSnowflake上のデータを参照しました。
今回はSnowflakeとADBのデータ連携を、よりオープンな仕組みであるApache Icebergで実現してみました。
その上でADBのSELECT AIと組み合わせ、Snowflake側で作成したIceberg形式のデータに自然言語で問い合わせてみました。
検証環境
前回と同様OCI TokyoリージョンのADBと、AWS TokyoリージョンのSnowflakeを使いました。
またIcebergテーブルはAWS TokyoリージョンのS3上に作成しました。
検証手順
Snowflake側の作業
Snowflake側の作業は下記チュートリアルに従いました。
「データをロードしてテーブルをクエリする」まで実行すると、customer_iceberg
テーブルと nation_iceberg
テーブルがIceberg形式でS3上に作成されます。
S3バケットを確認すると、Iceberg形式のデータファイル、メタデータファイルがあります。
customer_iceberg
テーブルのメタデータファイル
Snowflakeコンソール上で次のようにクエリを実行し、両テーブルのデータがちゃんと参照できることを確認します。
SELECT
c.c_name AS customer_name,
c.c_mktsegment AS market_segment,
n.n_name AS nation
FROM customer_iceberg c
INNER JOIN nation_iceberg n
ON c.c_nationkey = n.n_nationkey
LIMIT 15;
ADB側の作業
まずADBからAmazon S3へのアクセスを可能にするための認証を設定します。
具体的な手順は下記を参考にさせて頂きました。
こちらの記事の以下手順を実行します。
1. ARNを用いたロールベースの認証の有効化
2. AWSのポリシーとロールの設定
4. ARNを使用したクレデンシャルの作成
クレデンシャルを作成できたら外部テーブルを作成し、S3上で管理されているIceberg形式の customer_iceberg
テーブル、nation_iceberg
テーブルを参照できるようにします。
外部テーブルの作成コマンドは下記を参考にしました。
customer_iceberg
テーブルを参照する外部テーブルの作成
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'customer_iceberg',
credential_name => 'MY_S3_ARN_CRED',
file_uri_list => 'your s3 uri for customer_iceberg metadata json file',
format => '{"access_protocol":{"protocol_type":"iceberg"}}'
);
END;
nation_iceberg
テーブルを参照する外部テーブルの作成
BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'nation_iceberg',
credential_name => 'MY_S3_ARN_CRED',
file_uri_list => 'your s3 uri for nation_iceberg metadata json file',
format => '{"access_protocol":{"protocol_type":"iceberg"}}'
);
END;
試しに外部テーブル customer_iceberg
と nation_iceberg
を参照するクエリを実行してみます。
今回はADBのDatabase Actionsから実行してみました。
SELECT
c.c_name AS customer_name,
c.c_mktsegment AS market_segment,
n.n_name AS nation
FROM customer_iceberg c
INNER JOIN nation_iceberg n
ON c.c_nationkey = n.n_nationkey
FETCH FIRST 15 ROWS ONLY;
ちゃんとS3上のIceberg形式のデータを参照できています。
あとはSELECT AIを設定し、自然言語で問い合わせできるようにします。
まずは生成AIモデルを使うためのクレデンシャルを作成します。
今回はOCI Generative AI Serviceが提供するCohereの command-r-plus-08-2024
を使います。
今回は ADMIN
ユーザで作業したため、新規DBユーザ作成や権限付与は行っていません。
ADMIN
ユーザ以外で行う場合、以降の作業へ進む前に権限付与が必要となります。
-- OCIアカウントのクレデンシャルを作成
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OCI_GENAI',
user_ocid => 'your user ocid',
tenancy_ocid => 'your tenancy ocid',
private_key => 'your user private key',
fingerprint => 'your fingerprint related to your user private key'
);
END;
/
作成したクレデンシャルを使って生成AIと連携するためのAIプロファイルを作成します。
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
'GENAI_COHERE',
'{
"provider": "oci",
"credential_name": "OCI_GENAI",
"model":"cohere.command-plus-latest",
"oci_apiformat":"COHERE",
"region": " ap-osaka-1",
"object_list": [
{"owner": "ADMIN", "name": "customer_iceberg"},
{"owner": "ADMIN", "name": "nation_iceberg"}
]
}'
);
END;
/
SELECT AIの設定ができたので、最後に自然言語でS3上のIceberg形式のデータへ問い合わせてみます。
SELECT DBMS_CLOUD_AI.GENERATE(prompt => 'customer_iceberg表においてc_mktsegmentの種別を10件表示してください。',
profile_name => 'GENAI_COHERE',
action => 'runsql')
FROM dual;
念のため自然言語から変換されたSQLを確認してみます。
SELECT DBMS_CLOUD_AI.GENERATE(prompt => 'customer_iceberg表においてc_mktsegmentの種別を10件表示してください。',
profile_name => 'GENAI_COHERE',
action => 'showsql')
FROM dual;
意図したSQLに変換されているようです。
以上、Apache Icebergを使ったSnowflakeとADB間のデータ連携、およびADBのSELECT AIを使った自然言語によるデータ参照でした。
データの保管形式をApache Icebergにしておけば様々なDWHから参照できるため便利ですね。
またADBのSELECT AIと組み合わせれば、任意の生成AIを使ったNL2SQLがIcebergテーブルに対して実現できます。
データ利活用の幅を広げる上で、Apache Icebergは使い勝手の良い選択肢だと思いました。