1. Giới thiệu
Những tiến bộ gần đây trong lĩnh vực học sâu đã giúp chúng ta có thể biểu diễn văn bản và các dữ liệu khác theo cách nắm bắt được ý nghĩa ngữ nghĩa. Điều này đã dẫn đến một phương pháp tìm kiếm mới, được gọi là tìm kiếm vectơ. Phương pháp này sử dụng các biểu diễn vectơ của văn bản (được gọi là giá trị nhúng) để tìm những tài liệu phù hợp nhất với truy vấn của người dùng. Phương pháp tìm kiếm vectơ được ưu tiên hơn phương pháp tìm kiếm truyền thống đối với các ứng dụng như tìm kiếm quần áo. Trong đó, người dùng thường tìm kiếm mặt hàng theo nội dung mô tả, kiểu dáng hoặc bối cảnh thay vì theo tên sản phẩm hoặc tên thương hiệu chính xác. Chúng ta có thể tích hợp cơ sở dữ liệu Cloud Spanner với tính năng Tìm kiếm vectơ để thực hiện việc so khớp mức độ tương đồng của vectơ. Bằng cách sử dụng Spanner và Tìm kiếm vectơ cùng nhau, khách hàng có thể tạo một cấu hình tích hợp mạnh mẽ, kết hợp tính khả dụng, độ tin cậy và khả năng mở rộng của Spanner với các tính năng tìm kiếm mức độ tương đồng nâng cao của Vertex AI Vector Search. Quá trình tìm kiếm này được thực hiện bằng cách so sánh embeddings của các mặt hàng trong chỉ mục của Tìm kiếm vectơ và trả về các kết quả phù hợp nhất.
Trường hợp sử dụng
Hãy tưởng tượng bạn là một nhà khoa học dữ liệu tại một nhà bán lẻ thời trang đang cố gắng bắt kịp các xu hướng, lượt tìm kiếm sản phẩm và đề xuất thay đổi nhanh chóng. Thử thách là bạn có nguồn lực và các silo dữ liệu hạn chế. Bài đăng trên blog này minh hoạ cách triển khai trường hợp sử dụng đề xuất quần áo bằng phương pháp tìm kiếm mức độ tương đồng trên dữ liệu quần áo.Chúng ta sẽ đề cập đến các bước sau:
- Dữ liệu lấy từ Spanner
- Các vectơ được tạo cho dữ liệu quần áo bằng ML.PREDICT và được lưu trữ trong Spanner
- Dữ liệu vectơ Spanner được tích hợp với tính năng Tìm kiếm vectơ bằng các công việc luồng dữ liệu và quy trình làm việc
- Tính năng Tìm kiếm vectơ được thực hiện để tìm kết quả so khớp mức độ tương đồng cho dữ liệu đầu vào do người dùng nhập
Chúng ta sẽ xây dựng một ứng dụng web minh hoạ để thực hiện tìm kiếm quần áo dựa trên hoạt động đầu vào của người dùng. Ứng dụng này cho phép người dùng tìm kiếm quần áo bằng cách nhập nội dung mô tả bằng văn bản.
Spanner đến chỉ mục Tìm kiếm vectơ:
Dữ liệu cho tính năng tìm kiếm quần áo được lưu trữ trong Spanner. Chúng ta sẽ gọi Vertex AI Embeddings API trong cấu trúc ML.PREDICT trực tiếp từ dữ liệu Spanner. Sau đó, chúng ta sẽ tận dụng các công việc Luồng dữ liệu và Quy trình làm việc để tải hàng loạt dữ liệu này (kho hàng và giá trị nhúng) lên tính năng Tìm kiếm vectơ của Vertex AI và làm mới chỉ mục.
Chạy truy vấn của người dùng trên chỉ mục:
Khi người dùng nhập nội dung mô tả quần áo, ứng dụng sẽ tạo giá trị nhúng theo thời gian thực bằng API Giá trị nhúng văn bản. Sau đó, giá trị này được gửi dưới dạng thông tin đầu vào đến Vector Search API để tìm 10 nội dung mô tả sản phẩm có mức độ liên quan từ chỉ mục và hiển thị hình ảnh tương ứng.
Tổng quan về Cấu trúc (Architecture)
Cấu trúc của ứng dụng tìm kiếm Spanner – Tìm kiếm vectơ được thể hiện trong sơ đồ 2 phần sau:
Spanner đến chỉ mục Tìm kiếm vectơ: 
Ứng dụng máy khách để chạy truy vấn của người dùng trên chỉ mục:
Những gì bạn sẽ xây dựng
Spanner đến chỉ mục vectơ:
- Cơ sở dữ liệu Spanner để lưu trữ và quản lý dữ liệu nguồn cũng như các giá trị nhúng tương ứng
- Một công việc Quy trình làm việc tải hàng loạt dữ liệu (mã nhận dạng và giá trị nhúng) vào cơ sở dữ liệu Tìm kiếm vectơ của Vertex AI.
- Một Vector Search API được dùng để tìm nội dung mô tả sản phẩm có liên quan từ chỉ mục.
Chạy truy vấn của người dùng trên chỉ mục:
- Một ứng dụng web cho phép người dùng nhập nội dung mô tả bằng văn bản về quần áo, thực hiện tìm kiếm mức độ tương đồng bằng điểm cuối chỉ mục đã triển khai và trả về quần áo gần nhất với dữ liệu đầu vào.
Cách hoạt động
Khi người dùng nhập nội dung mô tả bằng văn bản về quần áo, ứng dụng web sẽ gửi nội dung mô tả đó đến Vector Search API. Sau đó, Vector Search API sử dụng giá trị nhúng của nội dung mô tả quần áo để tìm nội dung mô tả sản phẩm phù hợp nhất từ chỉ mục. Nội dung mô tả sản phẩm và hình ảnh tương ứng sẽ được hiển thị cho người dùng. Quy trình làm việc chung như sau:
- Tạo giá trị nhúng cho dữ liệu được lưu trữ trong Spanner.
- Xuất và tải embeddings lên chỉ mục của Tìm kiếm vectơ.
- Truy vấn chỉ mục của Tìm kiếm vectơ để tìm các mặt hàng tương tự bằng cách thực hiện tìm kiếm lân cận gần nhất.
2. Yêu cầu
- Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
- Một dự án Google Cloud đã bật tính năng thanh toán
Trước khi bắt đầu
- Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án Google Cloud
- Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên đám mây. Tìm hiểu cách kiểm tra xem tính năng thanh toán đã được bật cho một dự án hay chưa
- Đảm bảo rằng bạn đã bật tất cả các API cần thiết (Cloud Spanner, Vertex AI, Google Cloud Storage) enabled
- Bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn gcloud. Tham khảo tài liệu để biết các lệnh và cách sử dụng gcloud. Nếu dự án của bạn chưa được thiết lập, hãy sử dụng lệnh sau để thiết lập:
gcloud config set project <YOUR_PROJECT_ID>
- Chuyển đến trang Cloud Spanner bằng dự án Google Cloud đang hoạt động để bắt đầu
3. Phần phụ trợ: Tạo nguồn dữ liệu và giá trị nhúng Spanner
Trong trường hợp sử dụng này, cơ sở dữ liệu Spanner chứa kho hàng quần áo cùng với hình ảnh và nội dung mô tả tương ứng. Đảm bảo bạn tạo embeddings cho nội dung mô tả bằng văn bản và lưu trữ các embeddings đó trong cơ sở dữ liệu Spanner dưới dạng ARRAY<float64>.
- Tạo dữ liệu Spanner
Tạo một thực thể có tên là "spanner-vertex" và một cơ sở dữ liệu có tên là "spanner-vertex-embeddings". Tạo một bảng bằng DDL:
CREATE TABLE
apparels ( id NUMERIC,
category STRING(100),
sub_category STRING(50),
uri STRING(200),
content STRING(2000),
embedding ARRAY<FLOAT64>
)
PRIMARY KEY
(id);
- Chèn dữ liệu vào bảng bằng INSERT SQL
Bạn có thể tìm thấy các tập lệnh chèn cho dữ liệu mẫu tại đây.
- Tạo mô hình nhúng văn bản
Bạn cần thực hiện việc này để có thể tạo embeddings cho nội dung trong thông tin đầu vào. Dưới đây là DDL cho cùng một nội dung:
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
embeddings
STRUCT<
statistics STRUCT<truncated BOOL, token_count FLOAT64>,
values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/abis-345004/locations/us-central1/publishers/google/models/textembedding-gecko');
- Tạo embeddings văn bản cho dữ liệu nguồn
Tạo một bảng để lưu trữ giá trị nhúng và chèn giá trị nhúng đã tạo. Trong một ứng dụng cơ sở dữ liệu thực tế, quá trình tải dữ liệu lên Spanner cho đến bước 2 sẽ là giao dịch. Để giữ nguyên các phương pháp hay nhất về thiết kế, tôi thích giữ các bảng giao dịch được chuẩn hoá, vì vậy, tôi sẽ tạo một bảng riêng cho giá trị nhúng.
CREATE TABLE apparels_embeddings (id string(100), embedding ARRAY<FLOAT64>)
PRIMARY KEY (id);
INSERT INTO apparels_embeddings(id, embeddings)
SELECT CAST(id as string), embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT id, content from apparels)
) ;
Bây giờ, khi nội dung và giá trị nhúng hàng loạt đã sẵn sàng, hãy tạo một Chỉ mục Tìm kiếm vectơ và Điểm cuối để lưu trữ giá trị nhúng giúp thực hiện Tìm kiếm vectơ.
4. Công việc quy trình làm việc: Xuất dữ liệu Spanner sang Tìm kiếm vectơ
- Tạo một bộ chứa Cloud Storage
Bạn cần thực hiện việc này để lưu trữ embeddings từ Spanner trong một bộ chứa GCS ở định dạng JSON mà tính năng Tìm kiếm vectơ mong đợi dưới dạng dữ liệu đầu vào. Tạo một bộ chứa trong cùng khu vực với dữ liệu của bạn trong Spanner. Tạo một thư mục bên trong nếu cần, nhưng chủ yếu là tạo một tệp trống có tên là empty.json trong đó.
- Thiết lập Cloud Workflow
Cách thiết lập quy trình xuất hàng loạt từ Spanner sang chỉ mục Tìm kiếm vectơ của Vertex AI:
Tạo một chỉ mục trống:
Đảm bảo rằng Chỉ mục Tìm kiếm vectơ nằm trong cùng khu vực với Bộ chứa Cloud Storage và dữ liệu. Làm theo 11 bước hướng dẫn trong thẻ bảng điều khiển trên phần Tạo chỉ mục để cập nhật theo lô trong trang quản lý chỉ mục. Trong thư mục được truyền đến contentsDeltaUri, hãy tạo một tệp trống có tên là empty.json vì bạn sẽ không thể tạo chỉ mục nếu không có tệp này. Thao tác này sẽ tạo một chỉ mục trống.
Nếu đã có chỉ mục, bạn có thể bỏ qua bước này. Quy trình làm việc sẽ ghi đè chỉ mục của bạn.
Lưu ý: Bạn không thể triển khai một chỉ mục trống đến một điểm cuối. Vì vậy, chúng ta sẽ hoãn bước triển khai chỉ mục đó đến một điểm cuối ở bước sau, sau khi xuất dữ liệu vectơ sang Cloud Storage.
Sao chép kho lưu trữ git này: Có nhiều cách để sao chép kho lưu trữ git, một cách là chạy lệnh sau bằng GitHub CLI. Chạy 2 lệnh bên dưới từ Thiết bị đầu cuối Cloud Shell:
gh repo clone cloudspannerecosystem/spanner-ai
cd spanner-ai/vertex-vector-search/workflows
Thư mục này chứa hai tệp
batch-export.yaml: Đây là định nghĩa quy trình làm việc.sample-batch-input.json: Đây là một mẫu của các tham số đầu vào quy trình làm việc.
Thiết lập input.json từ tệp mẫu: Trước tiên, hãy sao chép json mẫu.
cp sample-batch-input.json input.json
Sau đó, chỉnh sửa input.json bằng thông tin chi tiết cho dự án của bạn. Trong trường hợp này, json của bạn sẽ như sau:
{
"project_id": "<<YOUR_PROJECT>>",
"location": "<<us-central1>>",
"dataflow": {
"temp_location": "gs://<<YOUR_BUCKET>>/<<FOLDER_IF_ANY>>/workflow_temp"
},
"gcs": {
"output_folder": "gs://<<YOUR_BUCKET>>/<<FOLDER_IF_ANY>>/workflow_output"
},
"spanner": {
"instance_id": "spanner-vertex",
"database_id": "spanner-vertex-embeddings",
"table_name": "apparels_embeddings",
"columns_to_export": "embedding,id"
},
"vertex": {
"vector_search_index_id": "<<YOUR_INDEX_ID>>"
}
}
Thiết lập quyền
Đối với môi trường phát hành công khai, bạn nên tạo một tài khoản dịch vụ mới và cấp cho tài khoản đó một hoặc nhiều vai trò IAM chứa các quyền tối thiểu cần thiết để quản lý dịch vụ. Bạn cần có các vai trò sau để thiết lập quy trình làm việc nhằm xuất dữ liệu từ Spanner (embeddings) sang chỉ mục của Tìm kiếm vectơ:
Tài khoản dịch vụ Cloud Workflow:
Theo mặc định, tài khoản này sử dụng Tài khoản dịch vụ mặc định của Compute Engine.
Nếu sử dụng tài khoản dịch vụ được định cấu hình theo cách thủ công, bạn phải thêm các vai trò sau:
Để kích hoạt công việc Dataflow: Quản trị viên Dataflow, Trình thực thi Dataflow.
Để mạo danh tài khoản dịch vụ trình thực thi luồng dữ liệu: Người dùng tài khoản dịch vụ.
Để ghi Nhật ký: Trình ghi nhật ký.
Để kích hoạt quá trình xây dựng lại tính năng Tìm kiếm vectơ của Vertex AI: Người dùng Vertex AI.
Tài khoản dịch vụ trình thực thi luồng dữ liệu:
Nếu sử dụng tài khoản dịch vụ được định cấu hình theo cách thủ công, bạn phải thêm các vai trò sau:
Để quản lý luồng dữ liệu: Quản trị viên luồng dữ liệu, Trình thực thi luồng dữ liệu. Để đọc dữ liệu từ Cloud Spanner: Trình đọc cơ sở dữ liệu Cloud Spanner. Quyền ghi đối với Container Registry GCS đã chọn: Chủ sở hữu bộ chứa GCS Storage.
- Triển khai Cloud Workflow
Triển khai tệp yaml quy trình làm việc vào dự án trên đám mây của bạn. Bạn có thể định cấu hình khu vực hoặc vị trí nơi quy trình làm việc sẽ chạy khi được thực thi.
gcloud workflows deploy vector-export-workflow --source=batch-export.yaml --location="us-central1" [--service account=<service_account>]
or
gcloud workflows deploy vector-export-workflow --source=batch-export.yaml --location="us-central1"
Quy trình làm việc hiện sẽ hiển thị trên trang Workflows trong bảng điều khiển Cloud.
Lưu ý: Bạn cũng có thể tạo và triển khai quy trình làm việc từ bảng điều khiển Cloud. Làm theo lời nhắc trong bảng điều khiển Cloud. Đối với định nghĩa quy trình làm việc, hãy sao chép và dán nội dung của batch-export.yaml.
Sau khi hoàn tất, hãy thực thi quy trình làm việc để bắt đầu xuất dữ liệu.
- Thực thi Cloud Workflow
Chạy lệnh sau để thực thi quy trình làm việc:
gcloud workflows execute vector-export-workflow --data="$(cat input.json)"
Quá trình thực thi sẽ xuất hiện trong thẻ Thực thi trong Quy trình làm việc. Thao tác này sẽ tải dữ liệu của bạn vào cơ sở dữ liệu Tìm kiếm vectơ và lập chỉ mục dữ liệu đó.
Lưu ý: Bạn cũng có thể thực thi từ bảng điều khiển bằng nút Thực thi. Làm theo lời nhắc và đối với dữ liệu đầu vào, hãy sao chép và dán nội dung của input.json tuỳ chỉnh.
5. Triển khai chỉ mục Tìm kiếm vectơ
Triển khai chỉ mục đến một điểm cuối
Bạn có thể làm theo các bước bên dưới để triển khai chỉ mục:
- Trên trang chỉ mục Tìm kiếm vectơ, bạn sẽ thấy nút TRIỂN KHAI bên cạnh chỉ mục mà bạn vừa tạo ở bước 2 của phần trước. Ngoài ra, bạn có thể chuyển đến trang thông tin chỉ mục rồi nhấp vào nút TRIỂN KHAI ĐẾN ĐIỂM CUỐI.
- Cung cấp thông tin cần thiết và triển khai chỉ mục đến một điểm cuối.
Ngoài ra, bạn có thể xem sổ tay này để triển khai đến một điểm cuối (chuyển đến phần triển khai của sổ tay). Sau khi triển khai, hãy ghi lại mã nhận dạng chỉ mục đã triển khai và URL điểm cuối.
6. Phần giao diện người dùng: Dữ liệu người dùng đến Tìm kiếm vectơ
Hãy xây dựng một ứng dụng Python đơn giản có UX do gradio cung cấp để nhanh chóng kiểm thử quá trình triển khai của chúng ta: Bạn có thể tham khảo quá trình triển khai tại đây để triển khai ứng dụng minh hoạ này trong sổ tay Colab của riêng bạn.
- Chúng ta sẽ sử dụng aiplatform python sdk để gọi Embeddings API và cũng để gọi điểm cuối chỉ mục của Tìm kiếm vectơ.
# [START aiplatform_sdk_embedding]
!pip install google-cloud-aiplatform==1.35.0 --upgrade --quiet --user
import vertexai
vertexai.init(project=PROJECT_ID, location="us-central1")
from vertexai.language_models import TextEmbeddingModel
import sys
if "google.colab" in sys.modules:
# Define project information
PROJECT_ID = " " # Your project id
LOCATION = " " # Your location
# Authenticate user to Google Cloud
from google.colab import auth
auth.authenticate_user()
- Chúng ta sẽ sử dụng gradio để minh hoạ ứng dụng AI mà chúng ta đang xây dựng một cách nhanh chóng và dễ dàng bằng giao diện người dùng. Khởi động lại thời gian chạy trước khi bạn triển khai bước này.
!pip install gradio
import gradio as gr
- Từ ứng dụng web khi có hoạt động đầu vào của người dùng, hãy gọi Embeddings API, chúng ta sẽ sử dụng mô hình nhúng văn bản: textembedding-gecko@latest
Phương thức bên dưới gọi Mô hình nhúng văn bản và trả về embeddings vectơ cho văn bản do người dùng nhập:
def text_embedding(content) -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@latest")
embeddings = model.get_embeddings(content)
for embedding in embeddings:
vector = embedding.values
#print(f"Length of Embedding Vector: {len(vector)}")
return vector
Kiểm thử
text_embedding("red shorts for girls")
Bạn sẽ thấy kết quả tương tự như bên dưới (xin lưu ý rằng hình ảnh bị cắt theo chiều cao nên bạn không thể xem toàn bộ phản hồi vectơ):

- Khai báo mã nhận dạng chỉ mục đã triển khai và mã nhận dạng điểm cuối
from google.cloud import aiplatform
DEPLOYED_INDEX_ID = "spanner_vector1_1702366982123"
#Vector Search Endpoint
index_endpoint = aiplatform.MatchingEngineIndexEndpoint('projects/273845608377/locations/us-central1/indexEndpoints/2021628049526620160')
- Xác định phương thức Tìm kiếm vectơ để gọi điểm cuối chỉ mục và hiển thị kết quả với 10 kết quả phù hợp gần nhất cho phản hồi giá trị nhúng tương ứng với hoạt động đầu vào của người dùng.
Trong định nghĩa phương thức bên dưới cho Tìm kiếm vectơ, hãy lưu ý rằng phương thức find_neighbors được gọi để xác định 10 vectơ gần nhất.
def vector_search(content) -> list:
result = text_embedding(content)
#call_vector_search_api(content)
index_endpoint = aiplatform.MatchingEngineIndexEndpoint('projects/273845608377/locations/us-central1/indexEndpoints/2021628049526620160')
# run query
response = index_endpoint.find_neighbors(
deployed_index_id = DEPLOYED_INDEX_ID,
queries = [result],
num_neighbors = 10
)
out = []
# show the results
for idx, neighbor in enumerate(response[0]):
print(f"{neighbor.distance:.2f} {spanner_read_data(neighbor.id)}")
out.append(f"{spanner_read_data(neighbor.id)}")
return out
Bạn cũng sẽ nhận thấy lệnh gọi đến phương thức spanner_read_data. Hãy xem xét phương thức này ở bước tiếp theo.
- Xác định quá trình triển khai phương thức đọc dữ liệu Spanner gọi phương thức execute_sql để trích xuất hình ảnh tương ứng với mã nhận dạng của các vectơ lân cận gần nhất được trả về từ bước cuối cùng.
!pip install google-cloud-spanner==3.36.0
from google.cloud import spanner
instance_id = "spanner-vertex"
database_id = "spanner-vertex-embeddings"
projectId = PROJECT_ID
client = spanner.Client()
client.project = projectId
instance = client.instance(instance_id)
database = instance.database(database_id)
def spanner_read_data(id):
query = "SELECT uri FROM apparels where id = " + id
outputs = []
with database.snapshot() as snapshot:
results = snapshot.execute_sql(query)
for row in results:
#print(row)
#output = "ID: {}, CONTENT: {}, URI: {}".format(*row)
output = "{}".format(*row)
outputs.append(output)
return "\n".join(outputs)
Phương thức này sẽ trả về URL của hình ảnh tương ứng với các vectơ đã chọn.
- Cuối cùng, hãy kết hợp các phần lại với nhau trong giao diện người dùng và kích hoạt quy trình Tìm kiếm vectơ
from PIL import Image
def call_search(query):
response = vector_search(query)
return response
input_text = gr.Textbox(label="Enter your query. Examples: Girls Tops White Casual, Green t-shirt girls, jeans shorts, denim skirt etc.")
output_texts = [gr.Image(label="") for i in range(10)]
demo = gr.Interface(fn=call_search, inputs=input_text, outputs=output_texts, live=True)
resp = demo.launch(share = True)
Bạn sẽ thấy kết quả như minh hoạ bên dưới:

Hình ảnh: Liên kết
Xem video kết quả: tại đây.
7. Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud cho các tài nguyên được sử dụng trong bài đăng này, hãy làm theo các bước sau:
- Trong bảng điều khiển Cloud, hãy chuyển đến trang Quản lý tài nguyên.
- Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, rồi nhấp vào Xoá.
- Trong hộp thoại, hãy nhập mã dự án, rồi nhấp vào Tắt để xoá dự án.
- Nếu không muốn xoá dự án, hãy xoá thực thể Spanner bằng cách chuyển đến thực thể mà bạn vừa tạo cho dự án này rồi nhấp vào nút XOÁ THỰC THỂ ở góc trên cùng bên phải của trang tổng quan về thực thể.
- Bạn cũng có thể chuyển đến chỉ mục của Tìm kiếm vectơ, huỷ triển khai điểm cuối và chỉ mục, rồi xoá chỉ mục.
8. Kết luận
Xin chúc mừng! Bạn đã triển khai thành công tính năng Tìm kiếm vectơ Spanner – Vertex bằng cách
- Tạo nguồn dữ liệu và giá trị nhúng Spanner cho các ứng dụng được lấy từ cơ sở dữ liệu Spanner.
- Tạo chỉ mục cơ sở dữ liệu Tìm kiếm vectơ.
- Tích hợp dữ liệu vectơ từ Spanner vào tính năng Tìm kiếm vectơ bằng các công việc Luồng dữ liệu và Quy trình làm việc.
- Triển khai chỉ mục đến một điểm cuối.
- Cuối cùng, hãy gọi tính năng Tìm kiếm vectơ trên hoạt động đầu vào của người dùng trong quá trình triển khai dựa trên Python của Vertex AI SDK.
Bạn có thể thoải mái mở rộng quá trình triển khai cho trường hợp sử dụng của riêng mình hoặc cải thiện trường hợp sử dụng hiện tại bằng các tính năng mới. Tìm hiểu thêm về các tính năng học máy của Spanner tại đây.