![[Oracle Cloud] Autonomous Database ) SELECT AI(自然言語によるクエリ実行)を活用するコツ 2025年5月分 (2024/05/12) #oci](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-afbab5eb44e0b055cce1258705637a91.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnFpaXRhLWltYWdlLXN0b3JlLnMzLmFtYXpvbmF3cy5jb20lMkYwJTJGMTA4NjM1JTJGcHJvZmlsZS1pbWFnZXMlMkYxNDczNzEwNjE2P2l4bGliPXJiLTQuMC4wJmFyPTElM0ExJmZpdD1jcm9wJm1hc2s9ZWxsaXBzZSZmbT1wbmczMiZzPTcwNjBmYTI3NDA2MTgxZTE1MTc3NWVkMTQ4NjcwMjhm%26blend-x%3D120%26blend-y%3D467%26blend-w%3D82%26blend-h%3D82%26blend-mode%3Dnormal%26s%3D4d62ca18cf16b3a430cff7a423ca6f8d?ixlib=rb-4.0.0&w=1200&fm=jpg&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk2MCZoPTMyNCZ0eHQ9JTVCT3JhY2xlJTIwQ2xvdWQlNUQlMjBBdXRvbm9tb3VzJTIwRGF0YWJhc2UlMjAlMjklMjBTRUxFQ1QlMjBBSSVFRiVCQyU4OCVFOCU4NyVBQSVFNyU4NCVCNiVFOCVBOCU4MCVFOCVBQSU5RSVFMyU4MSVBQiVFMyU4MiU4OCVFMyU4MiU4QiVFMyU4MiVBRiVFMyU4MiVBOCVFMyU4MyVBQSVFNSVBRSU5RiVFOCVBMSU4QyVFRiVCQyU4OSVFMyU4MiU5MiVFNiVCNCVCQiVFNyU5NCVBOCVFMyU4MSU5OSVFMyU4MiU4QiVFMyU4MiVCMyVFMyU4MyU4NCUyMCVFMiU4MCVBNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1wYWQ9MCZzPTIxNmNmYWJiZWFkZjFkNjhmYWYzNmFjMTM4MWU2Zjll&mark-x=120&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTgzOCZoPTU4JnR4dD0lNDBrZW53YXRhbiZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1wYWQ9MCZzPTdlNWRmOWNjMGE0NjMwZDkzZGU0YjUyMGUyYzUzNDkw&blend-x=242&blend-y=480&blend-w=838&blend-h=46&blend-fit=crop&blend-crop=left%2Cbottom&blend-mode=normal&s=caacebc10b5c1890b878876c4e04505e)
Oracle CloudのAutonomous Databaseで提供される自然言語によるクエリ実行(SELECT AI)を活用するには、AIプロファイルを作成する必要があります。
AIプロファイルを作成する際のオプションが追加されたので、試してみました。
- 特定スキーマの表全体を対象にする
- 関連する表を自動的に検出
- 列に大/小文字の区別を設定
- 表アクセスを制限
Autonomous Database:SELECT AI(自然言語によるクエリ実行)がOCI生成AIサービスに対応したので試してみたなどを参考にSELECT AIを使うことができる準備をします。
SHスキーマの表全体を対象にするプロファイルの作成
BEGIN
DBMS_CLOUD_AI.create_profile(
profile_name=>'OCI_SHALL',
attributes=>'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"object_list": [{"owner": "SH"}],
"oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaan...",
"model" : "meta.llama-3.3-70b-instruct"
}'
);
END;
/
SELECT AIでの確認
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_SHALL');
PL/SQLプロシージャが正常に完了しました。
SQL> select ai please list the user tables;
TABLE_NAME
--------------------------------------------------------------------------------
TIMES
PRODUCTS
COUNTRIES
COSTS
PROMOTIONS
SALES
CHANNELS
CUSTOMERS
SUPPLEMENTARY_DEMOGRAPHICS
9行が選択されました。
object_list_modeを”auto”に設定することでSelect AIが関連する表を自動的に検出し、Oracle Database 23aiの問合せに関連する特定の表に対してのみメタデータを送信します。
これにより、_OBJECT_LIST_VECINDEXという名前のベクトル索引が自動的に作成されます。
ベクトル索引は、デフォルトの属性および値(refresh_rate、similarity_threshold、match_limitなど)で初期化されます。
このベクトル索引の一部の属性は、DBMS_CLOUD_AI.UPDATE_VECTOR_INDEXを使用して変更できます。
自スキーマに関連する表を自動的に検出するプロファイルの作成
BEGIN
DBMS_CLOUD_AI.create_profile(
profile_name=>'OCI_AUTO',
attributes=>'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"oci_compartment_id": "ocid1.compartment...aaaaaaaan...",
"object_list_mode": "automated",
"model" : "meta.llama-3.3-70b-instruct"
}'
);
END;
/
ベクトル索引の確認
SQL> SELECT INDEX_NAME, TABLE_NAME, INDEX_TYPE FROM USER_INDEXES WHERE INDEX_TYPE = 'VECTOR';
INDEX_NAME
--------------------------------------------------------------------------------
TABLE_NAME
--------------------------------------------------------------------------------
INDEX_TYPE
---------------------------
OCI_AUTO_FEEDBACK_VECINDEX
OCI_AUTO_FEEDBACK_VECINDEX$VECTAB
VECTOR
OCI_AUTO_OBJECT_LIST_VECINDEX
OCI_AUTO_OBJECT_LIST_VECINDEX$VECTAB
VECTOR
SQL> SELECT content from OCI_AUTO_OBJECT_LIST_VECINDEX$VECTAB;
CONTENT
--------------------------------------------------------------------------------
"SELECTAIS"."VECTOR$OCI_AUTO_FEEDBACK_VECINDEX$113171_113178_0$IVF_FLAT_CENTROID
"SELECTAIS"."TIMES" ("TIME_ID" , "DAY_NAME" , "DAY_NUMBER_IN_WEEK" , "DAY_NUMBER
"SELECTAIS"."TIMES" ("FISCAL_QUARTER_DESC" , "FISCAL_QUARTER_ID" , "DAYS_IN_CAL_
"SELECTAIS"."PRODUCTS" ("PROD_ID" , "PROD_NAME" , "PROD_DESC" , "PROD_SUBCATEGOR
"SELECTAIS"."CHANNELS" ("CHANNEL_ID" , "CHANNEL_DESC" , "CHANNEL_CLASS" , "CHANN
"SELECTAIS"."COUNTRIES" ("COUNTRY_ID" , "COUNTRY_ISO_CODE" , "COUNTRY_NAME" , "C
"SELECTAIS"."PROMOTIONS" ("PROMO_ID" , "PROMO_NAME" , "PROMO_SUBCATEGORY" , "PRO
"SELECTAIS"."CUSTOMERS" ("CUST_ID" , "CUST_FIRST_NAME" , "CUST_LAST_NAME" , "CUS
"SELECTAIS"."COSTS" ("PROD_ID" , "TIME_ID" , "PROMO_ID" , "CHANNEL_ID" , "UNIT_C
"SELECTAIS"."SALES" ("PROD_ID" , "CUST_ID" , "TIME_ID" , "CHANNEL_ID" , "PROMO_I
"SELECTAIS"."VECTOR$OCI_AUTO_OBJECT_LIST_VECINDEX$113151_113158_0$IVF_FLAT_CENTR
"SELECTAIS"."VECTOR$OCI_AUTO_OBJECT_LIST_VECINDEX$113151_113158_0$IVF_FLAT_CENTR
"SELECTAIS"."OCI_AUTO_FEEDBACK_VECINDEX$VECTAB" ("CONTENT" , "ATTRIBUTES" , "EMB
"SELECTAIS"."VECTOR$OCI_AUTO_FEEDBACK_VECINDEX$113171_113178_0$IVF_FLAT_CENTROID
SELECT AIでの確認
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_AUTO');
PL/SQLプロシージャが正常に完了しました。
SQL> SELECT AI how many customers;
customer_count
--------------
55500
SQL> select ai please list the user tables;
RESPONSE
--------------------------------------------------------------------------------
Sorry, unfortunately a valid SELECT statement could not be generated for your na
tural language prompt. Here is some more information to help you further:
以下 略?
Select AIを使用すると、LLMがデータベースおよびLLMから大/小文字を区別しないレスポンスを生成するように指定できます。
大文字と小文字が区別されない問合せを取得するには、case_sensitive_valuesをfalseに設定します。
プロファイルの作成
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'OCI_CASE_SENSITIVE_FALSE',
attributes =>'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"object_list": [{"owner": "SH"}],
"oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaa...",
"case_sensitive_values" : "false" }
');
END;
/
SELECT AIでの確認
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_CASE_SENSITIVE_FALSE');
PL/SQLプロシージャが正常に完了しました。
SQL> select ai showsql how many customers in San Francisco are married;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(cu."CUST_ID") AS "NUMBER_OF_CUSTOMERS" FROM "SH"."CUSTOMERS" cu WHE
RE UPPER(cu."CUST_CITY") = UPPER('San Francisco') AND cu."CUST_MARITAL_STATUS" =
'married'
WHERE句に「UPPER」関数が含まれています。
参考:case_sensitive_valuesを true に設定した例
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'OCI_CASE_SENSITIVE_AUTO',
attributes =>'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"object_list": [{"owner": "SH"}],
"oci_compartment_id": "ocid1.compartment.oc1..aaaaaaaa...",
"case_sensitive_values" : "ture" }
');
END;
/
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_CASE_SENSITIVE_TURE');
PL/SQLプロシージャが正常に完了しました。
SQL> select ai showsql how many customers in San Francisco are married;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(DISTINCT c."CUST_ID") AS "NUMBER_OF_MARRIED_CUSTOMERS"
FROM "SH"."CUSTOMERS" c
WHERE c."CUST_CITY" = 'San Francisco' AND c."CUST_MARITAL_STATUS" = 'Married'
enforece_object_listをtrueに設定するとAIプロファイルのobject_listで指定された表のみを使用するようにLLMに指示します。
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'OCI_ENFORCED_TRUE',
attributes =>'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"object_list": [
{"owner": "SELECTAIS", "name": "TIMES"},
{"owner": "SELECTAIS", "name": "CUSTOMERS"},
{"owner": "SELECTAIS", "name": "PRODUCTS"},
{"owner": "SELECTAIS", "name": "SALES"}
],
"enforce_object_list" : "true" }
');
END;
/
SELECT AIでの確認
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_ENFORCED_TRUE');
PL/SQLプロシージャが正常に完了しました。
SQL> select ai showsql how many customers in San Francisco are married;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(c."CUST_ID") AS "NUMBER_OF_CUSTOMERS" FROM "SELECTAIS"."CUSTOMERS"
c WHERE UPPER(c."CUST_CITY") = UPPER('San Francisco') AND c."CUST_MARITAL_STATUS
" = 'married'
SQL> select ai please list the user tables;
select ai please list the user tables
*
行1でエラーが発生しました。:
ORA-00900: SQL文が無効です。 ヘルプ:
https://docs.oracle.com/error-help/db/ora-00900/
参考:enforce_object_listを false に設定した例
BEGIN
DBMS_CLOUD_AI.CREATE_PROFILE(
profile_name =>'OCI_ENFORCED_FALSE',
attributes =>'{
"provider": "oci",
"credential_name": "OCI_GENAI_CRED",
"object_list": [
{"owner": "SELECTAIS", "name": "TIMES"},
{"owner": "SELECTAIS", "name": "CUSTOMERS"},
{"owner": "SELECTAIS", "name": "PRODUCTS"},
{"owner": "SELECTAIS", "name": "SALES"}
],
"enforce_object_list" : "false" }
');
END;
/
PL/SQLプロシージャが正常に完了しました。
SQL> EXEC DBMS_CLOUD_AI.SET_PROFILE('OCI_ENFORCED_FALSE');
PL/SQLプロシージャが正常に完了しました。
SQL> select ai showsql how many customers in San Francisco are married;
RESPONSE
--------------------------------------------------------------------------------
SELECT COUNT(DISTINCT c."CUST_ID") AS "NUMBER_OF_CUSTOMERS" FROM "SELECTAIS"."CU
STOMERS" c WHERE UPPER(c."CUST_CITY") = UPPER('San Francisco') AND c."CUST_MARIT
AL_STATUS" = 'married'
SQL> select ai please list the user tables;
TABLE_NAME
--------------------------------------------------------------------------------
CUSTOMERS
PRODUCTS
SALES
TIMES
DBMS_CLOUD_AI.CREATE_PROFILEプロシージャのオプションを活用することで、AIプロファイルの制御を細かくできるようになりました。
参考情報
Views: 2