Thực hiện tìm kiếm điểm tương đồng vectơ bằng Vertex AI

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ộ

  1. Thiết lập một thực thể PostgreSQL cục bộ.
  2. Cấp cho chính bạn vai trò IAM của người dùng Vertex AI.
  3. 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.
  4. Cài đặt tiện ích pgvector trong phiên bản PostgreSQL cục bộ.
  5. 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

  1. Thiết lập không gian làm việc IDX bằng mẫu Data Connect.
  2. Cấp cho chính bạn vai trò IAM của người dùng Vertex AI.
  3. 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ề.