6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI Data Catalog 第3回:Object Storage上のOracle DatabaseマニュアルPDFでSelect AI with RAGを構築してみてみた

6
Last updated at Posted at 2026-08-10

SelectAIwithRAG絵.jpg

■ はじめに

こんにちは。今日は、OCI Data Catalog 第3回です。

OCI Data Catalogシリーズでは、これまでObject Storage上のデータや文書を、どのように見つけ、管理し、AIから利用できるようにするかを段階的に検証してきました。

内容
第1回 Object Storage上のCSV、ParquetファイルをOCI Data Catalogへハーベスト
第2回 Oracle DatabaseマニュアルPDFと文書インベントリParquetを使用し、文書名、製品バージョン、公式URL、Object Storage上の保存場所などをカタログ化
第3回 カタログ化したObject Storage上のPDFをSelect AI with RAGで検索

第2回までの検証で、Object Storage上にどのようなOracle Databaseマニュアルがあり、どの製品バージョンや文書カテゴリに属しているのかを、OCI Data Catalogから検索できるようになりました。

ただし、カタログから対象文書を見つけることができても、PDF本文の中から必要な情報を探すには、実際に文書を開いて読み進める必要があります。

一方、RAGだけを構築しても、検索対象がどの製品、バージョン、文書カテゴリに属し、どのOracle公式URLに対応しているのかが管理されていなければ、回答の根拠を確認しにくくなります。

つまり、今回の構成では役割が分かれます。

OCI Data Catalog
  信頼できる文書を見つける・管理する
        ↓
OCI Object Storage
  PDFの実体とMetadataを保存する
        ↓
Select AI with RAG
  PDF本文を検索して回答を生成する

Data Catalogが「どの文書を使うか」を管理し、Select AI with RAGが「文書に何が書かれているか」へ回答する構成です。

そこで今回は、第2回でカタログ化した4つのOracle AI Database 26aiマニュアルPDFをAutonomous AI Databaseへ取り込み、本文抽出、チャンク分割、Embedding生成、Vector Storeへの格納を行います。

さらに、SELECT AI NARRATEによる自然言語での問い合わせ、対象文書に存在しない質問のNegative Test、Oracle公式URLのSources表示まで確認します。

実際に試してみると、正しい文書がSourcesへ表示されることと、生成された回答本文が完全に正しいことは、別々に評価する必要があることも分かりました。

ということで今回は、OCI Data Catalogで管理しているOracle AI Database 26aiマニュアルPDFを使用し、Select AI with RAGを構築してみてみます。

検証日

2026年8月6日
OCI Generative AIの利用可能モデルやリージョンは変更されることがあるため、実施時点の公式ドキュメントを確認してください。

■ Agenda

■ 今回の構成

● OCI Data CatalogとSelect AI with RAGの役割

今回の構成では、OCI Data CatalogとSelect AI with RAGを次のように使い分けます。

サービス 今回の役割
OCI Data Catalog 文書名、製品バージョン、公式URL、Object Storage URIなどを検索・管理
OCI Object Storage Oracle AI DatabaseマニュアルPDFの実体とRAG用Metadataを保存
Autonomous AI Database 26ai PDF本文の抽出、チャンク分割、Vector Store、検索処理
OCI Generative AI Embedding生成と回答生成
Select AI SQLから自然言語でRAGを実行

ここで重要なのは、Select AI with RAGがOCI Data Catalogのカタログを直接検索するわけではないという点です。

DBMS_CLOUD_AI.CREATE_VECTOR_INDEXへ渡すのはData CatalogのAssetではなく、Object Storage URIです。

OCI Data Catalogは、対象文書の発見、バージョン管理、公式URLの管理などに使用します。RAG実行時は、Object Storage上のPDFをAutonomous AI Databaseが直接読み込みます。

Select AI with RAGでは、Object Storage上のPDFなどからテキストを抽出してチャンクへ分割し、Embeddingを生成してOracle Database内のVector Storeへ格納できます。

SELECT AI NARRATEの実行時には、質問をベクトル化して関連チャンクを検索し、取得したコンテキストをLLMへ渡して回答を生成します。

参考: Use Select AI with Retrieval Augmented Generation

● 構成イメージ

● Data CatalogとRAGの処理フロー

1) 文書を探す

OCI Data Catalogで、製品バージョンや文書カテゴリを条件に対象マニュアルを検索します。

2) Object Storage URIを確認する

文書インベントリから、PDFが保存されているObject Storage URIを確認します。

3) PDFをVector Indexへ登録する

Autonomous AI DatabaseのDBMS_CLOUD_AI.CREATE_VECTOR_INDEXを使用して、Object Storage上のPDFをベクトル化します。

4) Select AIで問い合わせる

SELECT AI NARRATEを使用して、Oracle AI Databaseマニュアルの内容について問い合わせます。

■ 使用するOCIリソース

今回使用した主なリソースです。

項目 設定値
Object Storageリージョン ap-tokyo-1
Autonomous AI Databaseリージョン ap-tokyo-1
OCI Generative AIリージョン ap-osaka-1
Compartment <compartment-name>
Bucket oracle-database-doc-catalog
PDF保存Prefix documents/oracle-database/26ai/
Autonomous AI Database <Autonomous-AI-Database-name>
Database User RAG_USER
Dynamic Group <dynamic-group-name>
Select AI Profile OCI_DB_MANUAL_RAG
Vector Index OCI_DB_MANUAL_IDX
Chat Model cohere.command-a-03-2025
Embedding Model cohere.embed-v4.0
Embedding次元 1536

2026年8月6日時点では、Japan Central(Osaka)でCohere Command AとCohere Embed 4を利用できます。

Cohere Embed 4のモデルIDはcohere.embed-v4.0で、出力次元として256、512、1024、1536を使用できます。今回は1536次元を使用します。

参考:

本構成では、Object StorageとAutonomous AI DatabaseをTokyo、OCI Generative AIをOsakaに配置しています。

RAGで取得されたチャンクは、回答生成時に指定したOCI Generative AIリージョンのモデルへ送信されます。データ配置やリージョン要件がある環境では、利用するモデルとリージョンを事前に確認します。

■ 事前準備

● Autonomous AI Database 26ai

今回使用するSelect AI with RAGは、Autonomous AI Database 26aiを前提とします。

参考: Use Select AI with Retrieval Augmented Generation

● 使用するPDF

第2回でObject Storageへ配置した、次のOracle AI Database 26aiマニュアルを使用します。

文書 Object Storage Object名
Database Administrator's Guide documents/oracle-database/26ai/admin/database-administrators-guide.pdf
Oracle Database Concepts documents/oracle-database/26ai/concepts/database-concepts.pdf
Oracle AI Database Installation Guide for Linux documents/oracle-database/26ai/installation_linux/oracle-ai-database-installation-guide-linux.pdf
AI Vector Search User's Guide documents/oracle-database/26ai/vector_search/ai-vector-search-users-guide.pdf

Object Storage上の配置です。

documents/
└── oracle-database/
    └── 26ai/
        ├── admin/
        │   └── database-administrators-guide.pdf
        ├── concepts/
        │   └── database-concepts.pdf
        ├── installation_linux/
        │   └── oracle-ai-database-installation-guide-linux.pdf
        └── vector_search/
            └── ai-vector-search-users-guide.pdf

ファイル名はASCII文字にする
Select AI with RAGでは、マルチバイト文字を含むファイル名は取り込み時にスキップされる場合があります。

そのため、PDF本文の言語にかかわらず、Object Storage上のファイル名とPrefixはASCII文字にします。

例えば、次のようなファイル名は避けます。

Oracleデータベース管理者ガイド.pdf

次のようなファイル名にします。

database-administrators-guide.pdf

また、Select AI with RAGのObject Storage入力で使用できる文書形式として、PDF、DOC、JSON、XML、HTMLなどがあります。

第2回で作成したParquet形式の文書インベントリはData Catalogでの検索・管理に使用し、RAGの入力にはPDFを使用します。

参考: DBMS_CLOUD_AI Package

■ OCI Data Catalogで対象PDFを確認

OCI Data Catalogを開き、第2回で登録した文書インベントリから、今回RAGで使用する文書を検索します。

例えば、次の条件を使用します。

条件
Product Oracle AI Database
Product Version 26ai
Document Category AI Vector Search
File Type PDF

対象文書のCustom Propertyや文書インベントリから、次の値を確認します。

  • 文書名
  • 製品バージョン
  • 文書カテゴリ
  • Oracle公式URL
  • Object Storage URI
  • Object Storage Object Name

今回使用するObject Storage Prefixです。

documents/oracle-database/26ai/

・ OCI Data CatalogでProduct Version = 26aiを条件に検索結果
01_OCI Data CatalogでProduct Version = 26aiを条件に検索した結果.jpg

・ AI Vector Search User's Guideの文書名、公式URL、Object Storage URIを表示した画面
02_AI Vector Search User's Guideの文書表示.jpg

■ IAMを設定

Autonomous AI Databaseから、次のOCIサービスへアクセスできるようにします。

  • OCI Object Storage
  • OCI Generative AI Chat
  • OCI Generative AI Text Embedding

今回はAPI Keyなどの固定CredentialをDatabaseへ保存せず、Autonomous AI DatabaseのResource Principalを使用します。

● Dynamic Groupを作成

OCI ConsoleでDynamic Groupを作成します。

項目 設定例
Name <dynamic-group-name>
Description Dynamic group for Select AI with RAG

Matching Ruleには、Autonomous AI DatabaseのOCIDを指定します。

resource.id = '<Autonomous-AI-Database-OCID>'

Identity Domainを使用する環境では、後続のPolicyでDomain名を含むDynamic Group名を指定します。

参考: Use Resource Principal to Access Oracle Cloud Infrastructure Resources

・ Dynamic GroupとMatching Ruleを表示した画面
03_Dynamic GroupとMatching Rule画面.jpg

● IAM Policyを作成

Object StorageとOCI Generative AIへのアクセス権限を付与します。

Identity Domain名を含める場合は、次の形式を使用します。

<identity-domain-name>/<dynamic-group-name>

Policy例です。

Allow dynamic-group <identity-domain-name>/<dynamic-group-name> to read buckets in compartment <compartment-name>

Allow dynamic-group <identity-domain-name>/<dynamic-group-name> to read objects in compartment <compartment-name> where target.bucket.name = 'oracle-database-doc-catalog'

Allow dynamic-group <identity-domain-name>/<dynamic-group-name> to use generative-ai-chat in compartment <compartment-name>

Allow dynamic-group <identity-domain-name>/<dynamic-group-name> to use generative-ai-text-embedding in compartment <compartment-name>

Allow dynamic-group <identity-domain-name>/<dynamic-group-name> to inspect generative-ai-model in compartment <compartment-name>

Default Identity Domainなど、Domain名を省略できる環境では次のように記述します。

Allow dynamic-group <dynamic-group-name> to read buckets in compartment <compartment-name>

Allow dynamic-group <dynamic-group-name> to read objects in compartment <compartment-name> where target.bucket.name = 'oracle-database-doc-catalog'

Allow dynamic-group <dynamic-group-name> to use generative-ai-chat in compartment <compartment-name>

Allow dynamic-group <dynamic-group-name> to use generative-ai-text-embedding in compartment <compartment-name>

Allow dynamic-group <dynamic-group-name> to inspect generative-ai-model in compartment <compartment-name>

Object StorageとOCI Generative AIが異なるCompartmentにある場合は、それぞれのCompartmentを指定してPolicyを作成します。

Data CatalogはRAG実行時の直接のアクセス先ではないため、Autonomous AI DatabaseにData Catalogの参照権限を追加する必要はありません。

■ Autonomous AI Databaseを設定

以降のSQLは、Autonomous AI Databaseへ接続したSQLclから実行します。

Database ActionsのSQL Worksheetでも、同じSQLを実行できます。

● RAG用Database Userを作成

既存ユーザーを使用する場合、この作成処理は省略します。

ADMINユーザーで実行します。

SQL
CREATE USER RAG_USER
IDENTIFIED BY "<RAG_USER-password>";

GRANT CREATE SESSION, CREATE TABLE TO RAG_USER;

ALTER USER RAG_USER QUOTA 10G ON DATA;

GRANT EXECUTE ON DBMS_CLOUD TO RAG_USER;
GRANT EXECUTE ON DBMS_CLOUD_AI TO RAG_USER;
GRANT EXECUTE ON DBMS_CLOUD_PIPELINE TO RAG_USER;

DBMS_CLOUD.LIST_OBJECTSを実行するため、DBMS_CLOUDEXECUTE権限も付与します。

Vector Indexの作成時には、RAG_USER Schema内にVector Tableなどが作成されます。

● Resource Principalを有効化

最初に、ADMIN SchemaでResource Principal Credentialが作成済みか確認します。

SQL
SELECT
    owner,
    credential_name
FROM
    dba_credentials
WHERE
    credential_name = 'OCI$RESOURCE_PRINCIPAL'
AND owner = 'ADMIN';

結果が0件の場合は、ADMINユーザーでResource Principalを有効化します。

SQL
BEGIN
    DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL();
END;
/

続いて、RAG_USERからResource Principalを使用できるようにします。

SQL
BEGIN
    DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL(
        username => 'RAG_USER'
    );
END;
/

権限を確認します。

SQL
SELECT
    grantee,
    table_schema,
    table_name,
    privilege,
    grantor
FROM
    all_tab_privs
WHERE
    grantee = 'RAG_USER'
AND table_name = 'OCI$RESOURCE_PRINCIPAL'
AND table_schema = 'ADMIN';
SQL実行結果
GRANTEE   TABLE_SCHEMA   TABLE_NAME                PRIVILEGE   GRANTOR
--------- -------------- ------------------------- ----------- -------
RAG_USER  ADMIN          OCI$RESOURCE_PRINCIPAL    EXECUTE     ADMIN

Resource Principal Tokenは2時間キャッシュされます。

そのため、IAM PolicyやDynamic Groupを変更した直後は、変更内容が反映されるまで最大2時間かかる場合があります。

参考: Use Resource Principal to Access Oracle Cloud Infrastructure Resources

● Object Storageへのアクセスを確認

以降はRAG_USERで実行します。

今回のPDFは、26ai直下の文書カテゴリごとに分かれています。

documents/oracle-database/26ai/<document-category>/*.pdf

DBMS_CLOUD.LIST_OBJECTSでは、URI内のファイル名とサブフォルダに*または?のWildcardを使用できます。

次のSQLで、4カテゴリ配下のPDFをまとめて確認します。

SQL
SELECT
    object_name,
    bytes,
    last_modified
FROM
    DBMS_CLOUD.LIST_OBJECTS(
        credential_name => 'OCI$RESOURCE_PRINCIPAL',
        location_uri     => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/*/*.pdf'
    )
ORDER BY
    object_name;
SQL実行結果
OBJECT_NAME                                                              BYTES      LAST_MODIFIED
------------------------------------------------------------------------ ---------- --------------------------------------
admin/database-administrators-guide.pdf                                  9975856    01-AUG-26 03.54.26.979000000 AM GMT
concepts/database-concepts.pdf                                           13348414   01-AUG-26 03.54.27.797000000 AM GMT
installation_linux/oracle-ai-database-installation-guide-linux.pdf       1138151    01-AUG-26 03.54.26.557000000 AM GMT
vector_search/ai-vector-search-users-guide.pdf                            6013363    01-AUG-26 03.54.26.890000000 AM GMT

4つのPDFを1回のSQLで取得できました。

参考: DBMS_CLOUD LIST_OBJECTS Function

■ Select AI Profileを作成

DBMS_CLOUD_AI.CREATE_PROFILEを使用して、OCI Generative AIへ接続するSelect AI Profileを作成します。

今回は次のモデルを使用します。

用途 モデル
回答生成 cohere.command-a-03-2025
Embedding生成 cohere.embed-v4.0
Embedding次元 1536
SQL
BEGIN
    DBMS_CLOUD_AI.CREATE_PROFILE(
        profile_name => 'OCI_DB_MANUAL_RAG',
        attributes   => q'~{
            "provider": "oci",
            "credential_name": "OCI$RESOURCE_PRINCIPAL",
            "region": "ap-osaka-1",
            "oci_compartment_id": "<OCI-Generative-AI-Compartment-OCID>",
            "model": "cohere.command-a-03-2025",
            "embedding_model": "cohere.embed-v4.0",
            "vector_index_name": "OCI_DB_MANUAL_IDX",
            "temperature": 0.1,
            "max_tokens": 2000,
            "enable_custom_source_uri": false,
            "role": "You are an assistant for Oracle Database documentation.",
            "additional_instructions": "Answer in Japanese. Use only the retrieved documents as evidence. If the answer cannot be confirmed from the retrieved documents, explicitly say that it cannot be confirmed. Do not invent product specifications."
        }~',
        status      => 'ENABLED',
        description => 'RAG profile for Oracle Database manuals in OCI Object Storage'
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

主なAttributeです。

Attribute 説明
provider OCI Generative AIを使用するためociを指定
credential_name Resource Principal Credential
region OCI Generative AIモデルを使用するリージョン
oci_compartment_id OCI Generative AIを使用するCompartment OCID
model 回答生成用Chat Model
embedding_model Embedding生成用Model
vector_index_name 後続で作成するVector Index
temperature 回答のばらつきを抑えるため0.1
max_tokens 回答生成時の最大Token数として2000を指定
enable_custom_source_uri 最初はObject Storage URIをSourcesに表示
role LLMへ与える役割
additional_instructions 日本語回答、取得文書のみを根拠とする指示

参考: DBMS_CLOUD_AI Package

● Select AI Profileを確認

SQL
SELECT
    profile_name,
    status,
    description
FROM
    user_cloud_ai_profiles
WHERE
    profile_name = 'OCI_DB_MANUAL_RAG';
SQL実行結果
PROFILE_NAME        STATUS    DESCRIPTION
------------------- --------- ---------------------------------------------------------------
OCI_DB_MANUAL_RAG   ENABLED   RAG profile for Oracle Database manuals in OCI Object Storage

Attributeを確認します。

SQL
SELECT
    attribute_name,
    DBMS_LOB.SUBSTR(attribute_value, 200, 1) AS attribute_value
FROM
    user_cloud_ai_profile_attributes
WHERE
    profile_name = 'OCI_DB_MANUAL_RAG'
ORDER BY
    attribute_name;
SQL実行結果
ATTRIBUTE_NAME              ATTRIBUTE_VALUE
___________________________ ___________________________________________________________________________________________________________________________________________________________________________________________________________
additional_instructions     Answer in Japanese. Use only the retrieved documents as evidence. If the answer cannot be confirmed from the retrieved documents, explicitly say that it cannot be confirmed. Do not invent product spec
credential_name             OCI$RESOURCE_PRINCIPAL
embedding_model             cohere.embed-v4.0
enable_custom_source_uri    false
max_tokens                  2000
model                       cohere.command-a-03-2025
oci_compartment_id          <OCI-Generative-AI-Compartment-OCID>
provider                    oci
region                      ap-osaka-1
role                        You are an assistant for Oracle Database documentation.
temperature                 0.1
vector_index_name           OCI_DB_MANUAL_IDX

12 rows selected.

DBMS_LOB.SUBSTR(attribute_value, 200, 1)を指定しているため、
長いAttribute値は先頭200文字まで表示されます。

■ PDFからVector Indexを作成

DBMS_CLOUD_AI.CREATE_VECTOR_INDEXを使用し、Object Storage上の4つのPDFからVector Indexを作成します。

● Vector Indexの設定内容

Attribute 設定値 説明
vector_db_provider oracle Oracle Database内へVectorを格納
location 26ai/*/*.pdf 26ai直下の各カテゴリにあるPDFを対象
object_storage_credential_name OCI$RESOURCE_PRINCIPAL Object Storageへの認証
profile_name OCI_DB_MANUAL_RAG Embedding生成に使用するProfile
vector_dimension 1536 Cohere Embed 4の出力次元
vector_distance_metric cosine Cosine Distanceを使用
chunk_size 1024 1チャンクの文字数
chunk_overlap 128 前後チャンクの重複文字数
match_limit 5 質問ごとに取得する上位チャンク数
refresh_rate 1440 Object Storageを再確認する間隔、単位は分
wait_for_completion TRUE 初回取り込みが完了するまで処理を待機

PDF数が多く、SQL Client側の接続時間を考慮する場合は、次のようにバックグラウンド実行できます。

SQL
wait_for_completion => FALSE

● Vector Index作成

DBMS_CLOUD.LIST_OBJECTSで正常に取得できたWildcard URIを、locationにも使用します。

SQL
BEGIN
    DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
        index_name => 'OCI_DB_MANUAL_IDX',
        attributes => q'~{
            "vector_db_provider": "oracle",
            "location": "https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/*/*.pdf",
            "object_storage_credential_name": "OCI$RESOURCE_PRINCIPAL",
            "profile_name": "OCI_DB_MANUAL_RAG",
            "vector_dimension": 1536,
            "vector_distance_metric": "cosine",
            "chunk_size": 1024,
            "chunk_overlap": 128,
            "match_limit": 5,
            "refresh_rate": 1440
        }~',
        status              => 'ENABLED',
        description         => 'Oracle Database 26ai manual PDF index for Select AI RAG',
        wait_for_completion => TRUE
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

● Vector Indexを確認

wait_for_completion => TRUEを指定したため、初回取り込みの完了後に処理が戻りました。

Vector IndexとPipelineの状態を確認します。

SQL
SELECT
    index_name,
    status,
    description
FROM
    user_cloud_vector_indexes
WHERE
    index_name = 'OCI_DB_MANUAL_IDX';
SQL実行結果
INDEX_NAME           STATUS    DESCRIPTION
-------------------- --------- --------------------------------------------------------
OCI_DB_MANUAL_IDX    ENABLED   Oracle Database 26ai manual PDF index for Select AI RAG

Attributeを確認します。

SQL
SELECT
    attribute_name,
    DBMS_LOB.SUBSTR(attribute_value, 200, 1) AS attribute_value
FROM
    user_cloud_vector_index_attributes
WHERE
    index_name = 'OCI_DB_MANUAL_IDX'
ORDER BY
    attribute_name;
SQL実行結果
ATTRIBUTE_NAME                    ATTRIBUTE_VALUE
_________________________________ _________________________________________________________________________________________________________________________________________
chunk_overlap                     128
chunk_size                        1024
location                          https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/*/*.pdf
match_limit                       5
object_storage_credential_name    OCI$RESOURCE_PRINCIPAL
pipeline_name                     OCI_DB_MANUAL_IDX$VECPIPELINE
profile_name                      OCI_DB_MANUAL_RAG
refresh_rate                      1440
vector_db_provider                oracle
vector_dimension                  1536
vector_distance_metric            cosine

11 rows selected.

● Vector Pipelineを確認

Vector Indexを作成すると、次の名前のPipelineが作成されました。

OCI_DB_MANUAL_IDX$VECPIPELINE

PipelineのStatusを確認します。

SQL
SELECT
    pipeline_name,
    pipeline_type,
    status
FROM
    user_cloud_pipelines
WHERE
    pipeline_name = 'OCI_DB_MANUAL_IDX$VECPIPELINE';
SQL実行結果
PIPELINE_NAME                    PIPELINE_TYPE   STATUS
-------------------------------- --------------- --------
OCI_DB_MANUAL_IDX$VECPIPELINE    VECTOR_INDEX    STARTED

USER_CLOUD_PIPELINES.STATUS = STARTEDは、
Pipelineが開始済みで、今後もスケジュール実行できる状態であることを示します。

Pipelineの実行履歴を確認します。

SQL
SELECT
    pipeline_id,
    pipeline_name,
    status,
    error_message
FROM
    user_cloud_pipeline_history
WHERE
    pipeline_name = 'OCI_DB_MANUAL_IDX$VECPIPELINE'
ORDER BY
    pipeline_id DESC;
SQL実行結果
PIPELINE_ID   PIPELINE_NAME                    STATUS      ERROR_MESSAGE
------------- -------------------------------- ----------- -------------
3             OCI_DB_MANUAL_IDX$VECPIPELINE    SUCCEEDED

初回のVector Store作成処理が正常終了したことは、
USER_CLOUD_PIPELINE_HISTORYの最新実行が
SUCCEEDEDであることから確認します。

● Vector Tableを確認

今回のCREATE_VECTOR_INDEXではvector_table_nameを明示していません。

そのため、次のデフォルト名でVector Tableが作成されました。

OCI_DB_MANUAL_IDX$VECTAB

Tableを確認します。

SQL
SELECT
    table_name
FROM
    user_tables
WHERE
    table_name = 'OCI_DB_MANUAL_IDX$VECTAB';
SQL実行結果
TABLE_NAME
---------------------------
OCI_DB_MANUAL_IDX$VECTAB

登録されたチャンク数を確認します。

SQL
SELECT
    COUNT(*) AS chunk_count
FROM
    OCI_DB_MANUAL_IDX$VECTAB;
SQL実行結果
CHUNK_COUNT
-----------
9590

4つのOracle AI Database 26aiマニュアルから、9,590件のチャンクが登録されました。

文書ごとのチャンク数も確認できます。

SQL
SELECT
    JSON_VALUE(attributes, '$.object_name') AS object_name,
    COUNT(*) AS chunk_count
FROM
    OCI_DB_MANUAL_IDX$VECTAB
GROUP BY
    JSON_VALUE(attributes, '$.object_name')
ORDER BY
    object_name;
SQL実行結果
OBJECT_NAME                                                              CHUNK_COUNT
_____________________________________________________________________ ______________
admin/database-administrators-guide.pdf                                         4586
concepts/database-concepts.pdf                                                  2386
installation_linux/oracle-ai-database-installation-guide-linux.pdf               733
vector_search/ai-vector-search-users-guide.pdf                                  1885

Vector Tableの構造を確認します。

SQL
DESC OCI_DB_MANUAL_IDX$VECTAB
SQL実行結果
Name          Null?    Type
------------- -------- ----------------------
CONTENT                CLOB
ATTRIBUTES             JSON
EMBEDDING              VECTOR(1536,*,DENSE)

各列の役割です。

内容
CONTENT PDFから抽出して分割された本文
ATTRIBUTES ファイル名、Object Storage URI、OffsetなどのSource情報
EMBEDDING 本文から生成された1536次元のEmbedding Vector

登録されたチャンクの一部を確認します。

SQL
SELECT
    JSON_VALUE(attributes, '$.object_name') AS object_name,
    DBMS_LOB.SUBSTR(content, 300, 1) AS content
FROM
    OCI_DB_MANUAL_IDX$VECTAB
WHERE
    DBMS_LOB.GETLENGTH(content) > 0
FETCH FIRST 3 ROWS ONLY;
SQL実行結果
OBJECT_NAME                                CONTENT
__________________________________________ ____________________________________________________________________________________________________________________________
admin/database-administrators-guide.pdf

                                           Database Administrator's Guide









                                           Oracle® AI Database



                                           Database Administrator's Guide



                                           26ai



                                           G42927-08



                                           July 2026













                                           Oracle AI Database Database Administrator's Guide, 26ai



                                           G42927-08



                                           Copyright © 1996, 2026, Oracle and/or its affiliates.



                                           Primary Author: Mark Dor
admin/database-administrators-guide.pdf    eck, S. Hase, W. Hu, P. Huey, K. Inoue, M. Ito, C. Iyer, K. Itikarlapalli, P. Jaganath, S. Jain, C. Jones, S.



                                           Joshi, B. Khaladkar, F. Kobylanski, B. Krishnan, V. Krishnaswamy, A. Kruglikov, B. Kuchibhotla, V. Kuhr, R. Kumar, S.



                                           Kumar, V. Kumar, H. Lakshmanan, A. Lee, B. Lee, J. Lee, S. K. Le
admin/database-administrators-guide.pdf


                                           This software or hardware is developed for general use in a variety of information management applications. It is not



                                           developed or intended for use in any inherently dangerous applications, including applications that may create a risk of



                                           personal injury. If you use this software or hardw

SQL>

■ Select AI Profileを有効化

現在のSessionで使用するSelect AI Profileを設定します。

SQL
BEGIN
    DBMS_CLOUD_AI.SET_PROFILE(
        profile_name => 'OCI_DB_MANUAL_RAG'
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

現在のProfileを確認します。

SQL
SELECT
    DBMS_CLOUD_AI.GET_PROFILE() AS current_profile
FROM
    dual;
SQL実行結果
CURRENT_PROFILE
---------------------------------
"RAG_USER"."OCI_DB_MANUAL_RAG"

Schema名とProfile名が表示されれば設定完了です。

SET_PROFILEは現在のSessionに対する設定です。SQLclを切断して再接続した場合は、再度実行します。

■ Select AI with RAGで問い合わせ

● AI Vector Searchについて質問

AI Vector Search User's Guideの内容について質問します。

SQL
SELECT AI NARRATE
Oracle AI Vector Searchで使用できるHNSW索引とIVF索引の違いを、
索引の構造、検索特性、更新時の考慮点が分かるように日本語で説明してください。
資料に記載されていないことは推測しないでください;

回答本文に加えて、参照したPDFがSourcesへ表示されました。

SQL実行結果
RESPONSE
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________
HNSW索引とIVF索引は、Oracle AI Vector Searchで使用できる2つの主要なベクトル索引です。以下に、それぞれの構造、検索特性、更新時の考慮点について説明します。

**HNSW索引**
- **構造**: HNSW(Hierarchical Navigable Small World)索引は、階層的なグラフ構造を持ち、複数のレイヤーで構成されています。各レイヤーは異なる解像度でデータを表現し、効率的な類似性検索を実現します。
- **検索特性**: 検索時にパーティション刈り込み(partition pruning)を使用し、該当するパーティションまたはサブパーティションのローカルHNSWグラフのみを検索することで、検索効率を向上させます。
- **更新時の考慮点**: 増分スナップショットが導入されており、最小限の頻度での更新に最適化されています。これにより、パフォーマンスとメモリ使用量のバランスが取られています。

**IVF索引**
- **構造**: IVF(Inverted File Flat)索引は、近隣パーティションまたはクラスターを使用したパーティションベースの索引です。検索領域を狭めることで効率的な検索を実現します。
- **検索特性**: 近隣パーティションやクラスターを活用して検索範囲を絞り込み、高速な類似性検索を可能にします。
- **更新時の考慮点**: IVF索引は、ベーステーブルに対する更新により品質が低下する可能性があります。しかし、自動再構成機能により、データベースが再構築の必要性を判断し、人間の手を介さずに索引を再構成できます。

Sources:
  - vector_search/ai-vector-search-users-guide.pdf (https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/vector_search/ai-vector-search-users-guide.pdf)

この時点ではenable_custom_source_urifalseのため、SourcesにはObject Storage URIが表示されています。

RAG回答の内容が正しいかどうかは、Sourcesが表示されたこととは別に、マニュアル原文と照合して評価する必要があります。

● マニュアルに存在しない質問

対象文書に存在しない質問も実行します。

SQL
SELECT AI NARRATE
このマニュアル群にOCI Data Catalogの最新料金表は記載されていますか。
記載されていない場合は、推測せず「確認できません」と回答してください;
SQL実行結果
RESPONSE
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________
確認できません。

Sources:
  - vector_search/ai-vector-search-users-guide.pdf (https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/vector_search/ai-vector-search-users-guide.pdf)
  - concepts/database-concepts.pdf (https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/concepts/database-concepts.pdf)
  - admin/database-administrators-guide.pdf (https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/admin/database-administrators-guide.pdf)

Profileのadditional_instructionsに、取得文書から確認できない場合は推測しないよう指定しています。

Use only the retrieved documents as evidence.
If the answer cannot be confirmed from the retrieved documents,
explicitly say that it cannot be confirmed.

対象PDFから確認できない内容について、無理に回答を生成しないことを確認できました。

■ Oracle公式URLをSourcesへ表示

ここまでの構成では、回答のSourcesにPDFファイル名とObject Storage URIが表示されます。

第2回では、文書インベントリとOCI Data Catalogに各マニュアルのOracle公式URLを登録しました。

そこで、Data Catalogで管理しているofficial_urlと同じ値をObject StorageのCustom Metadataにも設定し、Select AI with RAGのSourcesにOracle公式URLを表示します。

● Data CatalogのCustom Propertyは直接参照されない

Select AI with RAGが参照するのは、OCI Data CatalogのCustom Propertyではありません。

Object Storage Objectに設定された次のCustom Metadataです。

customized_url_source

Object StorageのMetadata Headerとしては、次の名前で確認できます。

opc-meta-customized_url_source

今回の構成では、次のように公式URLを連携します。

OCI Data Catalog
official_url
    ↓
OCI Object Storage
customized_url_source
    ↓
Select AI with RAG
Sources

Data Catalogへ登録したofficial_urlが、自動的にObject Storage Metadataへ同期されるわけではありません。

そのため、PDFをObject StorageへUploadするときに、同じOracle公式URLをCustom Metadataとして設定します。

参考: DBMS_CLOUD_AI Package - enable_custom_source_uri

● 使用するOracle公式URL

文書 Object名 Oracle公式PDF URL
Database Administrator's Guide documents/oracle-database/26ai/admin/database-administrators-guide.pdf https://docs.oracle.com/en/database/oracle/oracle-database/26/admin/database-administrators-guide.pdf
Oracle Database Concepts documents/oracle-database/26ai/concepts/database-concepts.pdf https://docs.oracle.com/cd/G47991_01/cncpt/database-concepts.pdf
Oracle AI Database Installation Guide for Linux documents/oracle-database/26ai/installation_linux/oracle-ai-database-installation-guide-linux.pdf https://docs.oracle.com/cd/G47991_01/ladbi/oracle-ai-database-installation-guide-linux.pdf
AI Vector Search User's Guide documents/oracle-database/26ai/vector_search/ai-vector-search-users-guide.pdf https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf

● AI Vector Search User's GuideへCustom Metadataを設定

AI Vector Search User's Guideを再Uploadし、Oracle公式URLを設定します。

oci os object put \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/vector_search/ai-vector-search-users-guide.pdf \
  --file ./ai-vector-search-users-guide.pdf \
  --content-type application/pdf \
  --metadata '{"customized_url_source":"https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf"}' \
  --force
実行結果
Uploading object  [####################################]  100%
{
  "etag": "c0a2d27b-6233-42c6-8feb-e774674d8ef2",
  "last-modified": "Thu, 06 Aug 2026 13:14:59 GMT",
  "opc-content-md5": "K+ng707ipjsI6Kncx5Redg=="
}

各指定値の役割です。

--name
  Object Storage上のObject名

--file
  ローカルに保存されているUpload元のPDF

customized_url_source
  Sourcesへ表示するOracle公式URL

--metadataで既存Objectを再Uploadするため、Object Versioningや既存Custom Metadataの有無を確認してから実行します。

・ AI Vector Search User's GuideのCustom Metadataを確認

oci os object head \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/vector_search/ai-vector-search-users-guide.pdf
実行結果
{
  "accept-ranges": "bytes",
  "access-control-allow-credentials": "true",
  "access-control-allow-methods": "POST,PUT,GET,HEAD,DELETE,OPTIONS",
  "access-control-allow-origin": "*",
  "access-control-expose-headers": "accept-ranges,access-control-allow-credentials,access-control-allow-methods,access-control-allow-origin,content-length,content-md5,content-type,date,etag,last-modified,opc-client-info,opc-client-request-id,opc-meta-customized_url_source,opc-request-id,storage-tier,strict-transport-security,version-id,x-api-id,x-content-type-options",
  "content-length": "6013363",
  "content-md5": "K+ng707ipjsI6Kncx5Redg==",
  "content-type": "application/pdf",
  "date": "Thu, 06 Aug 2026 13:17:29 GMT",
  "etag": "c0a2d27b-6233-42c6-8feb-e774674d8ef2",
  "last-modified": "Thu, 06 Aug 2026 13:14:59 GMT",
  "opc-client-request-id": "F90C098AFB064BCBA4CB5EB1A35E3B69",
  "opc-meta-customized_url_source": "https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf",
  "opc-request-id": "nrt-1:5cUHjwMgd6SH6ZNR_7VeiCi_wJUDtFUeP6jkGlXv41DOScYMloQrFnBgaDMeeuqb",
  "storage-tier": "Standard",
  "strict-transport-security": "max-age=31536000; includeSubDomains",
  "version-id": "9c89e57f-3309-453a-bd9f-94ba6e79b0e6",
  "x-api-id": "native",
  "x-content-type-options": "nosniff"
}

● ほかの3つのPDFにも公式URLを設定

・ Database Administrator's Guideを再Upload

oci os object put \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/admin/database-administrators-guide.pdf \
  --file documents/oracle-database/26ai/admin/database-administrators-guide.pdf \
  --content-type application/pdf \
  --metadata '{"customized_url_source":"https://docs.oracle.com/en/database/oracle/oracle-database/26/admin/database-administrators-guide.pdf"}' \
  --force
実行結果
Warning: To increase security of your API key located at <OCI-API-key-path>, append an extra line with 'OCI_API_KEY' at the end. For more information, refer to https://docs.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm. To suppress the warning, set the env variable SUPPRESS_LABEL_WARNING=True
Uploading object  [####################################]  100%
{
  "etag": "510ef44e-30c8-445c-bba2-d14b3030c5b5",
  "last-modified": "Thu, 06 Aug 2026 15:36:45 GMT",
  "opc-content-md5": "ixHI/2R9n56oxPS7Bh1kzw=="
}

Custom Metadataを確認します。

oci os object head \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/admin/database-administrators-guide.pdf
実行結果
Warning: To increase security of your API key located at <OCI-API-key-path>, append an extra line with 'OCI_API_KEY' at the end. For more information, refer to https://docs.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm. To suppress the warning, set the env variable SUPPRESS_LABEL_WARNING=True
{
  "accept-ranges": "bytes",
  "access-control-allow-credentials": "true",
  "access-control-allow-methods": "POST,PUT,GET,HEAD,DELETE,OPTIONS",
  "access-control-allow-origin": "*",
  "access-control-expose-headers": "accept-ranges,access-control-allow-credentials,access-control-allow-methods,access-control-allow-origin,content-length,content-md5,content-type,date,etag,last-modified,opc-client-info,opc-client-request-id,opc-meta-customized_url_source,opc-request-id,storage-tier,strict-transport-security,version-id,x-api-id,x-content-type-options",
  "content-length": "9975856",
  "content-md5": "ixHI/2R9n56oxPS7Bh1kzw==",
  "content-type": "application/pdf",
  "date": "Thu, 06 Aug 2026 15:36:55 GMT",
  "etag": "510ef44e-30c8-445c-bba2-d14b3030c5b5",
  "last-modified": "Thu, 06 Aug 2026 15:36:45 GMT",
  "opc-client-request-id": "F0182565088647F7800C3BB35106EDA4",
  "opc-meta-customized_url_source": "https://docs.oracle.com/en/database/oracle/oracle-database/26/admin/database-administrators-guide.pdf",
  "opc-request-id": "nrt-1:fodyhrWi1lB5AhoeT4apeZqBNOvF9TcC-6VqJU_7DdIipa3m_RkD1TPyGpKAr46i",
  "storage-tier": "Standard",
  "strict-transport-security": "max-age=31536000; includeSubDomains",
  "version-id": "7ffb7eb5-63da-4904-bdbd-d2f9ba3c800f",
  "x-api-id": "native",
  "x-content-type-options": "nosniff"
}

・ Oracle Database Conceptsを再Upload

oci os object put \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/concepts/database-concepts.pdf \
  --file documents/oracle-database/26ai/concepts/database-concepts.pdf \
  --content-type application/pdf \
  --metadata '{"customized_url_source":"https://docs.oracle.com/cd/G47991_01/cncpt/database-concepts.pdf"}' \
  --force
実行結果
Uploading object  [####################################]  100%
{
  "etag": "43a7a090-ea69-40f3-a646-b53cf3ba9ea4",
  "last-modified": "Thu, 06 Aug 2026 13:32:04 GMT",
  "opc-content-md5": "J19jEmbmwV4ZjbYdydaB2A=="
}

Custom Metadataを確認します。

oci os object head \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/concepts/database-concepts.pdf
実行結果
{
  "accept-ranges": "bytes",
  "access-control-allow-credentials": "true",
  "access-control-allow-methods": "POST,PUT,GET,HEAD,DELETE,OPTIONS",
  "access-control-allow-origin": "*",
  "access-control-expose-headers": "accept-ranges,access-control-allow-credentials,access-control-allow-methods,access-control-allow-origin,content-length,content-md5,content-type,date,etag,last-modified,opc-client-info,opc-client-request-id,opc-meta-customized_url_source,opc-request-id,storage-tier,strict-transport-security,version-id,x-api-id,x-content-type-options",
  "content-length": "13348414",
  "content-md5": "J19jEmbmwV4ZjbYdydaB2A==",
  "content-type": "application/pdf",
  "date": "Thu, 06 Aug 2026 13:33:57 GMT",
  "etag": "43a7a090-ea69-40f3-a646-b53cf3ba9ea4",
  "last-modified": "Thu, 06 Aug 2026 13:32:04 GMT",
  "opc-client-request-id": "0F4A340C861641E7825BE3C72AB1CE99",
  "opc-meta-customized_url_source": "https://docs.oracle.com/cd/G47991_01/cncpt/database-concepts.pdf",
  "opc-request-id": "nrt-1:WwVzjFnvqJHC9fmaXDiMNQWuM_0IIElQ89km46nPxvXDd56ZhHbSiOqLvd3V9ZRd",
  "storage-tier": "Standard",
  "strict-transport-security": "max-age=31536000; includeSubDomains",
  "version-id": "8955d553-c26e-4b06-9eec-284f31a347e2",
  "x-api-id": "native",
  "x-content-type-options": "nosniff"
}

・ Oracle AI Database Installation Guide for Linuxを再Upload

oci os object put \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/installation_linux/oracle-ai-database-installation-guide-linux.pdf \
  --file documents/oracle-database/26ai/installation_linux/oracle-ai-database-installation-guide-linux.pdf \
  --content-type application/pdf \
  --metadata '{"customized_url_source":"https://docs.oracle.com/cd/G47991_01/ladbi/oracle-ai-database-installation-guide-linux.pdf"}' \
  --force
実行結果
Uploading object  [####################################]  100%
{
  "etag": "41af6ce4-297a-4adc-a861-d65b32cf6d1f",
  "last-modified": "Thu, 06 Aug 2026 13:32:12 GMT",
  "opc-content-md5": "1xFCmSM/TDrK59artOh+Lw=="
}

Custom Metadataを確認します。

oci os object head \
  --region ap-tokyo-1 \
  --namespace-name <namespace> \
  --bucket-name oracle-database-doc-catalog \
  --name documents/oracle-database/26ai/installation_linux/oracle-ai-database-installation-guide-linux.pdf
実行結果
{
  "accept-ranges": "bytes",
  "access-control-allow-credentials": "true",
  "access-control-allow-methods": "POST,PUT,GET,HEAD,DELETE,OPTIONS",
  "access-control-allow-origin": "*",
  "access-control-expose-headers": "accept-ranges,access-control-allow-credentials,access-control-allow-methods,access-control-allow-origin,content-length,content-md5,content-type,date,etag,last-modified,opc-client-info,opc-client-request-id,opc-meta-customized_url_source,opc-request-id,storage-tier,strict-transport-security,version-id,x-api-id,x-content-type-options",
  "content-length": "1138151",
  "content-md5": "1xFCmSM/TDrK59artOh+Lw==",
  "content-type": "application/pdf",
  "date": "Thu, 06 Aug 2026 13:34:04 GMT",
  "etag": "41af6ce4-297a-4adc-a861-d65b32cf6d1f",
  "last-modified": "Thu, 06 Aug 2026 13:32:12 GMT",
  "opc-client-request-id": "301230ADE03C48EDA537B998FC043738",
  "opc-meta-customized_url_source": "https://docs.oracle.com/cd/G47991_01/ladbi/oracle-ai-database-installation-guide-linux.pdf",
  "opc-request-id": "nrt-1:6I6zb5lwEBZhl6fRivBOLmjkvKZKfj1AdQ-A-MKBzGN5-r74VonbhcJ68-vZvczV",
  "storage-tier": "Standard",
  "strict-transport-security": "max-age=31536000; includeSubDomains",
  "version-id": "d922c326-b6dc-4d63-878c-3cab52351543",
  "x-api-id": "native",
  "x-content-type-options": "nosniff"
}

● Select AI ProfileでCustom Source URIを有効化

Select AI Profileのenable_custom_source_uritrueへ変更します。

SQL
BEGIN
    DBMS_CLOUD_AI.SET_ATTRIBUTE(
        profile_name    => 'OCI_DB_MANUAL_RAG',
        attribute_name  => 'enable_custom_source_uri',
        attribute_value => 'true'
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

設定結果を確認します。

SQL
SELECT
    attribute_name,
    DBMS_LOB.SUBSTR(attribute_value, 200, 1) AS attribute_value
FROM
    user_cloud_ai_profile_attributes
WHERE
    profile_name = 'OCI_DB_MANUAL_RAG'
AND attribute_name = 'enable_custom_source_uri';
SQL実行結果
ATTRIBUTE_NAME             ATTRIBUTE_VALUE
-------------------------- ---------------
enable_custom_source_uri   true

● Vector Indexを再作成

今回の検証では、Object Storage MetadataをVector TableのATTRIBUTESへ確実に反映するため、Vector Indexを削除して再作成しました。

現在のVector Indexを削除します。

SQL
BEGIN
    DBMS_CLOUD_AI.DROP_VECTOR_INDEX(
        index_name   => 'OCI_DB_MANUAL_IDX',
        include_data => TRUE,
        force        => TRUE
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

Vector Indexを再作成します。

SQL
BEGIN
    DBMS_CLOUD_AI.CREATE_VECTOR_INDEX(
        index_name => 'OCI_DB_MANUAL_IDX',
        attributes => q'~{
            "vector_db_provider": "oracle",
            "location": "https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/*/*.pdf",
            "object_storage_credential_name": "OCI$RESOURCE_PRINCIPAL",
            "profile_name": "OCI_DB_MANUAL_RAG",
            "vector_dimension": 1536,
            "vector_distance_metric": "cosine",
            "chunk_size": 1024,
            "chunk_overlap": 128,
            "match_limit": 5,
            "refresh_rate": 1440
        }~',
        status              => 'ENABLED',
        description         => 'Oracle Database 26ai manual PDF index for Select AI RAG',
        wait_for_completion => TRUE
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

今回の環境ではenable_sourcesを明示するとORA-20048が発生するため、再作成時にも指定していません。

再作成後、4つのPDFのcustom_uriを確認します。

SQL
SELECT
    object_name,
    custom_uri,
    CASE
        WHEN custom_uri LIKE 'https://docs.oracle.com/%'
            THEN 'OK'
        ELSE 'NG'
    END AS url_status
FROM (
    SELECT DISTINCT
        JSON_VALUE(
            attributes,
            '$.object_name'
            RETURNING VARCHAR2(512)
        ) AS object_name,
        JSON_VALUE(
            attributes,
            '$.custom_uri'
            RETURNING VARCHAR2(2000)
        ) AS custom_uri
    FROM
        OCI_DB_MANUAL_IDX$VECTAB
)
ORDER BY
    object_name;
SQL実行結果
OBJECT_NAME                                                           CUSTOM_URI                                                                                               URL_STATUS
_____________________________________________________________________ ________________________________________________________________________________________________________ _____________
admin/database-administrators-guide.pdf                               https://docs.oracle.com/en/database/oracle/oracle-database/26/admin/database-administrators-guide.pdf    OK
concepts/database-concepts.pdf                                        https://docs.oracle.com/cd/G47991_01/cncpt/database-concepts.pdf                                         OK
installation_linux/oracle-ai-database-installation-guide-linux.pdf    https://docs.oracle.com/cd/G47991_01/ladbi/oracle-ai-database-installation-guide-linux.pdf               OK
vector_search/ai-vector-search-users-guide.pdf                        https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf     OK

Pipelineの実行結果も確認します。

SQL
SELECT
    pipeline_id,
    pipeline_name,
    status,
    error_message
FROM
    user_cloud_pipeline_history
WHERE
    pipeline_name = 'OCI_DB_MANUAL_IDX$VECPIPELINE'
ORDER BY
    pipeline_id DESC;
SQL実行結果
   PIPELINE_ID PIPELINE_NAME                    STATUS       ERROR_MESSAGE
______________ ________________________________ ____________ ________________
             7 OCI_DB_MANUAL_IDX$VECPIPELINE    SUCCEEDED

● Custom URIがVector Tableへ反映されたことを確認

再作成後、Vector TableのATTRIBUTES列を確認します。

SQL
SELECT
    JSON_SERIALIZE(
        attributes
        RETURNING VARCHAR2(4000)
        PRETTY
    ) AS attributes
FROM
    OCI_DB_MANUAL_IDX$VECTAB
WHERE
    JSON_SERIALIZE(attributes RETURNING VARCHAR2(4000))
        LIKE '%ai-vector-search-users-guide.pdf%'
FETCH FIRST 1 ROW ONLY;
SQL実行結果
{
  "object_name" : "vector_search/ai-vector-search-users-guide.pdf",
  "object_size" : 6013363,
  "last_modified" : "2026-08-06T13:32:21+00:00",
  "location_uri" : "https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/oracle-database-doc-catalog/o/documents/oracle-database/26ai/",
  "custom_uri" : "https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf",
  "start_offset" : 1001729,
  "end_offset" : 1002752
}

custom_uriにOracle公式URLが格納されました。

● Oracle公式URLがSourcesに表示されることを確認

Select AI Profileを現在のSessionへ設定します。

SQL
BEGIN
    DBMS_CLOUD_AI.SET_PROFILE(
        profile_name => 'OCI_DB_MANUAL_RAG'
    );
END;
/
SQL実行結果
PL/SQL procedure successfully completed.

再度、AI Vector Search User's Guideの内容について問い合わせます。

SQL
SELECT AI NARRATE
Oracle AI Vector SearchにおけるHNSW索引とIVF索引の違いを、
索引構造と検索特性が分かるように日本語で説明してください。
資料に記載されていない内容は推測しないでください;
SQL実行結果
  RESPONSE
  ____________________________________________________________________________________________________________________________________________________________
  Oracle AI Vector SearchにおけるHNSW索引とIVF索引の主な違いは以下の通りです。

  **索引構造**

  * **HNSW索引**: 階層的なナビゲーショングラフ(Hierarchical Navigable Small World Graph)を使用し、ベクトルを多層構造で表現します。この構造により、高速な近似最近傍検索を実現します。
  * **IVF索引**: 倒置ファイル(Inverted File)とフラットなベクトルリストを組み合わせた構造です。ベクトルをクラスタに分割し、各クラスタの代表ベクトルを使用して検索を効率化します。

  **検索特性**

  * **HNSW索引**: 高速な近似最近傍検索に優れています。階層的な構造により、検索範囲を効率的に絞り込み、高速な検索を実現します。
  * **IVF索引**: 検索効率を高めるために、近隣パーティションまたはクラスタを使用します。クラスタ内のベクトルを検索することで、検索範囲を絞り込み、効率的な検索を実現します。

  これらの違いは、索引の作成方法や検索アルゴリズムに反映されています。HNSW索引は、グラフの構築やメモリ割り当てなどの処理を必要としますが、IVF索引はクラスタの作成やハッシュテーブルの割り当てなどの処理を必要とします。

  Sources:
    - vector_search/ai-vector-search-users-guide.pdf (https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf)

回答のSourcesで、PDFファイル名に続くURLがObject Storage URIからOracle公式URLへ変更されました。

Sources:
  - vector_search/ai-vector-search-users-guide.pdf
    (https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf)

これにより、RAG回答からOracle公式マニュアルを直接確認できるようになりました。

● 確認結果

今回の検証では、次の流れでOracle公式URLをSourcesへ表示できました。

OCI Data Catalog
  official_urlを管理
        ↓
OCI Object Storage
  customized_url_sourceとして設定
        ↓
Select AI Profile
  enable_custom_source_uri = true
        ↓
Vector Indexを再作成
        ↓
SELECT AI NARRATE
  SourcesへOracle公式URLを表示

OCI Data CatalogのCustom Propertyは、Select AI with RAGから直接参照されません。

そのため、Data Catalogで管理しているofficial_urlと同じ値をObject Storageのcustomized_url_sourceへ設定しました。

■ PDFを追加・更新

新しいPDFを追加する場合は、次のパターンに一致する場所へ配置します。

documents/oracle-database/26ai/<document-category>/<file-name>.pdf

今回のVector Indexでは、次のWildcardを指定しています。

documents/oracle-database/26ai/*/*.pdf

そのため、26ai直下に文書カテゴリが1階層あり、その下にPDFがある構成が対象です。

Oracle公式URLをSourcesへ表示する場合は、PDFのUpload時にcustomized_url_sourceも設定します。

Vector Indexには次の設定をしています。

{
  "refresh_rate": 1440
}

単位は分なので、1,440分ごとにObject Storageの変更を確認します。

一方、OCI Data Catalogの文書インベントリやCustom Propertyは、Vector Pipelineによって自動更新されません。

OCI Data Catalog
  └── 文書インベントリを更新して再ハーベスト

Select AI with RAG
  └── Vector PipelineがObject Storage上のPDFの追加・更新を
      Vector Storeへ反映

Data CatalogのハーベストとVector Indexの更新は、それぞれ独立した処理として管理します。

■ RAGの回答品質とSourcesを確認

RAGの動作確認では、回答文を見るだけでなく、次の観点で評価します。

評価項目 確認内容
Grounding 回答がPDFの記述に基づいているか
Source 正しいPDFとOracle公式URLが表示されているか
Version 26ai以外の情報が混入していないか
Completeness 質問した項目が回答されているか
Negative Test 文書にない質問へ推測で回答していないか

今回の確認結果です。

No. 検証内容 確認方法 結果 備考
1 HNSW索引とIVF索引の違い SELECT AI NARRATE Source OK/一部にローカルHNSW索引の特性を一般化した回答あり AI Vector Search User's Guideを参照
2 文書に存在しない質問 SELECT AI NARRATE OK 「確認できません」と回答
3 Oracle公式URLの表示 SELECT AI NARRATE OK SourcesへOracle公式URLを表示
4 4つのPDFのCustom URI Vector Tableを直接SELECT OK 全ファイルでURL_STATUS = OK

評価上の注意

Sourcesが正しいことと、生成された回答内容が正しいことは
別の評価項目です。

回答本文はマニュアル原文と照合します。

● 検証SQL-1:単一マニュアルの検索

SELECT AI NARRATE
Oracle AI Vector Searchで使用できるHNSW索引とIVF索引の違いを、
索引の構造、検索特性、更新時の考慮点が分かるように
日本語で説明してください。
資料に記載されていないことは推測しないでください;

確認項目です。

  • 回答がAI Vector Search User's Guideに基づいている
  • HNSWとIVFの違いが説明されている
  • 26ai以外の説明が混入していない
  • AI Vector Search User's GuideがSourcesに表示される
SQL実行結果
RESPONSE
____________________________________________________________________________________________________________________________________________________________
HNSW索引とIVF索引の違いは以下の通りです。

**索引の構造**
- HNSW索引: 階層的なナビゲーション可能な小世界グラフ(Hierarchical Navigable Small World Graph)を使用し、マルチレイヤーのグラフ構造でベクトルを格納します。
- IVF索引: 近傍パーティションまたはクラスターを使用して検索効率を高める、パーティションベースの索引です。

**検索特性**
- HNSW索引: パーティション刈り込みにより、該当するパーティションまたはサブパーティションのローカルHNSWグラフのみを検索します。これにより、類似性検索の効率的な実行計画が決定されます。
- IVF索引: 近傍パーティションまたはクラスターを使用して検索範囲を狭め、効率的な検索を実現します。

**更新時の考慮点**
- HNSW索引: 増分スナップショットが導入されており、最小限の頻度で更新を最適化するために使用されます。これにより、パフォーマンスとメモリ使用量のバランスが取れます。
- IVF索引: 自動再構成機能により、データベースシステムが再構築が必要と判断した場合に自動的に再構成されます。これにより、手動での閾値設定が不要になります。

資料には、HNSW索引とIVF索引の詳細な比較や、更新時の具体的な考慮点については記載されていません。

Sources:
  - vector_search/ai-vector-search-users-guide.pdf (https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf)

今回の回答内容の確認

SourcesとしてAI Vector Search User's Guideが取得されました。

ただし、回答にあるパーティション刈り込みは、
ローカル・パーティションHNSW索引に関する特性です。

● 検証SQL-2:文書に存在しない質問

SELECT AI NARRATE
このマニュアル群にOCI Data Catalogの最新料金表は記載されていますか。
記載されていない場合は、推測せず
「確認できません」と回答してください;

確認項目です。

  • 対象PDFに存在しない内容を推測しない
  • 「確認できません」と回答する
SQL実行結果
RESPONSE
____________________________________________________________________________________________________________________________________________________________
確認できません。

Sources:
  - vector_search/ai-vector-search-users-guide.pdf (https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf)
  - admin/database-administrators-guide.pdf (https://docs.oracle.com/en/database/oracle/oracle-database/26/admin/database-administrators-guide.pdf)
  - concepts/database-concepts.pdf (https://docs.oracle.com/cd/G47991_01/cncpt/database-concepts.pdf)

今回の結果は、Negative Testとして成功です。

● 検証SQL-3:Oracle公式URLの表示

SELECT AI NARRATE
Oracle AI Vector SearchにおけるHNSW索引とIVF索引の違いを、
索引構造と検索特性が分かるように日本語で説明してください。
資料に記載されていない内容は推測しないでください;

確認項目です。

  • PDFファイル名が表示される
  • Object Storage URIではなくOracle公式URLが表示される
  • customized_url_sourceが反映されている

No.1と質問内容は似ていますが、目的が異なります。

検証SQL-1
回答内容とGroundingを確認

検証SQL-3
SourcesのURL表示を確認

SQL実行結果
RESPONSE
____________________________________________________________________________________________________________________________________________________________
Oracle AI Vector SearchにおけるHNSW索引とIVF索引の主な違いは以下の通りです。

**索引構造**

* **HNSW索引**: 階層的なナビゲーショングラフ(Hierarchical Navigable Small World Graph)を使用し、ベクトルを多層構造で表現します。この構造により、高速な近似最近傍検索を実現します。
* **IVF索引**: 倒置ファイル(Inverted File)とフラットなベクトルリストを組み合わせた構造です。ベクトルをクラスタに分割し、各クラスタの代表ベクトルを使用して検索を効率化します。

**検索特性**

* **HNSW索引**: 高速な近似最近傍検索に優れています。階層的な構造により、検索範囲を効率的に絞り込み、高速な検索を実現します。
* **IVF索引**: 検索効率を高めるために、近隣パーティションまたはクラスタを使用します。クラスタ内のベクトルを検索することで、検索範囲を絞り込み、効率的な検索を実現します。

これらの違いは、索引の作成方法や検索アルゴリズムに反映されています。HNSW索引は、グラフの構築やメモリ割り当てなどの処理を必要としますが、IVF索引はクラスタの作成やハッシュテーブルの割り当てなどの処理を必要とします。

Sources:
  - vector_search/ai-vector-search-users-guide.pdf (https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf)

● Vector StoreのMetadataを直接確認

ここまでの検証SQL-1~3では、SELECT AI NARRATEを使用して、
回答内容とSourcesを確認しました。

ただし、SELECT AI NARRATEのSourcesに表示されるのは、
質問に対して取得された上位チャンクの文書だけです。

そのため、1回の問い合わせで4つのPDFすべての
custom_uriを確認できるとは限りません。

そこで、Vector Tableを直接参照し、
4つのPDFすべてにOracle公式URLが格納されていることを確認します。

・ 確認SQL:4つのPDFのCustom URIを確認

SELECT
    object_name,
    custom_uri,
    CASE
        WHEN custom_uri LIKE 'https://docs.oracle.com/%'
            THEN 'OK'
        ELSE 'NG'
    END AS url_status
FROM (
    SELECT DISTINCT
        JSON_VALUE(
            attributes,
            '$.object_name'
            RETURNING VARCHAR2(512)
        ) AS object_name,
        JSON_VALUE(
            attributes,
            '$.custom_uri'
            RETURNING VARCHAR2(2000)
        ) AS custom_uri
    FROM
        OCI_DB_MANUAL_IDX$VECTAB
)
ORDER BY
    object_name;
実行結果
OBJECT_NAME                                                           CUSTOM_URI                                                                                               URL_STATUS
_____________________________________________________________________ ________________________________________________________________________________________________________ _____________
admin/database-administrators-guide.pdf                               https://docs.oracle.com/en/database/oracle/oracle-database/26/admin/database-administrators-guide.pdf    OK
concepts/database-concepts.pdf                                        https://docs.oracle.com/cd/G47991_01/cncpt/database-concepts.pdf                                         OK
installation_linux/oracle-ai-database-installation-guide-linux.pdf    https://docs.oracle.com/cd/G47991_01/ladbi/oracle-ai-database-installation-guide-linux.pdf               OK
vector_search/ai-vector-search-users-guide.pdf                        https://docs.oracle.com/en/database/oracle/oracle-database/26/vecse/ai-vector-search-users-guide.pdf     OK

■ RAGチューニングの概要と精度調整の考え方

RAGチューニング.jpg

この図について

この図は、RAGチューニングの一般的な全体像を示した本記事作成の概念図です。

今回の第3回で実際に設定・確認した項目は、
chunk_sizechunk_overlapvector_dimension
vector_distance_metricmatch_limittemperature
max_tokensadditional_instructionsなどです。

Hybrid Search、Reranking、ef_searchnprobe
HNSW/IVF固有の検索パラメータは、今回の検証範囲には含めていません。

また、図中のscore_thresholdに相当するSelect AIの
Vector Index属性はsimilarity_thresholdです。
今回の検証ではsimilarity_thresholdを明示指定していません。

RAGは、Vector Indexを作成して回答が生成できれば完了というわけではありません。

同じ文書と質問を使用しても、文書の分割方法、検索するチャンク数、生成モデルへの指示などによって、取得されるコンテキストや回答内容が変わります。

そのため、RAGでは次のサイクルを繰り返しながら、検索精度と回答品質を調整します。

データを準備する
      ↓
チャンクへ分割する
      ↓
Embeddingを生成する
      ↓
関連チャンクを検索する
      ↓
回答を生成する
      ↓
回答とSourcesを評価する
      ↓
設定を変更して再評価する

今回の第3回では、RAGチューニングそのものを比較検証するのではなく、最初のベースラインとなる設定でSelect AI with RAGを構築しました。

今後、同じ評価用質問を使用し、パラメータを1つずつ変更して結果を比較できるようにします。

● RAGチューニングの対象

RAGのチューニング対象は、大きく次の段階に分けられます。

段階 主な調整項目 今回の設定・確認内容
データ 対象文書、製品バージョン、文書カテゴリ、不要文書の除外 Oracle AI Database 26aiの4つのPDFを対象
チャンク分割 chunk_sizechunk_overlap 1024128
Embedding Embedding Model、vector_dimension Cohere Embed 4、1536次元
Vector検索 vector_distance_metricmatch_limitsimilarity_threshold、検索対象の絞り込み Cosine Distance、上位5チャンク、similarity_thresholdは未指定
回答生成 Chat Model、temperaturemax_tokens、Prompt Cohere Command A、temperature = 0.1max_tokens = 2000
評価 Grounding、Source、Version、Completeness、Negative Test 検証SQLを使用して確認
運用 refresh_rate、文書更新、SourcesのURL 1,440分間隔、Oracle公式URLを表示

● 今回のベースライン

今回のVector Indexでは、次の設定を使用しています。

{
  "chunk_size": 1024,
  "chunk_overlap": 128,
  "vector_dimension": 1536,
  "vector_distance_metric": "cosine",
  "match_limit": 5,
  "refresh_rate": 1440
}

Select AI Profileでは、次の設定を使用しています。

{
  "model": "cohere.command-a-03-2025",
  "embedding_model": "cohere.embed-v4.0",
  "temperature": 0.1,
  "max_tokens": 2000
}

この設定を今後の比較元となるベースラインにします。

複数の設定を同時に変更すると、どの変更が回答へ影響したのか分からなくなります。

そのため、チューニングするときは、同じ文書と同じ質問を使用し、原則として1回の検証で1つのパラメータだけを変更します。

● データと検索対象を調整

回答結果に異なる製品バージョンが混ざる場合、
例えば、バージョンごとにPrefixとVector Indexを分ける構成です。

documents/oracle-database/26ai/
  └── OCI_DB_MANUAL_26AI_IDX

documents/oracle-database/19c/
  └── OCI_DB_MANUAL_19C_IDX

documents/oracle-database/12.2/
  └── OCI_DB_MANUAL_122_IDX

これにより、26aiについて質問したときに、19cや12.2の説明が混ざることを抑制できます。

● チャンク分割を調整

PDFから抽出した本文は、chunk_sizeで指定した文字数を基準に分割されます。

chunk_size = 1024

chunk_sizeを大きくすると、1つのチャンクに多くの文脈を含められます。

一方で、質問と直接関係しない文章も同じチャンクに入りやすくなります。

chunk_sizeを小さくすると、検索対象を細かくできますが、文章の途中で意味が切れる可能性があります。

chunk_overlapは、隣接するチャンクで重複させる文字数です。

chunk_overlap = 128

Overlapを設定することで、チャンクの境界付近にある文章が分断されることを抑えます。

状況 調整候補
回答に必要な前後関係が不足する chunk_sizeを増やす
関係のない文章が多く含まれる chunk_sizeを減らす
文章の境界で意味が切れる chunk_overlapを増やす
同じ内容の重複が多い chunk_overlapを減らす

chunk_sizechunk_overlapを変更すると、PDF本文の分割結果とEmbeddingが変わります。

そのため、変更時はVector Indexを再作成して比較します。

● 検索するチャンク数を調整

match_limitは、質問に対してVector Storeから取得する上位チャンク数です。

match_limit = 5

値を増やすと、回答生成モデルへ渡す情報を増やせます。

一方で、関連性の低いチャンクも含まれやすくなり、回答へノイズが混入する可能性があります。

状況 調整候補
必要な情報が取得されない match_limitを増やす
関係の薄い内容が混入する match_limitを減らす
複数の論点を回答できない 質問を分割したうえでmatch_limitを調整
特定の文書だけが検索される 文書Metadataや対象Prefixによる絞り込みを検討

match_limitは、各PDFから指定件数を取得する設定ではありません。

Vector Store全体から類似度の高いチャンクを取得するため、上位チャンクが1つのPDFへ偏る場合があります。

複数文書を確実に使用する検索については、第4回で文書インベントリ表とVector Storeを組み合わせて検証します。

● 回答生成を調整

回答生成では、Select AI Profileの次の設定が影響します。

model
temperature
max_tokens
role
additional_instructions

今回のtemperatureは次の値です。

temperature = 0.1

低い値を設定することで、回答表現のばらつきを抑えています。

また、additional_instructionsには、取得した文書だけを根拠として回答し、確認できない場合は推測しないよう指定しています。

Use only the retrieved documents as evidence.
If the answer cannot be confirmed from the retrieved documents,
explicitly say that it cannot be confirmed.

今回のNegative Testでは、対象文書に存在しないOCI Data Catalogの料金について、次のように回答しました。

確認できません。

今回のNegative Testでは、additional_instructionsで指定した方針どおり、
対象文書から確認できない質問に対して
「確認できません」と応答することを確認しました。

状況 調整候補
回答表現が毎回大きく変わる temperatureを下げる
回答が短すぎる max_tokensまたは質問内容を見直す
文書にない内容を回答する additional_instructionsを強化
出力形式が統一されない Promptで見出しや表形式を指定
日本語以外で回答される roleまたはadditional_instructionsで日本語を指定

● 検索精度以外の設定

RAGの設定には、検索精度そのものではなく、運用や回答の確認性に影響する項目もあります。

refresh_rateは、Object Storage上の変更を確認する間隔です。

refresh_rate = 1440

これは検索類似度を調整する値ではなく、Vector Storeへ新しい文書や更新内容を反映する運用上の設定です。

また、customized_url_sourceenable_custom_source_uriは、検索精度を変更する設定ではありません。

回答のSourcesへOracle公式URLを表示し、回答の根拠を確認しやすくするための設定です。

設定 主な目的
refresh_rate Object Storage上の変更をVector Storeへ反映
customized_url_source Sourcesへ表示するURLを設定
enable_custom_source_uri Custom URIをSourcesとして使用
additional_instructions 回答ルールとGroundingを制御

● 評価と改善を繰り返す

RAGのチューニングでは、感覚だけで設定を変更するのではなく、評価用の質問を固定して結果を比較します。

今回作成したSelect AIの検証SQLとVector Storeの確認SQLを、
ベースラインの評価セットとして使用できます。

Select AI検証SQL-1
  対象文書に存在する内容を質問する

Select AI検証SQL-2
  対象文書に存在しない内容を質問する

Select AI検証SQL-3
  Sourcesへ正しいOracle公式URLが表示されるか確認する

Vector Store確認SQL
  4つのPDFすべてのCustom URIを確認する

チューニングは次の流れで実施します。

1. ベースラインの回答を保存する
2. パラメータを1つ変更する
3. 同じ質問を実行する
4. 回答とSourcesを比較する
5. GroundingやCompletenessを評価する
6. 改善しなければ設定を戻す

評価結果を記録することで、どの設定が回答品質へ影響したかを確認しやすくなります。

● 今回の位置付け

今回の第3回では、Select AI with RAGを構築し、初期設定で回答とSourcesを確認しました。

第3回
  Select AI with RAGを構築
  ベースライン設定を作成
  回答品質の評価方法を確認

今後
  パラメータを変更
  同じ質問で結果を比較
  検索精度と回答品質を継続的に改善

RAGのチューニングは一度で完了するものではありません。

対象文書の追加や更新、質問内容の変化に合わせて、データ、チャンク分割、検索、回答生成、評価を継続的に見直します。

■ トラブルシューティング

症状・エラー 確認内容
ORA-00904: "DBMS_CLOUD"."LIST_OBJECTS": invalid identifier RAG_USERGRANT EXECUTE ON DBMS_CLOUDを実行し、再接続する。必要に応じてTABLE(...)を明示する
ORA-20404: Object not found Namespace、Bucket、URI、Dynamic Group、IAM Policyを確認する。Policy変更直後はResource Principal Tokenの2時間キャッシュを考慮する
ORA-20048: Invalid vector index attribute - enable_sources 今回の環境ではenable_sourcesを明示せず、デフォルト動作でSourcesを確認する
一部PDFだけ取り込まれない ファイル名やPrefixにマルチバイト文字がないか確認する
Modelが見つからない Profileのregionとモデルの提供リージョンを確認する
Vector Index作成後も回答できない Vector PipelineのStatusとHistoryを確認する
vector_table_nameのAttributeが0件 明示指定していない場合は<index-name>$VECTABのデフォルト名を確認する
Vector Tableの件数が0 Object Storage URI、Wildcard、Credential、PDF本文を確認する
Sourcesが表示されない 利用中のDBMS_CLOUD_AIバージョンとVector Index設定を確認する
公式URLがSourcesに表示されない Object Metadata、enable_custom_source_uri、Vector Tableのcustom_uriを確認する
関係の薄い回答になる match_limit、対象Prefix、質問文を調整する
文脈が途中で切れる chunk_sizechunk_overlapを変更して再作成する

● Pipeline Errorを確認

SQL
SELECT
    pipeline_id,
    pipeline_name,
    status,
    error_message
FROM
    user_cloud_pipeline_history
WHERE
    pipeline_name = 'OCI_DB_MANUAL_IDX$VECPIPELINE'
ORDER BY
    pipeline_id DESC;
SQL実行結果
   PIPELINE_ID PIPELINE_NAME                    STATUS       ERROR_MESSAGE
______________ ________________________________ ____________ ________________
             7 OCI_DB_MANUAL_IDX$VECPIPELINE    SUCCEEDED

● Data Accessが無効な場合

Data Accessが無効であることを示すエラーが発生した場合は、ADMINユーザーで有効化します。

SQL
BEGIN
    DBMS_CLOUD_AI.ENABLE_DATA_ACCESS();
END;
/

● Modelとリージョンを再確認

今回の組合せです。

region          : ap-osaka-1
chat model      : cohere.command-a-03-2025
embedding model : cohere.embed-v4.0

OCI Generative AIのモデル提供リージョンは変更されることがあるため、Profile作成時点の提供状況を確認します。

■ セキュリティ上の考慮点

● Resource Principalを使用

今回の構成では、DatabaseへOCI UserのAPI秘密鍵を保存せず、Autonomous AI DatabaseのResource Principalを使用しています。

Resource Principalでは短期間有効なTokenが使用され、自動的にローテーションされます。

● Object Storageは読取り権限のみ

Autonomous AI Databaseには、対象BucketのPDFを読み取るための権限のみを付与します。

今回のRAG処理では、Autonomous AI DatabaseからObject StorageへPDFを書き込む必要はありません。

● Bucket単位で制限

次の条件を使用し、アクセス対象のBucketを限定します。

where target.bucket.name = 'oracle-database-doc-catalog'

● バージョンや公開範囲ごとに分離

公開文書と社内文書を同じVector Indexへ登録しないようにします。

documents/public/
documents/internal/

文書の機密区分が異なる場合は、Bucket、Prefix、Database User、Select AI Profile、Vector Indexを分離します。

■ リソースを削除

第4回で今回のVector Storeを使用する場合は、削除せずに残します。

検証後にSelect AI ProfileとVector Indexを削除する場合は、次のSQLを実行します。

● SessionのProfile設定を解除

SQL
BEGIN
    DBMS_CLOUD_AI.CLEAR_PROFILE;
END;
/

● Vector Indexを削除

SQL
BEGIN
    DBMS_CLOUD_AI.DROP_VECTOR_INDEX(
        index_name   => 'OCI_DB_MANUAL_IDX',
        include_data => TRUE,
        force        => TRUE
    );
END;
/

include_data => TRUEを指定すると、Vector Tableなどの関連データも削除します。

● Select AI Profileを削除

SQL
BEGIN
    DBMS_CLOUD_AI.DROP_PROFILE(
        profile_name => 'OCI_DB_MANUAL_RAG',
        force        => TRUE
    );
END;
/

Dynamic GroupやResource Principalをほかの処理でも使用している場合は、影響を確認してから削除します。

■ まとめ

■ まとめ

今回は、第2回でOCI Data Catalogへカタログ化した4つのOracle AI Database 26aiマニュアルPDFを使用し、Select AI with RAGを構築しました。

Object Storage上のPDFから本文を抽出して9,590件のチャンクへ分割し、Cohere Embed 4で1536次元のEmbeddingを生成して、Autonomous AI Database内のVector Storeへ格納できました。

さらに、Cohere Command AとSELECT AI NARRATEを使用してマニュアル本文へ自然言語で問い合わせ、次の点を確認しました。

  • 取得したPDFを根拠として回答を生成できる
  • 対象文書に存在しない質問へ「確認できません」と回答できる
  • Sourcesへ参照したPDFを表示できる
  • Object StorageのCustom Metadataを使用して、Oracle公式URLをSourcesへ表示できる
  • Object Storage上のPDF追加・更新をVector Pipelineから継続的に反映できる

今回整理してみると、OCI Data CatalogとSelect AI with RAGは、同じ検索サービスではなく、それぞれ異なる役割を持っていました。

OCI Data Catalog
  文書名、製品バージョン、カテゴリ、公式URLを管理する

OCI Object Storage
  PDFの実体とRAG用Metadataを保存する

Select AI with RAG
  PDF本文から関連チャンクを検索して回答を生成する

Data Catalogだけでは文書本文へ質問できず、RAGだけでは、どの製品やバージョンの文書を検索対象にすべきかという管理が分かりにくくなります。

両者を組み合わせることで、単にPDFをObject Storageへ保存するだけではなく、信頼できる文書を選び、その内容をAIから利用する流れを作ることができました。

一方で、今回の検証では、正しいPDFとOracle公式URLがSourcesへ表示されていても、回答本文には条件の限定や原文との照合が必要な場合がありました。

RAGでは、Sourcesが正しいことと、回答内容が正しいことは別々に評価する必要があります。

文書を管理する
      ↓
検索対象を決める
      ↓
回答を生成する
      ↓
Sourcesと原文を照合する
      ↓
評価結果からRAGを改善する

AIへPDFを入れるだけで終わるのではなく、対象文書、バージョン、Metadata、Sources、回答品質まで継続的に管理する。ここが、Data CatalogとRAGを組み合わせるうえで重要なポイントだと考えます。

次回は、第2回で作成した文書インベントリのカタログ・テーブルと、今回作成したVector StoreをJOINします。

構造化MetadataとVector検索結果をOracle Database内で組み合わせ、文書カテゴリや製品バージョンを指定した、さらに検索範囲の明確なSelect AI with RAGを構築してみてみます。

■ 次回

第4回では、第2回で作成した文書インベントリのカタログ・テーブルと、第3回で作成したVector Storeを組み合わせます。

Vector TableのATTRIBUTES.object_nameには、次のような相対Object名が格納されています。

vector_search/ai-vector-search-users-guide.pdf

一方、第2回のカタログ・テーブルには、次のような完全なObject名またはObject URIが格納されています。

documents/oracle-database/26ai/vector_search/ai-vector-search-users-guide.pdf

第4回では、この差を正規化してJOINキーを作り、文書名、製品バージョン、文書カテゴリ、公式URLなどの構造化Metadataと、PDF本文のVector検索結果を組み合わせます。

次回のタイトル案です。

OCI Data Catalog 第4回:カタログ・テーブルとVector StoreをJOINしてSelect AI with RAGを構築してみてみた

■ おまけ

おまけ.png

■ 参考資料

6
4
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
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?