產生開發與測試的合成資料

使用隨機產生器、演算法、統計模型和大型語言模型 (LLM) 產生合成資料,以模擬實際資料以有效開發和測試解決方案。

注意:從 19.29 版開始,Oracle Database 19c 以及從 23.26 版開始的 Oracle AI Database 26ai 中提供合成資料產生的支援。

開發和測試解決方案時,合成資料可以是強大的工具,尤其是當實際資料不存在或不允許使用時。合成或人工產生的資料可以有許多實際資料的特性。合成資料通常使用隨機產生器、演算法或統計模型建立,以模擬真實資料的特性和分佈。不過,這可能會很複雜,因為它們會產生或依賴具有不同複雜性的工具。隨著大型語言模型 (LLM) 的可用性,可能會產生更相關的綱要特定資料,以考量以自然語言表示的特性。

合成資料產生的優點

合成資料產生可植入資料庫中繼資料複製,支援開發、測試和機器學習專案,而無需使用原始表格中的敏感資料。

合成資料產生提供下列優點:

產生合成資料

使用 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 函數產生綜合資料,並使用「選取 AI」動作查詢資料。

若要進一步瞭解,請參閱 GENERATE_DATAETIC_DATA 函數範例:產生合成資料

監控及疑難排解合成資料產生

當跨多個表格產生大量資料時,Select AI 會將合成資料產生工作分割成較小的區塊,並平行執行工作。SYNTHETIC_DATA$<operation_id>_STATUS 表格中會追蹤每個區塊的狀態。

合成資料產生作業會記錄在 DBA_LOAD_OPERATIONSUSER_LOAD_OPERATIONS 表格中。使用這些表格來監督 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 作業。請參閱追蹤 DBMS_CLOUD 負載作業以瞭解詳細資訊。

在指定的階段作業中執行合成資料產生之後,您可以使用下列方式從 USER_LOAD_OPERATION 取得最新的 \\<operation_id\\>

SELECT max(id) FROM user_load_operations;

若要檢視在不同階段作業中執行的合成資料作業,請使用 DBA_LOAD_OPERATIONS 視觀表。

檢視合成資料產生的狀態

合成資料產生作業的狀態表格會顯示每個表格的進度及其對應的區塊。USER_LOAD_OPERATIONSDBA_LOAD_OPERATIONS 中的 STATUS_TABLE 資料欄會顯示狀態表格名稱。表格名稱是 SYNTHETIC_DATA$<operation_id>_STATUS,具有下列資料欄:

名稱 資料類型 描述
ID NUMBER 記錄的唯一識別碼。
NAME VARCHAR2 表格的合格名稱,例如 "ADB_USER"."EMPLOYEES"
BYTES NUMBER 此資料產生作業的所需記錄筆數
ROWS_LOADED NUMBER 實際產生的記錄數。
CHECKSUM VARCHAR2 此資料產生作業期間主索引鍵的開始值。
LAST_MODIFIED TIMESTAMP WITH TIME ZONE 指出記錄上次修改時間的時戳。
STATUS VARCHAR2 資料產生任務的狀態。有效值為:
  • COMPLETED
  • FAILED
  • PENDING
  • SKIPPED
ERROR_CODE NUMBER 錯誤代碼,如果資料產生任務失敗。
ERROR_MESSAGE VARCHAR2 作業失敗時所提供的錯誤訊息。
END_TIME TIMESTAMP WITH TIME ZONE 標記資料產生作業結束的時間戳記。

範例:檢查為每個表格產生的記錄數

若要檢查為每個表格產生的記錄數,請發出下列各項:

SELECT name, SUM(rows_loaded) FROM synthetic_data$<operation_id>_status group by name;

查詢 ROWS_LOADED 以確認每個區塊載入的資料列數目,以及每個表格的資料列為 SUM(ROWS_LOADED)

BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_list => '[{"owner": "ADB_USER", "name": "DIRECTOR","record_count":150},
                         {"owner": "ADB_USER", "name": "MOVIE_ACTOR","record_count":300},
                         {"owner": "ADB_USER", "name": "CLASSES", "user_prompt":"all in fall semester","record_count":5},
                         {"owner": "ADB_USER", "name": "ACTOR","record_count":220},
                         {"owner": "ADB_USER", "name": "MOVIE","record_count":50}]'
    );
END;
/


-- Check loaded rows for each chunk
SQL> SELECT name, rows_loaded FROM synthetic_data$141_status order by name;
NAME                           ROWS_LOADED
------------------------------------------
"ADB_USER"."ACTOR"                        188
"ADB_USER"."ACTOR"                         32
"ADB_USER"."CLASSES"                        5
"ADB_USER"."DIRECTOR"                     150
"ADB_USER"."MOVIE"                         50
"ADB_USER"."MOVIE_ACTOR"                   38
"ADB_USER"."MOVIE_ACTOR"                  114
"ADB_USER"."MOVIE_ACTOR"                  148

-- Check loaded rows for each table
SQL> SELECT name, SUM(rows_loaded) FROM synthetic_data$141_status group by name;

NAME                      SUM(ROWS_LOADED)
------------------------------------------
"ADB_USER"."DIRECTOR"                     150
"ADB_USER"."MOVIE_ACTOR"                  300
"ADB_USER"."CLASSES"                        5
"ADB_USER"."ACTOR"                        220
"ADB_USER"."MOVIE"                         50

範例:產生合成資料

此範例探討如何產生合成資料,以模擬真實資料的特性和分佈。

注意:從版本 19.29 開始,Oracle Database 19c 以及從版本 23.26 開始在 Oracle Database 26ai 中提供合成資料產生的支援。

下列範例顯示如何在綱要中建立幾個表格、使用 OCI Generative AI 作為 AI 提供者來建立 AI 設定檔、使用 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 函數將資料合成這些表格,以及使用 Select AI 查詢或產生自然語言提示回應。

--Create tables or use cloned tables

CREATE TABLE ADB_USER.Director (
    director_id     INT PRIMARY KEY,
    name            VARCHAR(100)
);
CREATE TABLE ADB_USER.Movie (
    movie_id        INT PRIMARY KEY,
    title           VARCHAR(100),
    release_date    DATE,
    genre           VARCHAR(50),
    director_id     INT,
    FOREIGN KEY (director_id) REFERENCES ADB_USER.Director(director_id)
);
CREATE TABLE ADB_USER.Actor (
    actor_id        INT PRIMARY KEY,
    name            VARCHAR(100)
);
CREATE TABLE ADB_USER.Movie_Actor (
    movie_id        INT,
    actor_id        INT,
    PRIMARY KEY (movie_id, actor_id),
    FOREIGN KEY (movie_id) REFERENCES ADB_USER.Movie(movie_id),
    FOREIGN KEY (actor_id) REFERENCES ADB_USER.Actor(actor_id)
);

-- Create the GenAI credential
BEGIN
  DBMS_CLOUD.create_credential(
    credential_name => 'GENAI_CRED',
    user_ocid       => 'ocid1.user.oc1....',
    tenancy_ocid    => 'ocid1.tenancy.oc1....',
    private_key     => 'vZ6cO...',
    fingerprint     => '86:7d:...'
  );
END;
/

-- Create a profile
BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
      profile_name =>'GENAI',
      attributes  =>'{"provider": "oci",
        "credential_name": "GENAI_CRED",
        "object_list": [{"owner": "ADB_USER",
		"oci_compartment_id": "ocid1.compartment.oc1...."}]
       }');
END;
/


EXEC DBMS_CLOUD_AI.set_profile('GENAI');

-- Run the API for single table
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_name  => 'Director',
        owner_name   => 'ADB_USER',
        record_count => 5
    );
END;
/
PL/SQL procedure successfully completed.


-- Query the table to see results
SQL> SELECT * FROM ADB_USER.Director;

DIRECTOR_ID NAME
----------- ----------------------------------------------------------------------------------------------------
          1 John Smith
          2 Emily Chen
          3 Michael Brown
          4 Sarah Taylor
          5 David Lee


-- Or ask select ai to show the results
SQL> select ai how many directors are there;

NUMBER_OF_DIRECTORS
-------------------
                  5

範例:產生多個表格的合成資料

建立並設定 AI 提供者設定檔之後,請使用 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 產生多個表格的資料。您可以查詢或使用 Select AI 來回應自然語言提示。

BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_list => '[{"owner": "ADB_USER", "name": "Director","record_count":5},
                         {"owner": "ADB_USER", "name": "Movie_Actor","record_count":5},
                         {"owner": "ADB_USER", "name": "Actor","record_count":10},
                         {"owner": "ADB_USER", "name": "Movie","record_count":5,"user_prompt":"all movies released in 2009"}]'
    );
END;
/
PL/SQL procedure successfully completed.


-- Query the table to see results
SQL> select * from ADB_USER.Movie;

 MOVIE_ID TITLE                                                     RELEASE_D                            GENRE                                 DIRECTOR_ID
---------- -------------------------------------------------------- --------- --------------------------------------------------------------- -----------
         1 The Dark Knight                                           15-JUL-09                              Action                              8
         2 Inglourious Basterds                                      21-AUG-09                              War                                 3
         3 Up in the Air                                             04-SEP-09                              Drama                               6
         4 The Hangover                                              05-JUN-09                              Comedy                              1
         5 District 9                                                14-AUG-09                              Science Fiction                     10



-- Or ask select ai to show the results
SQL> select ai how many actors are there;

Number of Actors
----------------
              10

範例:使用範例資料列產生合成資料

若要引導 AI 服務產生合成資料,您可以從表格中隨機選取現有記錄。例如,透過將 {"sample_rows": 5} 新增至 params 引數,您可以將 5 個範例資料列從表格傳送給 AI 提供者。此範例會根據 Transactions 表格中的範例資料列產生 10 個額外資料列。

BEGIN
  DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
    profile_name => 'GENAI',
    object_name  => 'Transactions',
    owner_name   => 'ADB_USER',
    record_count => 10,
    params       => '{"sample_rows":5}'
  );
END;
/

範例:使用使用者提示自訂合成資料產生

user_prompt 引數可讓您指定產生資料的其他規則或需求。這可以套用至單一表格,或作為多個表格之 object_list 引數的一部分。例如,在下列呼叫 DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA 中,提示會指示 AI 在 2009 年發行的影片上產生綜合資料。

-- Definition for the Movie table CREATE TABLE Movie

CREATE TABLE Movie (
    movie_id        INT PRIMARY KEY,
    title           VARCHAR(100),
    release_date    DATE,
    genre           VARCHAR(50),
    director_id     INT,
    FOREIGN KEY (director_id) REFERENCES Director(director_id)
);



BEGIN
  DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
    profile_name      => 'GENAI',
    object_name       => 'Movie',
    owner_name        => 'ADB_USER',
    record_count      => 10,
    user_prompt       => 'all movies are released in 2009',
    params            => '{"sample_rows":5}'
  );
END;
/

BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name => 'GENAI',
        object_list => '[{"owner": "ADB_USER", "name": "Director","record_count":5},
                         {"owner": "ADB_USER", "name": "Movie_Actor","record_count":5},
                         {"owner": "ADB_USER", "name": "Actor","record_count":10},
                         {"owner": "ADB_USER", "name": "Movie","record_count":5,"user_prompt":"all movies are released in 2009"}]'
    );
END;
/

範例:使用表格統計資料改善合成資料品質

如果表格有資料欄統計資料,或是從包含描述資料的資料庫複製,Select AI 可以使用這些統計資料來產生與原始資料相似或與原始資料一致的資料。

對於 NUMBER 資料欄,統計資料的高值和低值會引導值範圍。例如,如果原始 EMPLOYEES 表格中的 SALARY 資料欄範圍從 1000 到 10000,則此資料欄的綜合資料也會落在此範圍內。

對於具有不同值的資料欄 (例如值為 CAWATXSTATE 資料欄),合成資料將會使用這些特定值。您可以使用 {"table_statistics": true/false} 參數來管理此功能。預設會啟用表格統計資料。

BEGIN
  DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
    profile_name      => 'GENAI',
    object_name       => 'Movie',
    owner_name        => 'ADB_USER',
    record_count      => 10,
    user_prompt => 'all movies released in 2009',
    params            => '{"sample_rows":5,"table_statistics":true}'
  );
END;
/

範例:使用資料欄註解來引導資料產生

如果有資料欄註解,Select AI 會自動包含它們,以便在資料產生期間為 LLM 提供其他資訊。例如,「交易」表格中 Status 資料欄的註解可能會列出允許的值,例如 successfulfailedpendingcanceledneed manual check 。您也可以新增註解以進一步說明資料欄,讓 AI 服務更精確的指示或提示產生正確的資料。預設會停用註解。請參閱選擇性參數以取得詳細資訊。

-- Use comment on column
COMMENT ON COLUMN Transaction.status IS 'the value for state should either be ''successful'', ''failed'', ''pending'' or ''canceled''';
/

BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name  => 'GENAI',
        object_name   => 'employees',
        owner_name    => 'ADB_USER',
        record_count  => 10
        params        => '{"comments":true}'

    );
END;
/

範例:在合成資料產生中設定唯一值

使用 LLM 產生大量合成資料時,可能會出現重複的值。若要避免此情況,請在相關資料欄上設定唯一的限制條件。這可確保 Select AI 會忽略 LLM 回應中含有重複值的資料列。此外,若要限制特定資料欄的值,您可以使用 user_prompt 或新增註解來指定允許的值,例如將 STATE 資料欄限制為 CAWA 以及 TX

-- Use 'user_prompt'
BEGIN
    DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
        profile_name  => 'GENAI',
        object_name   => 'employees',
        owner_name    => 'ADB_USER',
        user_prompt   => 'the value for state should either be CA, WA, or TX',
        record_count  => 10
    );
END;
/


-- Use comment on column
COMMENT ON COLUMN EMPLOYEES.state IS 'the value for state should either be CA, WA, or TX'
/

範例:透過平行處理增強合成資料產生

為了減少執行時期,Select AI 可將合成資料產生工作分割成沒有主索引鍵或具有數字主索引鍵之表格的較小區塊。這些任務以平行方式執行,與 AI 提供者互動,以更有效率地產生資料。您資料庫中的平行程度 (DOP) 會受到專用 Exadata 基礎架構上自治式 AI 資料庫服務層級和 ECPU 或 OCPU 設定值的影響,決定每個區塊處理作業的記錄數目。平行執行工作通常會改善效能,尤其是在跨多個表格產生大量資料時。若要管理合成資料產生的平行處理,請將 priority 設為選擇性參數。請參閱可選參數

範例:啟用或停用資料存取

本範例說明管理員如何控制資料存取,以及防止 Select AI 將實際結構表傳送至 LLM。

停用資料存取

若要限制對綱要表格的存取,請以管理員的身分登入,然後執行下列程序。

EXEC DBMS_CLOUD_AI.DISABLE_DATA_ACCESS;

PL/SQL procedure successfully completed.

停用資料存取限制 選取 AI 的 narrate 動作和合成資料產生。narrate 動作和合成資料產生會產生錯誤。

以資料庫使用者身分登入,建立並設定您的 AI 設定檔。請參閱使用 DBMS_CLOUD_AI 設定 AI 設定檔來設定您的 AI 設定檔。

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
          profile_name =>'DATA_ACCESS',
          attributes   =>'{"provider": "openai",
            "credential_name": "OPENAI_CRED",
            "object_list": [{"owner":"SH"}]
          }');
END;
/

EXEC DBMS_CLOUD_AI.SET_PROFILE('DATA_ACCESS');


select ai how many customers;

NUM_CUSTOMERS
55500

select ai narrate what are the top 3 customers in San Francisco;

ORA-20000: Data access is disabled for SELECT AI.
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 2228
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 13157
ORA-06512: at line 1 https://docs.oracle.com/error-help/db/ora-20000/
The stored procedure 'raise_application_error' was called which causes this error to be generated
Error at Line: 1 Column: 6

下列範例顯示嘗試產生合成資料時所觸發的錯誤。

BEGIN
DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
profile_name => 'DATA_ACCESS_SDG',
object_name => 'CUSTOMERS_NEW',
owner_name => 'ADB_USER,
record_count => 5
);
END;
/

ERROR at line 1:

ORA-20000: Data access is disabled for SELECT AI.
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD", line 2228
ORA-06512: at "C##CLOUD$SERVICE.DBMS_CLOUD_AI", line 13401

ORA-06512: at line 2

啟用資料存取

下列範例顯示啟用資料存取。以管理員身分登入並執行下列程序:

EXEC DBMS_CLOUD_AI.ENABLE_DATA_ACCESS;

PL/SQL procedure successfully completed.

以資料庫使用者身分登入,建立並設定您的 AI 設定檔。請參閱使用 DBMS_CLOUD_AI 設定 AI 設定檔來設定您的 AI 設定檔。

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
          profile_name =>'DATA_ACCESS_NEW',
          attributes   =>'{"provider": "openai",
            "credential_name": "OPENAI_CRED",
            "object_list": [{"owner":"SH"}]
          }');
   END;
   /

PL/SQL procedure successfully completed.

EXEC DBMS_CLOUD_AI.SET_PROFILE('DATA_ACCESS_NEW');

PL/SQL procedure successfully completed.


select ai how many customers;

NUM_CUSTOMERS
55500

select ai narrate what are the top 3 customers in San Francisco;

"RESPONSE"
"The top 3 customers in San Francisco are Cody Seto, Lauren Yaskovich, and Ian Mc"

下列範例顯示啟用資料存取之後,成功產生綜合資料。

BEGIN
DBMS_CLOUD_AI.GENERATE_SYNTHETIC_DATA(
profile_name => 'DATA_ACCESS_SDG',
object_name => 'CUSTOMERS_NEW',
owner_name => 'ADB_USER',
record_count => 5
);
END;
/

PL/SQL procedure successfully completed.

相關內容