1. Tổng quan
Trong bối cảnh bán lẻ diễn ra nhanh chóng như hiện nay, việc cung cấp dịch vụ khách hàng xuất sắc trong khi mang đến trải nghiệm mua sắm phù hợp với từng khách hàng là điều tối quan trọng. Chúng ta sẽ cùng nhau khám phá kỹ thuật thông qua việc tạo một ứng dụng trò chuyện dựa trên kiến thức, được thiết kế để trả lời câu hỏi của khách hàng, hướng dẫn khám phá sản phẩm và điều chỉnh kết quả tìm kiếm. Giải pháp cải tiến này kết hợp sức mạnh của AlloyDB để lưu trữ dữ liệu, một công cụ phân tích nội bộ để hiểu rõ bối cảnh, Gemini (Mô hình ngôn ngữ lớn) để xác thực mức độ liên quan và Agent Builder của Google để nhanh chóng khởi động một trợ lý đàm thoại thông minh.
Thách thức: Khách hàng bán lẻ hiện đại mong đợi câu trả lời tức thì và đề xuất sản phẩm phù hợp với sở thích riêng của họ. Các phương thức tìm kiếm truyền thống thường không thể cung cấp mức độ cá nhân hoá này.
Giải pháp: Ứng dụng trò chuyện dựa trên kiến thức của chúng tôi sẽ trực tiếp giải quyết thách thức này. Công cụ này khai thác cơ sở kiến thức phong phú từ dữ liệu bán lẻ của bạn để hiểu ý định của khách hàng, phản hồi một cách thông minh và mang lại kết quả siêu phù hợp.
Sản phẩm bạn sẽ tạo ra
Trong phần 1 của bài thực hành này, bạn sẽ:
- Tạo một phiên bản AlloyDB và tải Tập dữ liệu thương mại điện tử
- Bật tiện ích mô hình AI tạo sinh và pgvector trong AlloyDB
- Tạo các vectơ nhúng từ nội dung mô tả sản phẩm
- Thực hiện tìm kiếm theo độ tương đồng Cosine theo thời gian thực cho văn bản tìm kiếm của người dùng
- Triển khai giải pháp trong Cloud Run Functions không máy chủ
Phần thứ hai của lớp học sẽ đề cập đến các bước trong Trình tạo tác nhân.
Yêu cầu
2. Kiến trúc
Luồng dữ liệu: Hãy xem xét kỹ hơn cách dữ liệu di chuyển qua hệ thống của chúng tôi:
Nhập:
Bước đầu tiên là nhập dữ liệu bán lẻ (kho hàng, nội dung mô tả sản phẩm, lượt tương tác của khách hàng) vào AlloyDB.
Công cụ phân tích:
Chúng tôi sẽ sử dụng AlloyDB làm công cụ phân tích để thực hiện những việc sau:
- Trích xuất bối cảnh: Công cụ này phân tích dữ liệu được lưu trữ trong AlloyDB để hiểu mối quan hệ giữa các sản phẩm, danh mục sản phẩm, hành vi của khách hàng, v.v. (nếu có).
- Tạo thông tin nhúng: Thông tin nhúng (biểu diễn toán học của văn bản) được tạo cho cả cụm từ tìm kiếm của người dùng và thông tin được lưu trữ trong AlloyDB.
- Tìm kiếm vectơ: Công cụ này thực hiện tìm kiếm tương đồng, so sánh embeddings truy vấn với embeddings của nội dung mô tả sản phẩm, bài đánh giá và các dữ liệu liên quan khác. Thao tác này xác định 25 "láng giềng gần nhất" phù hợp nhất.
Xác thực Gemini:
Những câu trả lời tiềm năng này sẽ được gửi đến Gemini để đánh giá. Gemini sẽ xác định xem những thông tin đó có thực sự phù hợp và an toàn để chia sẻ với người dùng hay không.
Tạo câu trả lời:
Các phản hồi đã xác thực được cấu trúc thành một mảng JSON và toàn bộ công cụ được đóng gói thành một Hàm Cloud Run không cần máy chủ được gọi từ Trình tạo tác nhân.
Tương tác đàm thoại:
Agent Builder trình bày các câu trả lời cho người dùng ở định dạng ngôn ngữ tự nhiên, tạo điều kiện cho cuộc trò chuyện qua lại. Phần này sẽ được đề cập trong một lớp học tiếp theo.
3. Trước khi bắt đầu
Tạo dự án
- Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trê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 của bạn. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trong một dự án hay không .
- 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 bằng bq. Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Google Cloud.

- Sau khi kết nối với Cloud Shell, bạn có thể kiểm tra để đảm bảo rằng bạn đã được xác thực và dự án được đặt thành mã dự án của bạn bằng lệnh sau:
gcloud auth list
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn.
gcloud config list project
- Nếu bạn chưa đặt dự án, hãy dùng lệnh sau để đặt:
gcloud config set project <YOUR_PROJECT_ID>
- Bật các API bắt buộc.
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
Bạn có thể thay thế lệnh gcloud bằng cách tìm kiếm từng sản phẩm trên bảng điều khiển hoặc sử dụng đường liên kết này.
Nếu bỏ lỡ API nào, bạn luôn có thể bật API đó trong quá trình triển khai.
Tham khảo tài liệu để biết các lệnh và cách sử dụng gcloud.
4. Thiết lập cơ sở dữ liệu
Trong phòng thí nghiệm này, chúng ta sẽ sử dụng AlloyDB làm cơ sở dữ liệu để lưu trữ dữ liệu bán lẻ. Nó sử dụng cụm để lưu giữ tất cả các tài nguyên, chẳng hạn như cơ sở dữ liệu và nhật ký. Mỗi cụm có một phiên bản chính cung cấp một điểm truy cập vào dữ liệu. Các bảng sẽ chứa dữ liệu thực tế.
Hãy tạo một cụm, phiên bản và bảng AlloyDB nơi tập dữ liệu thương mại điện tử sẽ được tải.
Tạo một cụm và phiên bản
- Chuyển đến trang AlloyDB trong Cloud Console. Cách dễ dàng để tìm hầu hết các trang trong Cloud Console là tìm kiếm các trang đó bằng thanh tìm kiếm của bảng điều khiển.
- Chọn CREATE CLUSTER (Tạo cụm) trên trang đó:

- Bạn sẽ thấy một màn hình như màn hình bên dưới. Tạo một cụm và phiên bản bằng các giá trị sau:
- mã cụm: "
shopping-cluster" - mật khẩu: "
alloydb" - Tương thích với PostgreSQL 15
- Khu vực: "
us-central1" - Mạng: "
default"

- Khi chọn mạng mặc định, bạn sẽ thấy một màn hình như màn hình bên dưới. Chọn THIẾT LẬP KẾT NỐI.

- Tại đây, hãy chọn "Sử dụng dải IP được phân bổ tự động" rồi chọn Tiếp tục. Sau khi xem xét thông tin, hãy chọn TẠO KẾT NỐI.

- Sau khi thiết lập mạng, bạn có thể tiếp tục tạo cụm. Nhấp vào CREATE CLUSTER (TẠO CỤM) để hoàn tất việc thiết lập cụm như minh hoạ bên dưới:

Hãy nhớ thay đổi mã nhận dạng phiên bản thành "shopping-instance".
Xin lưu ý rằng quá trình tạo Cụm sẽ mất khoảng 10 phút. Sau khi quá trình này diễn ra thành công, bạn sẽ thấy một màn hình tương tự như màn hình này:

5. Nhập dữ liệu
Bây giờ, đã đến lúc thêm một bảng có dữ liệu về cửa hàng. Chuyển đến AlloyDB, chọn cụm chính rồi chọn AlloyDB Studio:

Bạn có thể phải đợi phiên bản của mình tạo xong. Sau khi tạo xong, hãy đăng nhập vào AlloyDB bằng thông tin đăng nhập mà bạn đã tạo khi tạo cụm. Sử dụng dữ liệu sau để xác thực với PostgreSQL:
- Tên người dùng : "
postgres" - Cơ sở dữ liệu : "
postgres" - Mật khẩu : "
alloydb"
Sau khi bạn xác thực thành công vào AlloyDB Studio, các lệnh SQL sẽ được nhập vào Trình chỉnh sửa. Bạn có thể thêm nhiều cửa sổ Trình chỉnh sửa bằng cách nhấp vào dấu cộng ở bên phải cửa sổ cuối cùng.

Bạn sẽ nhập các lệnh cho AlloyDB trong cửa sổ trình chỉnh sửa, sử dụng các lựa chọn Chạy, Định dạng và Xoá khi cần.
Bật tiện ích
Để tạo ứng dụng này, chúng ta sẽ sử dụng các tiện ích pgvector và google_ml_integration. Tiện ích pgvector cho phép bạn lưu trữ và tìm kiếm các vectơ nhúng. Tiện ích google_ml_integration cung cấp các hàm mà bạn dùng để truy cập vào các điểm cuối dự đoán của Vertex AI nhằm nhận thông tin dự đoán bằng SQL. Bật các tiện ích này bằng cách chạy các DDL sau:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
Nếu bạn muốn kiểm tra các tiện ích đã được bật trên cơ sở dữ liệu, hãy chạy lệnh SQL sau:
select extname, extversion from pg_extension;
Tạo bảng
Tạo bảng bằng câu lệnh DDL bên dưới:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
Khi thực thi thành công lệnh trên, bạn sẽ có thể xem bảng trong cơ sở dữ liệu. Dưới đây là ảnh chụp màn hình mẫu:

Nhập dữ liệu
Đối với lớp học này, chúng ta có dữ liệu kiểm thử gồm khoảng 200 bản ghi trong tệp SQL này. Nội dung này có id, category, sub_category, uri, image và content. Các trường khác sẽ được điền vào sau trong phòng thí nghiệm.
Sao chép 20 dòng/câu lệnh chèn từ đó, sau đó dán các dòng đó vào một thẻ trình chỉnh sửa trống rồi chọn CHẠY.
Để xem nội dung của bảng, hãy mở rộng phần Trình khám phá cho đến khi bạn thấy bảng có tên là quần áo. Chọn biểu tượng ba dấu chấm dọc (⋮) để xem lựa chọn Truy vấn bảng. Câu lệnh SELECT sẽ mở ra trong một thẻ Trình chỉnh sửa mới.

Cấp quyền
Chạy câu lệnh bên dưới để cấp quyền thực thi cho hàm embedding đối với người dùng postgres:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Cấp vai trò Người dùng Vertex AI cho tài khoản dịch vụ AlloyDB
Chuyển đến cửa sổ dòng lệnh Cloud Shell và đưa ra lệnh sau:
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"
6. Ngữ cảnh
Quay lại trang Phiên bản AlloyDB.
Để tạo một mục nhúng, chúng ta cần có một context, tức là tất cả thông tin mà chúng ta muốn đưa vào một trường duy nhất. Chúng ta sẽ làm việc này bằng cách tạo một nội dung mô tả sản phẩm (chúng ta sẽ gọi là pdt_desc). Trong trường hợp này, chúng ta sẽ sử dụng tất cả thông tin về từng sản phẩm, nhưng khi bạn làm việc này với dữ liệu của riêng mình, hãy thoải mái thiết kế dữ liệu theo bất kỳ cách nào mà bạn thấy có ý nghĩa đối với doanh nghiệp của mình.
Chạy câu lệnh sau trong AlloyDB Studio của phiên bản bạn vừa tạo. Thao tác này sẽ cập nhật trường pdt_desc bằng dữ liệu bối cảnh:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
DML này tạo một bản tóm tắt ngữ cảnh đơn giản bằng cách sử dụng thông tin từ tất cả các trường có trong bảng và các phần phụ thuộc khác (nếu có trong trường hợp sử dụng của bạn). Để tạo ra nhiều thông tin và bối cảnh chính xác hơn, bạn có thể thoải mái thiết kế dữ liệu theo bất kỳ cách nào mà bạn cho là có ý nghĩa đối với doanh nghiệp của mình.
7. Tạo các thành phần nhúng cho bối cảnh
Máy tính xử lý các con số dễ dàng hơn nhiều so với xử lý văn bản. Một hệ thống nhúng sẽ chuyển đổi văn bản thành một chuỗi các số thực dấu phẩy động để biểu thị văn bản, bất kể văn bản đó được diễn đạt như thế nào, sử dụng ngôn ngữ gì, v.v.
Hãy cân nhắc việc mô tả một địa điểm ven biển. Ví dụ: "trên mặt nước", "bên bờ biển", "đi bộ từ phòng đến biển", "sur la mer", "на берегу океана", v.v. Những cụm từ này đều có vẻ khác nhau, nhưng ý nghĩa ngữ nghĩa của chúng (hoặc theo thuật ngữ học máy, các embeddings của chúng) phải rất gần nhau.
Giờ đây, khi dữ liệu và bối cảnh đã sẵn sàng, chúng ta sẽ chạy SQL để thêm các mục nhúng của nội dung mô tả sản phẩm vào bảng trong trường embedding. Bạn có thể sử dụng nhiều mô hình nhúng. Chúng tôi đang sử dụng text-embedding-004 từ Vertex AI. Hãy nhớ sử dụng cùng một mô hình nhúng trong suốt dự án!
Lưu ý: Nếu đang sử dụng một Dự án Google Cloud đã được tạo cách đây một thời gian, thì có thể bạn cần tiếp tục sử dụng các phiên bản cũ hơn của mô hình nhúng văn bản, chẳng hạn như textembedding-gecko.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
Hãy xem lại bảng apparels để xem một số thành phần được nhúng. Hãy nhớ chạy lại câu lệnh SELECT để xem các thay đổi.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
Thao tác này sẽ trả về vectơ nhúng (có dạng như một mảng số thực) cho văn bản mẫu trong truy vấn như minh hoạ bên dưới:

Lưu ý: Các dự án mới tạo trên Google Cloud trong cấp miễn phí có thể gặp phải vấn đề về hạn mức liên quan đến số lượng yêu cầu nhúng được phép mỗi giây đối với các mô hình Nhúng. Bạn nên sử dụng một truy vấn bộ lọc cho mã nhận dạng, sau đó chọn có chọn lọc 1 đến 5 bản ghi, v.v. trong khi tạo vectơ nhúng.
8. Thực hiện tìm kiếm vectơ
Giờ đây, khi bảng, dữ liệu và các thành phần nhúng đều đã sẵn sàng, hãy thực hiện tìm kiếm vectơ theo thời gian thực cho văn bản tìm kiếm của người dùng.
Giả sử người dùng hỏi:
"Tôi muốn mua áo nữ, chỉ có màu hồng, chất liệu cotton 100% và kiểu dáng bình thường."
Bạn có thể tìm thấy các kết quả trùng khớp cho trường hợp này bằng cách chạy truy vấn bên dưới:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Hãy xem xét cụm từ tìm kiếm này một cách chi tiết:
Trong truy vấn này,
- Văn bản tìm kiếm của người dùng là: "Tôi muốn áo nữ, chỉ màu hồng, chất liệu cotton nguyên chất."
- Chúng ta sẽ chuyển đổi nó thành các mục nhúng trong phương thức
embedding()bằng mô hình:text-embedding-004. Bước này có vẻ quen thuộc sau bước cuối cùng, trong đó chúng ta đã áp dụng hàm nhúng cho tất cả các mục trong bảng. - "
<=>" biểu thị việc sử dụng phương thức khoảng cách COSINE SIMILARITY. Bạn có thể tìm thấy tất cả các chỉ số về mức độ tương đồng có trong tài liệu của pgvector. - Chúng tôi đang chuyển đổi kết quả của phương thức nhúng thành loại vectơ để tương thích với các vectơ được lưu trữ trong cơ sở dữ liệu.
- LIMIT 5 cho biết rằng chúng ta muốn trích xuất 5 hàng xóm gần nhất cho văn bản tìm kiếm.
Kết quả sẽ có dạng như sau:

Như bạn có thể thấy trong kết quả, các kết quả khớp khá gần với văn bản tìm kiếm. Hãy thử thay đổi màu sắc để xem kết quả thay đổi như thế nào.
Lưu ý quan trọng:
Giả sử chúng ta muốn tăng hiệu suất (thời gian truy vấn), hiệu quả và khả năng thu hồi của kết quả Tìm kiếm vectơ này bằng cách sử dụng chỉ mục ScaNN. Vui lòng đọc các bước trong blog này để so sánh sự khác biệt về kết quả có và không có chỉ mục. Sau đây là các bước tạo chỉ mục để thuận tiện cho bạn:
- Vì chúng ta đã tạo cụm, thực thể, bối cảnh và các mục nhúng, nên chúng ta chỉ cần cài đặt tiện ích ScaNN bằng câu lệnh sau:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- Tiếp theo, chúng ta sẽ tạo chỉ mục (ScaNN):
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
Trong DDL ở trên, apparel_index là tên của chỉ mục
"apparels" là bảng của tôi
"scann" là phương thức chỉ mục
"embedding" là cột trong bảng mà tôi muốn lập chỉ mục
"cosine" là phương thức khoảng cách mà tôi muốn sử dụng với chỉ mục
"54" là số lượng phân vùng cần áp dụng cho chỉ mục này. Đặt thành giá trị bất kỳ trong khoảng từ 1 đến 1048576. Để biết thêm thông tin về cách quyết định giá trị này, hãy xem phần Điều chỉnh chỉ mục ScaNN.
Tôi đã sử dụng CĂN BẬC HAI của số lượng điểm dữ liệu như được đề xuất trong kho lưu trữ ScaNN (Khi phân vùng, num_leaves phải xấp xỉ căn bậc hai của số lượng điểm dữ liệu).
- Kiểm tra xem chỉ mục có được tạo bằng truy vấn sau hay không:
SELECT * FROM pg_stat_ann_indexes;
- Thực hiện Tìm kiếm vectơ bằng chính truy vấn mà chúng ta đã sử dụng mà không có chỉ mục:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
Truy vấn trên cũng là truy vấn mà chúng ta đã dùng trong phòng thí nghiệm ở bước 8. Tuy nhiên, hiện tại chúng tôi đã lập chỉ mục trường này.
- Thử nghiệm bằng một cụm từ tìm kiếm đơn giản có và không có chỉ mục (bằng cách thả chỉ mục):
white tops for girls without any print
Văn bản tìm kiếm ở trên trong cụm từ tìm kiếm Vector Search trên dữ liệu nhúng ĐƯỢC LẬP CHỈ MỤC sẽ mang lại kết quả tìm kiếm chất lượng và hiệu quả. Hiệu suất được cải thiện đáng kể (về thời gian thực thi: 10,37 mili giây không có ScaNN và 0,87 mili giây có ScaNN) với chỉ mục. Để biết thêm thông tin về chủ đề này, vui lòng tham khảo blog này.
9. Xác thực kết quả trùng khớp bằng LLM
Trước khi chuyển sang bước tiếp theo và tạo một dịch vụ để trả về kết quả phù hợp nhất cho một ứng dụng, hãy sử dụng mô hình AI tạo sinh để xác thực xem những câu trả lời tiềm năng này có thực sự phù hợp và an toàn để chia sẻ với người dùng hay không.
Đảm bảo phiên bản được thiết lập cho Gemini
Trước tiên, hãy kiểm tra xem bạn đã bật tính năng Tích hợp ML của Google cho Cụm và Phiên bản của mình hay chưa. Trong AlloyDB Studio, hãy đưa ra lệnh sau:
show google_ml_integration.enable_model_support;
Nếu giá trị hiển thị là "on", bạn có thể bỏ qua 2 bước tiếp theo và chuyển thẳng đến bước thiết lập chế độ tích hợp AlloyDB và Mô hình Vertex AI.
- Chuyển đến phiên bản chính của cụm AlloyDB rồi nhấp vào CHỈNH SỬA PHIÊN BẢN CHÍNH

- Chuyển đến phần Cờ trong mục Lựa chọn cấu hình nâng cao. và đảm bảo rằng
google_ml_integration.enable_model_support flagđược đặt thành "on" như minh hoạ bên dưới:

Nếu bạn chưa đặt thành "on", hãy đặt thành "on" rồi nhấp vào nút UPDATE INSTANCE (CẬP NHẬT THỰC THỂ). Bước này sẽ mất vài phút.
Tích hợp AlloyDB và Mô hình AI của Vertex AI
Giờ đây, bạn có thể kết nối với AlloyDB Studio và chạy câu lệnh DML sau đây để thiết lập quyền truy cập vào mô hình Gemini từ AlloyDB, bằng cách sử dụng mã dự án của bạn ở nơi được chỉ định. Bạn có thể nhận được cảnh báo về lỗi cú pháp trước khi chạy lệnh, nhưng lệnh sẽ chạy bình thường.
Trước tiên, chúng ta sẽ tạo kết nối mô hình Gemini 1.5 như minh hoạ bên dưới. Đừng quên thay thế $PROJECT_ID trong lệnh bên dưới bằng mã dự án của bạn trên Google Cloud.
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
Bạn có thể kiểm tra các mô hình được định cấu hình để truy cập thông qua lệnh sau trong AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;
Cuối cùng, chúng ta cần cấp quyền cho người dùng cơ sở dữ liệu để thực thi hàm ml_predict_row nhằm chạy các dự đoán thông qua các mô hình Vertex AI của Google. Chạy lệnh sau:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Lưu ý: Nếu đang sử dụng một Dự án Google Cloud hiện có và một cụm/phiên bản AlloyDB hiện có đã được tạo cách đây một thời gian, bạn có thể cần xoá các thông tin tham chiếu cũ đến mô hình Gemini 1.5 và tạo lại bằng câu lệnh CALL ở trên, đồng thời chạy lại lệnh cấp quyền thực thi trên hàm ml_predict_row trong trường hợp bạn gặp vấn đề khi gọi Gemini 1.5 trong tương lai.
Đánh giá câu trả lời
Mặc dù chúng ta sẽ sử dụng một truy vấn lớn trong phần tiếp theo để đảm bảo các phản hồi từ truy vấn là hợp lý, nhưng truy vấn này có thể khó hiểu. Bây giờ, chúng ta sẽ xem xét các phần và cách chúng kết hợp với nhau trong vài phút nữa.
- Trước tiên, chúng ta sẽ gửi một yêu cầu đến cơ sở dữ liệu để lấy 5 kết quả phù hợp nhất với một cụm từ tìm kiếm của người dùng. Chúng ta sẽ mã hoá cứng truy vấn để giữ cho truy vấn này đơn giản. Tuy nhiên, đừng lo lắng, chúng ta sẽ nội suy truy vấn này vào truy vấn sau. Chúng ta sẽ thêm nội dung mô tả sản phẩm từ bảng
apparelsvà thêm hai trường mới – một trường kết hợp nội dung mô tả với chỉ mục và một trường khác có yêu cầu ban đầu. Tất cả dữ liệu này sẽ được lưu trong một bảng có tên làxyz(chỉ là tên bảng tạm thời).
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Đầu ra của truy vấn này sẽ là 5 hàng tương tự nhất liên quan đến truy vấn của người dùng. Bảng xyz mới sẽ chứa 5 hàng, trong đó mỗi hàng sẽ có các cột sau:
literaturecontentuser_text
- Để xác định mức độ hợp lệ của các câu trả lời, chúng tôi sẽ sử dụng một truy vấn phức tạp để giải thích cách đánh giá các câu trả lời. Thao tác này sử dụng
user_textvàcontenttrong bảngxyznhư một phần của truy vấn.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- Sau đó, bằng cách sử dụng truy vấn đó, chúng ta sẽ xem xét "mức độ phù hợp" của các câu trả lời trong bảng
xyz.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
predict_rowsẽ trả về kết quả ở định dạng JSON. Mã "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"" được dùng để trích xuất văn bản thực tế từ JSON đó. Để xem JSON thực tế được trả về, bạn có thể xoá mã này.- Cuối cùng, để lấy trường LLM, bạn chỉ cần trích xuất trường đó từ bảng x:
SELECT
LLM_RESPONSE
FROM
x;
- Bạn có thể kết hợp các thông tin này thành một truy vấn tiếp theo duy nhất như sau.
Bạn sẽ cần xoá/loại bỏ các bảng xyz và x khỏi cơ sở dữ liệu AlloyDB trước khi chạy thao tác này, nếu đã chạy các truy vấn ở trên để kiểm tra kết quả trung gian.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
Mặc dù điều đó vẫn có vẻ khó khăn, nhưng hy vọng bạn có thể hiểu rõ hơn một chút. Kết quả cho biết có trùng khớp hay không, tỷ lệ phần trăm trùng khớp và một số giải thích về điểm xếp hạng.
Xin lưu ý rằng mô hình Gemini có tính năng truyền trực tuyến được bật theo mặc định, vì vậy câu trả lời thực tế sẽ trải dài trên nhiều dòng: 
10. Đưa ứng dụng lên web
Bạn đã sẵn sàng đưa ứng dụng này lên web chưa? Hãy làm theo các bước bên dưới để tạo Knowledge Engine Serverless bằng Cloud Run Functions:
- Truy cập vào Cloud Run Functions trong Google Cloud Console để TẠO một Cloud Run Function mới hoặc sử dụng đường liên kết: https://console.cloud.google.com/functions/add.
- Chọn Môi trường là "Hàm Cloud Run". Cung cấp Tên hàm "retail-engine" và chọn Khu vực là "us-central1". Đặt chế độ Xác thực thành "Cho phép lệnh gọi chưa xác thực" rồi nhấp vào TIẾP THEO. Chọn Java 17 làm thời gian chạy và Trình chỉnh sửa nội tuyến cho mã nguồn.
- Theo mặc định, giá trị này sẽ đặt Điểm truy cập thành "
gcfv2.HelloHttpFunction". Thay thế mã giữ chỗ trongHelloHttpFunction.javavàpom.xmlcủa Hàm Cloud Run bằng mã trong tệp Java và XML tương ứng. - Hãy nhớ thay đổi phần giữ chỗ $PROJECT_ID và thông tin đăng nhập kết nối AlloyDB bằng các giá trị của bạn trong tệp Java. Thông tin đăng nhập AlloyDB là thông tin mà chúng ta đã dùng khi bắt đầu lớp học lập trình này. Nếu bạn đã sử dụng các giá trị khác nhau, vui lòng sửa đổi các giá trị đó trong tệp Java.
- Nhấp vào Triển khai.
Sau khi triển khai, để cho phép Cloud Function truy cập vào phiên bản cơ sở dữ liệu AlloyDB, chúng ta sẽ tạo trình kết nối VPC.
BƯỚC QUAN TRỌNG:
Sau khi thiết lập để triển khai, bạn sẽ có thể thấy các hàm trong bảng điều khiển Google Cloud Run Functions. Tìm hàm mới tạo (retail-engine), nhấp vào hàm đó, sau đó nhấp vào CHỈNH SỬA và thay đổi những nội dung sau:
- Chuyển đến phần Cài đặt thời gian chạy, bản dựng, kết nối và bảo mật
- Tăng thời gian chờ lên 180 giây
- Chuyển đến thẻ KẾT NỐI:

- Trong phần cài đặt Ingress, hãy nhớ chọn "Cho phép tất cả lưu lượng truy cập".
- Trong phần Egress settings (Cài đặt lưu lượng truy cập đi), hãy nhấp vào trình đơn thả xuống Network (Mạng) rồi chọn "Add New VPC Connector" (Thêm trình kết nối VPC mới) và làm theo hướng dẫn mà bạn thấy trên hộp thoại bật lên:

- Đặt tên cho Trình kết nối VPC và đảm bảo khu vực này giống với khu vực của phiên bản. Để nguyên giá trị Mạng là mặc định và đặt Mạng con thành Dải IP tuỳ chỉnh với dải IP là 10.8.0.0 hoặc một dải IP tương tự có sẵn.
- Mở rộng mục HIỂN THỊ CÁC CHẾ ĐỘ CÀI ĐẶT THANG ĐO và đảm bảo bạn đã đặt cấu hình chính xác như sau:

- Nhấp vào CREATE (Tạo) và trình kết nối này sẽ xuất hiện trong phần cài đặt lưu lượng truy cập đi.
- Chọn giắc cắm mới tạo
- Chọn định tuyến tất cả lưu lượng truy cập thông qua trình kết nối VPC này.
- Nhấp vào TIẾP THEO rồi nhấp vào TRIỂN KHAI.
11. Kiểm thử ứng dụng
Sau khi triển khai Cloud Function đã cập nhật, bạn sẽ thấy điểm cuối ở định dạng sau:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
Bạn có thể kiểm thử tính năng này trong Cửa sổ dòng lệnh Cloud Shell bằng cách chạy lệnh sau:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
Ngoài ra, bạn có thể kiểm thử Hàm Cloud Run như sau:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
Kết quả là:

Vậy là xong! Bạn chỉ cần làm như vậy để thực hiện Tìm kiếm vectơ tương tự bằng mô hình Embeddings trên dữ liệu AlloyDB.
Xây dựng tác nhân đàm thoại!
Tác nhân được tạo trong phần 2 của lớp học này.
12. Dọn dẹp
Nếu bạn dự định hoàn tất Phần 2 của bài thực hành này, hãy bỏ qua bước này vì bước này sẽ xoá dự án hiện tại.
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được 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 Google 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.
13. Xin chúc mừng
Xin chúc mừng! Bạn đã thực hiện thành công một lượt tìm kiếm tương tự bằng AlloyDB, pgvector và tính năng Tìm kiếm vectơ. Bằng cách kết hợp các chức năng của AlloyDB, Vertex AI và Vector Search, chúng tôi đã có một bước tiến vượt bậc trong việc cung cấp các tính năng tìm kiếm theo ngữ cảnh và tìm kiếm vectơ một cách dễ dàng, hiệu quả và thực sự dựa trên ý nghĩa. Phần tiếp theo của lớp học này sẽ trình bày các bước xây dựng tác nhân.