はじめに
AWS S3内に貯まっているPDFファイルをAutonomous DatabaseのSELECT AI RAGで使用するためにテキスト化したいとのお話があったので、AWS S3のバケット内にある複数のPDFファイルを一括でテキストに変換し、変換後のテキストファイルをOCI Object Storageに保存するPL/SQLプロシージャを作成してみました。
※こちらの内容はあくまで個人が検証した内容であり、他の環境で正しく動作することを保証するものではありません。また、こちらの記事を元にしたOracleサポートへの問い合わせはご遠慮ください。
1. 事前準備
OCI Object Storage、AWS S3にアクセスするためのクレデンシャルを予め作成しておきます。
今回は、OCI Object StorageへのアクセスにはAutonomous Databaseのリソース・プリンシパルを使用し、AWS S3へのアクセスには、アクセスキーとシークレットアクセスキーを使用してDBMS_CLOUD.CREATE_CREDENTIALプロシージャで作成したクレデンシャルS3_CREDを使用しました。
2. PL/SQLプロシージャの作成
今回は、以下の4つのパラメータを渡して実行すると、ソースとなるPDFファイルが格納されているS3バケット内にあるPDFファイルをテキストに変換して、OCI Object Storageに格納するPL/SQLプロシージャ「s3_pdf_to_ocios_txt」を作成しました。
各パラメータは以下の通りです。
・aws_region:ソースとなるPDFファイルが格納されているS3バケットがあるAWSリージョンの識別子
・aws_bucket:ソースとなるPDFファイルが格納されているS3バケット名
・oci_region:テキストに変換されたファイルを格納するObject StorageバケットがあるOCIリージョンの識別子
・oci_bucket:テキストに変換されたファイルを格納するObject Storageバケット名
こちらのプロシージャでは、ソースとなるS3バケット内の拡張子が「.pdf」のファイルを変換対象としてテキストに変換して、ターゲットとなるObject Storageバケット内に拡張子を「.txt」として保存します。
CREATE OR REPLACE PROCEDURE s3_pdf_to_ocios_txt (aws_region IN VARCHAR2, aws_bucket IN VARCHAR2, oci_region IN VARCHAR2, oci_bucket IN VARCHAR2)
IS
resp_get_namespace DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_NAMESPACE_RESPONSE_T;
adb_compartment_ocid VARCHAR2(100);
namespace VARCHAR2(100);
os_uri_prefix VARCHAR2(256);
s3_uri_prefix VARCHAR2(256);
my_lob_data CLOB;
BEGIN
resp_get_namespace := DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACE(
region => oci_region,
credential_name => 'OCI$RESOURCE_PRINCIPAL'
);
namespace := REPLACE(resp_get_namespace.response_body, '"', '');
s3_uri_prefix := 'https://'||aws_bucket||'.s3.'||aws_region||'.amazonaws.com/';
os_uri_prefix := 'https://objectstorage.'||oci_region||'.oraclecloud.com/n/'||namespace||'/b/'||oci_bucket||'/o/';
FOR rec IN (
SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS('S3_CRED', s3_uri_prefix)
)
LOOP
SELECT DBMS_VECTOR_CHAIN.UTL_TO_TEXT(
DBMS_CLOUD.GET_OBJECT(
credential_name => 'S3_CRED',
object_uri => s3_uri_prefix||rec.object_name
),
JSON('{
"plaintext": "TRUE",
"charset" : "UTF8"
}'
)
) INTO my_lob_data;
DBMS_CLOUD.PUT_OBJECT(
credential_name => 'OCI$RESOURCE_PRINCIPAL',
object_uri => os_uri_prefix||REPLACE(rec.object_name,'.pdf','.txt'),
contents => apex_util.clob_to_blob(my_lob_data,'UTF8')
);
END LOOP;
END;
/
3. 動作確認(PL/SQLプロシージャの実行)
PL/SQLプロシージャs3_pdf_to_ocios_txtが作成できたので、実行してみます。
AWS 東京リージョン(ap-northeast-1)あるS3バケットpdf-bucket-s3には、2つのPDFファイル(001_012.pdf、rocket.pdf)が格納されています。
なお、rocket.pdfは以下のようになっており、架空のロケットエンジンの説明が含まれています。
また、OCI東京リージョン(ap-tokyo-1)にあるObject Storageバケットには、まだファイルがありません。
この状態で、パラメータとして
aws_region:ap-northeast-1
aws_bucket:pdf-bucket-s3
oci_region:ap-tokyo-1
oci_bucket:txt-bucket-oci
を指定して、PL/SQLプロシージャs3_pdf_to_ocios_txtを実行してみます。
SQL> BEGIN
2 s3_pdf_to_ocios_txt(
3 aws_region => 'ap-northeast-1',
4 aws_bucket => 'pdf-bucket-s3',
5 oci_region => 'ap-tokyo-1',
6 oci_bucket => 'txt-bucket-oci'
7 );
8 END;
9 /
PL/SQL procedure successfully completed.
SQL>
PL/SQLプロシージャs3_pdf_to_ocios_txtが正常に実行されました。
Object Storageバケットtxt-bucket-ociの内容を確認してみます。
001_012.txt、rocket.txtの2つのテキストファイルが作成されています。
rocket.txtをダウンロードして、内容を確認してみます。
S3バケットに格納されていたrocket.pdfの内容がテキスト化されて、rocket.txtとして保存されていることが確認できました。
あとはこちらのバケットtxt-bucket-ociをソースとしてDBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャを実行することで、元々S3バケット内にPDFファイルとして格納されていた情報をSELECT AI RAGの対象として使用することができるようになります。
めでたし、めでたし。