合成或人工生成的数据可以具有真实数据的许多特征,并且在开发和测试解决方案时可以成为强大的工具,尤其是在实际数据尚不存在或不允许使用的情况下。合成数据通常是使用随机生成器、算法或统计模型创建的,以模拟真实数据的特征和分布。然而,从历史上看,这一直很复杂,或者需要依赖具有不同复杂功能的工具。随着大型语言模型 (LLMs,可以生成更相关和特定于模式的数据,这些数据考虑了以自然语言表达的特征。拥有更相关的合成数据有助于在没有真实数据的情况下更好地测试您的应用程序,从而提高应用程序的整体质量。
为了支持生成合成数据,我们很高兴地宣布推出 Select AI 合成数据生成 (SDG),从而更轻松地使用 LLMs 生成符合您的架构的数据,用于解决方案测试、概念验证和其他用途。
Select AI 已经使用生成式 AI 进行了简化和自动化,无论是从自然语言提示生成、运行或解释 SQL,还是与您的 LLM,还是利用向量存储启用检索增强生成 (RAG)。现在,借助 Synthetic Data Generation,您可以方便地从 SQL 中使用生成式 AI 进一步开发应用程序。
使用案例
您可以将合成数据生成应用于各种使用案例。以下是其中的几个:
填充数据库元数据克隆:数据库元数据是指描述数据库本身的结构、组织和属性的数据。元数据克隆是指创建仅包含元数据(结构)而不包含实际数据的数据库或架构的克隆(或副本)的过程。此克隆包含所有数据库对象,例如表、索引、视图、统计信息、过程和触发器,但不包含任何数据行。Select AI 对合成数据生成的支持允许使用合成数据填充这些克隆表,从而避免使用可能包含敏感数据的原始表中的数据。
此类克隆可用于开发、测试或为新数据库或架构创建模板,从而保护原始表中的数据。在克隆表中生成合成数据可用于开发和测试目的,包括性能和可扩展性。
开始新项目:在提出新项目时,您可能缺乏实际数据,尤其是在项目的早期阶段。拥有有助于使概念“栩栩如生”并说服其他人推进给定项目的数据是很有帮助的。
验证用户体验:用户界面设计可能具有挑战性。拥有具有一系列维度和数据值的数据有助于发现设计缺陷以及性能和可扩展性问题。合成数据生成可以帮助开发团队使用“真实”数据来验证界面和用户体验。
机器学习和 AI 项目:涉及训练模型的新 AI 和 ML 项目可能还需要样本数据来探索模型训练,这可能是因为真实数据不存在,或者产品团队无权使用实际数据。LLMs 在生成具有某些类型模式的数据时可能非常有帮助。
使用 Select AI 生成合成数据
Select AI 在 DBMS_CLOUD_AI 包中引入了一个新的 API generate_synthetic_data(),它利用 AI 服务为单个表或具有表依赖关系的完整架构生成合成数据。新 API 包括两个重载过程:一个用于单个表数据生成,另一个用于多个表。
在单个表情况下,您可以指定 AI 配置文件名称、对象(表)名称、架构所有者和所需的记录数,以及进一步控制数据生成的可选用户提示和参数。
PROCEDURE generate_synthetic_data( profile_name IN VARCHAR2, object_name IN DBMS_ID, owner_name IN DBMS_ID, record_count IN NUMBER, user_prompt IN CLOB DEFAULT NULL, params IN CLOB DEFAULT NULL );
以下示例突出显示了使用目标表中的现有数据作为指导数据生成的示例 – 随机选择。我们指定选择 5 个样本行作为生成额外 10 行的基础。
BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI',
object_name => 'Transactions',
owner_name => 'SELECT_AI_USER',
record_count => 10,
params => '{"sample_rows":5}');
END;在多个表的情况下,您可以指定 AI 配置文件名称、对象(表)列表以及进一步控制数据生成的可选参数。对象列表指定表信息的列表,其中包括在单个表大小写的过程中提供的参数。
PROCEDURE generate_synthetic_data( profile_name IN VARCHAR2, object_list IN CLOB, params IN CLOB DEFAULT NULL );
下面是一个使用多个表案例的示例,其中突出显示了对象列表内容。请注意,JSON 字符串列出了每个表的所有者、表名称和所需的记录数。您还可以指定特定于表的提示来指导 LLM。在这里,我们正在为 2009 年上映的电影生成内容。请注意,虽然提示可以帮助定制 LLM,但它并不能保证结果,因为已知 LLMs 会产生幻觉。例如,如果您要求 10,000 名董事,LLM 可能不知道那么多董事(或者可能不存在这么多)。因此,LLM 将尽最大努力满足您的请求。
BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI',
object_list => '[{"owner": "SELECT_AI_USER", "name": "Director","record_count":5},
{"owner": "SELECT_AI_USER", "name": "Movie_Actor","record_count":5},
{"owner": "SELECT_AI_USER", "name": "Actor","record_count":10},
{"owner": "SELECT_AI_USER", "name": "Movie","record_count":5,"user_prompt":"all movies released in 2009"}]');
END;从合成数据生成中获取更多信息
您可以通过多种方式进一步影响 Select AI 生成数据的方式。以下是一些需要考虑的因素。
列统计信息
如果表有列统计信息,或者是从其他有元数据的表中克隆而来的,Select AI 支持在请求中为每一列添加统计信息,以使数据与基于这些统计信息的原始数据更加一致。这可以提高数据质量。
对于 NUMBER 列,统计数据中的高值和低值可用于指导值范围。例如,如果原始 EMPLOYEES 表中 SALARY 列的值介于 1000 和 10000 之间,则克隆表中此列的数据生成也应限制在此范围内。
对于具有合理数量的 distinct 值的列,我们可以提供所需值的列表。例如,如果原始 EMPLOYEES 表中 STATE 列的值仅为 'CA'、'WA' 和 'TX',则克隆表中的值也应为 'CA'、'WA' 或 'TX'。您可以通过在 params 参数中包含 this 来启用列统计信息,如下所示。默认情况下,列统计信息处于启用状态。
BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI',
object_name => 'Employees',
owner_name => 'SELECT_AI_USER',
record_count => 10,
user_prompt => 'all movies are released in 2009',
params => '{"sample_rows":5,"column_statistics":true}' );
END;对列的注释
列注释(如果存在)会自动包含在内,以提供有关列的更多信息,从而为LLM用于数据生成的代码。例如,对于“事务”表中的字符串列“Status”,您可能有一个列出允许值的注释,例如:successful、failed、pending、canceled、need manual check。
非重复值
使用 LLMs 生成数据,很可能会产生重复的值,尤其是在记录计数较大时。您可以通过在给定列上设置唯一约束来解决此问题。这会导致 Select AI 忽略具有重复值的行。
示例行
如果您的表中已经包含记录,您可以指示 Select AI 随机选择特定数量的记录来指导 LLM 的数据生成。要使用此功能,请在 params 参数 {“sample_row”:5} 中为单个表指定,或在对象列表中为单个表指定 add 以进行多表调用。例如,Select AI 将从表 Transactions 中抽样 5 行,并将它们发送到 LLM 以再生成 10 行:
BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI',
object_name => 'Transactions',
owner_name => 'SELECT_AI_USER',
record_count => 10,
params => '{"sample_rows":5}'
);
END;用户提示
可以为每个表指定一个用户提示,以便在生成数据时为 LLM。例如,您可以指定某些列允许的值,而不是列注释。例如,如果您只想为 STATE 列请求 'CA'、'WA' 和 'TX':
BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI',
object_name => 'employees',
owner_name => 'admin',
user_prompt => 'the value for state should either be CA, WA, or TX',
record_count => 10 );
END;排比
为了帮助减少数据生成运行时间,Select AI 会拆分合成数据生成任务,以便并行运行适当的表。通过以较小的块生成数据并并行运行 LLM 任务,可以提高运行时性能。您的 Autonomous Database 服务级别和 ECPU/OCPU 设置将决定允许的并行度。虽然许多因素会影响运行时,但为具有大量记录的多个并行表生成数据可以提高整体性能。
选择 AI 合成数据生成示例
在此示例中,我们将创建四个涉及电影相关数据的表:导演、电影、演员以及哪些演员出现在哪些电影中。还有各种约束,例如指定了主键和外键。
首先,我们显式创建表,或者我们可以使用克隆表。
CREATE TABLE SELECT_AI_USER.Director (
director_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE SELECT_AI_USER.Movie (
movie_id INT PRIMARY KEY,
title VARCHAR(100),
release_date DATE,
genre VARCHAR(50),
director_id INT,
FOREIGN KEY (director_id) REFERENCES SELECT_AI_USER.Director(director_id)
);
CREATE TABLE SELECT_AI_USER.Actor (
actor_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE SELECT_AI_USER.Movie_Actor (
movie_id INT,
actor_id INT,
PRIMARY KEY (movie_id, actor_id),
FOREIGN KEY (movie_id) REFERENCES SELECT_AI_USER.Movie(movie_id),
FOREIGN KEY (actor_id) REFERENCES SELECT_AI_USER.Actor(actor_id)
);对于任何设置 AI 的使用,我们在此处创建凭证以访问 AI 提供商,即 OCI 生成式 AI 服务。然后,我们使用此凭证和对象列表指定 AI 配置文件,该列表仅指向用户的架构(在本例中为 SELECT_AI_USER。
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;
BEGIN
DBMS_CLOUD_AI.create_profile(
profile_name => 'GENAI',
attributes =>'{"provider": "oci",
"credential_name": "GENAI_CRED",
"object_list": [{"owner": "SELECT_AI_USER"}]}');
END;
BEGIN
DBMS_CLOUD_AI.set_attribute(
'GENAI', 'oci_compartment_id', 'ocid1.compartment.oc1....');
END;
EXEC DBMS_CLOUD_AI.set_profile(profile_name => 'GENAI');现在,我们已准备好为单个表运行 synthetic_data_generation 过程。
BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI',
object_name => 'Director',
owner_name => 'SELECT_AI_USER',
record_count => 5 );
END;
PL/SQL procedure successfully completed.我们可以显式查询表以查看生成的 director names。
SQL> SELECT * FROM SELECT_AI_USER.Director
DIRECTOR_ID NAME
----------- -----------------
1 John Smith
2 Emily Chen
3 Michael Brown
4 Sarah Taylor
5 David Lee或者,我们可以让 Select AI 告诉我们有多少个导演。
SQL> SELECT AI how many directors are there
NUMBER_OF_DIRECTORS
-------------------
5但是,我们的架构中有更多表,因此我们将为多个表运行 synthetic_data_generation。由于我们的 director 表中已经有记录,因此我们将再获得 5 条记录。请注意,在我们的 Movie 表中,我们提供了一个提示,将我们的电影限制为 2009 年发行的电影。
BEGIN
DBMS_CLOUD_AI.generate_synthetic_data(
profile_name => 'GENAI',
object_list => '[{"owner": "SELECT_AI_USER", "name": "Director","record_count":5},
{"owner": "SELECT_AI_USER", "name": "Movie_Actor","record_count":5},
{"owner": "SELECT_AI_USER", "name": "Actor","record_count":10},
{"owner": "SELECT_AI_USER", "name": "Movie","record_count":5,"user_prompt":"all movies released in 2009"}]' );
END;PL/SQL 过程已成功完成。
让我们查询 movie 表以查看结果...
SQL> select * from SELECT_AI_USER.Movie
MOVIE_ID TITLE RELEASE_DATE 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…并要求 Select AI 告诉我们有多少个 actor。
SQL> SELECT AI how many actors are there
Number of Actors
----------------
10资源
有关 Select AI 的更多信息,请参阅以下内容并立即通过 Oracle LiveLabs 试用 Select AI RAG!
作者:Mark Hornick
Oracle机器学习和 AI 产品管理高级总监
2024年9月11日




