6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Cloud InfrastructureAdvent Calendar 2024

Day 23

Autonomous Database:S3バケットにある複数のPDFファイルをテキストに変換してOCI Object Storageに格納する

Last updated at Posted at 2024-12-23

はじめに

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」として保存します。

s3_pdf_to_ocios_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)が格納されています。
スクリーンショット 2024-12-23 17.08.35.png
なお、rocket.pdfは以下のようになっており、架空のロケットエンジンの説明が含まれています。

また、OCI東京リージョン(ap-tokyo-1)にあるObject Storageバケットには、まだファイルがありません。
スクリーンショット 2024-12-23 17.08.20.png

この状態で、パラメータとして
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の内容を確認してみます。

スクリーンショット 2024-12-23 17.20.42.png

001_012.txt、rocket.txtの2つのテキストファイルが作成されています。

rocket.txtをダウンロードして、内容を確認してみます。

スクリーンショット 2024-12-23 17.25.57.png

S3バケットに格納されていたrocket.pdfの内容がテキスト化されて、rocket.txtとして保存されていることが確認できました。

あとはこちらのバケットtxt-bucket-ociをソースとしてDBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャを実行することで、元々S3バケット内にPDFファイルとして格納されていた情報をSELECT AI RAGの対象として使用することができるようになります。

めでたし、めでたし。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?