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 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ộ

  1. Thiết lập một thực thể PostgreSQL cục bộ.
  2. Cấp cho bạn vai trò IAM 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 thực thể PostgreSQL cục bộ.
  5. 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.

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 bạn vai trò IAM 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 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ư methodwithin 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 dataconnect

Nế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ề.