Chào mừng bạn đến với tính năng tìm kiếm vectơ theo độ tương đồng của Firebase Data Connect — cách triển khai tính năng tìm kiếm ngữ nghĩa của Firebase tích hợp với Google Vertex AI.
Nòng cốt của tính năng này là các vectơ nhúng, là các mảng số dấu phẩy động đại diện cho ý 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 một tìm kiếm kề gần nhất bằng cách nhúng vectơ đầu vào, bạn có thể tìm thấy tất cả nội dung tương tự về ngữ nghĩa. Data Connect sử dụng tiện ích pgvector
của PostgreSQL cho chức 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 chính trong quy trình tạo sinh được tăng cường bằng tính năng truy xuất trong quy trình AI tạo sinh. Tài liệu về Vertex AI là nơi tuyệt vời để bạn tìm hiểu thêm.
Bạn có thể dựa vào tính năng hỗ trợ tích hợp của Data Connect để tự động tạo các vectơ nhúng bằng cách sử dụng API Nhúng của Vertex AI hoặc sử dụng API đó để tạo các vectơ nhúng theo cách thủ công.
Điều kiện tiên quyết
Thiết lập tính năng Kết nối dữ liệu 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 cho 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 chính thức và phiên bản Cloud SQL cho PostgreSQL để phát triển.
Hướng dẫn này giả định rằng bạn đã tạo dự án Data Connect 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 chính bạn vai trò IAM của người dùng Vertex AI.
- Thiết lập Thông tin đăng nhập 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
pgvector
trong phiên bản PostgreSQL cục bộ. - Bật tiện ích này bằng cách sử dụng
CREATE EXTENSION vector
theo hướng dẫn về 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 chính bạn vai trò IAM của người dùng Vertex AI.
- Bật tiện ích bằng
CREATE EXTENSION vector
theo 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
trong giản đồ. Ví dụ: nếu bạn muốn tìm kiếm theo 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 vectơ nhúng đượ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 vectơ nhúng 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 nội dung nhúng
Data Connect mang đến sự hỗ trợ tích hợp cho các mục nhúng vectơ với giá trị máy chủ _embed
. Thao tác này sẽ hướng dẫn Data Connect tạo các vectơ nhúng bằng cách gọi nội bộ các API Nhúng của Vertex AI. Bạn có thể sử dụng giá trị máy chủ _embed
trong cả trường hợp đột biến và truy vấn.
Đột biến
Tạo và lưu trữ một mục nhúng thông qua Data Connect
Trong ứng dụng tìm kiếm vectơ, bạn có thể yêu cầu tạo các mục nhúng ngay khi thêm bản ghi vào cơ sở dữ liệu. Dưới đây là một đột biến createMovie
thêm bản ghi phim vào bảng Movie
và cũng truyền nội dung mô tả phim bằng model
nhúng được chỉ định.
mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
movie_insert(data: {
...movieData,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
})
}
Trong một số trường hợp, có thể bạn sẽ muốn cập nhật nội dung mô tả và việc nhúng 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 { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';
await updateMovieDescriptionWithEmbed({ id: movieId, description: description});
// Use the response
Cụm từ tìm kiếm
Truy xuất nội dung nhúng vectơ bằng một truy vấn như sau. Lưu ý descriptionEmbedding
mà truy vấn trả về là một mảng số thực, mà thường con người không thể đọc được. Do đó, các SDK do Data Connect tạo không hỗ trợ việc trả về trực tiếp.
Bạn có thể sử dụng các vectơ nhúng được trả về để tìm kiếm nội dung tương tự, như mô tả trong phần tiếp theo.
query getMovieDescription($id: String!) @auth(is: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Thực hiện tìm kiếm điểm tương tự
Bây giờ, chúng ta có thể thực hiện tìm kiếm theo mức độ tương đồng.
Đố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 nội dung tương tự. Tên của hàm được tạo này là ${pluralType}_${vectorFieldName}_similarity
. Phương thức 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 ra lệnh tìm kiếm tương tự. Như đã đề cập ở trên, giá trị máy chủ _embed
sẽ hướng dẫn Data Connect tạo các vectơ nhúng bằng cách sử dụng API nhúng của Vertex AI, trong trường hợp này là để tạo các vectơ nhúng cho chuỗi tìm kiếm dùng để so sánh với các vectơ nhúng nội dung mô tả phim.
Trong ví dụ này, tính năng tìm kiếm nội dung 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 cụm từ tìm kiếm đầu vào. Tập hợp kết quả được sắp xếp theo thứ tự tăng dần của khoảng cách – 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},
method: L2,
within: 2,
where: {content: {ne: "No info available for this movie."}}, limit: 5)
{
id
title
description
}
}
Gọi truy vấn tương đồng
Cách gọi tính năng tìm kiếm nội dung 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 nội dung 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 phần nhúng dưới dạng Vector
thay vì sử dụng giá trị máy chủ _embed
để tạo các phần nhúng đó.
Lưu trữ một mục nhúng tuỳ chỉnh
Sử dụng Vertex Nhúng API, chỉ định một mô hình phù hợp và yêu cầu kết quả nhúng theo đúng kích thước.
Sau đó, truyền mảng số thực được trả về vào Vector
để truyền đến thao tác cập nhật cho bộ nhớ.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Tìm kiếm điểm tương đồng bằng các mục nhúng tuỳ chỉnh
Thực hiện thao tác tương tự để truy xuất các nội dung nhúng cho cụm từ tìm kiếm và truyền các nội dung đó vào Vectors
.
Sau đó, hãy 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 vào giai đoạn sản xuất
Triển khai giản đồ và trình kết nối
Bước cuối cùng trong một vòng lặp Data Connect thông thường là triển khai tài sản của bạn sang môi trường phát hành chính thức.
Khi triển khai giản đồ chứa các loại Vector
cho CloudSQL bằng lệnh firebase deploy
, CLI Firebase sẽ thực hiện các bước cần thiết để bật tính năng tạo nội dung nhúng dựa trên Vertex AI trên phiên bản CloudSQL của bạn.
firebase deploy --only dataconnect
nếu bạn muốn bật tính năng hỗ 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 những hướng dẫn này.
Cú pháp tìm kiếm vectơ
Phần mở rộng về giản đồ
Loại dữ liệu Vector
của Data Connect liên kết với loại vector
của PostgreSQL như được xác định bằng tiện ích pgvector
. Loại vector
của pgvector được lưu trữ dưới dạng một mảng gồm các số có dấu phẩy động với độ 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. Dữ liệu đầu vào được chuyển đổi thành một mảng các giá trị float32
. Nếu không thực hiện được việc ép buộc, lỗi sẽ được báo.
Sử dụng tham số kích thước của lệnh @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 phép toán Vector
, chẳng hạn như tìm kiếm theo mức độ tương đồng, đòi hỏi tất cả Vector
phải có cùng số lượng chiều.
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 sẽ hướng dẫn dịch vụ Data Connect tạo và lưu trữ các phần nhúng bằng cách sử dụng API Nhúng của Vertex AI. Bạn có thể sử dụng giá trị máy chủ này cho cả truy vấn và đột biến.
Tham số cho tính năng tìm kiếm nội dung tương tự
method: COSINE|INNER_PRODUCT|L2
Hàm khoảng cách dùng để tìm kiếm những người hàng xóm ở gần. Các thuật toán hiện được hỗ trợ là một tập hợp con của thuật toán tìm kiếm pgvector.
within: float
Quy tắc ràng buộc về khoảng cách trong đó tìm kiếm đối tượng lân cận gần nhất được thực hiện.
where: FDC filter condition
Xem hướng dẫn về lược đồ, truy vấn và đột biến.
limit: int
Số lượng kết quả cần trả về.