使用 Spanner、矢量搜索和构建专利搜索应用Gemini 1.0 Pro!

1. 概览

在各个行业中,专利研究都是了解竞争格局、发现潜在的许可或收购机会以及避免侵犯现有专利的重要工具。

专利研究浩瀚而复杂。从无数的技术摘要中过滤出相关创新是一项艰巨的任务。传统的基于关键字的搜索通常不准确且耗时。摘要内容冗长且技术性强,因此很难快速掌握核心要点。这可能会导致研究人员错过关键专利,或者在无关结果上浪费时间。

目标

在此 Codelab 中,我们将利用 Spanner 以及原位 Gemini 1.0 Pro、嵌入和向量搜索,让搜索专利的过程变得更快、更直观、更精确。

构建内容

在本实验中,您将执行以下操作:

  1. 创建 Spanner 实例
  2. 加载 Google 专利公共数据集
  3. 使用 Gemini 1.0 Pro 模型创建用于文本嵌入的远程模型
  4. 从加载的数据集中创建生成式数据分析
  5. 根据数据分析生成嵌入
  6. 对数据集发出相似度搜索查询

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

14cfdde5e24258a.png

要求

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

2. 准备工作

创建项目

  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. 在控制台中搜索 Vertex AI 和 Spanner API,确保它们已启用。或者,您也可以在 Cloud Shell 终端中使用以下命令:
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>

另一种方法是使用此链接

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

3. 准备 Spanner 数据库

我们来创建一个 Spanner 实例、数据库和表,用于加载专利数据集。

创建 Spanner 实例

  1. 创建一个名为 spanner-vertexSpanner 实例
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

创建数据库

  1. 在 Google Cloud 控制台中,打开 Spanner 页面。
  2. 从列表中选择 spanner-vertex 实例。
  3. 在“数据库”下,点击创建数据库
  4. 将数据库名称设置为 patents。
  5. 点击创建以创建数据库。

创建表

  1. 在 Google Cloud 控制台中,打开 Spanner 页面。
  2. 从列表中选择 spanner-vertex 实例。
  3. 选择 patents 数据库。
  4. 标签页下,点击创建表。系统会打开 Spanner Studio 页面。
  5. 点击新的 SQL 编辑器标签页以打开新标签页。
  6. 请运行以下查询:
CREATE TABLE patents_data (
   id string(25), type string(25), number string(20), country string(2), date string(20), abstract string(300000), title string(100000),kind string(5), num_claims numeric, filename string(100), withdrawn numeric, 
) PRIMARY KEY (id);

4. 将专利数据加载到数据库中

我们将使用 BigQuery 上的 Google 专利公共数据集作为数据集。我们将使用 Spanner Studio 运行查询。spanner-gemini-search 代码库包含我们将运行的 insert_into_patents_data.sql 脚本,用于加载专利数据。

  1. 在 Google Cloud 控制台中,打开 Spanner 页面。
  2. 从列表中选择 spanner-vertex 实例。
  3. 选择 patents 数据库。
  4. 在导航菜单中,点击 Spanner Studio探索器窗格会显示数据库中的对象列表。
  5. 点击新的 SQL 编辑器标签页以打开新标签页。
  6. 从编辑器中的 insert_into_patents_data.sql 脚本中复制 insert 查询语句。您可以复制 50-100 个插入语句,以便快速演示此用例。
  7. 点击运行。查询结果会显示在结果表中。

5. 为 Gemini 1.0 Pro 创建远程模型

将专利数据加载到数据库后,我们将创建一个远程模型,该模型使用 Gemini 1.0 Pro Vertex AI 模型生成一组摘要标题和关键字。

在 Spanner Studio 编辑器中运行以下 DDL 命令:

  1. 在导航菜单中,点击 Spanner Studio探索器窗格会显示数据库中的对象列表。
  2. 点击新的 SQL 编辑器标签页以打开新标签页。
  3. 请运行以下查询:
CREATE MODEL gemini_pro_model INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/gemini-pro',
default_batch_size = 1
);
  1. 点击运行。查询结果会显示在结果表中。

6. 创建用于文本嵌入的远程模型

上一步的结果包含一个由标题和关键字组成的汇总摘要。我们会将此回答转换为嵌入,以便在运行查询时生成适当的匹配项。我们将远程从 Spanner 使用 Vertex AI 中的 Text Embedding Gecko 003 model

  1. 在导航菜单中,点击 Spanner Studio探索器窗格会显示数据库中的对象列表。
  2. 点击新的 SQL 编辑器标签页以打开新标签页。
  3. 请运行以下查询:
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
 embeddings
   STRUCT<
     statistics STRUCT<truncated BOOL, token_count FLOAT64>,
     values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
 endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/textembedding-gecko@003');
  1. 点击运行。查询结果会显示在结果表中。

7. 从专利摘要中生成生成式数据分析

我们将创建一个 patents_data_gemini 表,用于存储我们将使用之前创建的 Gemini 1.5 Pro 模型生成的生成式数据分析。

创建表

  1. 在导航菜单中,点击 Spanner Studio探索器窗格会显示数据库中的对象列表。
  2. 点击新的 SQL 编辑器标签页以打开新标签页。
  3. 请运行以下查询:
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. 点击运行。查询结果会显示在结果表中。

生成洞见

如需使用生成式数据分析来填充表格,建议您使用采用批量写入或更改方法的应用。在此 Codelab 中,我们最多会运行 4 次以下 DDL 查询来填充表。

INSERT INTO patents_data_gemini (id, gemini_response)
SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b where id not in (select id from patents_data_gemini) limit 50
));

注意:如果您在此步骤中收到“配额已超出”错误(如果免费额度较小,则可能出现这种情况),请尝试跳过插入操作,仅运行下文中的权宜解决方法部分中的选择查询。

Workaround section:

SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))

观察数据分析

该表格包含为查询中的 'Identify the areas of work or keywords in this abstract', 提示生成的数据分析。

注意:如果您运行的是上文中的权宜解决方法部分查询,而不是 INSERT DDL,请跳过此部分,改为运行本页中的最后一个 SELECT 查询。

我们来运行以下查询,验证数据分析结果:

select title, abstract, gemini_response from patents_data a inner join patents_data_gemini b
on a.id = b.id;

您会看到以下结果:

6041fab164aaab93.png

注意:如果您运行了“权宜解决方法”部分中的查询,请将上述选择查询中的表名称替换为“权宜解决方法”部分中的查询。因此,您应改为运行以下命令:

select title, abstract, gemini_response from patents_data a inner join (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))) b
on a.id = b.id;

结果应与上方结果屏幕截图中的结果相同。

8. 为生成的分析洞见生成嵌入

在表格中填充数据分析后,我们现在可以使用这些数据分析生成嵌入。这些嵌入有助于我们不依赖于关键字完全匹配,而是根据概念相似性生成结果。

注意:如果您在上一步中运行了“解决方法”部分查询,则可以跳过此步骤,直接在此步骤中运行“解决方法”部分查询。

运行以下查询以生成嵌入:

  1. 在导航菜单中,点击 Spanner Studio探索器窗格会显示数据库中的对象列表。
  2. 点击新的 SQL 编辑器标签页以打开新标签页。
  3. 运行以下查询以创建 patents_data_embeddings 表。
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. 点击运行。查询结果会显示在结果表中。
  2. 运行以下查询以生成嵌入。
INSERT INTO patents_data_embeddings (id, patents_embeddings)
SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM patents_data_gemini));
  1. 点击运行。查询结果会显示在结果表中。

观察结果

该表格包含为标题和提取的文本生成的嵌入。

我们来运行以下查询来验证结果:

select title, abstract, b.patents_embeddings from patents_data a inner join patents_data_embeddings b
on a.id = b.id;

您会看到以下结果:

a1e968bac4ab1cb.png

“解决方法”部分

如果您在其他步骤中执行了“临时解决方法”部分,请使用以下查询:

select title, abstract, b.patents_embeddings from patents_data a inner join 
(SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
)))))) b
on a.id = b.id;

这应该会产生与上面屏幕截图中显示的相同结果。

9. 为矢量搜索做好准备

现在,我们已经生成了文本嵌入,接下来可以准备我们的 Web 应用,以便执行相似向量搜索。在此 Codelab 中,我们将创建一个 Web 应用,其中包含根据 K 最近邻相似搜索功能提供搜索结果的逻辑。您可以将此准备好的数据集与搜索应用搭配使用,直观呈现搜索结果的显示方式。

在本 Codelab 中,我们将运行一个示例查询,该查询会搜索提示、根据上下文生成结果,并将结果限制为 10 条条目。

请运行以下查询:

  1. 在导航菜单中,点击 Spanner Studio探索器窗格会显示数据库中的对象列表。
  2. 点击新的 SQL 编辑器标签页以打开新标签页。
  3. 运行以下查询以创建 patents_data_embeddings 表。
SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join patents_data_gemini b on a.id = b.id
inner join patents_data_embeddings c on a.id = c.id
ORDER BY distance
LIMIT 10;
  1. 点击运行。查询结果会显示在结果表中。

注意:如果您使用了“权宜解决方法”部分中的查询,但由于最早的某个插入语句出现配额错误,则可以跳过所有其他步骤,直接运行以下查询,以观察在 Spanner 数据库中对向量嵌入执行最近邻搜索的结果:

SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join (SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b 
)))))) c on a.id = c.id
ORDER BY distance
LIMIT 2;

观察结果

前面的查询使用 COSINE_DISTANCE 方法查找与问题最相符的 10 个答案。

您会看到以下结果:

d26ca8b8238bdf25.png

生成的结果在上下文上与查询中的问题非常接近。

10. 清理

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

  1. 在 Google Cloud 控制台中,前往管理资源页面。
  2. 在项目列表中,选择要删除的项目,然后点击删除。如果您不想删除项目,只需删除您在 Spanner 中创建的实例即可。
  3. 在对话框中输入项目 ID,然后点击关停以删除项目。

11. 恭喜

恭喜!您已成功使用 Spanner 的内置矢量搜索功能执行了相似度搜索。此外,您还了解了如何轻松使用嵌入模型和 LLM 模型,直接使用 SQL 提供生成式 AI 功能。

后续操作

如需详细了解 Spanner 的精确最近邻 (KNN 向量搜索) 功能,请参阅:https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

您还可以点击以下链接,详细了解如何使用 Spanner 的 VertexAI 集成通过 SQL 执行在线预测:https://cloud.google.com/spanner/docs/ml