使用 AlloyDB、Vector Search 和 Vertex AI 构建专利搜索应用!

1. 概览

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

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

这场革命背后的秘密武器就是 Vector Search。向量搜索不会依赖于简单的关键字匹配,而是会将文本转换为数值表示法(嵌入)。这样,我们就可以根据查询的含义(而不仅仅是使用的具体字词)进行搜索。在文献搜索领域,这是一个革命性的变化。假设您要查找“穿戴式心率监测器”的专利,即使文档中未使用该确切字词,也可以找到相关专利。

目标

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

构建内容

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

  1. 创建 AlloyDB 实例并加载专利公共数据集数据
  2. 在 AlloyDB 中启用 pgvector 和生成式 AI 模型扩展
  3. 根据数据分析生成嵌入
  4. 对用户搜索文本执行实时余弦相似度搜索
  5. 在无服务器 Cloud Functions 中部署解决方案

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

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

要求

  • 一个浏览器,例如 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. 启用所需的 API。 您可以在 Cloud Shell 终端中使用 gcloud 命令:
gcloud services enable alloydb.googleapis.com \ 
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

您可以通过控制台搜索各个产品或使用此链接,以替代 gcloud 命令。

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

3. 准备 AlloyDB 数据库

我们来创建一个 AlloyDB 集群、实例和表,以便加载专利数据集。

创建 AlloyDB 对象

创建一个集群和实例,集群 ID 为“patent-cluster”,密码为“alloydb”,与 PostgreSQL 15 兼容,区域为“us-central1”,网络设置为“default”。将实例 ID 设置为“patent-instance”。点击“创建集群”。如需详细了解如何创建集群,请访问以下链接:https://cloud.google.com/alloydb/docs/cluster-create

创建表

您可以在 AlloyDB Studio 中使用以下 DDL 语句创建表:

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT) ;

启用扩展程序

如需构建专利搜索应用,我们将使用 pgvector 和 google_ml_integration 扩展程序。借助 pgvector 扩展程序,您可以存储和搜索向量嵌入。google_ml_integration 扩展程序提供了一些函数,可用于访问 Vertex AI 预测端点,以便在 SQL 中获取预测结果。运行以下 DDL 以启用这些扩展程序:

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

授予权限

运行以下语句,以授予对“embedding”函数的执行权限:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

向 AlloyDB 服务账号授予 Vertex AI User 角色

在 Google Cloud IAM 控制台中,向 AlloyDB 服务账号(格式为:service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com)授予“Vertex AI 用户”角色的访问权限。PROJECT_NUMBER 将包含您的项目编号。

或者,您也可以使用 gcloud 命令授予访问权限:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

修改表,添加一个用于存储嵌入的“Vector”列

运行以下 DDL 将 abstract_embeddings 字段添加到我们刚刚创建的表中。此列将允许存储文本的向量值:

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

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

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

  1. 在 Google Cloud 控制台中,打开 AlloyDB 页面。
  2. 选择新创建的集群,然后点击实例。
  3. 在 AlloyDB 导航菜单中,点击 AlloyDB Studio。使用凭据登录。
  4. 点击右侧的新标签页图标,打开新标签页。
  5. 将上述 insert_into_patents_data.sql 脚本中的 insert 查询语句复制到编辑器中。您可以复制 50-100 个插入语句,以便快速演示此用例。
  6. 点击运行。查询结果会显示在结果表中。

5. 为专利数据创建嵌入

首先,我们通过运行以下示例查询来测试嵌入函数:

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

这应该会返回查询中示例文本的嵌入矢量,该矢量看起来像一个浮点数数组。如下所示:

25a1d7ef0e49e91e.png

更新 abstract_embeddings 向量字段

运行以下 DML 以使用相应的嵌入更新表中的专利摘要:

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

6. 执行矢量搜索

现在,表格、数据和嵌入都已准备就绪,接下来我们将针对用户搜索文本执行实时向量搜索。您可以通过运行以下查询来进行测试:

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

在此查询中,

  1. 用户搜索的文字是:“一种新的自然语言处理相关机器学习模型”。
  2. 我们将在 embedding() 方法中使用模型 textembedding-gecko@003 将其转换为嵌入。
  3. “<=>”表示使用 COSINE SIMILARITY 距离方法。
  4. 我们将嵌入方法的结果转换为向量类型,以使其与存储在数据库中的向量兼容。
  5. LIMIT 10 表示我们要选择与搜索文本最相符的 10 个结果。

结果如下:

8e77af965fc787ae.png

如您在结果中所见,匹配项与搜索文本非常接近。

7. 将应用移植到 Web 平台

准备好将此应用移植到 Web 平台了吗?请按以下步骤操作:

  1. 前往 Cloud Shell Editor,然后点击编辑器左下角(状态栏)的“Cloud Code - 登录”图标。选择已启用结算功能的当前 Google Cloud 项目,并确保您已在 Gemini 中登录该项目(在状态栏的右下角)。
  2. 点击 Cloud Code 图标,然后等待 Cloud Code 对话框弹出。选择“新建应用”,然后在“创建新应用”弹出式窗口中选择 Cloud Functions 应用:

a800ee1eb6cb8a5b.png

在“创建新应用”弹出式窗口的 2/2 页面中,选择“Java:Hello World”,然后在首选位置输入项目名称“alloydb-pgvector”,最后点击“确定”:

5b09446ecf7d4f8d.png

  1. 在生成的项目结构中,搜索 pom.xml 并将其替换为代码库文件中的内容。除了其他几个依赖项之外,它还应具有以下依赖项:

2b3a3cdd75a57711.png

  1. 将 HelloWorld.java 文件替换为 repo 文件中的内容。

请注意,您必须将以下值替换为实际值:

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values

请注意,该函数需要将搜索文本作为键为“search”的输入参数,在此实现中,我们仅从数据库中返回一个最接近的匹配项:

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
   //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
   try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', '" + searchText + "' )::vector LIMIT 1")) {
     ResultSet resultSet = statement.executeQuery();
     resultSet.next();
     String lit = resultSet.getString("literature");
     result = result + lit + "\n";
     System.out.println("Matching Literature: " + lit);
 }
writer.write("Here is the closest match: " + result);
}
  1. 如需部署您刚刚创建的 Cloud Functions 函数,请从 Cloud Shell 终端运行以下命令。请务必先使用以下命令进入相应的项目文件夹:
cd alloydb-pgvector

然后运行以下命令:

gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

重要步骤

开始部署后,您应该可以在 Google Cloud Run Functions 控制台中看到这些函数。搜索新创建的函数并将其打开,修改配置并更改以下内容:

  1. 前往“运行时、构建、连接和安全设置”
  2. 将超时时间延长至 180 秒
  3. 前往“连接”标签页:

4e83ec8a339cda08.png

  1. 在“入站流量”设置下,确保已选择“允许所有流量”。
  2. 在“出站流量设置”下,点击“网络”下拉菜单,然后选择“添加新的 VPC 连接器”选项,并按照随即弹出的对话框中显示的说明操作:

8126ec78c343f199.png

  1. 为 VPC 连接器提供一个名称,并确保区域与您的实例相同。将“网络”值保留为默认值,并将“子网”设置为“自定义 IP 地址范围”,IP 地址范围为 10.8.0.0 或其他可用的类似 IP 地址。
  2. 展开“显示缩放设置”,并确保将配置设置为完全如下所示:

7baf980463a86a5c.png

  1. 点击“创建”,此连接器现在应已列在出站流量设置中。
  2. 选择新创建的连接器
  3. 选择将所有流量都通过此 VPC 连接器路由。

8. 测试应用

部署完成后,您应该会看到采用以下格式的端点:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

您可以通过在 Cloud Shell 终端中运行以下命令来对其进行测试:

gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

结果:

da3dcfac7d024031.png

您还可以通过 Cloud Functions 列表进行测试。选择已部署的函数,然后前往“测试”标签页。在“Configure triggering event”(配置触发事件)部分的“request json”(请求 JSON)文本框中,输入以下内容:

{"search": "A new Natural Language Processing related Machine Learning Model"}

点击“测试函数”按钮,您可以在页面右侧看到结果:

e21f806d661996ff.png

大功告成!只需这样,即可使用嵌入模型对 AlloyDB 数据执行相似性矢量搜索。

9. 清理

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

  1. 在 Google Cloud 控制台中,前往管理
  2. 资源页面。
  3. 在项目列表中,选择要删除的项目,然后点击删除
  4. 在对话框中输入项目 ID,然后点击关停以删除项目。

10. 恭喜

恭喜!您已成功使用 AlloyDB、pgvector 和向量搜索执行相似度搜索。通过结合 AlloyDBVertex AIVector Search 的功能,我们在让文献搜索变得简单、高效且真正以实用为导向方面取得了长足进步。