本教程介绍了如何使用 Google Cloud 控制台在 AlloyDB for PostgreSQL 中设置和执行矢量搜索。我们在其中添加了一些示例来展示向量搜索功能,这些示例仅供演示之用。
如需了解如何使用 Vertex AI 嵌入执行向量搜索,请参阅 AlloyDB AI 中的向量嵌入使用入门。
目标
- 创建 AlloyDB 集群和主实例。
- 连接到数据库并安装所需的扩展程序。
- 创建
product
和product inventory
表。 - 将数据插入
product
和product inventory
表,然后执行基本向量搜索。 - 在 products 表上创建 ScaNN 索引。
- 执行简单的向量搜索。
- 使用过滤条件和联接执行复杂的向量搜索。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
启用结算功能和所需的 API
在 Google Cloud 控制台中,前往集群页面。
启用创建和连接到 AlloyDB for PostgreSQL 所需的 Cloud API。
- 在确认项目步骤中,点击下一步以确认要更改的项目的名称。
在启用 API 步骤中,点击启用以启用以下各项:
- AlloyDB API
- Compute Engine API
- Service Networking API
- Vertex AI API
创建 AlloyDB 集群和主实例
在 Google Cloud 控制台中,前往集群页面。
点击创建集群。
在集群 ID 中,输入
my-cluster
。输入密码。记下此密码,因为您在本教程中会用到它。
选择一个区域,例如
us-central1 (Iowa)
。选择默认网络。
如果您有专用访问权限连接,请继续执行下一步。否则,请点击设置关联,然后按照以下步骤操作:
- 在分配 IP 范围中,点击使用自动分配的 IP 范围。
- 点击继续,然后点击创建关联。
在可用区级可用性中,选择单个可用区。
选择
2 vCPU,16 GB
机器类型。在连接中,选择启用公共 IP。
点击创建集群。AlloyDB 可能需要几分钟才能创建集群并将其显示在主集群的概览页面上。
在集群中的实例中,展开连接窗格。记下连接 URI,因为您在本教程中会用到它。
连接 URI 采用
projects/<var>PROJECT_ID</var>/locations/<var>REGION_ID</var>/clusters/my-cluster/instances/my-cluster-primary
格式。
向 AlloyDB 服务代理授予 Vertex AI 用户权限
如需让 AlloyDB 使用 Vertex AI 文本嵌入模型,您必须为集群和实例所在的项目的 AlloyDB 服务代理添加 Vertex AI 用户权限。
如需详细了解如何添加权限,请参阅向 AlloyDB 服务代理授予 Vertex AI 用户权限。
使用网络浏览器连接到数据库
在 Google Cloud 控制台中,前往集群页面。
在资源名称列中,点击集群的名称
my-cluster
。在导航窗格中,点击 AlloyDB Studio。
在登录 AlloyDB Studio 页面中,按以下步骤操作:
- 选择
postgres
数据库。 - 选择
postgres
用户。 - 输入您在创建集群及其主实例中创建的密码。
- 点击身份验证。Explorer 窗格会显示
postgres
数据库中的对象列表。
- 选择
点击 + 新的 SQL 编辑器标签页或 + 新标签页以打开新标签页。
安装所需的扩展程序
运行以下查询以安装 vector
、alloydb_scann
和 google_ml_integration
扩展程序:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
插入商品和商品目录数据并执行基本向量搜索
运行以下语句以创建一个
product
表,该表执行以下操作:- 存储基本商品信息。
- 包含一个
embedding
向量列,用于计算和存储每个商品的商品说明的嵌入向量。
CREATE TABLE product ( id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, category VARCHAR(255), color VARCHAR(255), embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005', description)) STORED );
运行以下查询以创建一个
product_inventory
表,用于存储有关可用商品目录和相应价格的信息。本教程中,product_inventory
和product
表用于运行复杂的矢量搜索查询。CREATE TABLE product_inventory ( id INT PRIMARY KEY, product_id INT REFERENCES product(id), inventory INT, price DECIMAL(10,2) );
运行以下查询,将商品数据插入
product
表中:INSERT INTO product (id, name, description,category, color) VALUES (1, 'Stuffed Elephant', 'Soft plush elephant with floppy ears.', 'Plush Toys', 'Gray'), (2, 'Remote Control Airplane', 'Easy-to-fly remote control airplane.', 'Vehicles', 'Red'), (3, 'Wooden Train Set', 'Classic wooden train set with tracks and trains.', 'Vehicles', 'Multicolor'), (4, 'Kids Tool Set', 'Toy tool set with realistic tools.', 'Pretend Play', 'Multicolor'), (5, 'Play Food Set', 'Set of realistic play food items.', 'Pretend Play', 'Multicolor'), (6, 'Magnetic Tiles', 'Set of colorful magnetic tiles for building.', 'Construction Toys', 'Multicolor'), (7, 'Kids Microscope', 'Microscope for kids with different magnification levels.', 'Educational Toys', 'White'), (8, 'Telescope for Kids', 'Telescope designed for kids to explore the night sky.', 'Educational Toys', 'Blue'), (9, 'Coding Robot', 'Robot that teaches kids basic coding concepts.', 'Educational Toys', 'White'), (10, 'Kids Camera', 'Durable camera for kids to take pictures and videos.', 'Electronics', 'Pink'), (11, 'Walkie Talkies', 'Set of walkie talkies for kids to communicate.', 'Electronics', 'Blue'), (12, 'Karaoke Machine', 'Karaoke machine with built-in microphone and speaker.', 'Electronics', 'Black'), (13, 'Kids Drum Set', 'Drum set designed for kids with adjustable height.', 'Musical Instruments', 'Blue'), (14, 'Kids Guitar', 'Acoustic guitar for kids with nylon strings.', 'Musical Instruments', 'Brown'), (15, 'Kids Keyboard', 'Electronic keyboard with different instrument sounds.', 'Musical Instruments', 'Black'), (16, 'Art Easel', 'Double-sided art easel with chalkboard and whiteboard.', 'Arts & Crafts', 'White'), (17, 'Finger Paints', 'Set of non-toxic finger paints for kids.', 'Arts & Crafts', 'Multicolor'), (18, 'Modeling Clay', 'Set of colorful modeling clay.', 'Arts & Crafts', 'Multicolor'), (19, 'Watercolor Paint Set', 'Watercolor paint set with brushes and palette.', 'Arts & Crafts', 'Multicolor'), (20, 'Beading Kit', 'Kit for making bracelets and necklaces with beads.', 'Arts & Crafts', 'Multicolor'), (21, '3D Puzzle', '3D puzzle of a famous landmark.', 'Puzzles', 'Multicolor'), (22, 'Race Car Track Set', 'Race car track set with cars and accessories.', 'Vehicles', 'Multicolor'), (23, 'RC Monster Truck', 'Remote control monster truck with oversized tires.', 'Vehicles', 'Green'), (24, 'Train Track Expansion Set', 'Expansion set for wooden train tracks.', 'Vehicles', 'Multicolor');
可选:运行以下查询,验证数据是否已插入
product
表:SELECT * FROM product;
运行以下查询,将商品目录数据插入
product_inventory
表中:INSERT INTO product_inventory (id, product_id, inventory, price) VALUES (1, 1, 9, 13.09), (2, 2, 40, 79.82), (3, 3, 34, 52.49), (4, 4, 9, 12.03), (5, 5, 36, 71.29), (6, 6, 10, 51.49), (7, 7, 7, 37.35), (8, 8, 6, 10.87), (9, 9, 7, 42.47), (10, 10, 3, 24.35), (11, 11, 4, 10.20), (12, 12, 47, 74.57), (13, 13, 5, 28.54), (14, 14, 11, 25.58), (15, 15, 21, 69.84), (16, 16, 6, 47.73), (17, 17, 26, 81.00), (18, 18, 11, 91.60), (19, 19, 8, 78.53), (20, 20, 43, 84.33), (21, 21, 46, 90.01), (22, 22, 6, 49.82), (23, 23, 37, 50.20), (24, 24, 27, 99.27);
运行以下向量搜索查询,尝试查找与字词
music
相似的商品。这意味着,即使商品说明中未明确提及music
一词,结果也会显示与该查询相关的商品:SELECT * FROM product ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector LIMIT 3;
查询结果如下所示:
在不创建索引的情况下执行基本向量搜索时,系统会使用精确最近邻搜索 (KNN),从而提供高效的召回率。在大规模使用时,使用 KNN 可能会影响性能。为了获得更好的查询性能,我们建议您使用 ScaNN 索引进行近似最近邻 (ANN) 搜索,这样可以实现高召回率和低延迟。
如果不创建索引,AlloyDB 会默认使用精确最近邻搜索 (KNN)。
如需详细了解如何大规模使用 ScaNN,请参阅 AlloyDB AI 中的向量嵌入使用入门。
在 products 表上创建 ScaNN 索引
运行以下查询,在 product
表上创建 product_index
ScaNN 索引:
CREATE INDEX product_index ON product
USING scann (embedding cosine)
WITH (num_leaves=5);
num_leaves
参数表示基于树的索引用于构建索引的叶子节点数。如需详细了解如何调整此参数,请参阅调整矢量查询性能。
执行向量搜索
运行以下向量搜索查询,尝试查找与自然语言查询 music
类似的商品。即使商品说明中未包含 music
一词,结果也会显示与查询相关的商品:
SET LOCAL scann.num_leaves_to_search = 2;
SELECT * FROM product
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;
查询结果如下所示:
scann.num_leaves_to_search
查询参数用于控制在相似度搜索期间搜索的叶节点数。num_leaves
和 scann.num_leaves_to_search
参数值有助于实现效果和召回率之间的平衡。
执行使用过滤条件和联接的矢量搜索
即使使用了 Scann 索引,您也可以高效运行过滤的矢量搜索查询。运行以下复杂的矢量搜索查询,该查询会返回满足查询条件的相关结果,即使使用过滤条件也是如此:
SET LOCAL scann.num_leaves_to_search = 2;
SELECT * FROM product p
JOIN product_inventory pi ON p.id = pi.product_id
WHERE pi.price < 80.00
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;