简化主数据管理:匹配和与生成式 AI 合并!

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 数据的主数据管理应用(例如丰富和去重)。

所需工具

  1. BigQuery 公开数据集 bigquery-public-data.new_york_citibike
  2. Gemini 函数调用(一个 Java Cloud Functions 函数,用于针对 citibike_stations 数据中提供的坐标使用 Reverse Geocoding API 获取地址信息)。
  3. 使用 BigQuery 中的 Vertex AI Embeddings API 和 Vector Search 来识别重复项。

构建内容

  1. 您将为该用例创建一个 BigQuery 数据集。在此数据集中,您将使用公共数据集表 bigquery-public-data.new_york_citibike.citibike_stations 中的数据创建着陆页表。
  2. 您将部署包含 Gemini 函数调用的 Cloud Functions 函数,以实现地址标准化。
  3. 您将在着陆表中存储经过丰富的地址数据(来自本演示所提供的两个来源)。
  4. 您将针对地址数据从 BigQuery 调用 Vertex AI Embeddings API。
  5. 您将使用 BigQuery Vector Search 来识别重复记录。

下图显示了数据流和实现过程中涉及的步骤。

用例的概要流程

3. 要求

  • 一个浏览器,例如 ChromeFirefox
  • 启用了结算功能的 Google Cloud 项目。

4. 准备工作

  1. Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
  3. 您将使用 Cloud Shell,它是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq。点击 Google Cloud 控制台顶部的“激活 Cloud Shell”。

“激活 Cloud Shell”按钮图片

  1. 连接到 Cloud Shell 后,您可以使用以下命令检查自己是否已通过身份验证,以及项目是否已设置为您的项目 ID:
gcloud auth list
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目。
gcloud config list project
  1. 如果项目未设置,请使用以下命令进行设置:
gcloud config set project <YOUR_PROJECT_ID>
  1. 前往 Gemini for Google Cloud Marketplace 启用该 API。您还可以在 Cloud Shell 终端中使用以下命令:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. 确保已启用 BigQuery、BigQuery Connection、Cloud Functions、Cloud Run、Vertex AI 和 Cloud Build API。您可以通过此链接在控制台中使用 gcloud 命令的替代方案。

如需了解 gcloud 命令和用法,请参阅文档

5. 创建 BigQuery 数据集和外部连接

首先,创建一个数据集和一个 Cloud 资源连接。

BigQuery 中的数据集是应用的所有表和对象的容器。

如需创建数据集,请执行以下操作:

  1. 前往 Google Cloud 控制台中的 BigQuery 页面
  2. 探索器面板中,选择您要在其中创建数据集的项目。
  3. 展开操作选项(垂直省略号图标),然后点击创建数据集

“操作”菜单和“创建数据集”选项的图片

  1. 数据集 ID 字段中输入 mdm_gemini
  2. 将位置类型设置为 Multi-region,并接受默认值 US(multiple regions in United States.
  3. 点击创建数据集
  4. 检查数据集是否已创建,并在探索器窗格中列在您的项目 ID 下。

您需要创建 BigQuery 连接才能与 Cloud Functions 函数进行交互。如需创建远程函数,您必须创建 BigQuery 连接。在本 Codelab 中,我们将使用 BigLake 连接通过 Cloud Functions 函数从 BigQuery 访问模型。BigLake 连接有助于连接外部数据源,同时保留精细的 BigQuery 访问权限控制和安全性(在本例中为 Vertex AI Gemini Pro API)。

如需创建 BigLake 连接,请执行以下操作:

  1. 在 BigQuery 页面的探索器窗格中,点击添加

突出显示了“ADD”(添加)按钮的 BigQuery 控制台,用于添加外部连接

  1. 点击与外部数据源的连接
  2. 在“连接类型”列表中,选择 Vertex AI 远程模型、远程函数和 BigLake(Cloud 资源)
  3. 连接 ID 字段中,输入连接名称 gemini-bq-conn
  4. 将位置类型设置为 Multi-region,并接受默认值 US(multiple regions in United States.
  5. 点击创建连接
  6. 点击前往关联,然后复制连接信息窗格中的服务账号 ID。

连接信息屏幕截图

  1. 前往 IAM 和管理页面,然后点击授予访问权限
  2. 将服务账号 ID 粘贴到新主账号字段中。
  3. 从角色列表中选择 Vertex AI user 角色,然后点击保存

授予对服务账号的访问权限屏幕截图

您现在已成功创建数据集和 BigQuery 连接。

6. 部署 Gemini 函数调用 (Java Cloud Functions 函数)

请按照以下步骤部署包含 Gemini 函数调用的 Java Cloud Functions 函数。

  1. 使用以下命令从 Cloud Shell 终端克隆 GitHub 代码库
git clone https://github.com/AbiramiSukumaran/GeminiFunctionCalling
  1. 将占位符 YOUR_API_KEYYOUR_PROJECT_ID 替换为您的值。

如果您阅读此处的博文,就会知道函数调用实现使用的是 Reverse Geocoding API。您可以按照此处的说明创建自己的 API_KEY。

  1. 在 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”。理想情况下,您应根据建议为企业应用设置身份验证。不过,由于这是演示应用,因此我们将在不进行身份验证的情况下继续操作。

输出是一个采用以下格式的 REST 网址:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/gemini-fn-calling

  1. 从终端运行以下命令,测试此 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 中存储或处理的函数响应。

  1. 在 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 函数,则可以改为执行以下操作:

  1. repository 中的 CITIBIKE_STATIONS.csv 文件下载到您的 Cloud Shell 项目文件夹中,然后进入该文件夹。
  2. 在 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) ;

现在,我们将对表格中提供的纬度和经度坐标调用远程函数,以丰富地址数据。为数据设置以下条件:

  • 报告时间为 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 文本嵌入,请点击此处

  1. 运行以下 DDL 以为 Vertex AI 文本嵌入 API 创建远程模型:
CREATE OR REPLACE MODEL `mdm_gemini.CITIBIKE_STATIONS_ADDRESS_EMB`
REMOTE WITH CONNECTION `us.gemini-bq-conn`
OPTIONS (ENDPOINT = 'textembedding-gecko@latest');
  1. 现在,远程嵌入模型已准备就绪,接下来使用以下查询为第一个来源生成嵌入,并将其存储在表中:
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 表中,而无需创建新表。

  1. 如需为表 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. 如需直观呈现为源数据表 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_SOURCE1CITIBIKE_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;

查询结果如下所示:

结果集 2

这两个查询(两种距离类型)都按距离降序排序,这意味着我们希望按距离递减顺序列出结果。不过,您会注意到,第二个查询的距离顺序是相反的。您能猜出原因吗?

是的!没错!在余弦相似度中,数字越大,相似度越高,距离越小。在欧几里得距离中,数值越大,值之间的距离越大。

如需详细了解 MDM 以及有关了解欧几里德距离和余弦距离的差异和应用的技巧,请参阅博文

11. 清理

为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往管理资源页面。
  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关停以删除项目。
  4. 如果您想保留项目,请跳过上述步骤,然后前往 Cloud Functions 页面,在函数列表中选中要删除的函数,然后点击删除以删除该函数。

12. 恭喜

恭喜!您已证明,使用 Gemini 1.0 Pro 和函数调用可以将一些 MDM 活动转换为简化但强大的确定性和可靠的生成式 AI 功能。现在,您已经了解了相关知识,可以随意确定实现相同用例或其他 MDM 功能的其他方法。您是否有数据集需要验证、信息缺口需要填补,或者有任务可以通过在生成式 AI 回答中嵌入结构化调用来自动执行?如需更深入的指导,请参阅 Vertex AIBigQuery 远程函数Cloud Functions嵌入Vector Search 的文档。以下是此项目的 GitHub 代码库。欢迎与我们分享您通过这些学习内容构建的项目!