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ơ 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 tăng cườ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 để 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à thực thể 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 phiên bản 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 xác thực 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 bằng CREATE EXTENSION vector theo hướng dẫn của 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 cách sử dụ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 ngữ nghĩa bằng nội dung mô tả phim, hãy thêm một trường để lưu trữ các vectơ nhúng 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 tính năng hỗ trợ tích hợp cho các vectơ nhúng bằng 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ả các đột biến và truy vấn.

Đột biến

Tạo và lưu trữ nội dung 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 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, bạn có thể muốn cập nhật nội dung mô tả và tính năng 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. Xin lưu ý rằng descriptionEmbedding do truy vấn trả về là một mảng số thực, thường không đọc được bằng văn bản. 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
}

Tìm kiếm nội dung tương tự

Bây giờ, chúng ta có thể thực hiện tìm kiếm theo độ 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 lệnh tìm kiếm nội dung 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ữ nội dung nhúng tuỳ chỉnh

Sử dụng API nhúng Vertex, hãy chỉ định một mô hình phù hợp và yêu cầu kết quả nhúng của đú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 nội dung tương đồng bằng cách sử dụ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 mục nhúng cho cụm từ tìm kiếm và truyền các mục đó 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 cho 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 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 phiên bản CloudSQL theo cách thủ công hoặc gặp lỗi CLI, hãy làm theo hướng dẫn này.

Cú pháp tìm kiếm vectơ

Tiện ích giản đồ

Kiểu dữ liệu Vector của Data Connect liên kết với kiểu vector của PostgreSQL như được xác định bởi tiện ích pgvector. Kiểu vector của pgvector được lưu trữ dưới dạng một mảng số 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. 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 các đối tượng lân cận ở gần. Các thuật toán hiện được hỗ trợ là một tập hợp con của các 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ề.