Bắt đầu với Spanner Vector Search

1. Giới thiệu

Spanner là một dịch vụ cơ sở dữ liệu được quản lý hoàn toàn theo chiều ngang, có thể mở rộng, phân phối trên toàn cầu, rất phù hợp cho cả khối lượng công việc vận hành có quan hệ lẫn không có quan hệ.

Với việc phát hành chức năng lân cận gần nhất chính xác, Spanner hiện cũng là một cơ sở dữ liệu vectơ có khả năng mở rộng cao, cho phép bạn thực hiện việc tìm kiếm tương tự hoặc tìm kiếm theo ngữ nghĩa và triển khai chức năng tạo tăng cường truy xuất (RAG) trong các ứng dụng AI tạo sinh trên quy mô lớn. Các truy vấn tìm kiếm vectơ của Spanner trả về dữ liệu mới theo thời gian thực ngay sau khi giao dịch được cam kết, giống như bất kỳ truy vấn nào khác về dữ liệu hoạt động của bạn.

Trong phòng thí nghiệm này, bạn sẽ hướng dẫn cách thiết lập các tính năng cơ bản cần thiết để tận dụng Spanner nhằm thực hiện việc tìm kiếm vectơ cũng như truy cập vào các mô hình nhúng và LLM từ khu vườn mô hình của VertexAI bằng SQL.

Cấu trúc sẽ có dạng như sau:

d179a760add7adc0.png

Sản phẩm bạn sẽ tạo ra

Trong phòng thí nghiệm này, bạn sẽ:

  • Tạo một thực thể Spanner
  • Thiết lập giản đồ cơ sở dữ liệu của Spanner để tích hợp với các mô hình nhúng và mô hình LLM trong VertexAI
  • Tải tập dữ liệu bán lẻ
  • Đưa ra cụm từ tìm kiếm tương tự với tập dữ liệu
  • Cung cấp bối cảnh cho mô hình LLM để tạo các đề xuất theo sản phẩm cụ thể.

Kiến thức bạn sẽ học được

  • Cách thiết lập thực thể Spanner
  • Cách tích hợp với VertexAI
  • Cách sử dụng Spanner để tìm kiếm vectơ nhằm tìm các mục tương tự trong một tập dữ liệu bán lẻ

Bạn cần có

  • Một dự án Google Cloud được kết nối với một tài khoản thanh toán.
  • Một trình duyệt web, chẳng hạn như Chrome hoặc Firefox.

2. Thiết lập và yêu cầu

Tạo một dự án

Nếu chưa có Tài khoản Google (Gmail hoặc Google Apps), bạn phải tạo một tài khoản. Đăng nhập vào bảng điều khiển Google Cloud Platform ( console.cloud.google.com) và tạo một dự án mới.

Nếu bạn đã có một dự án, hãy nhấp vào trình đơn kéo xuống để chọn dự án ở phía trên bên trái của bảng điều khiển:

6c9406d9b014760.pngS

và nhấp vào nút "Dự án MỚI" trong hộp thoại kết quả để tạo một dự án mới:

949d83c8a4ee17d9.pngS

Nếu chưa có dự án nào, bạn sẽ thấy một hộp thoại như sau để tạo dự án đầu tiên:

870a3cbd6541ee86.pngS

Hộp thoại tạo dự án tiếp theo cho phép bạn nhập thông tin chi tiết về dự án mới:

6a92c57d3250a4b3.pngS

Xin lưu ý rằng mã dự án là tên duy nhất trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Mã này sẽ được đề cập sau trong lớp học lập trình này với tên PROJECT_ID.

Tiếp theo, nếu chưa bật tính năng thanh toán, bạn sẽ phải bật tính năng thanh toán trong Developers Console để có thể sử dụng tài nguyên trên Google Cloud và bật Spanner API.

15d0ef27a8fbab27.png.

Bạn sẽ không mất quá vài đô la khi chạy lớp học lập trình này, nhưng sẽ tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để chúng chạy (xem phần "dọn dẹp" ở cuối tài liệu này). Bạn có thể xem giá của Google Cloud Spanner tại đây.

Người dùng mới của Google Cloud Platform đủ điều kiện nhận 300 USD dùng thử miễn phí. Vì vậy, lớp học lập trình này sẽ hoàn toàn miễn phí.

Thiết lập Google Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud và Spanner từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Máy ảo dựa trên Debian này được tải tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Tức là tất cả những gì bạn cần để thực hiện lớp học lập trình này là một trình duyệt (vâng, trình duyệt này hoạt động trên Chromebook).

  1. Để kích hoạt Cloud Shell từ Cloud Console, bạn chỉ cần nhấp vào biểu tượng Kích hoạt Cloud Shell gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (chỉ mất vài phút để cấp phép và kết nối với môi trường).

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

Ảnh chụp màn hình lúc 10:13.43 chiều 14/6/2017.png

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành PROJECT_ID.

gcloud auth list

Kết quả lệnh

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu vì lý do nào đó mà dự án không được thiết lập, chỉ cần phát hành lệnh sau:

gcloud config set project <PROJECT_ID>

Bạn đang tìm PROJECT_ID? Hãy xem mã nhận dạng bạn đã sử dụng ở các bước thiết lập hoặc tra cứu trong trang tổng quan Cloud Console:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

Cloud Shell cũng đặt một số biến môi trường theo mặc định. Điều này có thể hữu ích khi bạn chạy các lệnh sau này.

echo $GOOGLE_CLOUD_PROJECT

Kết quả lệnh

<PROJECT_ID>

Bật Spanner API

gcloud services enable spanner.googleapis.com

Tóm tắt

Ở bước này, bạn đã thiết lập dự án của mình nếu bạn chưa có dự án, kích hoạt Cloud shell và bật các API bắt buộc.

Tiếp theo

Tiếp theo, bạn sẽ thiết lập thực thể và cơ sở dữ liệu Spanner.

3. Tạo một thực thể và cơ sở dữ liệu Spanner

Tạo thực thể Spanner

Ở bước này, chúng ta đã thiết lập Thực thể Spanner cho lớp học lập trình này. Để thực hiện việc này, hãy mở Cloud Shell và chạy lệnh sau:

export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1

Kết quả của lệnh:

$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
Creating instance...done.  

Tạo cơ sở dữ liệu

Khi thực thể của bạn đang chạy, bạn có thể tạo cơ sở dữ liệu. Spanner cho phép nhiều cơ sở dữ liệu trên một thực thể.

Cơ sở dữ liệu là nơi bạn xác định giản đồ của mình. Bạn cũng có thể kiểm soát ai có quyền truy cập vào cơ sở dữ liệu, thiết lập mã hoá tuỳ chỉnh, định cấu hình trình tối ưu hoá và đặt khoảng thời gian lưu giữ.

Để tạo cơ sở dữ liệu, hãy sử dụng lại công cụ dòng lệnh gcloud:

export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

Kết quả của lệnh:

$ gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID
Creating database...done.

Tóm tắt

Ở bước này, bạn đã tạo phiên bản thể hiện và cơ sở dữ liệu Spanner.

Tiếp theo

Tiếp theo, bạn sẽ thiết lập giản đồ và dữ liệu Spanner.

4. Tải dữ liệu và giản đồ Cymbal

Tạo giản đồ Cymbal

Để thiết lập giản đồ, hãy chuyển đến Spanner Studio:

3e1a0feed928b33cf.png.

Giản đồ có hai phần. Trước tiên, bạn muốn thêm bảng products. Sao chép và dán câu lệnh này vào thẻ trống.

Đối với giản đồ, hãy sao chép và dán DDL này vào hộp:

CREATE TABLE products (
categoryId INT64 NOT NULL,
productId INT64 NOT NULL,
productName STRING(MAX) NOT NULL,
productDescription STRING(MAX) NOT NULL,
productDescriptionEmbedding ARRAY<FLOAT64>,
createTime TIMESTAMP NOT NULL OPTIONS (
allow_commit_timestamp = true
),
inventoryCount INT64 NOT NULL,
priceInCents INT64,
) PRIMARY KEY(categoryId, productId);

Sau đó, hãy nhấp vào nút run rồi đợi vài giây để tạo giản đồ.

Tiếp theo, bạn sẽ tạo hai mô hình và định cấu hình chúng cho các điểm cuối của mô hình VertexAI.

Mô hình đầu tiên là mô hình Nhúng dùng để tạo các mục nhúng từ văn bản, còn mô hình thứ hai là mô hình LLM (mô hình ngôn ngữ lớn) dùng để tạo các câu trả lời dựa trên dữ liệu trong Spanner.

Dán giản đồ sau vào một thẻ mới trong Spanner Studio:

CREATE MODEL EmbeddingsModel INPUT(
content STRING(MAX),
) OUTPUT(
embeddings STRUCT<statistics STRUCT<truncated BOOL, token_count FLOAT64>, values ARRAY<FLOAT64>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/textembedding-gecko@003'
);

CREATE MODEL LLMModel INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-bison@001',
default_batch_size = 1
);

Sau đó, nhấp vào nút run và đợi vài giây để tạo mô hình.

Trong ngăn bên trái của Spanner Studio, bạn sẽ thấy các bảng và mô hình sau:

62455aa4b0e839d9.pngS

Tải dữ liệu

Bây giờ, bạn sẽ muốn chèn một số sản phẩm vào cơ sở dữ liệu của mình. Mở một thẻ mới trong Spanner Studio, sau đó sao chép và dán các câu lệnh chèn sau:

INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);

Nhấp vào nút run để chèn dữ liệu.

Tóm tắt

Ở bước này, bạn đã tạo giản đồ và tải một số dữ liệu cơ bản vào cơ sở dữ liệu cymbal-bikes.

Tiếp theo

Tiếp theo, bạn sẽ tích hợp với mô hình Nhúng để tạo các mục nhúng cho nội dung mô tả sản phẩm, cũng như chuyển đổi một yêu cầu tìm kiếm dạng văn bản thành một mục nhúng để tìm kiếm các sản phẩm có liên quan.

5. Làm việc với các mục nhúng

Tạo các mục nhúng vectơ cho nội dung mô tả sản phẩm

Để tính năng tìm kiếm điểm tương đồng hoạt động trên các sản phẩm, bạn cần tạo các mục nhúng cho nội dung mô tả sản phẩm.

Với EmbeddingsModel được tạo trong giản đồ, đây là một câu lệnh DML UPDATE đơn giản.

UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;

Nhấp vào nút run để cập nhật nội dung mô tả sản phẩm.

Trong ví dụ này, bạn sẽ cung cấp yêu cầu tìm kiếm bằng ngôn ngữ tự nhiên thông qua truy vấn SQL. Cụm từ tìm kiếm này sẽ chuyển yêu cầu tìm kiếm thành một mục nhúng, sau đó tìm kiếm kết quả tương tự dựa trên mục nhúng đã lưu trữ cho nội dung mô tả sản phẩm đã được tạo ở bước trước.

-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.


SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

Nhấp vào nút run để tìm các sản phẩm tương tự. Kết quả sẽ có dạng như sau:

672e111753077fcf.png.

Xin lưu ý rằng các bộ lọc bổ sung được sử dụng cho cụm từ tìm kiếm, chẳng hạn như chỉ quan tâm đến những sản phẩm còn hàng (inventoryCount > 0).

Tóm tắt

Trong bước này, bạn đã tạo các mục nhúng nội dung mô tả sản phẩm và một mục nhúng yêu cầu tìm kiếm bằng SQL, tận dụng tính năng tích hợp của Spanner với các mô hình trong VertexAI. Bạn cũng đã thực hiện tìm kiếm vectơ để tìm các sản phẩm tương tự phù hợp với yêu cầu tìm kiếm.

Các bước tiếp theo

Tiếp theo, hãy sử dụng kết quả tìm kiếm để cấp dữ liệu cho một LLM (mô hình ngôn ngữ lớn) nhằm tạo phản hồi tuỳ chỉnh cho từng sản phẩm.

6. Làm việc với một mô hình ngôn ngữ lớn (LLM)

Spanner giúp bạn dễ dàng tích hợp với các mô hình LLM do VertexAI cung cấp. Điều này cho phép nhà phát triển sử dụng SQL để giao tiếp trực tiếp với các LLM, thay vì yêu cầu ứng dụng thực hiện logic.

Ví dụ: chúng ta có kết quả từ truy vấn SQL trước đó từ người dùng "I'd like to buy a starter bike for my 3 year old child".

Đối với mỗi kết quả, nhà phát triển muốn phản hồi về việc sản phẩm có phù hợp với người dùng hay không bằng cách sử dụng câu lệnh sau:

"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"

Dưới đây là truy vấn bạn có thể sử dụng:

-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM ML.PREDICT(
MODEL LLMModel,
(   SELECT
inventoryCount,
productName,
productDescription,
CONCAT(
"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me?",
"I'd like to buy a starter bike for my 3 year old child \n",
"Product Name: ", productName, "\n",
"Product Description:", productDescription) AS prompt,
FROM products
WHERE inventoryCount > 0
ORDER by COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
( SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) LIMIT 5
),
STRUCT(256 AS maxOutputTokens)
);

Nhấp vào nút run để đưa ra truy vấn. Kết quả sẽ có dạng như sau:

35878cd0f88f1470.pngS

Sản phẩm đầu tiên là sản phẩm phù hợp cho bé 3 tuổi vì sản phẩm phù hợp với lứa tuổi trong phần mô tả sản phẩm (từ 2 đến 4 tuổi). Các sản phẩm khác không phù hợp lắm.

Tóm tắt

Các bước tiếp theo

Tiếp theo, đã đến lúc dọn dẹp!

7. Dọn dẹp (không bắt buộc)

Để dọn dẹp, bạn chỉ cần chuyển đến phần Cloud Spanner của Cloud Console rồi xoá thực thể 'retail-demo' mà chúng ta đã tạo trong lớp học lập trình này.

41cbc1a84b3588d5.pngS

8. Xin chúc mừng!

Xin chúc mừng, bạn đã thực hiện thành công tìm kiếm tương tự bằng tìm kiếm vectơ tích hợp sẵn của Spanner. Ngoài ra, bạn đã thấy việc sử dụng các mô hình nhúng và LLM để cung cấp trực tiếp chức năng AI tạo sinh bằng SQL dễ dàng như thế nào.

Tiếp theo là gì?

Tìm hiểu thêm về tính năng hàng xóm gần nhất chính xác của Spanner (tìm kiếm vectơ KNN) tại đây: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Bạn cũng có thể đọc thêm về cách dự đoán trực tuyến bằng SQL bằng công cụ tích hợp VertexAI của Spanner tại đây: https://cloud.google.com/spanner/docs/ml