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 SQL Connect tính năng tìm kiếm độ tương đồng giữa các vectơ – tính năng 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áng giềng gần nhất bằng cách sử dụ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. SQL Connect sử dụng tiện ích 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à thành phần chính trong quá trình tạo sinh được tăng cường khả năng truy xuất generation 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 SQL Connect để tự động tạo giá trị nhúng vectơ bằng API Nhúng 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 SQL 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 SQL Connect thực tế và Cloud SQL cho thực thể 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 SQL 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 thực thể PostgreSQL cục bộ.

  2. Cấp cho bạn vai trò IAM Người dùng Vertex AI.

  3. Trong môi trường của bạn, hãy thiết lập Google Cloud Thông tin xác thực mặc định của ứng dụng.

  4. Trong thực thể PostgreSQL cục bộ, hãy cài đặt tiện ích pgvector mở rộng.

  5. Bật tiện ích này bằng cách sử dụng CREATE EXTENSION vector theo hướng dẫn trong 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 SQL Connect.

  2. Cấp cho bạn vai trò IAM Người dùng Vertex AI.

  3. Bật tiện ích này bằng cách sử dụng CREATE EXTENSION vector theo hướng dẫn trong 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 đồ của bạ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ơ 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

SQL 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 SQL Connect tạo giá trị nhúng vectơ bằng cách gọi API Nhúng của Vertex AI một cách nội bộ. Bạn có thể sử dụng giá trị máy chủ _embed trong cả đột biến và truy vấn.

Đột biến

Tạo và lưu trữ giá trị nhúng thông qua SQL Connect

Trong ứng dụng tìm kiếm vectơ, có thể bạn sẽ muốn yêu cầu tạo giá trị nhúng ngay khi bạn thêm bản ghi vào cơ sở dữ liệu. Sau đây là createMovie đột biến thêm bản ghi phim vào bảng Movie và cũng chuyển nội dung mô tả phim có giá trị nhúng được chỉ định model.

mutation createMovie($title: String!, $description: String!) {
  movie_insert(data: {
    title: $title,
    description: $description,
    descriptionEmbedding_embed: {model: "text-embedding-005", 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: "text-embedding-005", 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 cách sử dụng 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 SQL 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ề để tìm kiếm độ tương đồng, 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 đồng

Giờ đây, chúng ta có thể thực hiện tìm kiếm độ tương đồng.

Đối với mỗi trường Vector, SQL Connect sẽ tạo một hàm GraphQL triển khai tính năng tìm kiếm độ tương đồng. 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 hàm GraphQL gọi tính năng tìm kiếm độ tương đồng. Như đã đề cập ở trên, giá trị máy chủ _embed hướng dẫn SQL Connect tạo các giá trị nhúng vectơ bằng cách sử dụng API Nhúng 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 được dùng để so sánh với các 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 đồng 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: "text-embedding-005", 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 đồng

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 của mình trả về các kết quả quá khác nhau 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ị phù 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: "text-embedding-005", 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: "text-embedding-005", 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 đồng

Cách gọi tìm kiếm độ tương đồng 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

SQL 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 Nhúng của Vertex, hãy chỉ định mô hình phù hợp và yêu cầu kết quả nhúng có phương diện chính xác.

Sau đó, truyền mảng số thực dấu phẩy động được trả về vào Vector để chuyể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 đồng bằng cách sử dụ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 đó, 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 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 SQL Connect điển hình là triển khai tài sả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 Cloud SQL bằng lệnh firebase deploy, 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ể Cloud SQL của bạn.

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ể Cloud SQL theo cách thủ công hoặc gặp lỗi CLI, hãy làm theo các hướng dẫn này.

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

Tiện ích giản đồ

Loại dữ liệu Vector của SQL 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ảng số dấu phẩy động có độ chính xác đơn trong PostgreSQL.

Trong SQL Connect, loại Vector được biểu thị dưới dạng mảng số JSON. Các giá trị đầu vào được ép buộc thành mảng giá trị float32. Nếu quá trình ép buộc không thành công, thì sẽ có lỗi xảy ra.

Sử dụng tham số kích thước của chỉ thị @col để đặt phương diện 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 đồng, đòi hỏi tất cả Vector phải có cùng số lượng phương diện.

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ụ SQL Connect tạo và lưu trữ giá trị 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ìm kiếm độ tương đồng

method: COSINE|INNER_PRODUCT|L2

Hàm khoảng cách được dùng để tìm kiếm các láng giềng 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áng giềng 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ả sẽ trả về.