1. 概览
什么是主数据管理?
主数据管理 (MDM) 旨在为贵组织最关键的数据创建单一可靠的可靠来源。假设有一个精心组织的图书馆,其中每本图书(数据点)都已正确标记、最新且易于查找。
主数据代表对公司运营至关重要的核心基础业务实体。以下是主数据的关键元素:
- 企业实体:客户、产品、供应商、营业地点和员工等实体;这些实体是您的业务所涉及的名词
- 标识符:用于确保每个实体都各不相同且可以跨系统跟踪的唯一标识符
- 属性:描述每个实体的特征,例如客户的地址和产品的价格等。
为了帮助您更好地了解主数据,我们将主数据与事务数据进行比较。交易数据可捕获各个事件(购买、发货等)。而主数据通过定义所涉及的实体为这些事件提供上下文。例如,销售交易链接到客户、产品和销售人员的主数据。
虽然实施强大的 MDM 对于战略决策至关重要,但可能非常复杂且需要大量资源。这正是生成式 AI 的变革力量,特别是 Gemini 1.0 Pro、Gemini 1.0 Pro Vision、Gemini 1.5 Pro 等模型所发挥的作用。
2. 目标
在此 Codelab 中,您将演示 Gemini 1.0 Pro 如何针对 BigQuery 公共数据集中提供的 citibike_stations 数据,简化丰富和去重等主数据管理应用。
你将使用的内容
- BigQuery 公共数据集
bigquery-public-data.new_york_citibike
。 - Gemini 函数调用(一种 Java Cloud Functions 函数,针对 citibike_stations 数据可用的坐标使用 reverse Geocoding API 获取地址信息)。
- BigQuery 中的 Vertex AI Embeddings API 和矢量搜索来识别重复项。
构建内容
- 您将为用例创建一个 BigQuery 数据集。在此数据集中,您将使用公共数据集表“
bigquery-public-data.new_york_citibike.citibike_stations
”中的数据创建一个着陆页。 - 您将部署包含 Gemini 函数调用的 Cloud Functions 函数,以实现地址标准化。
- 您需要将丰富地址数据存储在着陆页(本演示将提供的两个来源中)。
- 您将从 BigQuery 对地址数据调用 Vertex AI Embeddings API。
- 您将使用 BigQuery 矢量搜索来识别重复记录。
下图显示了数据流和实现中所涉及的步骤。
3. 要求
4. 准备工作
- 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
- 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
- 您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq。点击 Google Cloud 控制台顶部的“激活 Cloud Shell”。
- 在连接到 Cloud Shell 后,您可以使用以下命令检查是否已通过身份验证,以及项目是否已设置为您的项目 ID:
gcloud auth list
- 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目。
gcloud config list project
- 如果项目未设置,请使用以下命令进行设置:
gcloud config set project <YOUR_PROJECT_ID>
- 前往 Google Cloud Marketplace 专用 Gemini 启用该 API。您也可以在 Cloud Shell 终端中使用以下命令:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
- 确保已启用 BigQuery、BigQuery Connection、Cloud Functions、Cloud Run、Vertex AI 和 Cloud Build API。您也可以使用此链接通过控制台使用 gcloud 命令。
如需了解 gcloud 命令和用法,请参阅文档。
5. 创建 BigQuery 数据集和外部连接
首先,创建一个数据集和一个 Cloud 资源连接。
BigQuery 中的数据集是用于存储应用所有表和对象的容器。
如需创建数据集,请执行以下操作:
- 转到 Google Cloud 控制台中的 BigQuery 页面。
- 在“探索器”Explorer面板中,选择您要在其中创建数据集的项目。
- 展开操作选项(垂直省略号图标),然后点击创建数据集。
- 在数据集 ID 字段中输入
mdm_gemini
。 - 将您的位置类型设置为
Multi-region
并接受默认值,即US(multiple regions in United States.
- 点击创建数据集。
- 在Explorer窗格中,检查数据集是否已创建并列在项目 ID 下。
需要 BigQuery 连接才能与您的 Cloud Functions 函数交互。如需创建远程函数,您必须创建 BigQuery 连接。在此 Codelab 中,我们将使用 BigLake 连接,通过 Cloud Functions 函数从 BigQuery 访问模型。BigLake 连接有助于连接外部数据源,同时保留精细的 BigQuery 访问权限控制和安全机制,在本例中即为 Vertex AI Gemini Pro API。
如需创建 BigLake 连接,请执行以下操作:
- 在 BigQuery 页面的探索器窗格中点击添加。
- 点击与外部数据源的连接。
- 在“连接类型”列表中,选择 Vertex AI 远程模型、远程函数和 BigLake (Cloud Resource)。
- 在连接 ID 字段中,输入连接名称
gemini-bq-conn
。 - 将您的位置类型设置为
Multi-region
并接受默认值,即US(multiple regions in United States.
- 点击创建连接。
- 点击转到连接,然后复制连接信息窗格中的服务账号 ID。
- 转到 IAM &管理页面,然后点击授予访问权限。
- 将服务账号 ID 粘贴到新原则字段中。
- 从角色列表中选择
Vertex AI user
角色,然后点击保存。
现在,您已成功创建数据集和 BigQuery 连接。
6. 部署 Gemini 函数调用 (Java Cloud Functions 函数)
请按照以下步骤部署包含 Gemini 函数调用的 Java Cloud Functions 函数。
- 使用以下命令从 Cloud Shell 终端克隆 GitHub 代码库:
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
- 将占位符
YOUR_API_KEY
和YOUR_PROJECT_ID
替换为您的值。
如果您阅读此处的博客,便会知道函数调用的实现使用的是 Reverse Geocoding API。您可以按照此处的说明创建自己的 API_KEY。
- 在 Cloud Shell 终端中,转到新克隆的项目目录 GeminiFunctionCalling,然后运行以下语句来构建和部署 Cloud Functions 函数:
gcloud functions deploy gemini-fn-calling --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http
说“y”当系统提示“Allow unauthenticated invocations”时问题。理想情况下,您将按照建议为企业应用设置身份验证。但由于这是一个演示版应用,我们将不进行身份验证就继续。
输出是采用以下格式的 REST 网址:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling
- 在终端运行以下命令来测试此 Cloud Functions 函数:
gcloud functions call gemini-fn-calling --region=us-central1 --gen2 --data '{"calls":[["40.714224,-73.961452"]]}'
对随机示例提示的响应:
'{"replies":["{ \"DOOR_NUMBER\": \"277\", \"STREET_ADDRESS\": \"Bedford Ave\", \"AREA\":
null, \"CITY\": \"Brooklyn\", \"TOWN\": null, \"COUNTY\": \"Kings County\", \"STATE\":
\"NY\", \"COUNTRY\": \"USA\", \"ZIPCODE\": \"11211\", \"LANDMARK\": null}}```"]}'
此 Cloud Functions 函数的请求和响应参数的实现方式与 BigQuery 的远程函数调用兼容。您可以直接通过 BigQuery 数据就地使用这些数据。这意味着,如果您的数据输入(经纬度数据)位于 BigQuery 中,那么您可以对该数据调用远程函数,并获得可直接在 BigQuery 中存储或处理的函数响应。
- 从 BigQuery 运行以下 DDL,以创建调用此已部署的 Cloud Functions 函数的远程函数:
CREATE OR REPLACE FUNCTION
`mdm_gemini.MDM_GEMINI` (latlng STRING) RETURNS STRING
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (
endpoint = 'https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling', max_batching_rows = 1
);
测试查询以使用创建的新远程函数:
SELECT mdm_gemini.MDM_GEMINI
(latlong) from mdm_gemini.CITIBIKE_STATIONS limit 1;
如果使用在 BigQuery 中创建的新远程函数的测试查询因 Cloud Functions 权限问题而失败,请从 Google Cloud 控制台前往 Cloud Functions,找到已部署且名为“gemini-fn-calling”的 Cloud Functions 函数。前往“权限”标签页,将主账号添加为“allUsers”然后授予“Cloud Functions Invoker”角色确保 Cloud Functions 可供所有用户访问(仅因为这是演示版应用)。
7. 尝试解决方法
如果您没有进行反向地理编码函数调用方法所需的 API_KEY,或者由于某种原因未部署 Cloud Functions 函数,可以采取以下替代做法:
- 从代码库下载文件 CITIBIKE_STATIONS.csv 到 Cloud Shell 项目文件夹,然后进入该文件夹。
- 在 Cloud Shell 终端中使用以下命令,将 csv 中的数据导出到新的 BigQuery 数据集
mdm_gemini
:
bq load --source_format=CSV --skip_leading_rows=1 mdm_gemini.CITIBIKE_STATIONS ./CITIBIKE_STATIONS.csv \ name:string,latlng:string,capacity:numeric,num_bikes_available:numeric,num_docks_available:numeric,last_reported:timestamp,full_address_string:string
8. 创建表并丰富地址数据
第 1 步:创建表
提示:如果您已经使用了解决方法,请跳过此步骤,因为必须已创建表。
如果您尚未采用过解决方法,请在 BigQuery SQL 编辑器中运行以下 DDL:
CREATE TABLE mdm_gemini.CITIBIKE_STATIONS as (
select name, latitude || ',' || longitude as latlong, capacity, num_bikes_available, num_docks_available,last_reported,
'' as full_address_string
from bigquery-public-data.new_york_citibike.citibike_stations) ;
现在,我们根据表格中提供的纬度和经度坐标调用 Remote 函数,从而丰富地址数据。为数据设置以下条件:
- 报告时间:2024 年
- 可用单车数量 >0 次
- 容量 >100 个
请运行以下查询:
update `mdm_gemini.CITIBIKE_STATIONS`
set full_address_string = `mdm_gemini.MDM_GEMINI`(latlong)
where EXTRACT(YEAR FROM last_reported) = 2024 and num_bikes_available > 0 and capacity > 100;
第 2 步:为自行车站位置数据创建第二个来源
即使您使用了解决方法来创建表,也不要跳过此步骤。
在此步骤中,您将为自行车站位置数据创建第二个来源,以便用于此 Codelab。这是为了证明 MDM 将来自多个来源的数据整合在一起,并识别黄金真相。
在 BigQuery SQL 编辑器中运行以下 DDL,以创建包含两条记录的第二个营业地点数据源。我们将这个表命名为 mdm_gemini.CITIBIKE_STATIONS_SOURCE2
,并向其中插入两条记录。
CREATE TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE2 (name STRING(55), address STRING(1000), embeddings_src ARRAY<FLOAT64>);
insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Location broadway and 29','{ "DOOR_NUMBER": "1593", "STREET_ADDRESS": "Broadway", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10019", "LANDMARK": null}', null);
insert into mdm_gemini.CITIBIKE_STATIONS_SOURCE2 VALUES ('Allen St & Hester','{ "DOOR_NUMBER": "36", "STREET_ADDRESS": "Allen St", "AREA": null, "CITY": "New York", "TOWN": null, "COUNTY": "New York County", "STATE": "NY", "COUNTRY": "USA", "ZIPCODE": "10002", "LANDMARK": null}', null);
9. 为地址数据生成嵌入
嵌入是表示给定实体(例如一段文本或音频文件)的高维数字向量。机器学习 (ML) 模型使用嵌入对此类实体的语义进行编码,以便更轻松地推断和比较这些实体。例如,聚类、分类和推荐模型中的一项常见操作是测量嵌入空间中向量之间的距离,以查找语义上最相似的项。借助 Vertex AI 文本嵌入 API,您可以使用 Vertex AI 上的生成式 AI 创建文本嵌入。文本嵌入是文本的数字表示形式,用于捕获字词和短语之间的关系。如需详细了解 Vertex AI 文本嵌入,请点击此处。
- 运行以下 DDL,为 Vertex AI Textembeddings API 创建远程模型:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
- 现在,远程嵌入模型已准备就绪,让我们为第一个来源生成嵌入,并使用以下查询将其存储在表中:
CREATE TABLE `mdm_gemini.CITIBIKE_STATIONS_SOURCE1` AS (
SELECT *
FROM ML.GENERATE_EMBEDDING(
MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
( select name, full_address_string as content from `mdm_gemini.CITIBIKE_STATIONS`
where full_address_string is not null )
)
);
您还可以将嵌入结果字段存储在之前创建的同一 mdm_gemini.CITIBIKE_STATIONS 表中,而不是创建新表。
- 如需为表 CITIBIKE_STATIONS_SOURCE2 中的地址数据生成嵌入,请运行以下查询:
update `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` a set embeddings_src =
(
SELECT ml_generate_embedding_result
FROM ML.GENERATE_EMBEDDING(
MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`,
( select name, address as content from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2` ))
where name = a.name) where name is not null;
这应该会为第二个来源创建嵌入。请注意,我们在同一个表 CITIBIKE_STATIONS_SOURCE2 中创建了嵌入字段。
- 要直观呈现为源数据表 1 和 2 生成的嵌入,请运行以下查询:
select name,address,embeddings_src from `mdm_gemini.CITIBIKE_STATIONS_SOURCE2`;
select name,content,ml_generate_embedding_result from `mdm_gemini.CITIBIKE_STATIONS_SOURCE1`;
现在,我们执行矢量搜索来识别重复项。
10. 运行标记重复地址的矢量搜索
在此步骤中,您将搜索 mdm_gemini.CITIBIKE_STATIONS_SOURCE1 表的地址嵌入 ml_generate_embedding_result 列,以查找与 mdm_gemini.CITIBIKE_STATIONS_SOURCE2 表的 embeddings_src 列中的每行数据匹配的前两个嵌入。
为此,请运行以下查询:
select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
'ml_generate_embedding_result',
(SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
'embeddings_src',
top_k => 2
) where query.name <> base.name
order by distance desc;
我们正在查询的表 :针对 ml_generate_embedding_result
字段的 mdm_gemini.CITIBIKE_STATIONS_SOURCE1
我们用作基准的表格 :针对字段 embeddings_src
的 mdm_gemini.CITIBIKE_STATIONS_SOURCE2
top_k::指定要返回的最近邻项的数量。默认值为 10。负值被视为无穷大,这意味着所有值均计为相邻值并返回。
distance_type::指定用于计算两个矢量之间距离的指标类型。支持的距离类型包括欧几里得和余弦。默认值为欧几里得语。
查询结果如下所示:
如您所见,它列出了 CITIBIKE_STATIONS_SOURCE1
中 CITIBIKE_STATIONS_SOURCE2
中两行的两个最近相邻项(即最邻近的重复项)。由于未指定 distance_type
,因此它会假定为欧几里得值,并将距离读取为两个源地址 TEXT 值中的距离,最小值为最相似的地址文本。
我们使用以下查询将 distance_type
设置为余弦:
select query.name name1,base.name name2,
/* (select address from mdm_gemini.CITIBIKE_STATIONS_SOURCE2 where name = query.name) content1, base.content content2, */
distance
from VECTOR_SEARCH(
TABLE mdm_gemini.CITIBIKE_STATIONS_SOURCE1,
'ml_generate_embedding_result',
(SELECT * FROM mdm_gemini.CITIBIKE_STATIONS_SOURCE2),
'embeddings_src',
top_k => 2,distance_type => 'COSINE'
) where query.name <> base.name
order by distance desc;
查询结果如下所示:
两种类型的查询都按距离 DESCENDING 进行排序,这意味着我们希望按距离的递减顺序列出结果。但您会发现,第二个查询的距离顺序颠倒了。你能猜出这是为什么吗?
没错!!你答对了!在余弦相似度中,数值越大,相似度越高,距离越小。在欧几里得距离中,数值越大,值之间的距离越大。
如要进一步了解 MDM 以及了解欧几里得和余弦的差异和应用方面的提示,请阅读博客。
11. 清理
为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按以下步骤操作:
- 在 Google Cloud 控制台中,前往管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关停以删除项目。
- 如果您想保留项目,请跳过上述步骤,并删除 Cloud Functions 函数。为此,请前往 Cloud Functions,在函数列表中选中要删除的函数,然后点击删除。
12. 恭喜
恭喜!您展示了使用 Gemini 1.0 Pro 和函数调用的强大功能,将一些 MDM 活动转换为简单但强大、确定性且可靠的生成式 AI 功能。现在,您已经了解了,请随意寻找实现同一用例或其他 MDM 功能的其他方式。有没有可以验证数据集、可以填补的信息缺口,或者有没有可以通过嵌入生成式 AI 响应中的结构化调用自动执行的任务?如需更深入的指导,请参阅 Vertex AI、BigQuery 远程函数、Cloud Functions、嵌入和矢量搜索的文档。以下是此项目的 GitHub 代码库。请与我们分享您的学习成果!