本页面介绍如何使用 Vertex AI 排名模型端点对应用的搜索结果进行排名。
Vertex AI Ranking API 会接收一个文档列表作为输入,然后根据这些文档与给定查询(搜索字符串)的相关程度对它们进行排名。使用 ai.rank()
函数时,它会根据文档回答与给定查询的匹配程度返回一个得分。
如需按本页面上的说明操作,您必须了解 AlloyDB for PostgreSQL,并熟悉生成式 AI 概念。
AlloyDB 会预留并创建 ai
架构。
准备工作
在对搜索结果进行排名之前,请先执行以下操作:
- 验证
google_ml_integration
扩展程序是否已安装。 - 验证
google_ml_integration.enable_model_support
标志是否已设置为on
。 - 与 Vertex AI 集成。
- 启用 Discovery Engine API。
- 获得使用排名模型所需的角色。
启用 Discovery Engine API
控制台
- 启用 API
- 在确认项目步骤中,点击下一步以确认您要更改的项目的名称。
- 在启用 API 步骤中,点击启用以启用 Discovery Engine API。如果您已启用此 API,则不会在此处看到它。
gcloud
如要使用排名模型,您必须启用 Discovery Engine API。
将 PROJECT_ID
替换为您的 Google Cloud 项目 ID,并将 PROJECT_NUMBER
替换为相应的项目编号。
# Enable Discovery Engine API gcloud services enable discoveryengine.googleapis.com --project=PROJECT_ID gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-alloydb.iam.gserviceaccount.com" \ --role="roles/discoveryengine.viewer"
Vertex AI 模型不需要注册排名模型。
您可以使用 Vertex AI 模型名称作为 model_id
,如以下示例所示。
SELECT index, score FROM ai.rank( model_id => 'semantic-ranker-default-003', search_string => 'Affordable family-friendly vacation spots in Southeast Asia?', documents => ARRAY[ 'Luxury resorts in South Korea', 'Family vacation packages for Vietnam: Ha Long Bay and Hoi An', 'Budget-friendly beaches in Thailand perfect for families', 'A backpacker guide to solo travel in India'])
语义排名工具的常见用例是对向量搜索返回的结果进行重新排名,以实现更好的查询排序。以下示例展示了如何针对此用例使用语义排名模型。此示例会使用向量搜索检索查询 personal fitness
equipment
的初始结果集。之后,系统会对这些结果重新排名,返回前 5 个结果。
WITH initial_ranking AS ( SELECT id, description, ROW_NUMBER() OVER () AS ref_number FROM product ORDER BY embedding <=> google_ml.embedding( 'gemini-embedding-001', 'personal fitness equipment')::vector LIMIT 10 ), reranked_results AS ( SELECT index, score FROM ai.rank( model_id => 'semantic-ranker-default-003', search_string => 'personal fitness equipment', documents => (SELECT ARRAY_AGG(description ORDER BY ref_number) FROM initial_ranking), top_n => 5) ) SELECT id, description FROM initial_ranking, reranked_results WHERE initial_ranking.ref_number = reranked_results.index ORDER BY reranked_results.score DESC;
如需查看可用模型及相关用例的列表,请参阅支持的模型。
与 Vertex AI 集成并安装扩展程序
- 与 Vertex AI 集成。
- 确保已安装最新版本的
google_ml_integration
。如需检查已安装的版本,请运行以下命令:
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.4.3 (1 row)
如果未安装该扩展程序,或者安装的版本低于 1.4.3,请运行以下命令来更新该扩展程序:
CREATE EXTENSION IF NOT EXISTS google_ml_integration; ALTER EXTENSION google_ml_integration UPDATE;
如果您在运行上述命令时遇到问题,或者在运行上述命令后扩展程序未更新到 1.4.3 版,请与 AlloyDB 支持团队联系。
确保是最新版本后,运行
upgrade_to_preview_version
过程来安装预览版功能:CALL google_ml.upgrade_to_preview_version(); SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.4.4 (1 row)
所需的角色
如需获得使用 Discovery Engine 中的排名模型所需的权限,请让您的管理员为您授予 your project
的 Discovery Engine Viewer (roles/discoveryengine.viewer
) Identity and Access Management (IAM) 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
对搜索结果进行排名
以下 SQL 查询展示了如何对搜索结果进行排名:
SELECT
ai.rank(
model_id => 'MODEL_ID',
search_string => 'SEARCH_STRING',
documents => ARRAY['DOCUMENT_1', 'DOCUMENT_2', 'DOCUMENT_3']);
替换以下内容:
参数 | 说明 |
---|---|
MODEL_ID |
您定义的模型端点的唯一 ID。 |
SEARCH_STRING |
要针对其对记录进行排名的搜索字符串。 |
DOCUMENTS |
用于标识记录的唯一字符串。 |
如需查看受支持的 Vertex AI 排名模型列表,请参阅支持的模型。
示例
如需使用 Vertex AI 排名模型对搜索结果进行排名,请运行以下查询:
SELECT index, score
FROM
ai.rank(
model_id => 'semantic-ranker-default-003',
search_string => 'AlloyDB is a PostgreSQL compatible AI database that is ready for production.',
documents =>
ARRAY[
'Alloys are made from combination of metals',
'The best enterprise-ready PostgreSQL database.',
'You can feel the heat in Alloy apartments.']);
响应是一个表格,其中列出了每个文档以及根据它们与搜索查询的相关程度计算出的得分。以下是示例响应:
index | score
-------+------------
2 | 0.33
1 | 0.28
3 | 0.16
(3 rows)
假设有一个示例 AlloyDB 数据库,其中包含已转换为嵌入的评价描述列表。以下示例代码段展示了如何使用排名模型根据评价描述与查询的语义相似度来检索排名最高的产品的名称。
WITH initial_ranking AS (
SELECT product_id, name, review, review_id, ROW_NUMBER() OVER () AS ref_number
FROM user_reviews
ORDER BY
review_desc_embedding <=> google_ml.embedding(
'gemini-embedding-001', 'good desserts')::vector
LIMIT 10
), reranked_results AS (
SELECT index, score
FROM
ai.rank(
model_id => 'semantic-ranker-512',
search_string => 'good desserts',
documents => (SELECT ARRAY_AGG(review ORDER BY ref_number) FROM initial_ranking),
top_n => 5)
)
SELECT product_id, name
FROM initial_ranking, reranked_results
WHERE initial_ranking.ref_number = reranked_results.index
ORDER BY reranked_results.score DESC;