Chào mừng bạn đến với Firebase Data Connect tính năng tìm kiếm độ tương tự vectơ – tính năng triển khai tìm kiếm ngữ nghĩa của Firebase tích hợp với Google Vertex AI.
Tính năng này dựa trên các giá trị nhúng vectơ, là các mảng số dấu phẩy động biểu thị ý nghĩa ngữ nghĩa của văn bản hoặc nội dung nghe nhìn. Bằng cách chạy tìm kiếm lân cận gần nhất bằng giá trị nhúng vectơ đầu vào, bạn có thể tìm thấy tất cả nội dung tương tự về mặt ngữ nghĩa. Data Connect sử dụng tiện ích mở rộng
pgvector của PostgreSQL cho tính năng này.
Tính năng tìm kiếm ngữ nghĩa mạnh mẽ này có thể thúc đẩy các trường hợp sử dụng như công cụ đề xuất và công cụ tìm kiếm. Đây cũng là một thành phần quan trọng trong quá trình tạo nội dung được tăng cường bằng khả năng truy xuất trong các luồng AI tạo sinh. Tài liệu về Vertex AI là nơi tuyệt vời để tìm hiểu thêm.
Bạn có thể dựa vào tính năng hỗ trợ tích hợp sẵn của Data Connect để tự động tạo giá trị nhúng vectơ bằng API Embeddings của Vertex AI, hoặc sử dụng API đó để tạo giá trị nhúng theo cách thủ công.
Điều kiện tiên quyết
Thiết lập Data Connect cho dự án của bạn.
Bật API Vertex AI.
Thiết lập
Bạn có thể chọn giữa quy trình phát triển cục bộ (nếu bạn là nhà phát triển web, Kotlin Android hoặc iOS) hoặc quy trình IDX (dành cho nhà phát triển web). Bạn có thể sử dụng cơ sở dữ liệu cục bộ hoặc dự án Data Connect phát hành công khai và thực thể Cloud SQL cho PostgreSQL của dự án đó để phát triển.
Các hướng dẫn này giả định rằng bạn đã tạo dự án Data Connect của mình theo hướng dẫn bắt đầu nhanh.
Tích hợp với PostgreSQL cục bộ
- Thiết lập một thực thể PostgreSQL cục bộ.
- Cấp cho bạn vai trò IAM người dùng Vertex AI.
- Thiết lập Thông tin xác thực mặc định của ứng dụng Google Cloud trong môi trường của bạn.
- Cài đặt tiện ích
pgvectortrong thực thể PostgreSQL cục bộ. - Bật tiện ích bằng cách sử dụng
CREATE EXTENSION vectortheo hướng dẫn của kho lưu trữpgvector.
Tích hợp với IDX
- Thiết lập không gian làm việc IDX bằng mẫu Data Connect.
- Cấp cho bạn vai trò IAM người dùng Vertex AI.
- Bật tiện ích bằng cách sử dụng
CREATE EXTENSION vectortheo hướng dẫn của kho lưu trữpgvector.
Thiết kế giản đồ
Để thực hiện tìm kiếm vectơ, hãy thêm một trường mới thuộc loại Vector vào giản đồ. Ví dụ: nếu bạn muốn thực hiện tìm kiếm ngữ nghĩa bằng cách sử dụng nội dung mô tả phim, hãy thêm một trường để lưu giữ các giá trị nhúng vectơ được liên kết với nội dung mô tả phim. Trong
giản đồ này, descriptionEmbedding được thêm vào để lưu trữ các giá trị nhúng vectơ cho
trường description.
type Movie @table {
id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
title: String!
description: String
descriptionEmbedding: Vector! @col(size:768)
// ...
}
Tạo và truy xuất giá trị nhúng
Data Connect hỗ trợ tích hợp cho các giá trị nhúng vectơ với
giá trị máy chủ _embed. Điều này hướng dẫn Data Connect tạo
giá trị nhúng vectơ bằng cách gọi nội bộ các API Embedding của Vertex AI. Bạn có thể sử dụng giá trị máy chủ _embed trong cả các đột biến và truy vấn.
Đột biến
Tạo và lưu trữ giá trị nhúng thông qua Data Connect
Trong ứng dụng tìm kiếm vectơ, bạn có thể muốn yêu cầu tạo giá trị nhúng ngay khi thêm bản ghi vào cơ sở dữ liệu. Sau đây là một createMovie
đột biến thêm bản ghi phim vào bảng Movie và cũng truyền nội dung mô tả phim có giá trị nhúng model được chỉ định.
mutation createMovie($title: String!, $description: String!) {
movie_insert(data: {
title: $title,
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
Trong một số trường hợp, bạn có thể muốn cập nhật nội dung mô tả và giá trị nhúng của phim.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
Cách gọi đột biến sau từ ứng dụng:
import { updateMovieDescription } from 'lib/dataconnect-sdk/';
await updateMovieDescription({ id: movieId, description: description});
// Use the response
Cụm từ tìm kiếm
Tìm nạp giá trị nhúng vectơ bằng một truy vấn như sau. Xin lưu ý rằng descriptionEmbedding do truy vấn trả về là một mảng số thực dấu phẩy động, thường không thể đọc được. Do đó, các SDK do Data Connect tạo không
hỗ trợ trả về trực tiếp.
Bạn có thể sử dụng các giá trị nhúng vectơ được trả về để thực hiện tìm kiếm độ tương tự, như mô tả trong phần tiếp theo.
query getMovieDescription($id: String!) @auth(level: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Thực hiện tìm kiếm độ tương tự
Giờ đây, chúng ta có thể thực hiện tìm kiếm độ tương tự.
Đối với mỗi trường Vector, Data Connect sẽ tạo một hàm GraphQL
triển khai tính năng tìm kiếm độ tương tự. Tên của hàm được tạo này là ${pluralType}_${vectorFieldName}_similarity. Hàm này hỗ trợ một số tham số
như trong các ví dụ sau và trong danh sách tham chiếu.
Bạn có thể xác định một hàm GraphQL gọi tính năng tìm kiếm độ tương tự. Như
đã đề cập ở trên, giá trị máy chủ _embed hướng dẫn Data Connect tạo các giá trị nhúng vectơ bằng API Embedding của Vertex AI, trong trường hợp này
là để tạo giá trị nhúng cho chuỗi tìm kiếm dùng để so sánh với giá trị nhúng nội dung mô tả phim.
Trong ví dụ này, tính năng tìm kiếm độ tương tự sẽ trả về tối đa 5 bộ phim có nội dung mô tả gần nhất về mặt ngữ nghĩa với truy vấn đầu vào. Tập kết quả được sắp xếp theo thứ tự tăng dần của khoảng cách – từ gần nhất đến xa nhất.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Điều chỉnh truy vấn độ tương tự
Các giá trị mặc định cho các tham số tìm kiếm như method và within hoạt động tốt cho hầu hết các trường hợp sử dụng. Tuy nhiên, nếu bạn nhận thấy truy vấn trả về kết quả quá khác biệt hoặc thiếu kết quả mà bạn muốn đưa vào, hãy thử điều chỉnh các tham số này.
Để tìm giá trị thích hợp cho within, chúng ta có thể thêm _metadata.distance vào các trường đã chọn để xem mỗi kết quả cách vectơ truy vấn bao xa. Dựa trên các giá trị distance được trả về, chúng ta có thể đặt tham số within; chỉ những kết quả có khoảng cách nhỏ hơn giá trị của within mới được đưa vào:
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Bạn cũng có thể thử nghiệm các hàm khoảng cách khác nhau bằng cách đặt tham số method.
query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare_embed: {model: "textembedding-gecko@003", text: $query},
within: .5,
method: COSINE,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
_metadata {
distance
}
}
}
Xin lưu ý rằng các phương thức khác nhau sẽ trả về các giá trị rất khác nhau cho khoảng cách: nếu bạn đã đặt within, bạn sẽ cần điều chỉnh lại giá trị đó sau khi thay đổi method.
Gọi truy vấn độ tương tự
Cách gọi tìm kiếm độ tương tự từ mã ứng dụng:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Sử dụng giá trị nhúng tuỳ chỉnh
Data Connect cũng cho phép bạn làm việc trực tiếp với các giá trị nhúng dưới dạng Vectors
thay vì sử dụng giá trị máy chủ _embed để tạo các giá trị nhúng đó.
Lưu trữ giá trị nhúng tuỳ chỉnh
Sử dụng API Vertex Embeddings, hãy chỉ định một mô hình phù hợp và yêu cầu kết quả nhúng có kích thước chính xác.
Sau đó, truyền mảng số thực dấu phẩy động được trả về vào Vector để truyền đến thao tác cập nhật để lưu trữ.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Thực hiện tìm kiếm độ tương tự bằng giá trị nhúng tuỳ chỉnh
Thực hiện cùng một thao tác để truy xuất giá trị nhúng cho các cụm từ tìm kiếm và truyền các giá trị nhúng đó vào Vectors.
Sau đó, gọi truy vấn _similarity để thực hiện từng lượt tìm kiếm.
query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
movies_descriptionEmbedding_similarity(
compare: $compare,
method: L2,
within: $within,
where: {content: {ne: $excludesContent}}, limit: $limit)
{
id
title
description
}
}
Triển khai lên kênh phát hành công khai
Triển khai giản đồ và trình kết nối
Bước cuối cùng trong một lần lặp lại Data Connect điển hình là triển khai các thành phần của bạn lên kênh phát hành công khai.
Khi triển khai giản đồ chứa các loại Vector lên CloudSQL bằng lệnh
firebase deploy command, Firebase CLI sẽ thực hiện các bước cần thiết để
bật tính năng tạo giá trị nhúng dựa trên Vertex AI trên thực thể CloudSQL.
firebase deploy --only dataconnectNếu bạn muốn bật tính năng hỗ trợ giá trị nhúng trong thực thể CloudSQL theo cách thủ công hoặc gặp lỗi CLI, hãy làm theo các hướng dẫn sau.
Cú pháp tìm kiếm vectơ
Tiện ích giản đồ
Loại dữ liệu Vector của Data Connect's ánh xạ đến loại vector của PostgreSQL
như được xác định bởi tiện ích pgvector.
Loại vector của pgvector được lưu trữ dưới dạng một mảng số thực dấu phẩy động có độ chính xác đơn
trong PostgreSQL.
Trong Data Connect, loại Vector được biểu thị dưới dạng một mảng số JSON. Các giá trị đầu vào được ép buộc thành một mảng giá trị float32. Nếu quá trình ép buộc không thành công, một lỗi sẽ xảy ra.
Sử dụng tham số kích thước của chỉ thị @col để đặt kích thước của vectơ.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
size chỉ được hỗ trợ cho các loại Vector. Các thao tác Vector, chẳng hạn như tìm kiếm độ tương tự, đòi hỏi tất cả Vector phải có cùng số lượng kích thước.
directive @col(
# … existing args
"""
Defines a fixed column size for certain scalar types.
- For Vector, size is required.
- For all other types, size is currently unsupported and hence supplying it will result in a schema error.
"""
size: Int
) on FIELD_DEFINITION
Giá trị máy chủ _embed cho các truy vấn và đột biến
_embed
Giá trị máy chủ này hướng dẫn dịch vụ Data Connect tạo và lưu trữ giá trị nhúng bằng API Embedding của Vertex AI. Bạn có thể sử dụng giá trị máy chủ này trên cả các truy vấn và đột biến.
Tham số cho tìm kiếm độ tương tự
method: COSINE|INNER_PRODUCT|L2
Hàm khoảng cách dùng để tìm kiếm các lân cận gần đó. Các thuật toán được hỗ trợ hiện tại là một tập hợp con của các thuật toán tìm kiếm pgvector.
within: float
Một ràng buộc về khoảng cách mà trong đó quá trình tìm kiếm lân cận gần nhất được thực hiện.
where: FDC filter condition
Xem hướng dẫn về giản đồ, truy vấn và đột biến.
limit: int
Số lượng kết quả cần trả về.