1. 概览
在各个行业中,专利研究都是了解竞争格局、发现潜在的许可或收购机会以及避免侵犯现有专利的重要工具。
专利研究浩瀚而复杂。从无数的技术摘要中过滤出相关创新是一项艰巨的任务。传统的基于关键字的搜索通常不准确且耗时。摘要内容冗长且技术性强,因此很难快速掌握核心要点。这可能会导致研究人员错过关键专利,或者在无关结果上浪费时间。
这场革命背后的秘密武器就是 Vector Search。向量搜索不会依赖于简单的关键字匹配,而是会将文本转换为数值表示法(嵌入)。这样,我们就可以根据查询的含义(而不仅仅是使用的具体字词)进行搜索。在文献搜索领域,这是一个革命性的变化。假设您要查找“穿戴式心率监测器”的专利,即使文档中未使用该确切字词,也可以找到相关专利。
目标
在此 Codelab 中,我们将利用 AlloyDB、pgvector 扩展程序以及原位 Gemini 1.5 Pro、嵌入和向量搜索,让搜索专利的过程变得更快、更直观、更精确。
构建内容
在本实验中,您将执行以下操作:
- 创建 AlloyDB 实例并加载专利公共数据集数据
- 在 AlloyDB 中启用 pgvector 和生成式 AI 模型扩展
- 根据数据分析生成嵌入
- 对用户搜索文本执行实时余弦相似度搜索
- 在无服务器 Cloud Functions 中部署解决方案
下图显示了数据流和实现过程中涉及的步骤。
High level diagram representing the flow of the Patent Search Application with AlloyDB
要求
2. 准备工作
创建项目
- 在 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>
- 启用所需的 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
脚本,用于加载专利数据。
- 在 Google Cloud 控制台中,打开 AlloyDB 页面。
- 选择新创建的集群,然后点击实例。
- 在 AlloyDB 导航菜单中,点击 AlloyDB Studio。使用凭据登录。
- 点击右侧的新标签页图标,打开新标签页。
- 将上述
insert_into_patents_data.sql
脚本中的insert
查询语句复制到编辑器中。您可以复制 50-100 个插入语句,以便快速演示此用例。 - 点击运行。查询结果会显示在结果表中。
5. 为专利数据创建嵌入
首先,我们通过运行以下示例查询来测试嵌入函数:
SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');
这应该会返回查询中示例文本的嵌入矢量,该矢量看起来像一个浮点数数组。如下所示:
更新 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;
在此查询中,
- 用户搜索的文字是:“一种新的自然语言处理相关机器学习模型”。
- 我们将在 embedding() 方法中使用模型 textembedding-gecko@003 将其转换为嵌入。
- “<=>”表示使用 COSINE SIMILARITY 距离方法。
- 我们将嵌入方法的结果转换为向量类型,以使其与存储在数据库中的向量兼容。
- LIMIT 10 表示我们要选择与搜索文本最相符的 10 个结果。
结果如下:
如您在结果中所见,匹配项与搜索文本非常接近。
7. 将应用移植到 Web 平台
准备好将此应用移植到 Web 平台了吗?请按以下步骤操作:
- 前往 Cloud Shell Editor,然后点击编辑器左下角(状态栏)的“Cloud Code - 登录”图标。选择已启用结算功能的当前 Google Cloud 项目,并确保您已在 Gemini 中登录该项目(在状态栏的右下角)。
- 点击 Cloud Code 图标,然后等待 Cloud Code 对话框弹出。选择“新建应用”,然后在“创建新应用”弹出式窗口中选择 Cloud Functions 应用:
在“创建新应用”弹出式窗口的 2/2 页面中,选择“Java:Hello World”,然后在首选位置输入项目名称“alloydb-pgvector”,最后点击“确定”:
- 在生成的项目结构中,搜索 pom.xml 并将其替换为代码库文件中的内容。除了其他几个依赖项之外,它还应具有以下依赖项:
- 将 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);
}
- 如需部署您刚刚创建的 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 控制台中看到这些函数。搜索新创建的函数并将其打开,修改配置并更改以下内容:
- 前往“运行时、构建、连接和安全设置”
- 将超时时间延长至 180 秒
- 前往“连接”标签页:
- 在“入站流量”设置下,确保已选择“允许所有流量”。
- 在“出站流量设置”下,点击“网络”下拉菜单,然后选择“添加新的 VPC 连接器”选项,并按照随即弹出的对话框中显示的说明操作:
- 为 VPC 连接器提供一个名称,并确保区域与您的实例相同。将“网络”值保留为默认值,并将“子网”设置为“自定义 IP 地址范围”,IP 地址范围为 10.8.0.0 或其他可用的类似 IP 地址。
- 展开“显示缩放设置”,并确保将配置设置为完全如下所示:
- 点击“创建”,此连接器现在应已列在出站流量设置中。
- 选择新创建的连接器
- 选择将所有流量都通过此 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"}'
结果:
您还可以通过 Cloud Functions 列表进行测试。选择已部署的函数,然后前往“测试”标签页。在“Configure triggering event”(配置触发事件)部分的“request json”(请求 JSON)文本框中,输入以下内容:
{"search": "A new Natural Language Processing related Machine Learning Model"}
点击“测试函数”按钮,您可以在页面右侧看到结果:
大功告成!只需这样,即可使用嵌入模型对 AlloyDB 数据执行相似性矢量搜索。
9. 清理
为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:
10. 恭喜
恭喜!您已成功使用 AlloyDB、pgvector 和向量搜索执行相似度搜索。通过结合 AlloyDB、Vertex AI 和 Vector Search 的功能,我们在让文献搜索变得简单、高效且真正以实用为导向方面取得了长足进步。