Selamat datang di penelusuran kemiripan vektor Firebase Data Connect — implementasi penelusuran semantik Firebase yang terintegrasi dengan Google Vertex AI.
Inti dari fitur ini adalah penyematan vektor, yang merupakan array bilangan floating point yang mewakili makna semantik teks atau media. Dengan menjalankan penelusuran tetangga terdekat menggunakan embedding vektor input, Anda dapat menemukan semua konten yang mirip secara semantik. Data Connect menggunakan ekstensi
pgvector
PostgreSQL untuk kemampuan ini.
Penelusuran semantik yang canggih ini dapat mendorong kasus penggunaan seperti mesin pemberi saran dan mesin telusur. Ini juga merupakan komponen utama dalam pembuatan yang ditingkatkan pengambilan dalam alur AI generatif. Dokumentasi Vertex AI adalah referensi yang tepat untuk mempelajari lebih lanjut.
Anda dapat mengandalkan dukungan bawaan Data Connect untuk membuat embedding vektor secara otomatis menggunakan Embeddings API Vertex AI, atau menggunakan API tersebut untuk membuatnya secara manual.
Prasyarat
Siapkan Data Connect untuk project Anda.
Aktifkan Vertex AI API.
Penyiapan
Anda dapat memilih antara alur pengembangan lokal (jika Anda adalah developer web, developer Kotlin Android, atau iOS) atau alur IDX (untuk developer web). Anda dapat menggunakan database lokal atau project Data Connect produksi dan instance Cloud SQL untuk PostgreSQL-nya untuk pengembangan.
Petunjuk ini mengasumsikan bahwa Anda telah membuat project Data Connect dengan mengikuti panduan memulai.
Berintegrasi dengan PostgreSQL lokal
- Siapkan instance PostgreSQL lokal.
- Berikan peran IAM pengguna Vertex AI kepada diri Anda sendiri.
- Siapkan Kredensial Default Aplikasi Google Cloud di lingkungan Anda.
- Instal ekstensi
pgvector
di instance PostgreSQL lokal Anda. - Aktifkan ekstensi menggunakan
CREATE EXTENSION vector
sesuai petunjuk repositoripgvector
.
Berintegrasi dengan IDX
- Siapkan ruang kerja IDX menggunakan template Data Connect.
- Berikan peran IAM pengguna Vertex AI kepada diri Anda sendiri.
- Aktifkan ekstensi menggunakan
CREATE EXTENSION vector
sesuai petunjuk repositoripgvector
.
Mendesain skema
Untuk melakukan penelusuran vektor, tambahkan kolom baru dengan jenis Vector
di skema Anda. Misalnya, jika Anda ingin melakukan penelusuran semantik menggunakan deskripsi film, tambahkan
kolom untuk menyimpan embedding vektor yang terkait dengan deskripsi film. Dalam
skema ini, descriptionEmbedding
ditambahkan untuk menyimpan embedding vektor untuk
kolom 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)
// ...
}
Membuat dan mengambil penyematan
Data Connect menghadirkan dukungan terintegrasi untuk penyematan vektor dengan
nilai server _embed
. Tindakan ini akan mengarahkan Data Connect untuk menghasilkan
sematan vektor dengan memanggil Embedding API Vertex AI secara internal. Nilai server _embed
dapat digunakan dalam mutasi dan kueri.
Mutasi
Membuat dan menyimpan penyematan melalui Data Connect
Di aplikasi penelusuran vektor, Anda mungkin ingin meminta agar penyematan
dibuat segera setelah Anda menambahkan data ke database. Berikut adalah mutasi createMovie
yang menambahkan data film ke tabel Movie
dan juga meneruskan deskripsi
film dengan penyematan model
yang ditentukan.
mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
movie_insert(data: {
...movieData,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
})
}
Dalam beberapa kasus, Anda mungkin ingin memperbarui deskripsi dan penyematan film.
mutation updateDescription($id: String!, $description: String!) {
movie_update(id: $id, data: {
description: $description,
descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
})
}
Untuk memanggil mutasi terakhir dari klien:
import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';
await updateMovieDescriptionWithEmbed({ id: movieId, description: description});
// Use the response
Kueri
Ambil penyematan vektor menggunakan kueri seperti berikut. Perhatikan bahwa
descriptionEmbedding
yang ditampilkan oleh kueri adalah array float, yang
biasanya tidak dapat dibaca manusia. Dengan demikian, SDK yang dihasilkan Data Connect tidak
mendukung menampilkannya secara langsung.
Anda dapat menggunakan embedding vektor yang ditampilkan untuk melakukan penelusuran kesamaan, seperti yang dijelaskan di bagian berikutnya.
query getMovieDescription($id: String!) @auth(is: PUBLIC) {
movie(id: $id)
id
description
descriptionEmbedding
}
Melakukan penelusuran kemiripan
Sekarang kita dapat melakukan pencarian kesamaan.
Untuk setiap kolom Vector
, Data Connect menghasilkan fungsi GraphQL
yang menerapkan penelusuran kemiripan. Nama fungsi yang dihasilkan ini adalah
${pluralType}_${vectorFieldName}_similarity
. Fungsi ini mendukung beberapa parameter
seperti yang ditunjukkan dalam contoh berikut dan dalam daftar referensi.
Anda dapat menentukan fungsi GraphQL yang memanggil penelusuran kemiripan. Seperti
yang disebutkan di atas, nilai server _embed
mengarahkan Data Connect untuk
membuat embedding vektor menggunakan Embedding API Vertex AI, dalam hal ini
untuk membuat embedding string penelusuran yang digunakan untuk perbandingan dengan
embedding deskripsi film.
Dalam contoh ini, penelusuran kemiripan akan menampilkan hingga 5 film yang deskripsinya paling dekat secara semantis dengan kueri input. Kumpulan hasil diurutkan dalam urutan menaik berdasarkan jarak - terdekat ke terjauh.
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
}
}
Memanggil kueri kemiripan
Untuk memanggil penelusuran kesamaan dari kode klien:
import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';
const response = await searchMovieDescriptionUsingL2similarity({ query });
// Use the response
Menggunakan penyematan kustom
Data Connect juga memungkinkan Anda menggunakan penyematan secara langsung sebagai Vector
,
bukan menggunakan nilai server _embed
untuk membuatnya.
Menyimpan penyematan kustom
Dengan menggunakan Vertex Embeddings API, tentukan model yang cocok dan minta hasil penyematan dari dimensi yang benar.
Kemudian, transmisikan array float yang ditampilkan ke Vector
untuk diteruskan ke operasi
update untuk penyimpanan.
mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
movie_update(id: $id, data: {
// title, genre...
description: $description,
descriptionEmbedding: $descriptionEmbedding
})
}
Melakukan penelusuran kemiripan menggunakan penyematan kustom
Lakukan operasi yang sama untuk mengambil penyematan untuk istilah penelusuran dan mentransmisikannya ke Vectors
.
Kemudian, panggil kueri _similarity
untuk melakukan setiap penelusuran.
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
}
}
Men-deploy ke produksi
Men-deploy skema dan konektor Anda
Langkah terakhir dalam iterasi Data Connect standar adalah men-deploy aset ke produksi.
Saat men-deploy skema yang berisi jenis Vector
ke CloudSQL menggunakan perintah firebase deploy
, CLI Firebase akan melakukan langkah-langkah yang diperlukan untuk mengaktifkan pembuatan penyematan berbasis Vertex AI di instance CloudSQL Anda.
firebase deploy --only dataconnect
jika ingin mengaktifkan dukungan penyematan di instance CloudSQL secara manual, atau mengalami error CLI, ikuti petunjuk ini.
Sintaksis penelusuran vektor
Ekstensi skema
Jenis data Vector
Data Connect dipetakan ke jenis vector
PostgreSQL
seperti yang ditentukan oleh ekstensi pgvector
.
Jenis vector
pgvector disimpan sebagai array bilangan floating point presisi tunggal
di PostgreSQL.
Di Data Connect, jenis Vector
direpresentasikan sebagai array
angka JSON. Input dikonversi menjadi array nilai float32
. Jika pemaksaan gagal, error akan ditampilkan.
Gunakan parameter ukuran perintah @col
untuk menetapkan dimensi
vektor.
type Question @table {
text: String!
category: String!
textEmbedding: Vector! @col(size: 768)
}
size
hanya didukung untuk jenis Vector
. Operasi Vector
,
seperti penelusuran kemiripan, mengharuskan semua Vector
memiliki jumlah dimensi
yang sama.
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
Nilai server _embed
untuk kueri dan mutasi
_embed
Nilai server ini mengarahkan layanan Data Connect untuk membuat dan menyimpan penyematan menggunakan Vertex AI's Embedding API. Nilai server ini dapat digunakan pada kueri dan mutasi.
Parameter untuk penelusuran kemiripan
method: COSINE|INNER_PRODUCT|L2
Fungsi jarak yang digunakan untuk menelusuri tetangga di sekitar. Algoritma yang didukung saat ini adalah subset dari algoritma penelusuran pgvector.
within: float
Batasan pada jarak yang digunakan untuk melakukan penelusuran tetangga terdekat.
where: FDC filter condition
Lihat panduan skema, kueri, dan mutasi.
limit: int
Jumlah hasil yang akan ditampilkan.