1. Tổng quan
Hãy tưởng tượng bạn bước vào một cửa hàng đồ chơi ảo hoặc thực tế, nơi bạn có thể dễ dàng tìm được món quà hoàn hảo. Bạn có thể mô tả món đồ mình đang tìm kiếm, tải hình ảnh một món đồ chơi lên hoặc thậm chí tự thiết kế món đồ chơi của riêng mình. Cửa hàng sẽ hiểu ngay nhu cầu của bạn và mang đến trải nghiệm phù hợp. Đây không phải là một viễn cảnh tương lai xa vời mà là hiện thực được hỗ trợ bởi AI, công nghệ đám mây và tầm nhìn về thương mại điện tử được cá nhân hoá.
Thách thức: Bạn có thể gặp khó khăn khi tìm sản phẩm hoàn hảo phù hợp với trí tưởng tượng của mình. Các cụm từ tìm kiếm chung, từ khoá và tìm kiếm mờ thường không mang lại kết quả như mong muốn, việc duyệt qua vô số trang có thể gây nhàm chán và sự khác biệt giữa những gì bạn tưởng tượng và những gì có sẵn có thể khiến bạn thất vọng.
Giải pháp: Ứng dụng minh hoạ này giải quyết trực tiếp thách thức này, tận dụng sức mạnh của AI để mang lại trải nghiệm thực sự được cá nhân hoá và liền mạch với tính năng tìm kiếm theo bối cảnh và tạo sản phẩm tuỳ chỉnh phù hợp với bối cảnh tìm kiếm.
Sản phẩm bạn sẽ tạo ra
Trong lớp học này, bạn sẽ:
- Tạo một thực thể AlloyDB và tải Tập dữ liệu đồ chơi
- Bật tiện ích pgvector và mô hình AI tạo sinh trong AlloyDB
- Tạo nội dung nhúng từ nội dung mô tả sản phẩm và thực hiện tìm kiếm tương đồng theo hàm Cosin theo thời gian thực cho văn bản tìm kiếm của người dùng
- Gọi Gemini 2.0 Flash để mô tả hình ảnh do người dùng tải lên cho tính năng tìm kiếm đồ chơi theo bối cảnh
- Gọi Imagen 3 để tạo đồ chơi tuỳ chỉnh dựa trên mối quan tâm của người dùng
- Gọi một công cụ dự đoán giá được tạo bằng Hộp công cụ AI tạo sinh cho cơ sở dữ liệu để biết thông tin chi tiết về giá của đồ chơi được tạo tuỳ chỉnh
- Triển khai giải pháp trong các Chức năng Cloud Run không có máy chủ
Yêu cầu
2. Kiến trúc
Luồng dữ liệu: Hãy cùng tìm hiểu kỹ hơn về cách dữ liệu di chuyển qua hệ thống của chúng ta:
- Tìm kiếm theo bối cảnh bằng công nghệ RAG (Tạo sinh tăng cường truy xuất) dựa trên AI
Hãy nghĩ như thế này: thay vì chỉ tìm "ô tô màu đỏ", hệ thống sẽ hiểu được những nội dung sau:
"xe nhỏ phù hợp với bé trai 3 tuổi".
AlloyDB làm nền tảng: Chúng tôi sử dụng AlloyDB, cơ sở dữ liệu tương thích với PostgreSQL được quản lý hoàn toàn của Google Cloud, để lưu trữ dữ liệu về đồ chơi, bao gồm nội dung mô tả, URL hình ảnh và các thuộc tính có liên quan khác.
pgvector cho Tìm kiếm ngữ nghĩa: pgvector, một tiện ích PostgreSQL, cho phép chúng ta lưu trữ các vectơ nhúng của cả nội dung mô tả đồ chơi và cụm từ tìm kiếm của người dùng. Điều này cho phép tìm kiếm ngữ nghĩa, nghĩa là hệ thống hiểu được ý nghĩa đằng sau các từ, chứ không chỉ từ khoá chính xác.
Mức độ tương đồng cosin để đánh giá mức độ liên quan: Chúng tôi sử dụng mức độ tương đồng cosin để đo lường mức độ tương đồng ngữ nghĩa giữa vectơ tìm kiếm của người dùng và vectơ mô tả đồ chơi, từ đó hiển thị những kết quả liên quan nhất.
Chỉ mục ScaNN để đảm bảo tốc độ và độ chính xác: Để đảm bảo kết quả nhanh chóng và chính xác, đặc biệt là khi kho hàng đồ chơi của chúng tôi ngày càng tăng, chúng tôi tích hợp chỉ mục ScaNN (Bạn hàng gần nhất có thể mở rộng quy mô). Điều này giúp cải thiện đáng kể hiệu quả và khả năng gợi nhắc của tính năng tìm kiếm vectơ.
- Tìm kiếm và hiểu biết dựa trên hình ảnh bằng Gemini 2.0 Flash
Thay vì nhập ngữ cảnh dưới dạng văn bản, giả sử người dùng muốn tải hình ảnh một món đồ chơi quen thuộc mà họ muốn dùng để tìm kiếm lên. Người dùng có thể tải hình ảnh một món đồ chơi mà họ thích lên và nhận được các tính năng có liên quan. Chúng tôi tận dụng mô hình Flash Gemini 2.0 của Google, được gọi bằng LangChain4j, để phân tích hình ảnh và trích xuất ngữ cảnh có liên quan, chẳng hạn như màu sắc, chất liệu, loại và nhóm tuổi dự kiến của đồ chơi.
- Tạo đồ chơi trong mơ được tuỳ chỉnh bằng AI tạo sinh: Imagen 3
Điều kỳ diệu thực sự xảy ra khi người dùng quyết định tạo đồ chơi của riêng mình. Khi sử dụng Imagen 3, trẻ có thể mô tả đồ chơi trong mơ bằng các câu lệnh văn bản đơn giản. Hãy tưởng tượng bạn có thể nói: "Tôi muốn có một con rồng nhồi bông có cánh màu tím và khuôn mặt thân thiện" rồi thấy con rồng đó xuất hiện trên màn hình! Sau đó, Imagen 3 sẽ tạo hình ảnh của đồ chơi được thiết kế tuỳ chỉnh, giúp người dùng hình dung rõ ràng về sản phẩm của họ.
- Tính năng dự đoán giá do các tác nhân cung cấp và Hộp công cụ AI tạo sinh cho cơ sở dữ liệu
Chúng tôi đã triển khai tính năng dự đoán giá để ước tính chi phí sản xuất đồ chơi được thiết kế tuỳ chỉnh. Công cụ này được cung cấp bởi một tác nhân có công cụ tính giá phức tạp.
Gen AI Toolbox for Databases (Hộp công cụ AI tạo sinh cho cơ sở dữ liệu): Tác nhân này được tích hợp liền mạch với cơ sở dữ liệu của chúng tôi bằng cách sử dụng công cụ nguồn mở mới của Google, Gen AI Toolbox for Databases (Hộp công cụ AI tạo sinh cho cơ sở dữ liệu). Điều này cho phép nhân viên hỗ trợ truy cập vào dữ liệu theo thời gian thực về chi phí nguyên vật liệu, quy trình sản xuất và các yếu tố liên quan khác để đưa ra giá ước tính chính xác. Hãy đọc thêm về vấn đề này tại đây.
- Java Spring Boot, tính năng Hỗ trợ mã Gemini và Cloud Run để phát triển nhanh chóng và triển khai không cần máy chủ
Toàn bộ ứng dụng được xây dựng bằng Java Spring Boot, một khung mạnh mẽ và có thể mở rộng. Chúng tôi đã tận dụng tính năng Hỗ trợ mã Gemini trong suốt quá trình phát triển, đặc biệt là cho hoạt động phát triển giao diện người dùng, giúp đẩy nhanh đáng kể chu kỳ phát triển và cải thiện chất lượng mã. Chúng tôi đã sử dụng Cloud Run để triển khai toàn bộ ứng dụng và Hàm Cloud Run để triển khai cơ sở dữ liệu và các chức năng của tác nhân dưới dạng các điểm cuối độc lập.
3. Trước khi bắt đầu
Tạo một dự án
- Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
- Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên 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 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, hãy kiểm tra để đảm bảo 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 dự án của bạn chưa được đặt, hãy sử dụng lệnh sau để đặt dự án:
gcloud config set project <YOUR_PROJECT_ID>
- Bật các API bắt buộc bằng cách chạy lần lượt các lệnh sau trong Dòng lệnh Cloud Shell:
Ngoài ra, bạn cũng có thể chạy một lệnh duy nhất như bên dưới. Tuy nhiên, nếu là người dùng tài khoản dùng thử, bạn có thể gặp phải các vấn đề về hạn mức khi bật các tính năng này hàng loạt. Đó là lý do các lệnh được tách riêng ra từng dòng.
gcloud services enable alloydb.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com
gcloud services enable servicenetworking.googleapis.com
gcloud services enable run.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
gcloud services enable aiplatform.googleapis.com
Bạn có thể sử dụng bảng điều khiển để tìm kiếm từng sản phẩm hoặc sử dụng đường liên kết này thay cho lệnh gcloud.
Nếu thiếu bất kỳ 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 lớp học lập trình này, chúng ta sẽ sử dụng AlloyDB làm cơ sở dữ liệu để lưu trữ dữ liệu của cửa hàng đồ chơi. Mô-đun này sử dụng các cụm để lưu giữ tất 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 điểm truy cập vào dữ liệu. Bảng sẽ chứa dữ liệu thực tế.
Hãy tạo một cụm, thực thể và bảng AlloyDB nơi tập dữ liệu thương mại điện tử sẽ được tải.
Tạo cụm và thực thể
- Chuyển đến trang AlloyDB trong Cloud Console. Bạn có thể dễ dàng tìm thấy hầu hết các trang trong Cloud Console bằng cách tìm kiếm các trang đó thông qua thanh tìm kiếm của bảng điều khiển.
- Chọn CREATE CLUSTER (TẠO CHUỖI) 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à thực thể với các giá trị sau (Đảm bảo các giá trị khớp với nhau trong trường hợp bạn đang nhân bản mã ứng dụng từ kho lưu trữ):
- mã cụm: "
vector-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ư dưới đây.
Chọn THIẾT LẬP KẾT NỐI.
- Tại đó, 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 lại 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 CLUSTER) để 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 thực thể thành "
vector-instance"
.
Xin lưu ý rằng quá trình tạo cụm sẽ mất khoảng 10 phút. Sau khi tạo thành công, bạn sẽ thấy một màn hình hiển thị thông tin tổng quan về cụm bạn vừa tạo.
5. Nhập dữ liệu
Bây giờ, đã đến lúc thêm một bảng chứa 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 thực thể của mình hoàn tất quá trình tạo. Sau khi hoàn tất, hãy đăng nhập vào AlloyDB bằng thông tin xác thực 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 biểu tượng 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 tuỳ chọn Run (Chạy), Format (Định dạng) và Clear (Xoá) nếu cần.
Bật tiện ích
Để xây dựng ứ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 sử 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 trong 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 toys ( id VARCHAR(25), name VARCHAR(25), description VARCHAR(20000), quantity INT, price FLOAT, image_url VARCHAR(200), text_embeddings 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.
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 72 bản ghi trong tệp SQL này. Tệp này chứa các trường id, name, description, quantity, price, image_url
. Các trường khác sẽ được điền vào sau trong lớp học lập trình.
Sao chép các dòng/đoạn mã chèn từ đó, sau đó dán các dòng đó vào thẻ trình chỉnh sửa trống rồi chọn RUN (CHẠY).
Để xem nội dung của bảng, hãy mở rộng mục Trình khám phá cho đến khi bạn thấy bảng có tên là apparels. Chọn biểu tượng ba dấu chấm (⋮) để xem tuỳ chọn Truy vấn bảng. Câu lệnh SELECT sẽ mở trong thẻ Trình chỉnh sửa mới.
Cấp quyền
Chạy câu lệnh dưới đây để cấp quyền thực thi trên hàm embedding
cho 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à nhập 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. Tạo nội dung nhúng cho ngữ cảnh
Máy tính xử lý số dễ dàng hơn nhiều so với xử lý văn bản. Hệ thống nhúng chuyển đổi văn bản thành một loạt số dấu phẩy động đại diện cho văn bản đó, bất kể văn bản được viết như thế nào, sử dụng ngôn ngữ nào, v.v.
Hãy cân nhắc việc mô tả một địa điểm bên bờ biển. Cụm từ này có thể là "on the water" (trên mặt nước), "beachfront" (bờ biển), "walk from your room to the ocean" (đi bộ từ phòng đến biển), "sur la mer" (trên biển), "на берегу океана" (trên bờ biển), v.v. Tất cả các cụm từ này đều có vẻ khác nhau, nhưng ý nghĩa ngữ nghĩa của chúng hoặc trong thuật ngữ học máy, nội dung nhúng của chúng phải rất gần nhau.
Giờ đây, khi dữ liệu và ngữ cảnh đã sẵn sàng, chúng ta sẽ chạy SQL để thêm nội dung 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 ta sẽ sử dụng text-embedding-005
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 hiện có được tạo cách đây một thời gian, bạn có thể cần tiếp tục sử dụng các phiên bản cũ của mô hình nhúng văn bản như textembedding-gecko.
Quay lại thẻ AlloyDB Studio và nhập DML sau:
UPDATE toys set text_embeddings = embedding( 'text-embedding-005', description);
Xem lại bảng toys
để xem một số phần nhúng. Hãy nhớ chạy lại câu lệnh SELECT để xem các thay đổi.
SELECT id, name, description, price, quantity, image_url, text_embeddings FROM toys;
Thao tác này sẽ trả về vectơ nhúng, trông giống như một mảng float, cho nội dung mô tả đồ chơi như dưới đây:
Lưu ý: Các dự án Google Cloud mới tạo trong gói miễn phí có thể gặp 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 truy vấn bộ lọc cho mã nhận dạng, sau đó chọn lọc 1-5 bản ghi, v.v. trong khi tạo nội dung nhúng.
7. Tìm kiếm vectơ
Giờ đây, bảng, dữ liệu và nội dung nhúng đã 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:
"I want a white plush teddy bear toy with a floral pattern
."
Bạn có thể tìm thấy các kết quả trùng khớp bằng cách chạy truy vấn dưới đây:
select * from toys
ORDER BY text_embeddings <=> CAST(embedding('text-embedding-005', 'I want a white plush teddy bear toy with a floral pattern') as vector(768))
LIMIT 5;
Hãy cùng xem chi tiết truy vấn này:
Trong truy vấn này,
- Văn bản tìm kiếm của người dùng là: "
I want a white plush teddy bear toy with a floral pattern.
" - Chúng ta sẽ chuyển đổi dữ liệu này thành dữ liệu nhúng trong phương thức
embedding()
bằng cách sử dụng mô hình:text-embedding-005
. Bước này sẽ trông quen thuộc sau bước cuối cùng, khi chúng ta áp dụng hàm nhúng cho tất cả các mục trong bảng. - "
<=>
" thể hiện việc sử dụng phương thức khoảng cách COSINE SIMILARITY (TƯƠNG ĐỒNG COSINE). Bạn có thể tìm thấy tất cả các chỉ số tương đồng có trong tài liệu về pgvector. - Chúng ta đ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 chúng ta muốn trích xuất 5 từ 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ể quan sát trong kết quả, các cụm từ trùng khớp khá gần với văn bản tìm kiếm. Hãy thử thay đổi văn bản để 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 gợi nhắc 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ả khi có và không có chỉ mục.
Bước không bắt buộc: Cải thiện hiệu quả và khả năng gợi nhắc bằng Chỉ số ScaNN
Để thuận tiện, bạn chỉ cần liệt kê các bước tạo chỉ mục tại đây:
- Vì đã tạo cụm, thực thể, ngữ cảnh và nội dung 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 toysearch_index ON toys
USING scann (text_embeddings cosine)
WITH (num_leaves=9);
Trong DDL ở trên, apparel_index là tên của chỉ mục
"toys" là bảng của tôi
"scann" là phương thức chỉ mục
"nhúng" 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
"8" 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 SQUARE ROOT (HÀM LẤY CÂU ROOT) của số điểm dữ liệu như được đề xuất trong kho lưu trữ ScaNN (Khi phân vùng, num_leaves phải gần bằng căn bậc hai của số điểm dữ liệu).
- Kiểm tra xem chỉ mục có được tạo bằng truy vấn 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 toys
ORDER BY text_embeddings <=> CAST(embedding('text-embedding-005', 'I want a white plush teddy bear toy with a floral pattern') as vector(768))
LIMIT 5;
Truy vấn ở trên giống với truy vấn chúng ta đã sử dụng trong lớp học lập trình ở bước 8. Tuy nhiên, giờ đây chúng ta đã lập chỉ mục trường này.
- Kiểm thử 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 xoá chỉ mục):
Trường hợp sử dụng này chỉ có 72 bản ghi nên chỉ mục không thực sự có hiệu lực. Đối với một thử nghiệm được thực hiện trong trường hợp sử dụng khác, kết quả sẽ như sau:
Với cùng một cụm từ tìm kiếm Tìm kiếm vectơ trên dữ liệu nhúng ĐÃ LẬP CHỈ MỤC, bạn sẽ nhận được 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ể (theo 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.
8. Xác thực kết quả bằng LLM
Trước khi tiếp tục và tạo một dịch vụ để trả về các 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 thực thể đượ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 công nghệ học máy của Google cho Cụm và Thực thể của mình hay chưa. Trong AlloyDB Studio, hãy nhập lệnh sau:
show google_ml_integration.enable_model_support;
Nếu giá trị hiển thị là "bật", bạn có thể bỏ qua 2 bước tiếp theo và chuyển thẳng đến phần thiết lập tính năng 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 Tuỳ 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ạ dưới đây:
Nếu bạn chưa đặt thành "bật", hãy đặt thành "bật" rồi nhấp vào nút UPDATE INSTANCE (CẬP NHẬT MẪU). Bước này sẽ mất vài phút.
Tích hợp AlloyDB và Mô hình 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 để thiết lập quyền truy cập vào mô hình Gemini từ AlloyDB, 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 này sẽ chạy tốt.
Trước tiên, chúng ta tạo kết nối mô hình Gemini 1.5 như minh hoạ bên dưới. Hãy nhớ thay thế $PROJECT_ID
trong lệnh bên dưới bằng Mã dự án Google Cloud của bạn.
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 để chạy các dự đoán thông qua mô hình Google Vertex AI. 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 hiện có của AlloyDB được tạo cách đây một thời gian, bạn có thể cần xoá các tệp 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 grant execute trên hàm ml_predict_row trong trường hợp gặp vấn đề trong các lệnh gọi sắp tới của gemini-1.5.
Đánh giá các phản hồ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. Chúng ta sẽ xem xét các phần này và xem cách chúng kết hợp với nhau trong vài phút.
- Trước tiên, chúng ta sẽ gửi một yêu cầu đến cơ sở dữ liệu để lấy 10 kết quả phù hợp nhất với truy vấn của người dùng.
- Để xác định mức độ hợp lệ của các phản hồi, chúng ta sẽ sử dụng một truy vấn bên ngoài để giải thích cách đánh giá các phản hồi. Hàm này sử dụng trường
recommended_text
là văn bản tìm kiếm vàcontent
(là trường mô tả đồ chơi) của bảng bên trong như một phần của truy vấn. - Sau đó, chúng ta sẽ xem xét "mức độ phù hợp" của các câu trả lời được trả về.
predict_row
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, để nhận phản hồi của LLM, chúng ta sẽ trích xuất phản hồi đó bằng
REGEXP_REPLACE(gemini_validation,
'[^a-zA-Z,: ]',
'',
'g')
SELECT id,
name,
content,
quantity,
price,
image_url,
recommended_text,
REGEXP_REPLACE(gemini_validation, '[^a-zA-Z,: ]', '', 'g') AS gemini_validation
FROM (SELECT id,
name,
content,
quantity,
price,
image_url,
recommended_text,
CAST(ARRAY_AGG(LLM_RESPONSE) AS TEXT) AS gemini_validation
FROM (SELECT id,
name,
content,
quantity,
price,
image_url,
recommended_text,
json_array_elements(google_ml.predict_row(model_id => 'gemini-1.5',
request_body => CONCAT('{ "contents": [ { "role": "user", "parts": [ { "text": "User wants to buy a toy and this is the description of the toy they wish to buy: ', recommended_text, '. Check if the following product items from the inventory are close enough to really, contextually match the user description. Here are the items: ', content, '. Return a ONE-LINE response with 3 values: 1) MATCH: if the 2 contexts are reasonably matching in terms of any of the color or color family specified in the list, approximate style match with any of the styles mentioned in the user search text: This should be a simple YES or NO. Choose NO only if it is completely irrelevant to users search criteria. 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear one-line 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' :: TEXT AS LLM_RESPONSE
FROM (SELECT id,
name,
description AS content,
quantity,
price,
image_url,
'Pink panther standing' AS recommended_text
FROM toys
ORDER BY text_embeddings <=> embedding('text-embedding-005',
'Pink panther standing')::VECTOR
LIMIT 10) AS xyz) AS X
GROUP BY id,
name,
content,
quantity,
price,
image_url,
recommended_text) AS final_matches
WHERE REGEXP_REPLACE(gemini_validation, '[^a-zA-Z,: ]', '', 'g') LIKE '%MATCH%:%YES%';
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 về vấn đề này. Kết quả sẽ cho biết liệu có trùng khớp hay không, tỷ lệ phần trăm trùng khớp và một số nội dung giải thích về điểm xếp hạng.
Lưu ý rằng mô hình Gemini đã bật tính năng truyền trực tuyến theo mặc định, vì vậy, câu trả lời thực tế được phân bổ trên nhiều dòng:
9. Chuyển ứng dụng Tìm kiếm đồ chơi lên Cloud Search mà không cần máy chủ
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 dưới đây để tạo Công cụ tri thức không có máy chủ này bằng Hàm chạy trên đám mây:
- Chuyển đến phần Hàm Cloud Run trong Google Cloud Console để TẠO một Hàm Cloud Run 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 "get-toys-alloydb" và chọn Khu vực là "us-central1". Đặt Authentication (Xác thực) thành "Allow unauthenticated invocations" (Cho phép các lệnh gọi chưa xác thực) rồi nhấp vào NEXT (TIẾP THEO). Chọn Java 17 làm môi trường thời gian chạy và Inline Editor (Trình chỉnh sửa cùng dòng) cho mã nguồn.
- Theo mặc định, hàm này sẽ đặt Điểm truy cập thành "
gcfv2.HelloHttpFunction
". Thay thế mã phần giữ chỗ trongHelloHttpFunction.java
vàpom.xml
của Hàm chạy trên đám mây bằng mã từ HelloHttpFunction.java và pom.xml tương ứng. - Hãy nhớ thay thế phần giữ chỗ <<YOUR_PROJECT>> và thông tin xác thực kết nối AlloyDB bằng các giá trị của bạn trong tệp Java. Thông tin xác thực AlloyDB là những thông tin mà chúng ta đã sử dụng ở đầu lớp học lập trình này. Nếu bạn đã sử dụng các giá trị khác, 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 Hàm trên đám mây truy cập vào thực thể 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 Hàm Cloud Run của Google. Tìm hàm mới tạo (get-toys-alloydb
), nhấp vào hàm đó, sau đó nhấp vào CHỈNH SỬA rồi thay đổi như sau:
- Chuyển đến phần Thời gian chạy, bản dựng, kết nối và cài đặt 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 "Allow all traffic" (Cho phép tất cả lưu lượng truy cập).
- Trong phần Cài đặt đầu ra, hãy nhấp vào trình đơn thả xuống Mạng rồi chọn "Thêm trình kết nối VPC mới" và làm theo hướng dẫn 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 giống với phiên bản của bạn. Giữ 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 phần Hiển thị chế độ cài đặt điều chỉnh theo tỷ lệ và đảm bảo bạn đã thiết lập cấu hình chính xác như sau:
- Nhấp vào TẠO và trình kết nối này sẽ xuất hiện trong phần cài đặt đầu ra.
- Chọn trình kết nối 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 TRÌNH DƯƠNG.
10. Kiểm thử hàm Cloud Run
Sau khi triển khai Chức năng đám mây đã 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/get-toys-alloydb
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/get-toys-alloydb \
-H 'Content-Type: application/json' \
-d '{"search":"I want a standing pink panther toy"}' \
| jq .
Và kết quả:
Vậy là xong! Bạn có thể thực hiện thao tác Tìm kiếm vectơ tương đồng bằng cách sử dụng mô hình Nhúng trên dữ liệu AlloyDB một cách đơn giản như vậy.
11. Xây dựng ứng dụng web!
Trong phần này, chúng ta sẽ xây dựng một ứng dụng web để người dùng tương tác và tìm thấy đồ chơi phù hợp dựa trên văn bản, hình ảnh và thậm chí tạo đồ chơi mới dựa trên nhu cầu của họ. Vì ứng dụng đã được tạo, nên bạn có thể làm theo các bước bên dưới để sao chép ứng dụng đó vào IDE và chạy ứng dụng.
- Vì chúng ta sử dụng Gemini 2.0 Flash để mô tả hình ảnh mà người dùng có thể tải lên để tìm đồ chơi phù hợp, nên chúng ta cần lấy KHOÁ API cho ứng dụng này. Để làm việc đó, hãy truy cập vào https://aistudio.google.com/apikey và lấy Khoá API cho Dự án Google Cloud đang hoạt động mà bạn đang triển khai ứng dụng này và lưu khoá ở một nơi nào đó:
- Chuyển đến Cửa sổ dòng lệnh Cloud Shell
- Sao chép kho lưu trữ bằng lệnh sau:
git clone https://github.com/AbiramiSukumaran/toysearch
cd toysearch
- Sau khi sao chép kho lưu trữ, bạn có thể truy cập vào dự án từ Trình chỉnh sửa Cloud Shell.
- Bạn cần xoá các thư mục "get-toys-alloydb" và "toolbox-toys" khỏi dự án được sao chép vì đây là 2 mã Hàm chạy trên đám mây có thể được tham chiếu từ kho lưu trữ khi bạn cần.
- Đảm bảo bạn đã đặt tất cả các biến môi trường cần thiết trước khi tạo và triển khai ứng dụng. Chuyển đến Cloud Shell Terminal (Màn hình điều khiển Cloud Shell) và thực thi các lệnh sau:
PROJECT_ID=$(gcloud config get-value project)
export PROJECT_ID $PROJECT_ID
export GOOGLE_API_KEY <YOUR API KEY that you saved>
- Tạo bản dựng và chạy ứng dụng trên máy:
Đảm bảo bạn đang ở thư mục dự án, hãy chạy các lệnh sau:
mvn package
mvn spring-boot:run
- Triển khai trên Cloud Run
gcloud run deploy --source .
12. Tìm hiểu thông tin chi tiết về AI tạo sinh
Bạn không cần làm gì cả. Để bạn hiểu rõ hơn:
Giờ đây, bạn đã có ứng dụng để triển khai, hãy dành chút thời gian để tìm hiểu cách chúng tôi thực hiện việc tìm kiếm (văn bản và hình ảnh) cũng như tạo nội dung.
- Tìm kiếm vectơ dựa trên văn bản của người dùng:
Vấn đề này đã được giải quyết trong Hàm Cloud Run mà chúng ta đã triển khai trong phần "Đưa ứng dụng Tìm kiếm vectơ lên web".
- Tìm kiếm vectơ dựa trên hình ảnh tải lên:
Thay vì nhập ngữ cảnh dưới dạng văn bản, giả sử người dùng muốn tải hình ảnh một món đồ chơi quen thuộc mà họ muốn dùng để tìm kiếm lên. Người dùng có thể tải hình ảnh một món đồ chơi mà họ thích lên và nhận được các tính năng có liên quan.
Chúng tôi tận dụng mô hình Flash Gemini 2.0 của Google, được gọi bằng LangChain4j, để phân tích hình ảnh và trích xuất ngữ cảnh có liên quan, chẳng hạn như màu sắc, chất liệu, loại và nhóm tuổi dự kiến của đồ chơi.
Chỉ trong 5 bước, chúng tôi đã lấy dữ liệu đa phương thức của người dùng để so khớp kết quả với lệnh gọi mô hình ngôn ngữ lớn bằng cách sử dụng khung nguồn mở. Tìm hiểu cách làm:
package cloudcode.helloworld.web;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.googleai.GoogleAiGeminiChatModel;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.model.output.Response;
import dev.langchain4j.data.message.ImageContent;
import dev.langchain4j.data.message.TextContent;
import java.util.Base64;
import java.util.Optional;
public class GeminiCall {
public String imageToBase64String(byte[] imageBytes) {
String base64Img = Base64.getEncoder().encodeToString(imageBytes);
return base64Img;
}
public String callGemini(String base64ImgWithPrefix) throws Exception {
String searchText = "";
// 1. Remove the prefix
String base64Img = base64ImgWithPrefix.replace("data:image/jpeg;base64,", "");
// 2. Decode base64 to bytes
byte[] imageBytes = Base64.getDecoder().decode(base64Img);
String image = imageToBase64String(imageBytes);
// 3. Get API key from environment variable
String apiKey = Optional.ofNullable(System.getenv("GOOGLE_API_KEY"))
.orElseThrow(() -> new IllegalArgumentException("GOOGLE_API_KEY environment variable not set"));
// 4. Invoke Gemini 2.0
ChatLanguageModel gemini = GoogleAiGeminiChatModel.builder()
.apiKey(apiKey)
.modelName("gemini-2.0-flash-001")
.build();
Response<AiMessage> response = gemini.generate(
UserMessage.from(
ImageContent.from(image, "image/jpeg"),
TextContent.from(
"The picture has a toy in it. Describe the toy in the image in one line. Do not add any prefix or title to your description. Just describe that toy that you see in the image in one line, do not describe the surroundings and other objects around the toy in the image. If you do not see any toy in the image, send response stating that no toy is found in the input image.")));
// 5. Get the text from the response and send it back to the controller
searchText = response.content().text().trim();
System.out.println("searchText inside Geminicall: " + searchText);
return searchText;
}
}
- Tìm hiểu cách chúng tôi sử dụng Imagen 3 để tạo một món đồ chơi tuỳ chỉnh dựa trên yêu cầu của người dùng bằng AI tạo sinh.
Sau đó, Imagen 3 sẽ tạo hình ảnh của đồ chơi được thiết kế tuỳ chỉnh, giúp người dùng hình dung rõ ràng về sản phẩm của họ. Chúng tôi đã thực hiện việc này chỉ trong 5 bước:
// Generate an image using a text prompt using an Imagen model
public String generateImage(String projectId, String location, String prompt)
throws ApiException, IOException {
final String endpoint = String.format("%s-aiplatform.googleapis.com:443", location);
PredictionServiceSettings predictionServiceSettings =
PredictionServiceSettings.newBuilder().setEndpoint(endpoint).build();
// 1. Set up the context and prompt
String context = "Generate a photo-realistic image of a toy described in the following input text from the user. Make sure you adhere to all the little details and requirements mentioned in the prompt. Ensure that the user is only describing a toy. If it is anything unrelated to a toy, politely decline the request stating that the request is inappropriate for the current context. ";
prompt = context + prompt;
// 2. Initialize a client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
try (PredictionServiceClient predictionServiceClient =
PredictionServiceClient.create(predictionServiceSettings)) {
// 3. Invoke Imagen 3
final EndpointName endpointName =
EndpointName.ofProjectLocationPublisherModelName(
projectId, location, "google", "imagen-3.0-generate-001"); //"imagegeneration@006"; imagen-3.0-generate-001
Map<String, Object> instancesMap = new HashMap<>();
instancesMap.put("prompt", prompt);
Value instances = mapToValue(instancesMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("sampleCount", 1);
paramsMap.put("aspectRatio", "1:1");
paramsMap.put("safetyFilterLevel", "block_few");
paramsMap.put("personGeneration", "allow_adult");
paramsMap.put("guidanceScale", 21);
paramsMap.put("imagenControlScale", 0.95); //Setting imagenControlScale
Value parameters = mapToValue(paramsMap);
// 4. Get prediction response image
PredictResponse predictResponse =
predictionServiceClient.predict(
endpointName, Collections.singletonList(instances), parameters);
// 5. Return the Base64 Encoded String to the controller
for (Value prediction : predictResponse.getPredictionsList()) {
Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
if (fieldsMap.containsKey("bytesBase64Encoded")) {
bytesBase64EncodedOuput = fieldsMap.get("bytesBase64Encoded").getStringValue();
}
}
return bytesBase64EncodedOuput.toString();
}
}
Dự đoán giá
Trong phần trước, chúng ta đã thảo luận về cách Imagen tạo hình ảnh của một món đồ chơi mà người dùng muốn tự thiết kế. Để người dùng có thể mua, ứng dụng cần đặt giá cho món đồ chơi đó. Chúng tôi đã sử dụng logic trực quan để xác định giá cho món đồ chơi tuỳ chỉnh theo đơn đặt hàng. Logic là sử dụng giá trung bình của 5 món đồ chơi phù hợp nhất (theo nội dung mô tả) trong số những món đồ chơi mà người dùng thiết kế.
Thông tin dự đoán giá của đồ chơi được tạo là một phần quan trọng của ứng dụng này và chúng tôi đã sử dụng phương pháp đại diện để tạo thông tin này. Giới thiệu Hộp công cụ AI tạo sinh cho cơ sở dữ liệu.
13. Hộp công cụ Gen AI cho cơ sở dữ liệu
Hộp công cụ Gen AI cho cơ sở dữ liệu là một máy chủ nguồn mở của Google giúp bạn dễ dàng xây dựng các công cụ Gen AI để tương tác với cơ sở dữ liệu. Thư viện này giúp bạn phát triển các công cụ dễ dàng, nhanh chóng và an toàn hơn bằng cách xử lý các vấn đề phức tạp như gộp kết nối, xác thực, v.v. Công cụ này giúp bạn xây dựng các công cụ AI tạo sinh để cho phép nhân viên hỗ trợ truy cập vào dữ liệu trong cơ sở dữ liệu của bạn.
Dưới đây là các bước bạn cần làm theo để thiết lập công cụ này nhằm chuẩn bị cho công cụ của bạn và tạo ứng dụng của chúng tôi: Đường liên kết đến lớp học lập trình về Hộp công cụ
Giờ đây, ứng dụng của bạn có thể sử dụng điểm cuối Hàm chạy trên đám mây đã triển khai này để điền giá cùng với kết quả Imagen được tạo cho hình ảnh đồ chơi được làm theo yêu cầu.
14. Kiểm thử ứng dụng web
Giờ đây, tất cả các thành phần của ứng dụng đã được tạo và triển khai, ứng dụng đã sẵn sàng phân phát trên đám mây. Kiểm thử ứng dụng của bạn cho tất cả các trường hợp. Sau đây là đường liên kết đến video về những điều bạn có thể mong đợi:
https://www.youtube.com/shorts/ZMqUAWsghYQ
Trang đích sẽ có dạng như sau:
15. Dọn dẹp
Để tránh bị tính phí cho tài khoản Google Cloud của bạn đối với 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 Google Cloud Console, 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, sau đó nhấp vào Shut down (Tắt) để xoá dự án.
16. Xin chúc mừng
Xin chúc mừng! Bạn đã thực hiện thành công tính năng Tìm kiếm theo ngữ cảnh và Tạo nội dung theo ngữ cảnh cho Cửa hàng đồ chơi bằng cách sử dụng AlloyDB, pgvector, Imagen và Gemini 2.0, đồng thời tận dụng các thư viện nguồn mở để xây dựng các tính năng tích hợp mạnh mẽ. Bằng cách kết hợp các tính năng của AlloyDB, Vertex AI và Tìm kiếm vectơ, chúng tôi đã tiến một bước dài trong việc giúp các tính năng tìm kiếm theo ngữ cảnh và vectơ trở nên dễ tiếp cận, hiệu quả và thực sự mang lại ý nghĩa.